]> git.madduck.net Git - code/vcsh.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Keep worktree relative to GIT_DIR
authormartin f. krafft <madduck@madduck.net>
Sat, 27 Apr 2013 06:17:30 +0000 (08:17 +0200)
committermartin f. krafft <madduck@madduck.net>
Fri, 19 Jul 2013 17:20:35 +0000 (19:20 +0200)
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

diff --git a/vcsh b/vcsh
index 3fa63d7bf266a698a8a1804fb8ae4152a41d9b5f..d45e95d927925fa31e45deadd7e19f409a94ae9b 100755 (executable)
--- a/vcsh
+++ b/vcsh
@@ -197,9 +197,8 @@ hook() {
 
 init() {
        [ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10
 
 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
 }
        git init
        upgrade
 }
@@ -275,17 +274,22 @@ run() {
 
 upgrade() {
        hook pre-upgrade
 
 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'
        [ ! "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
        [ -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"
 }
 
        export VCSH_DIRECTORY="$VCSH_REPO_NAME"
 }