]> git.lizzy.rs Git - plan9front.git/commitdiff
git/fetch: be more robust
authorOri Bernstein <ori@eigenstate.org>
Tue, 27 Jul 2021 15:05:45 +0000 (15:05 +0000)
committerOri Bernstein <ori@eigenstate.org>
Tue, 27 Jul 2021 15:05:45 +0000 (15:05 +0000)
currently, git/fetch prints the refs
to update before it fully fetches the
pack files; this can lead to updates
to the refs before we're 100% certain
that the objects are present.

This change prints the updates after
the packfile has been successfully
indexed.

sys/src/cmd/git/fetch.c

index d82e56f119fe0aa8bafde72669b0243b6f8ad80d..5951cfaf7235c9c5fd41f1a4abc4716627ecae61 100644 (file)
@@ -181,7 +181,7 @@ int
 fetchpack(Conn *c)
 {
        char buf[Pktmax], *sp[3];
-       char *packtmp, *idxtmp;
+       char *packtmp, *idxtmp, **ref;
        Hash h, *have, *want;
        int nref, refsz, first;
        int i, n, req, pfd;
@@ -193,6 +193,7 @@ fetchpack(Conn *c)
        first = 1;
        have = eamalloc(refsz, sizeof(have[0]));
        want = eamalloc(refsz, sizeof(want[0]));
+       ref = eamalloc(refsz, sizeof(ref[0]));
        while(1){
                n = readpkt(c, buf, sizeof(buf));
                if(n == -1)
@@ -213,19 +214,20 @@ fetchpack(Conn *c)
                        continue;
                if(refsz == nref + 1){
                        refsz *= 2;
-                       have = erealloc(have, refsz * sizeof(have[0]));
-                       want = erealloc(want, refsz * sizeof(want[0]));
+                       have = earealloc(have, refsz, sizeof(have[0]));
+                       want = earealloc(want, refsz, sizeof(want[0]));
+                       ref = earealloc(ref, refsz, sizeof(ref[0]));
                }
                if(hparse(&want[nref], sp[0]) == -1)
                        sysfatal("invalid hash %s", sp[0]);
                if (resolveremote(&have[nref], sp[1]) == -1)
                        memset(&have[nref], 0, sizeof(have[nref]));
-               print("remote %s %H local %H\n", sp[1], want[nref], have[nref]);
+               ref[nref] = estrdup(sp[1]);
                nref++;
        }
        if(listonly){
                flushpkt(c);
-               return 0;
+               goto showrefs;
        }
 
        if(writephase(c) == -1)
@@ -295,6 +297,15 @@ fetchpack(Conn *c)
                fail(packtmp, idxtmp, "could not index fetched pack: %r");
        if(rename(packtmp, idxtmp, h) == -1)
                fail(packtmp, idxtmp, "could not rename indexed pack: %r");
+
+showrefs:
+       for(i = 0; i < nref; i++){
+               print("remote %s %H local %H\n", ref[i], want[i], have[i]);
+               free(ref[i]);
+       }
+       free(ref);
+       free(want);
+       free(have);
        return 0;
 }