ref: c3ba64f6935322f09b6de5c2285544fd471c605d
dir: /sys/src/cmd/git/export/
#!/bin/rc rfork ne . /sys/lib/git/common.rc patchname=/tmp/git.patchname.$pid patchfile=/tmp/git.patchfile.$pid fn sigexit{ rm -f $patchname $patchfile } gitup flagfmt='o:patchdir patchdir'; args='[query]' eval `''{aux/getflags $*} || exec aux/usage if(~ $#patchdir 1 && ! test -d $patchdir) mkdir -p $patchdir q=$* if(~ $#q 0) q=HEAD commits=`{git/query $q || die $status} n=1 m=$#commits # sleazy hack: we want to run # under rfork m for the web ui, # so don't error if we can't mount mntgen /mnt/scratch >[2]/dev/null || status='' for(c in $commits){ cp=`{git/query -p $c} pp=`{git/query -p $c'~'} fc=`$nl{git/query -c $c~ $c | sed 's/^..//'} @{ rfork n cd /mnt/scratch if(test -d $pp/tree) bind $pp/tree a if(test -d $cp/tree) bind $cp/tree b echo From: `{cat $cp/author} echo Date: `{date -uf'WW, DD MMM YYYY hh:mm:ss Z' `{walk -em $cp/author}} <$cp/msg awk ' NR == 1 { n = ENVIRON["n"] m = ENVIRON["m"] msg=$0 if(m > 1) patch = sprintf("[PATCH %d/%d]", n, m) else patch = "[PATCH]" printf "Subject: %s %s\n\n", patch, msg gsub("^[ ]|[ ]$", "", msg) gsub("[^a-zA-Z0-9_]+", "-", msg) printf "%.4d-%s.patch", n, msg >ENVIRON["patchname"] next } { print }' echo '---' echo diff `{basename $pp} `{basename $cp} for(f in $fc){ a=a/$f if(! test -e $a) a=/dev/null b=b/$f if(! test -e $b) b=/dev/null diff -ur $a $b } } >$patchfile if(~ $#patchdir 0){ cat $patchfile ! ~ $n $m && echo } if not{ f=$patchdir/`{cat $patchname} mv $patchfile $f echo $f } n=`{echo $n + 1 | bc} } exit ''