X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/321717820389d5f9a28a6546caa06bccd7e2923e..7005061db5ed43de6ffc18a974a778c9e7a8c9f4:/mrconfig.git-fake-bare diff --git a/mrconfig.git-fake-bare b/mrconfig.git-fake-bare index 83f2202..730d85d 100644 --- a/mrconfig.git-fake-bare +++ b/mrconfig.git-fake-bare @@ -1,11 +1,39 @@ # An example of how to add a new revision control system type to mr. -# git fake bare repositories have a detached workspace. This file adds +# git fake bare repositories have a detached workspace. One potential +# application is storing dotfiles in git, keeping them checked out in +# one $HOME, but checked into different git repositories. This file adds # support for them, separate from the normal git support. # To make mr use this file, add a line like this inside the [DEFAULT] # section of your ~/.mrconfig #include = cat /path/to/mrconfig.git-fake-bare +# And an example repo using it would look something like: +#[.dotfiles] +#lib = git_fake_bare_worktree $HOME +#checkout = git_fake_bare_checkout git://... .dotfiles + +lib = + # called to tell git where the worktree is + git_fake_bare_worktree() { + GIT_WORK_TREE="$1"; export GIT_WORK_TREE + } + # git doesn't have an easy way to check out such a repo, so + # do it by hand + git_fake_bare_checkout() { + set -x + url="$1" + repo="$2" + GIT_WORK_TREE= git clone --no-checkout "$url" "$repo" + cd "$repo" + mkdir -p "$GIT_WORK_TREE" + git read-tree HEAD + git config core.worktree "$GIT_WORK_TREE" + git checkout-index -a --prefix="$worktree" || true + mv .git/* . + rmdir .git + } + git_fake_bare_test = test -d "$MR_REPO"/refs/heads && test -d "$MR_REPO"/refs/tags && test -d "$MR_REPO"/objects && test -f "$MR_REPO"/config && @@ -42,15 +70,6 @@ git_fake_bare_register = if [ ! -d "$worktree" ]; then error "git worktree $worktree does not exist" fi - mr -c "$MR_CONFIG" config "`pwd`" \ - lib="GIT_WORK_TREE=$work_tree; export GIT_WORK_TREE" + mr -c "$MR_CONFIG" config "`pwd`" lib="git_fake_bare_worktree '$worktree'" echo "Registering git url: $url in $MR_CONFIG (with worktree $worktree)" - mr -c "$MR_CONFIG" config "`pwd`" \ - checkout=" \ - git clone --no-checkout $url $MR_REPO && \ - cd $MR_REPO && \ - git read-tree HEAD && \ - git checkout-index -a --prefix='$work_tree' || true; \ - git config core.worktree '$worktree' && \ - mv .git/* . && \ - rmdir .git" + mr -c "$MR_CONFIG" config "`pwd`" checkout="git_fake_bare_checkout '$url' '$MR_REPO'"