On Thu, 8 Jul 2010, Jeff King wrote: > On Thu, Jul 08, 2010 at 02:19:42PM +0200, Jakub Narebski wrote: > > > Nevertheless for the patch output format both "git diff --relative=sub" > > and "git diff --relative=sub/" give the same output, without 'b//quux'. > > The same IMHO should be done for raw output format, so we don't have > > '/quux' but 'quux'. > > Hmm. That is because the diff output properly eliminates the double "/". > But AFAICT, all of the following do what I would expect: > > git diff --relative=sub > git diff --relative=sub/ ;# same as above > git diff --relative=foo- ;# yields "a/10" for file "foo-10" > > Doing > > git diff --relative=sub --stat > > shows the same issue as your --raw version, as does --name-only. I think > the right solution is to clean up a leading "/" for those cases. That > leaves the possibility for non-directory prefixes, but should do what > the user wants in the directory case (since a leading "/" is > nonsensical). Perhaps this would be enough: -- >8 -- diff --git i/diff.c w/diff.c index 3aa695d..3a4696e 100644 --- i/diff.c +++ w/diff.c @@ -2705,10 +2705,16 @@ static void diff_fill_sha1_info(struct diff_filespec *one) static void strip_prefix(int prefix_length, const char **namep, const char **otherp) { /* Strip the prefix but do not molest /dev/null and absolute paths */ - if (*namep && **namep != '/') + if (*namep && **namep != '/') { *namep += prefix_length; - if (*otherp && **otherp != '/') + if (**namep == '/') + ++*namep; + } + if (*otherp && **otherp != '/') { *otherp += prefix_length; + if (**otherp == '/') + ++*otherp; + } } static void run_diff(struct diff_filepair *p, struct diff_options *o) -- 8< -- > > Or was that what you had in mind the whole time? My impression was that > you wanted --relative=foo to always be equivalent to --relative=foo/. > The subtle difference is that I want the "/" removed only if it is the > next character (or another way of thinking about it is to append "/" to > the prefix only if it is an actual directory). What I wanted is for "git diff-tree A B --relative=sub" to behave as "git diff-tree A:sub B:sub". Currently without -r / -t (without turning on recursive mode) it produces no output; well at least no output if 'sub' is really subdirectory. What's more I wanted for "git diff --raw" in any combination to behave the same... although I guess here point is moot, as "git diff" is automatically recursive regardless of output format, and you can't turn it off. Stil I'd like for "git diff-tree <commit>" to behave appropriately with --relative or --relative=<path>. -- Jakub Narebski Poland -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html