summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2021-08-07 18:01:22 +0000
committerOri Bernstein <ori@eigenstate.org>2021-08-07 18:01:22 +0000
commit3909b83a90ff0c820ef7c903a03fc12b043ebfea (patch)
tree7fd354c5e3ec19afcc6b3c51099b4fbe48a16cef
parent5a15acc7f0cbbcddf80e445cf1721cba6de31d4b (diff)
downloadplan9front-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.c16
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);
}