| #!/bin/sh | |
| # Usage: | |
| # Meta/amlook <mbox (for single message from MUA) or | |
| # Meta/amlook id1 id2... (from the command line) | |
| # Meta/amlook --gc | |
| MASTER=master | |
| find_commit () { | |
| in= commits= | |
| if test -z "$commits" | |
| then | |
| # I know I know there should be "notes grep" command... | |
| commits=$( | |
| git grep -l -e "$1" notes/amlog | | |
| sed -e 's|^notes/amlog:||' -e 's|/||g' | |
| ) | |
| fi | |
| if test -z "$commits" | |
| then | |
| commits=$(sed -ne "s|^\([0-9a-f]\{40\}\) $1|\1|p" .git/am.log) | |
| fi | |
| if test -z "$commits" | |
| then | |
| echo "Never applied" | |
| return | |
| fi | |
| echo "$commits" | |
| found=$( | |
| echo "$commits" | | |
| while read commit | |
| do | |
| git branch --with $commit | |
| done | sed -e 's|^..||' | | |
| sort -u | | |
| tr '\012' ' ' | |
| ) | |
| if test -z "$found" | |
| then | |
| echo "Not merged ($commits)" | |
| return | |
| fi | |
| case " $found " in | |
| *' maint '*) in=maint ;; | |
| *" $MASTER "*) in=$MASTER ;; | |
| *' next '*) in=next ;; | |
| esac | |
| if test -n "$in" | |
| then | |
| echo "Found in $in" | |
| else | |
| echo "Found in $found" | |
| fi | |
| } | |
| garbage_collect () { | |
| cutoff_days=${1-"180"} && | |
| git notes --ref amlog list | | |
| sed -e 's/.* //' | | |
| xargs -n 1 git show -s --format="%ci %H" 2>/dev/null | | |
| perl -e ' | |
| my @time = localtime(time() - $ARGV[0] * 24 * 3600); | |
| my $cutoff = sprintf("%04d-%02d-%02d 00:00:00", | |
| $time[5]+1900, $time[4]+1, $time[3]); | |
| while (<STDIN>) { | |
| if ($_ le $cutoff) { | |
| s/.* //; | |
| print; | |
| } | |
| } | |
| ' "$cutoff_days" >..gcinput | |
| : <<\INVALID | |
| : ( | |
| GIT_INDEX_FILE=/tmp/amlook.$$.tmp && | |
| export GIT_INDEX_FILE && | |
| rm -f "$GIT_INDEX_FILE" && | |
| git read-tree refs/notes/amlog && | |
| xargs git rm -f && | |
| T=$(git write-tree) && | |
| C=$(echo Prune amlog | git commit-tree $T -p refs/notes/amlog) && | |
| git update-ref -m "Prune amlog" refs/notes/amlog $C | |
| ) | |
| INVALID | |
| } | |
| if test $# = 0 | |
| then | |
| msg=$(sed -ne ' | |
| /^[ ]/{ | |
| # Append continuation line | |
| H | |
| x | |
| s/\n// | |
| x | |
| n | |
| } | |
| # Hold this new line, and look at what is in the hold space | |
| x | |
| # Is it the Message-ID line? If so, spit out and finish. | |
| /^[Mm][Ee][Ss][Ss][Aa][Gg][Ee]-[Ii][Dd]:[ ]*/{ | |
| s///p | |
| q | |
| } | |
| # Otherwise, check if this new line is empty | |
| x | |
| # Is it? Then we are done with the header | |
| /^$/b end | |
| # Otherwise we need to hold onto this header line | |
| x | |
| # And start the next cycle | |
| b | |
| : end | |
| q | |
| ') && | |
| find_commit "$msg" | |
| elif test "$1" = "--gc" | |
| then | |
| shift | |
| garbage_collect "$@" | |
| elif test "$1" == "--squash" | |
| then | |
| L=notes/amlog && | |
| git notes --ref=$L prune && | |
| C=$(echo amlog | git commit-tree refs/$L^{tree}) && | |
| git update-ref refs/$L $C | |
| else | |
| for msg | |
| do | |
| find_commit "$msg" | |
| done | |
| fi |