# Producing tar file with 666/777 permissions

3 messages from 2006-03-04 to 2006-03-04. Participants: Matt McCutchen, Junio C Hamano.
Thread: https://gitlist.dev/t/3545

## Matt McCutchen, 2006-03-04 04:25

Subject: Producing tar file with 666/777 permissions
Message-ID: <1141446331.3171.4.camel@mattlaptop>
URL: https://gitlist.dev/e/1141446331.3171.4.camel%40mattlaptop

```
Dear GIT people,

How do I package a git repository in a tar file with 666 and 777
embedded permissions?  There's evidently some way to do it because the
Linux kernel source packages have 666 and 777 embedded permissions, but
git-tar-tree gives me a tar file with 644 and 755 permissions and
there's no obvious way to tell it to do otherwise.

There was lots of discussion on the mailing list about what permissions
to preserve when copying in and out of repositories (I obviously side
with those who want a single execute bit), but I could not find any
mention of permission issues in reference to git-tar-tree.

Please reply to me as I am off-list.
-- 
Matt McCutchen
hashproduct@verizon.net
http://hashproduct.metaesthetics.net/

```

## Junio C Hamano, 2006-03-04 05:03

Subject: Re: Producing tar file with 666/777 permissions
Message-ID: <7v7j7ax0le.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7v7j7ax0le.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <1141446331.3171.4.camel@mattlaptop>

```
Matt McCutchen <hashproduct@verizon.net> writes:

> Dear GIT people,
>
> How do I package a git repository in a tar file with 666 and 777
> embedded permissions?  There's evidently some way to do it because the
> Linux kernel source packages have 666 and 777 embedded permissions, but
> git-tar-tree gives me a tar file with 644 and 755 permissions and
> there's no obvious way to tell it to do otherwise.

Ouch, thanks for reporting this.  You have spotted a recent
regression.

```

## Junio C Hamano, 2006-03-04 05:35

Subject: [PATCH] tar-tree: file/dirmode fix.
Message-ID: <7vy7zqvkl2.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7vy7zqvkl2.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <1141446331.3171.4.camel@mattlaptop>

```
This fixes two bugs introduced when we switched to generic tree
traversal code.

 (1) directory mode recorded silently became 0755, not 0777

 (2) if passed a tree object (not a commit), it emitted an
     alarming error message (but proceeded anyway).

Signed-off-by: Junio C Hamano <junkio@cox.net>

---

 tar-tree.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

815afaf1bd0ddf419231d2d9f129260ce1ddbecc
diff --git a/tar-tree.c b/tar-tree.c
index e85a1ed..e478e13 100644
--- a/tar-tree.c
+++ b/tar-tree.c
@@ -304,9 +304,11 @@ static void write_header(const unsigned 
 	}
 
 	if (S_ISDIR(mode))
-		mode |= 0755;	/* GIT doesn't store permissions of dirs */
-	if (S_ISLNK(mode))
-		mode |= 0777;   /* ... nor of symlinks */
+		mode |= 0777;
+	else if (S_ISREG(mode))
+		mode |= (mode & 0100) ? 0777 : 0666;
+	else if (S_ISLNK(mode))
+		mode |= 0777;
 	sprintf(&header[100], "%07o", mode & 07777);
 
 	/* XXX: should we provide more meaningful info here? */
@@ -391,7 +393,7 @@ int main(int argc, char **argv)
 		usage(tar_tree_usage);
 	}
 
-	commit = lookup_commit_reference(sha1);
+	commit = lookup_commit_reference_gently(sha1, 1);
 	if (commit) {
 		write_global_extended_header(commit->object.sha1);
 		archive_time = commit->date;
-- 
1.2.4.gfe04

```
