diff options
| -rwxr-xr-x | scripts/git-sync | 79 | ||||
| -rwxr-xr-x | scripts/git-sync-noconflict | 93 | 
2 files changed, 102 insertions, 70 deletions
diff --git a/scripts/git-sync b/scripts/git-sync index e0117d7..aa1facc 100755 --- a/scripts/git-sync +++ b/scripts/git-sync @@ -1,93 +1,32 @@  #!/bin/bash  set -eu -verbose=0 -hosthash=$(python3 -c "import uuid, hashlib -print(hashlib.new('sha1', str(uuid.getnode()).encode('utf8')).hexdigest())") -#hostident="${HOSTNAME}" -hostident="${hosthash}" -  if [ -d "$(git rev-parse --git-dir)/annex" ]; then      echo 'Sync: using git annex'      exec git annex sync "$@" +    exit 1 # if attained, this is an error  fi -# determine current branch name  branch_name=$(git symbolic-ref -q --short HEAD) -# remote name -remote_name=$(git config --get branch.${branch_name}.remote || true) - -# conflict commit message -conflict_message="Merge conflict autocommit on ${hostident}" - -if [ -z "$remote_name" ]; then -    echo "No remote for this repository" >&2 -    exit 1 -fi -  if [ "$(git config --get --bool branch.${branch_name}.sync)" != "true" ]; then -    echo "Branch is not configured to accept git-sync" >&2 -    echo "To accept git-sync operation, set current branch sync to true:" >&2 +    echo "Branch is not configured to accept git-sync, maybe you can do:" >&2      echo "    git config --bool branch.${branch_name}.sync true" >&2      exit 1  fi -if [ "$verbose" -ne 0 ]; then -    echo 'Sync: git autocommit' -fi +git fetch --all --quiet +  git add -A "./$(git rev-parse --show-cdup)"  if ! git diff --cached --quiet; then      git status --short -    git commit -m "Auto-commit on ${hostident}" -fi - -if [ "$verbose" -ne 0 ]; then -    echo 'Sync: fetch and merge' -fi - -git fetch --quiet - -# might fail one time if conflict detected -git merge -m "$conflict_message" || true - -if [ "$verbose" -ne 0 ]; then -    echo 'Sync: conflict autocommit' -fi - -git status --porcelain | while read -r filename; do -    state="${filename:0:2}" -    filename="${filename:3}" -    ours="${filename}.${hostident}.conflict" -    theirs="${filename}.${remote_name}.conflict" -    case "$state" in -        *U*) -            git checkout --ours -- "$filename" -            mv -i -- "$filename" "$ours" -            git add -- "$ours" -            git checkout --theirs -- "$filename" -            cp -ai -- "$filename" "$theirs" -            git add -- "$filename" -            git add -- "$theirs" -        ;; -    esac -done - -# no action is done if there is nothing to commit -if git status --porcelain | grep -q .; then -    git status --short -    git commit -m "$conflict_message" +    git commit -m "git-sync on ${HOSTNAME}"  fi -# should not fail again -git merge -m "$conflict_message" - -if [ "$verbose" -ne 0 ]; then -    echo 'Sync: pushing changes' +#git merge --ff-only +if ! git merge --quiet --no-edit; then +    git merge --abort +    exit 1  fi  git push --quiet - -if [ "$verbose" -ne 0 ]; then -    echo 'Sync: done' -fi diff --git a/scripts/git-sync-noconflict b/scripts/git-sync-noconflict new file mode 100755 index 0000000..e0117d7 --- /dev/null +++ b/scripts/git-sync-noconflict @@ -0,0 +1,93 @@ +#!/bin/bash +set -eu + +verbose=0 +hosthash=$(python3 -c "import uuid, hashlib +print(hashlib.new('sha1', str(uuid.getnode()).encode('utf8')).hexdigest())") +#hostident="${HOSTNAME}" +hostident="${hosthash}" + +if [ -d "$(git rev-parse --git-dir)/annex" ]; then +    echo 'Sync: using git annex' +    exec git annex sync "$@" +fi + +# determine current branch name +branch_name=$(git symbolic-ref -q --short HEAD) + +# remote name +remote_name=$(git config --get branch.${branch_name}.remote || true) + +# conflict commit message +conflict_message="Merge conflict autocommit on ${hostident}" + +if [ -z "$remote_name" ]; then +    echo "No remote for this repository" >&2 +    exit 1 +fi + +if [ "$(git config --get --bool branch.${branch_name}.sync)" != "true" ]; then +    echo "Branch is not configured to accept git-sync" >&2 +    echo "To accept git-sync operation, set current branch sync to true:" >&2 +    echo "    git config --bool branch.${branch_name}.sync true" >&2 +    exit 1 +fi + +if [ "$verbose" -ne 0 ]; then +    echo 'Sync: git autocommit' +fi +git add -A "./$(git rev-parse --show-cdup)" +if ! git diff --cached --quiet; then +    git status --short +    git commit -m "Auto-commit on ${hostident}" +fi + +if [ "$verbose" -ne 0 ]; then +    echo 'Sync: fetch and merge' +fi + +git fetch --quiet + +# might fail one time if conflict detected +git merge -m "$conflict_message" || true + +if [ "$verbose" -ne 0 ]; then +    echo 'Sync: conflict autocommit' +fi + +git status --porcelain | while read -r filename; do +    state="${filename:0:2}" +    filename="${filename:3}" +    ours="${filename}.${hostident}.conflict" +    theirs="${filename}.${remote_name}.conflict" +    case "$state" in +        *U*) +            git checkout --ours -- "$filename" +            mv -i -- "$filename" "$ours" +            git add -- "$ours" +            git checkout --theirs -- "$filename" +            cp -ai -- "$filename" "$theirs" +            git add -- "$filename" +            git add -- "$theirs" +        ;; +    esac +done + +# no action is done if there is nothing to commit +if git status --porcelain | grep -q .; then +    git status --short +    git commit -m "$conflict_message" +fi + +# should not fail again +git merge -m "$conflict_message" + +if [ "$verbose" -ne 0 ]; then +    echo 'Sync: pushing changes' +fi + +git push --quiet + +if [ "$verbose" -ne 0 ]; then +    echo 'Sync: done' +fi  | 
