Skip to content

Commit

Permalink
Import git/import.
Browse files Browse the repository at this point in the history
  • Loading branch information
glenda committed Sep 3, 2019
1 parent e2232a8 commit 406e308
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 7 deletions.
2 changes: 1 addition & 1 deletion export
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ for(c in $commits){

echo From $c
echo From: `{cat $cp/author}
echo Date: `{date -t `{mtime $cp/author}}
echo Date: `{date -m `{mtime $cp/author}}
echo Subject: [PATCH] `{sed 1q $cp/msg}
echo
sed '1d' $cp/msg
Expand Down
99 changes: 99 additions & 0 deletions import
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#!/bin/rc

rfork ne

nl='
'
if(! cd `{git/conf -r})
exit 'not in git repository'
fn die{
echo $patchname: $1 $2
exit $2
}
fn apply @{
flag +e
git/fs
email=''
name=''
msg=''
parents='-p'^`{cat /mnt/git/HEAD/parent}
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="begin"
}
state=="begin" && /^From[ \t]/ {
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"
printf "%s", name > "/env/name"
printf "%s", email > "/env/email"
printf "%s", msg > "/env/msg"
printf "%s", date > "/env/date"
}
'
date=`{seconds $date}
ape/patch -p1 < $diffpath
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
}
}
if(~ $#* 0){
import
if not
for(f in $*)
import < $f
2 changes: 2 additions & 0 deletions mkfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ RC=\
commit\
diff\
export\
import\
init\
log\
merge\
pull\
push\

OFILES=\
date.$O\
objset.$O\
ols.$O\
pack.$O\
Expand Down
23 changes: 17 additions & 6 deletions save.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ treeify(char *path, Hash *th)


void
mkcommit(Hash *c, char *msg, char *name, char *email, Hash *parents, int nparents, Hash tree)
mkcommit(Hash *c, char *msg, char *name, char *email, vlong date, Hash *parents, int nparents, Hash tree)
{
char *s, h[64];
int ns, nh, i;
Expand All @@ -209,8 +209,8 @@ mkcommit(Hash *c, char *msg, char *name, char *email, Hash *parents, int nparent
fmtprint(&f, "tree %H\n", tree);
for(i = 0; i < nparents; i++)
fmtprint(&f, "parent %H\n", parents[i]);
fmtprint(&f, "author %s <%s> %lld +0000\n", name, email, (vlong)time(nil));
fmtprint(&f, "committer %s <%s> %lld +0000\n", name, email, (vlong)time(nil));
fmtprint(&f, "author %s <%s> %lld +0000\n", name, email, date);
fmtprint(&f, "committer %s <%s> %lld +0000\n", name, email, date);
fmtprint(&f, "\n");
fmtprint(&f, "%s", msg);
s = fmtstrflush(&f);
Expand All @@ -232,30 +232,41 @@ void
main(int argc, char **argv)
{
Hash c, t, parents[Maxparents];
char *msg, *name, *email;
char *msg, *name, *email, *dstr;
int r, nparents;

vlong date;

msg = nil;
name = nil;
email = nil;
dstr = nil;
date = time(nil);
nparents = 0;
gitinit();
ARGBEGIN{
case 'm': msg = EARGF(usage()); break;
case 'n': name = EARGF(usage()); break;
case 'e': email = EARGF(usage()); break;
case 'd': dstr = EARGF(usage()); break;
case 'p':
if(nparents >= Maxparents)
sysfatal("too many parents");
if(resolveref(&parents[nparents++], EARGF(usage())) == -1)
sysfatal("invalid parent: %r");
break;
default:
usage();
}ARGEND;

if(!msg) sysfatal("missing message");
if(!name) sysfatal("missing name");
if(!email) sysfatal("missing email");
if(dstr){
date=strtoll(dstr, &dstr, 10);
if(strlen(dstr) != 0)
sysfatal("could not parse date %s", dstr);
}

if(!msg || !name)
usage();

Expand All @@ -267,7 +278,7 @@ main(int argc, char **argv)
sysfatal("could not commit: %r\n");
if(r == 0)
sysfatal("empty commit: aborting");
mkcommit(&c, msg, name, email, parents, nparents, t);
mkcommit(&c, msg, name, email, date, parents, nparents, t);
print("%H\n", c);
exits(nil);
}

0 comments on commit 406e308

Please sign in to comment.