Skip to content

Commit

Permalink
Teach new attribute 'export-ignore' to git-archive
Browse files Browse the repository at this point in the history
Paths marked with this attribute are not output to git-archive
output.

Signed-off-by: Rene Scharfe <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
René Scharfe authored and gitster committed Jun 9, 2008
1 parent 457bb45 commit 008d896
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Documentation/gitattributes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,12 @@ frotz unspecified
Creating an archive
~~~~~~~~~~~~~~~~~~~

`export-ignore`
^^^^^^^^^^^^^^^

Files and directories with the attribute `export-ignore` won't be added to
archive files.

`export-subst`
^^^^^^^^^^^^^^

Expand Down
2 changes: 2 additions & 0 deletions archive-tar.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,8 @@ static int write_tar_entry(const unsigned char *sha1,
strbuf_grow(&path, PATH_MAX);
strbuf_add(&path, base, baselen);
strbuf_addstr(&path, filename);
if (is_archive_path_ignored(path.buf + base_len))
return 0;
if (S_ISDIR(mode) || S_ISGITLINK(mode)) {
strbuf_addch(&path, '/');
buffer = NULL;
Expand Down
2 changes: 2 additions & 0 deletions archive-zip.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ static int write_zip_entry(const unsigned char *sha1,
crc = crc32(0, NULL, 0);

path = construct_path(base, baselen, filename, S_ISDIR(mode), &pathlen);
if (is_archive_path_ignored(path + base_len))
return 0;
if (verbose)
fprintf(stderr, "%s\n", path);
if (pathlen > 0xffff) {
Expand Down
13 changes: 13 additions & 0 deletions archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,16 @@ void *sha1_file_to_archive(const char *path, const unsigned char *sha1,
return buffer;
}

int is_archive_path_ignored(const char *path)
{
static struct git_attr *attr_export_ignore;
struct git_attr_check check[1];

if (!attr_export_ignore)
attr_export_ignore = git_attr("export-ignore", 13);

check[0].attr = attr_export_ignore;
if (git_checkattr(path, ARRAY_SIZE(check), check))
return 0;
return ATTR_TRUE(check[0].value);
}
1 change: 1 addition & 0 deletions archive.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,6 @@ extern int write_zip_archive(struct archiver_args *);
extern void *parse_extra_zip_args(int argc, const char **argv);

extern void *sha1_file_to_archive(const char *path, const unsigned char *sha1, unsigned int mode, enum object_type *type, unsigned long *size, const struct commit *commit);
extern int is_archive_path_ignored(const char *path);

#endif /* ARCHIVE_H */
9 changes: 9 additions & 0 deletions t/t5000-tar-tree.sh
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ test_expect_success \
echo text >file_with_long_path) &&
(cd a && find .) | sort >a.lst'

test_expect_success \
'add ignored file' \
'echo ignore me >a/ignored &&
echo ignored export-ignore >.gitattributes'

test_expect_success \
'add files to repository' \
'find a -type f | xargs git update-index --add &&
Expand All @@ -53,6 +58,10 @@ test_expect_success \
git update-ref HEAD $(TZ=GMT GIT_COMMITTER_DATE="2005-05-27 22:00:00" \
git commit-tree $treeid </dev/null)'

test_expect_success \
'remove ignored file' \
'rm a/ignored'

test_expect_success \
'git archive' \
'git archive HEAD >b.tar'
Expand Down

0 comments on commit 008d896

Please sign in to comment.