| #!/bin/sh |
| # Usage: |
| # Meta/amlook <mbox (for single message from MUA) or |
| # Meta/amlook id1 id2... (from the command line) |
| # Meta/amlook --gc |
| |
| 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 |
| |
| 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 "$@" |
| else |
| for msg |
| do |
| find_commit "$msg" |
| done |
| fi |