From e9a6b438443bad91e92032fbb9923aa3ebd5bb5b Mon Sep 17 00:00:00 2001
From: "martin f. krafft" <madduck@madduck.net>
Date: Sat, 27 Apr 2013 08:17:30 +0200
Subject: [PATCH] Keep worktree relative to GIT_DIR

core.worktree can be set relatively to GIT_DIR, thereby preventing the
hard-coding of the home directory path, which should make a vcsh setup
more portable.

On the other hand, this means that the vcsh repo.d is now invariably
linked to its position, relative to the base directory. Apply this patch
only if you think it to be less likely that people change
~/.config/vcsh/repo.d to something else, than they would rsync/tar/mv
a whole tree to a different $HOME.

Paths are resolved using Git itself, for maximum portability.

In addition to making sure the new method works on new repositories,
I checked that

  - "old" repositories can be used with the new code just fine;
  - upgrading works.

Signed-off-by: martin f. krafft <madduck@madduck.net>
---
 vcsh | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/vcsh b/vcsh
index 3fa63d7..d45e95d 100755
--- a/vcsh
+++ b/vcsh
@@ -197,9 +197,8 @@ hook() {
 
 init() {
 	[ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10
-	export GIT_WORK_TREE="$VCSH_BASE"
-	mkdir -p "$GIT_WORK_TREE" || fatal "could not create '$GIT_WORK_TREE'" 50
-	cd "$GIT_WORK_TREE" || fatal "could not enter '$GIT_WORK_TREE'" 11
+	mkdir -p "$VCSH_BASE" || fatal "could not create '$VCSH_BASE'" 50
+	cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11
 	git init
 	upgrade
 }
@@ -275,17 +274,22 @@ run() {
 
 upgrade() {
 	hook pre-upgrade
-	use
-	git config core.worktree     "$GIT_WORK_TREE"
+	# fake-bare repositories are not bare, actually. Set this to false
+	# because otherwise Git complains "fatal: core.bare and core.worktree
+	# do not make sense"
+	git config core.bare false
+	# in core.worktree, keep a relative reference to the base directory
+	git config core.worktree $(cd $GIT_DIR && GIT_WORK_TREE="$VCSH_BASE" git rev-parse --show-cdup)
 	[ ! "x$VCSH_GITIGNORE" = 'xnone' ] && git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME"
 	git config vcsh.vcsh         'true'
+	use
 	[ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ] && git add -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME"
 	hook post-upgrade
 }
 
 use() {
 	git_dir_exists
-	export GIT_WORK_TREE="$(git config --get core.worktree)"
+	export GIT_WORK_TREE="$(git rev-parse --show-toplevel)"
 	export VCSH_DIRECTORY="$VCSH_REPO_NAME"
 }
 
-- 
GitLab