diff options
author | Ori Bernstein <ori@eigenstate.org> | 2021-08-07 18:01:22 +0000 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2021-08-07 18:01:22 +0000 |
commit | 3909b83a90ff0c820ef7c903a03fc12b043ebfea (patch) | |
tree | 7fd354c5e3ec19afcc6b3c51099b4fbe48a16cef | |
parent | 5a15acc7f0cbbcddf80e445cf1721cba6de31d4b (diff) | |
download | plan9front-3909b83a90ff0c820ef7c903a03fc12b043ebfea.tar.xz |
git/save: leave submodules unmangled
When modifying a submodule, we would garble the
mode, leading to an apparently dangling object.
This fixes the issue.
-rw-r--r-- | sys/src/cmd/git/save.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/sys/src/cmd/git/save.c b/sys/src/cmd/git/save.c index a9f0f5162..d6062769c 100644 --- a/sys/src/cmd/git/save.c +++ b/sys/src/cmd/git/save.c @@ -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); } |