ref: 22a4ca0f360a36a4a0927844e4d41e0845614826
parent: 9bcfa173b66507cf728023aedc39f73ec23d246a
author: Ori Bernstein <ori@eigenstate.org>
date: Fri Feb 7 12:57:03 EST 2020
removing tracked should implicitly untrack them.
--- a/commit
+++ b/commit
@@ -80,7 +80,7 @@
echo $branch: $hash
echo $hash > $refpath
for(f in $files){- if(test -e .git/index9/removed/$f){+ if(test -e .git/index9/removed/$f || ! test -e $f){rm -f .git/index9/removed/$f
rm -f .git/index9/tracked/$f
}
--- a/save.c
+++ b/save.c
@@ -160,14 +160,11 @@
}
void
-blobify(char *path, int *mode, Hash *bh)
+blobify(Dir *d, char *path, int *mode, Hash *bh)
{char h[64], *buf;
int f, nh;
- Dir *d;
- if((d = dirstat(path)) == nil)
- sysfatal("could not stat %s: %r", path);if((d->mode & DMDIR) != 0)
sysfatal("not file: %s", path);*mode = d->mode;
@@ -179,15 +176,14 @@
sysfatal("could not read blob %s: %r", path);writeobj(bh, h, nh, buf, d->length);
free(buf);
- free(d);
close(f);
}
int
-tracked(char *path, int *explicit)
+tracked(char *path)
{- Dir *d;
char ipath[256];
+ Dir *d;
/* Explicitly removed. */
snprint(ipath, sizeof(ipath), ".git/index9/removed/%s", path);
@@ -206,8 +202,6 @@
if(access(ipath, AEXIST) == 0)
return 1;
- /* unknown */
- *explicit = 0;
return 0;
}
@@ -244,11 +238,12 @@
int
treeify(Object *t, char **path, char **epath, int off, Hash *h)
{- int r, ne, nsub, nent, isdir, untrack;
+ int r, ne, nsub, nent, isdir;
char **p, **ep;
char elt[256];
Object **sub;
Dirent *e, *ent;
+ Dir *d;
r = -1;
nsub = 0;
@@ -273,12 +268,12 @@
if(treeify(sub[nsub], p, ep, off + ne + 1, &e->h) == -1)
goto err;
}else{- if(tracked(*p, &untrack))
- blobify(*p, &e->mode, &e->h);
- else if(untrack)
- e->name = nil;
+ d = dirstat(*p);
+ if(d != nil && tracked(*p))
+ blobify(d, *p, &e->mode, &e->h);
else
- sysfatal("untracked file %s", *p);+ e->name = nil;
+ free(d);
}
}
if(nent == 0){--- a/walk.c
+++ b/walk.c
@@ -295,8 +295,8 @@
rpath = smprint(RDIR"/%s", p);
tpath = smprint(TDIR"/%s", p);
bpath = smprint(HDIR"/%s", p);
- if(access(rpath, AEXIST) == 0){- dirty |= Mflg;
+ if(d == nil || access(rpath, AEXIST) == 0){+ dirty |= Rflg;
if(!quiet && (printflg & Rflg))
print("%s%s\n", rstr, p); }else if(access(bpath, AEXIST) == -1) {--
⑨