]> git.lizzy.rs Git - plan9front.git/commitdiff
git/save: leave submodules unmangled
authorOri Bernstein <ori@eigenstate.org>
Sat, 7 Aug 2021 18:01:22 +0000 (18:01 +0000)
committerOri Bernstein <ori@eigenstate.org>
Sat, 7 Aug 2021 18:01:22 +0000 (18:01 +0000)
When modifying a submodule, we would garble the
mode, leading to an apparently dangling object.

This fixes the issue.

sys/src/cmd/git/save.c

index a9f0f51621645e78989304b111c2c633955e063a..d6062769cdead2d1ce24ec70e49f9ecf4f260ec5 100644 (file)
@@ -15,16 +15,18 @@ enum {
 };
 
 int
-gitmode(int m)
+gitmode(Dirent *e)
 {
-       if(m & DMDIR)           /* directory */
+       if(e->islink)
+               return 0120000;
+       else if(e->ismod)
+               return 0160000;
+       else if(e->mode & DMDIR)
                return 0040000;
-       else if(m & 0111)       /* executable */
+       else if(e->mode & 0111)
                return 0100755;
-       else if(m != 0)         /* regular */
+       else
                return 0100644;
-       else                    /* symlink */
-               return 0120000;
 }
 
 int
@@ -141,7 +143,7 @@ writetree(Dirent *ent, int nent, Hash *h)
        for(d = ent; d != ent + nent; d++){
                if(strlen(d->name) >= 255)
                        sysfatal("overly long filename: %s", d->name);
-               t = seprint(t, etxt, "%o %s", gitmode(d->mode), d->name) + 1;
+               t = seprint(t, etxt, "%o %s", gitmode(d), d->name) + 1;
                memcpy(t, d->h.h, sizeof(d->h.h));
                t += sizeof(d->h.h);
        }