ref: d5e2a8d00b4f769d56e567905c4c6689e803a49e
dir: /import/
#!/bin/rc rfork ne . /bin/git/common.rc usage=' git/import [file ...] ' fn die{ echo $patchname: $1 $2 exit $2 } fn apply @{ flag +e git/fs email='' name='' msg='' parents='-p'^`{git/query HEAD} diffpath=/tmp/gitimport.$pid.diff branch=`{awk '$1=="branch"{print $2}' < /mnt/git/ctl} if(test -e /mnt/git/branch/$branch/tree) refpath=.git/refs/$branch if not if(test -e /mnt/git/object/$branch/tree) refpath=.git/HEAD if not exit 'invalid branch '$branch awk ' BEGIN{ state="headers" } state=="headers" && /^From:/ { sub(/^From:*[ \t]*/, "", $0); name=$0; email=$0; sub(/<.*$/, "", name); sub(/.*</, "", email); sub(/>/, "", email); } state=="headers" && /^Date:/{ sub(/^Date:[ \t]*/, "", $0) date=$0 } state=="headers" && /^Subject:/{ sub(/^Subject: (\[PATCH\])*[ \t]*/, "", $0); msg=msg $0 "\n" } state=="headers" && /^$/ { state="body" } (state=="headers" || state=="body") && (/^diff/ || /^---[ ]*$/){ state="diff" print > ENVIRON["diffpath"] } state=="body" { print > "/env/msg" } state=="diff" { print > ENVIRON["diffpath"] } END{ if(state != "diff") exit("malformed patch: " state); if(name == "" || email == "" || msg == "" || date == ""){ print "missing headers" > "/fd/2"; exit("missingheader"); } printf "%s", name > "/env/name" printf "%s", email > "/env/email" printf "%s", msg > "/env/msg" printf "%s", date > "/env/date" } ' st=$status if(! ~ $st ''){ echo could not import: $st >[1=2] exit badpatch } # force re-reading env rc -c ' flag -e echo applying $msg | sed 1q date=`{seconds $date} files=`$nl{ape/patch -p1 < $diffpath | sed ''s/^patching file `(.*)''''/\1/''} for(f in $files){ if(test -e $f) git/add $f if not git/add -r $f } git/walk -fRMA hash=`{git/save -n $name -e $email -m $msg -d $date $parents} echo $hash > $refpath ' } fn import{ apply st=$status if(! ~ $st ''){ echo stdin: $st exit $st } } gitup patches=(/fd/0) if(! ~ $#* 0) patches=$* for(f in $patches) import < $f