chiark / gitweb /
5b31614ab97bde44672da8f5763df91dca2f26bf
[dgit-junk.git] / badcommit-fixup
1 #!/bin/bash
2
3 set -e
4 set -o pipefail
5
6 tmp=.git/dgit-badcommit-fixup-tmp
7 rm -rf $tmp
8 mkdir $tmp
9
10 LC_MESSAGES=C git fsck --no-dangling >$tmp/gfo 2>&1 || test $? = 1
11
12 perl -ne '
13         print $1, "\n" or die $! if
14  m/^error in commit (\w+):.*invalid format - expected '\''committer/;
15 ' <$tmp/gfo >$tmp/bad
16
17 case `wc -l <$tmp/bad` in
18     0)
19         echo >&2 'nothing bad found - is git-fsck doing as we expect?' ;
20         exit 8 ;;
21     1)
22         read <$tmp/bad bads
23         nots="^$bads^0 ^$bads^1"
24         ;;
25     *)
26         bads="cat $tmp/bad"
27         ;;
28 esac
29
30 args="$nots"
31
32 refs=`git-for-each-ref --format='%(refname)'`
33
34 if git-symbolic-ref HEAD >/dev/null 2>&1; then
35     refs+=' HEAD'
36 fi
37
38 for head in $refs; do
39     exec <$tmp/bad
40     needed=false
41     for bad in $bads; do
42         if git merge-base --is-ancestor $bad $head; then
43             needed=true
44             break
45         fi
46     done 
47     if ! $needed; then continue; fi
48     args+=" $head"
49 done
50
51 git filter-branch --original dgit-badcommit --commit-filter '
52 echo >&2 "FOO $*"
53 cat >&2
54 echo >&2 ====
55 false
56     sed -e '\''1,/^$/ s/^commiter /committer /'\''
57 ' $args