Teach new attribute 'export-ignore' to git-archive
Paths marked with this attribute are not output to git-archive output. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
457bb45291
commit
008d896df5
@ -502,6 +502,12 @@ frotz unspecified
|
|||||||
Creating an archive
|
Creating an archive
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
`export-ignore`
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Files and directories with the attribute `export-ignore` won't be added to
|
||||||
|
archive files.
|
||||||
|
|
||||||
`export-subst`
|
`export-subst`
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@ -247,6 +247,8 @@ static int write_tar_entry(const unsigned char *sha1,
|
|||||||
strbuf_grow(&path, PATH_MAX);
|
strbuf_grow(&path, PATH_MAX);
|
||||||
strbuf_add(&path, base, baselen);
|
strbuf_add(&path, base, baselen);
|
||||||
strbuf_addstr(&path, filename);
|
strbuf_addstr(&path, filename);
|
||||||
|
if (is_archive_path_ignored(path.buf + base_len))
|
||||||
|
return 0;
|
||||||
if (S_ISDIR(mode) || S_ISGITLINK(mode)) {
|
if (S_ISDIR(mode) || S_ISGITLINK(mode)) {
|
||||||
strbuf_addch(&path, '/');
|
strbuf_addch(&path, '/');
|
||||||
buffer = NULL;
|
buffer = NULL;
|
||||||
|
@ -176,6 +176,8 @@ static int write_zip_entry(const unsigned char *sha1,
|
|||||||
crc = crc32(0, NULL, 0);
|
crc = crc32(0, NULL, 0);
|
||||||
|
|
||||||
path = construct_path(base, baselen, filename, S_ISDIR(mode), &pathlen);
|
path = construct_path(base, baselen, filename, S_ISDIR(mode), &pathlen);
|
||||||
|
if (is_archive_path_ignored(path + base_len))
|
||||||
|
return 0;
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "%s\n", path);
|
fprintf(stderr, "%s\n", path);
|
||||||
if (pathlen > 0xffff) {
|
if (pathlen > 0xffff) {
|
||||||
|
13
archive.c
13
archive.c
@ -82,3 +82,16 @@ void *sha1_file_to_archive(const char *path, const unsigned char *sha1,
|
|||||||
return buffer;
|
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);
|
||||||
|
}
|
||||||
|
@ -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 *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 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 */
|
#endif /* ARCHIVE_H */
|
||||||
|
@ -44,6 +44,11 @@ test_expect_success \
|
|||||||
echo text >file_with_long_path) &&
|
echo text >file_with_long_path) &&
|
||||||
(cd a && find .) | sort >a.lst'
|
(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 \
|
test_expect_success \
|
||||||
'add files to repository' \
|
'add files to repository' \
|
||||||
'find a -type f | xargs git update-index --add &&
|
'find a -type f | xargs git update-index --add &&
|
||||||
@ -53,6 +58,10 @@ test_expect_success \
|
|||||||
git update-ref HEAD $(TZ=GMT GIT_COMMITTER_DATE="2005-05-27 22:00:00" \
|
git update-ref HEAD $(TZ=GMT GIT_COMMITTER_DATE="2005-05-27 22:00:00" \
|
||||||
git commit-tree $treeid </dev/null)'
|
git commit-tree $treeid </dev/null)'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'remove ignored file' \
|
||||||
|
'rm a/ignored'
|
||||||
|
|
||||||
test_expect_success \
|
test_expect_success \
|
||||||
'git archive' \
|
'git archive' \
|
||||||
'git archive HEAD >b.tar'
|
'git archive HEAD >b.tar'
|
||||||
|
Loading…
Reference in New Issue
Block a user