chiark / gitweb /
badcommit-fixup wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 4 Jan 2017 22:52:44 +0000 (22:52 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 4 Jan 2017 22:52:44 +0000 (22:52 +0000)
badcommit-fixup [new file with mode: 0755]

diff --git a/badcommit-fixup b/badcommit-fixup
new file mode 100755 (executable)
index 0000000..259775f
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+set -e
+set -o pipefail
+
+tmp=.git/dgit-badcommit-fixup-tmp
+rm -rf $tmp
+mkdir $tmp
+
+LC_MESSAGES=C git fsck --no-dangling 2>&1 | \
+ perl -ne 'print $1 if m/^error in commit d1a977e7f9637372750ac02a58e85c35ddd4ca54:.*invalid format - expected '\''committer' | \
+ >$tmp/bad
+
+case `wc -l <$tmp/bad` in
+    0)
+       echo >&2 'nothing bad found - is git-fsck doing as we expect?' ;
+       exit 8 ;;
+    1)
+       read <$tmp/bad bads
+       nots="^$onlybad^0 ^$onlybad^1"
+       ;;
+    *)
+       bads="cat $tmp/bad"
+       ;;
+esac
+
+args="$nots"
+
+for head in `git-show-ref --heads`; do
+    exec <$tmp/bad
+    needed=false
+    for bad in $bads; do
+       if git merge-base --is-ancestor $bad $head; then
+           needed=true
+           break
+       fi
+    done 
+    if ! $needed; then continue; fi
+    args+=" $head"
+done
+
+echo $args