From: Richard Hartmann Date: Sat, 8 Feb 2014 15:30:38 +0000 (+0100) Subject: Merge pull request #89 from alerque/master X-Git-Url: https://git.madduck.net/code/vcsh.git/commitdiff_plain/30e3b0e741f20d73e24978b4722dd58e7b3ef741?hp=890dbdede9545f927385bfd798f34831df3fc537 Merge pull request #89 from alerque/master Add hooks to allow fancy merge handling --- diff --git a/doc/hooks b/doc/hooks index 54ff795..282ee86 100644 --- a/doc/hooks +++ b/doc/hooks @@ -14,6 +14,12 @@ Available hooks are: * post-enter * pre-init * post-init +* pre-merge + Use this hook to detect and handle merge conflicts before vcsh's native code + finds and errors on them. This is useful for allowing clones on top of existing + files. +* post-merge + Use this hook to finish handling any merge conflicts found in the pre-merge hook. * pre-pull * post-pull * pre-push diff --git a/doc/sample_hooks/post-merge-unclobber b/doc/sample_hooks/post-merge-unclobber new file mode 100755 index 0000000..017a13f --- /dev/null +++ b/doc/sample_hooks/post-merge-unclobber @@ -0,0 +1,10 @@ +#!/bin/sh + +# This finds objects that the pre-merge script moved out of the way to +# avoid conflicts when running git clone and moves them back to their +# original places. The result is that the git repository gets checked out +# and the extant objects end up back in the working directory. Git now +# sees these as un-staged changes to the working branch and you can deal +# with them by adding them or reverting. + +find -name '*.vcsh-unclobber' -execdir rename .vcsh-unclobber '' {} \; diff --git a/doc/sample_hooks/pre-merge-unclobber b/doc/sample_hooks/pre-merge-unclobber new file mode 100755 index 0000000..93a7319 --- /dev/null +++ b/doc/sample_hooks/pre-merge-unclobber @@ -0,0 +1,11 @@ +#!/bin/sh + +# This code does amost exactly what the native VCSH sanity checking code +# does except that on finding a potential merge conflict, it moves the +# extant object out of the way temporarily. The merge then happens cleanly +# as far as git knows, and a post-merge hook can figure out what to do with +# the extant versions of the objects. + +for object in $(git ls-tree -r origin/master | awk '{print $4}'); do + [ -e "$object" ] && mv "$object" "$object.vcsh-unclobber" +done diff --git a/vcsh b/vcsh index 6ce5320..a6d8213 100755 --- a/vcsh +++ b/vcsh @@ -152,6 +152,7 @@ clone() { exit fi git fetch + hook pre-merge git ls-tree -r --name-only origin/master | (while read object; do [ -e "$object" ] && error "'$object' exists." && @@ -161,6 +162,7 @@ clone() { fatal "will stop after fetching and not try to merge! Once this situation has been resolved, run 'vcsh run $VCSH_REPO_NAME git pull' to finish cloning." 17 git merge origin/master + hook post-merge hook post-clone retire hook post-clone-retired