From: Junio C Hamano <gitster@pobox.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: git@vger.kernel.org
Subject: Re: [PATCH/RFC] diff --relative: output paths as relative to the current subdirectory
Date: Wed, 13 Feb 2008 00:33:56 -0800 [thread overview]
Message-ID: <7v3arxs1aj.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <7vhcgdzm8u.fsf@gitster.siamese.dyndns.org> (Junio C. Hamano's message of "Tue, 12 Feb 2008 17:19:29 -0800")
Junio C Hamano <gitster@pobox.com> writes:
> Linus Torvalds <torvalds@linux-foundation.org> writes:
>
>> So I simply don't think that we should assume a working directory for any
>> basic git operation, unless that operation fundamentally needs one because
>> it's only defined for a system with working directories (which is fairly
>> rare, but obviously happens: "git reset --hard", "git pull/merge", "git
>> checkout" etc).
>
> Yeah, but that begs for a larger design-level question.
>
> Instead of treating "diff --relative=drivers/ a..b", as a
> special case, shouldn't we have a more general "I may be in a
> bare repository, but please pretend that my prefix were this
> path" option?
>
> $ git --prefix=drivers/ diff --relative a..b -- scsi
> $ git --prefix=drivers/scsi log a..b .
>
> Of course, if you are truly in a bare repository and if you did
> an operation that wants a work tree, you would get mostly
> useless results, e.g.
>
> $ git --prefix=fs/ diff v2.6.24 -- ext3
>
> will give you tons of whole-file removals.
>
> I suspect that a lot of existing code assumes a non NULL prefix
> automatically means we have work tree, which needs to be fixed,
> if we go this route, though.
This does not address the above issue, but simply adds the
special purpose --relative=<path>.
The earlier one had the option described only in "git-diff"
manual page, simply because I originally planned to do this only
for "git-diff" Porcelain and nothing else. But it should have
been described as a general diff option. This moves the
description where it belongs to.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
Documentation/diff-options.txt | 8 ++++++++
Documentation/git-diff.txt | 5 -----
diff.c | 4 ++++
revision.c | 2 +-
4 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index 8d35cbd..8dc5b00 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -170,6 +170,14 @@ endif::git-format-patch[]
Swap two inputs; that is, show differences from index or
on-disk file to tree contents.
+--relative[=<path>]::
+ When run from a subdirectory of the project, it can be
+ told to exclude changes outside the directory and show
+ pathnames relative to it with this option. When you are
+ not in a subdirectory (e.g. in a bare repository), you
+ can name which subdirectory to make the output relative
+ to by giving a <path> as an argument.
+
--text::
Treat all files as text.
diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt
index 012bbdc..57c2862 100644
--- a/Documentation/git-diff.txt
+++ b/Documentation/git-diff.txt
@@ -78,11 +78,6 @@ OPTIONS
:git-diff: 1
include::diff-options.txt[]
---relative::
- When run from a subdirectory of the project, it can be
- told to exclude changes outside the directory and show
- pathnames relative to it with this option.
-
<path>...::
The <paths> parameters, when given, are used to limit
the diff to the named paths (you can give directory
diff --git a/diff.c b/diff.c
index db4bd55..2b89b16 100644
--- a/diff.c
+++ b/diff.c
@@ -2302,6 +2302,10 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
options->detect_rename = 0;
else if (!strcmp(arg, "--relative"))
DIFF_OPT_SET(options, RELATIVE_NAME);
+ else if (!prefixcmp(arg, "--relative=")) {
+ DIFF_OPT_SET(options, RELATIVE_NAME);
+ options->prefix = arg + 11;
+ }
/* xdiff options */
else if (!strcmp(arg, "-w") || !strcmp(arg, "--ignore-all-space"))
diff --git a/revision.c b/revision.c
index 6d9188b..4d6f57b 100644
--- a/revision.c
+++ b/revision.c
@@ -720,7 +720,7 @@ void init_revisions(struct rev_info *revs, const char *prefix)
revs->commit_format = CMIT_FMT_DEFAULT;
diff_setup(&revs->diffopt);
- if (prefix) {
+ if (prefix && !revs->diffopt.prefix) {
revs->diffopt.prefix = prefix;
revs->diffopt.prefix_length = strlen(prefix);
}
next prev parent reply other threads:[~2008-02-13 8:34 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-12 22:26 [PATCH/RFC] diff --relative: output paths as relative to the current subdirectory Junio C Hamano
2008-02-12 23:33 ` Linus Torvalds
2008-02-12 23:43 ` Junio C Hamano
2008-02-12 23:53 ` Linus Torvalds
2008-02-13 0:09 ` Linus Torvalds
2008-02-13 1:19 ` Junio C Hamano
2008-02-13 8:33 ` Junio C Hamano [this message]
2008-02-13 0:59 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7v3arxs1aj.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.