Re: Bug?: git archive exclude pathspec and gitattributes export-ignore
Am 14.08.2017 um 18:43 schrieb René Scharfe: > The real solution is probably to teach tree-walk.c::do_match() how to > handle attributes and then inject ":(attr:-export-ignore)" as a default > internal pathspec in archive.c::parse_pathspec_arg() instead of handling > it in archive.c::write_archive_entry(). That's complicated and I'm not sure anymore if it's even a good idea. Let's solve this in git archive for now. t5001: add tests for export-ignore attributes and exclude pathspecs archive: factor out helper functions for handling attributes archive: don't queue excluded directories archive: queue directories for all types of pathspecs archive.c | 49 + t/t5001-archive-attr.sh | 47 --- 2 files changed, 85 insertions(+), 11 deletions(-) -- 2.14.1
Re: Bug?: git archive exclude pathspec and gitattributes export-ignore
On Mon, 14 Aug 2017, René Scharfe wrote: > Am 13.08.2017 um 06:53 schrieb David Adam: > > I think I have a bug in git (tested 2.11.0 on Debian 8, 2.14.1 on OS X and > > 2.14.1.145.gb3622a4 on OS X). > > > > Given a repository with an export-ignore directive for a subdirectory in > > .gitattributes, `git archive` with a pathspec that excludes a different > > subdirectory produces no output file and git exits with -1 as the return > > status. > > Thanks for the thoughtful bug report! > > The problem seems to be that archive.c::write_archive_entry() returns 0 > instead of READ_TREE_RECURSIVE for directories with the attribute > "export-ignore", and archive.c::write_directory() gets caught by > surprise by that and returns -1, which ends up causing git archive to > exit with return code 255 without actually writing anything. > > This should only happen if you use wildcards like "*", i.e. git archive > should behave as expected if you spell out the full name of the > directory. Can you confirm that? Yes - that's definitely the case. The reason I am trying to use the wildcard is that using an ":(exclude)b" pathspec excludes the contents of, but not the actual b directory itself: > git archive HEAD ':(top)' ':(exclude)b' | tar t .gitattributes b/ Whereas I would like to export the archive without the b directory entirely. > The real solution is probably to teach tree-walk.c::do_match() how to > handle attributes and then inject ":(attr:-export-ignore)" as a default > internal pathspec in archive.c::parse_pathspec_arg() instead of handling > it in archive.c::write_archive_entry(). Many thanks David Adam zanc...@ucc.gu.uwa.edu.au
Re: Bug?: git archive exclude pathspec and gitattributes export-ignore
Am 13.08.2017 um 06:53 schrieb David Adam: > Hi all, > > I think I have a bug in git (tested 2.11.0 on Debian 8, 2.14.1 on OS X and > 2.14.1.145.gb3622a4 on OS X). > > Given a repository with an export-ignore directive for a subdirectory in > .gitattributes, `git archive` with a pathspec that excludes a different > subdirectory produces no output file and git exits with -1 as the return > status. > > As shown: > > > git init foo && cd foo > Initialized empty Git repository in /Users/david/src/foo/.git/ > > mkdir a b > > touch {a,b}/somefile > > echo "/a export-ignore" >> .gitattributes > > git add . > > git commit -m "Initial commit" > [master (root-commit) 53527a7] Initial commit > 3 files changed, 1 insertion(+) > create mode 100644 .gitattributes > create mode 100644 a/somefile > create mode 100644 b/somefile > > git archive --verbose master ':(top)' ':(exclude)b*' > .gitattributes > > echo $? > 255 > > If this is intended behaviour, is there any way of achieving the goal of > excluding a subdirectory not listed as export-ignore? Using the exclude > pathspec ":(exclude)b" produces an empty subdirectory b in the output, > which I would like to avoid. > > This is a reduced testcase; my goal is to end up with two archives, one > containing directory b only, and one containing everything except for > directory b - so I can't just add 'b export-ignore' to gitattributes. Thanks for the thoughtful bug report! The problem seems to be that archive.c::write_archive_entry() returns 0 instead of READ_TREE_RECURSIVE for directories with the attribute "export-ignore", and archive.c::write_directory() gets caught by surprise by that and returns -1, which ends up causing git archive to exit with return code 255 without actually writing anything. This should only happen if you use wildcards like "*", i.e. git archive should behave as expected if you spell out the full name of the directory. Can you confirm that? The real solution is probably to teach tree-walk.c::do_match() how to handle attributes and then inject ":(attr:-export-ignore)" as a default internal pathspec in archive.c::parse_pathspec_arg() instead of handling it in archive.c::write_archive_entry(). @Duy: What do you think? Thanks, René
Bug?: git archive exclude pathspec and gitattributes export-ignore
Hi all, I think I have a bug in git (tested 2.11.0 on Debian 8, 2.14.1 on OS X and 2.14.1.145.gb3622a4 on OS X). Given a repository with an export-ignore directive for a subdirectory in .gitattributes, `git archive` with a pathspec that excludes a different subdirectory produces no output file and git exits with -1 as the return status. As shown: > git init foo && cd foo Initialized empty Git repository in /Users/david/src/foo/.git/ > mkdir a b > touch {a,b}/somefile > echo "/a export-ignore" >> .gitattributes > git add . > git commit -m "Initial commit" [master (root-commit) 53527a7] Initial commit 3 files changed, 1 insertion(+) create mode 100644 .gitattributes create mode 100644 a/somefile create mode 100644 b/somefile > git archive --verbose master ':(top)' ':(exclude)b*' .gitattributes > echo $? 255 If this is intended behaviour, is there any way of achieving the goal of excluding a subdirectory not listed as export-ignore? Using the exclude pathspec ":(exclude)b" produces an empty subdirectory b in the output, which I would like to avoid. This is a reduced testcase; my goal is to end up with two archives, one containing directory b only, and one containing everything except for directory b - so I can't just add 'b export-ignore' to gitattributes. Thanks David Adam zanc...@ucc.gu.uwa.edu.au