summaryrefslogtreecommitdiff
path: root/sys/src/cmd/git/pack.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/src/cmd/git/pack.c')
-rw-r--r--sys/src/cmd/git/pack.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/sys/src/cmd/git/pack.c b/sys/src/cmd/git/pack.c
index 50077ba27..2ffcdec57 100644
--- a/sys/src/cmd/git/pack.c
+++ b/sys/src/cmd/git/pack.c
@@ -70,6 +70,7 @@ int cachemax = 4096;
Packf *packf;
int npackf;
int openpacks;
+int gitdirmode = -1;
static void
clear(Object *o)
@@ -887,7 +888,7 @@ parsecommit(Object *o)
static void
parsetree(Object *o)
{
- int m, entsz, nent;
+ int m, a, entsz, nent;
Dirent *t, *ent;
char *p, *ep;
@@ -908,7 +909,15 @@ parsetree(Object *o)
if(*p != ' ')
sysfatal("malformed tree %H: *p=(%d) %c\n", o->hash, *p, *p);
p++;
- t->mode = m & 0777;
+ /*
+ * only the stored permissions for the user
+ * are relevant; git fills group and world
+ * bits with whatever -- so to serve with
+ * useful permissions, replicate the mode
+ * of the git repo dir.
+ */
+ a = (m & 0777)>>6;
+ t->mode = ((a<<6)|(a<<3)|a) & gitdirmode;
t->ismod = 0;
t->islink = 0;
if(m == 0160000){
@@ -1048,7 +1057,14 @@ Object*
readobject(Hash h)
{
Object *o;
+ Dir *d;
+ if(gitdirmode == -1){
+ if((d = dirstat(".git")) == nil)
+ sysfatal("stat .git: %r");
+ gitdirmode = d->mode & 0777;
+ free(d);
+ }
if((o = readidxobject(nil, h, 0)) == nil)
return nil;
parseobject(o);