chiark / gitweb /
badcommit-fixup: wip g-f-b
[dgit.git] / badcommit-fixup
index 259775f510984c5c652b377905b3238e03f6ddd1..15b1720cf4d265028b5d9bfa73a5001b1e6fdf2c 100755 (executable)
@@ -1,4 +1,6 @@
-#!/bin/bash
+#!/usr/bin/perl -w
+
+use strict;
 
 set -e
 set -o pipefail
@@ -7,9 +9,12 @@ 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
+LC_MESSAGES=C git fsck --no-dangling >$tmp/gfo 2>&1 || test $? = 1
+
+perl -ne '
+       print $1, "\n" or die $! if
+ m/^error in commit (\w+):.*invalid format - expected '\''committer/;
+' <$tmp/gfo >$tmp/bad
 
 case `wc -l <$tmp/bad` in
     0)
@@ -17,7 +22,7 @@ case `wc -l <$tmp/bad` in
        exit 8 ;;
     1)
        read <$tmp/bad bads
-       nots="^$onlybad^0 ^$onlybad^1"
+       nots="^$bads^0 ^$bads^1"
        ;;
     *)
        bads="cat $tmp/bad"
@@ -26,7 +31,13 @@ esac
 
 args="$nots"
 
-for head in `git-show-ref --heads`; do
+refs=`git-for-each-ref --format='%(refname)'`
+
+if git-symbolic-ref HEAD >/dev/null 2>&1; then
+    refs+=' HEAD'
+fi
+
+for head in $refs; do
     exec <$tmp/bad
     needed=false
     for bad in $bads; do
@@ -39,4 +50,10 @@ for head in `git-show-ref --heads`; do
     args+=" $head"
 done
 
-echo $args
+git filter-branch --original dgit-badcommit --commit-filter '
+echo >&2 "FOO $*"
+cat >&2
+echo >&2 ====
+false
+    sed -e '\''1,/^$/ s/^commiter /committer /'\''
+' $args