diff --relative: help working in a bare repository
authorJunio C Hamano <gitster@pobox.com>
Wed, 13 Feb 2008 08:34:39 +0000 (00:34 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 13 Feb 2008 22:59:34 +0000 (14:59 -0800)
This allows the --relative option to say which subdirectory to
pretend to be in, so that in a bare repository, you can say:

    $ git log --relative=drivers/ v2.6.20..v2.6.22 -- drivers/scsi/

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/diff-options.txt
diff.c
revision.c

index 286c30c..8dc5b00 100644 (file)
@@ -170,10 +170,13 @@ endif::git-format-patch[]
        Swap two inputs; that is, show differences from index or
        on-disk file to tree contents.
 
---relative::
+--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.
+       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/diff.c b/diff.c
index db4bd55..2b89b16 100644 (file)
--- 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"))
index 6d9188b..4d6f57b 100644 (file)
@@ -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);
        }