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