Nazri Ramliy <[email protected]> writes:
> -- >8 --
> Subject: [PATCH] Teach git to change to a given directory using -C option
>
> This is similar in spirit to to "make -C dir ..." and "tar -C dir ...".
>
> Currently it takes more effort (keypresses) to invoke git command in a
> different directory than the current one without leaving the current
> directory:
>
> 1. (cd ~/foo && git status)
> git --git-dir=~/foo/.git --work-dir=~/foo status
> GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
> 2. (cd ../..; git grep foo)
> 3. for d in d1 d2 d3; do (cd $d && git svn rebase); done
>
> While doable the methods shown above are arguably more suitable for
> scripting than quick command line invocations.
>
> With this new option, the above can be done with fewer keystrokes:
>
> 1. git -C ~/foo status
> 2. git -C ../.. grep foo
> 3. for d in d1 d2 d3; do git -C $d svn rebase; done
>
> A new test script is added to verify the behavior of this option with
> other path-related options like --git-dir and --work-tree.
>
> Signed-off-by: Nazri Ramliy <[email protected]>
> ---
Thanks; will tentatively queue on 'pu' with some rephrasing of the
log message, but I have a few comments.
> Documentation/git.txt | 16 +++++++++-
> git.c | 15 ++++++++--
> t/t0056-git-C.sh | 82
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 110 insertions(+), 3 deletions(-)
> create mode 100755 t/t0056-git-C.sh
>
> diff --git a/Documentation/git.txt b/Documentation/git.txt
> index 83edf30..6105cb0 100644
> --- a/Documentation/git.txt
> +++ b/Documentation/git.txt
> @@ -9,7 +9,7 @@ git - the stupid content tracker
> SYNOPSIS
> --------
> [verse]
> -'git' [--version] [--help] [-c <name>=<value>]
> +'git' [--version] [--help] [-C <path>] [-c <name>=<value>]
I do not care too deeply either way, but I am curious if there was a
reason why you changed the earlier <directory> to <path>? Somehow,
when we _know_ a path has to be a directory, I find it easier on the
readers to spell that out, instead of saying "this is a path",
implying that it could be a directory, a regular file, or even
non-existent.
> [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
> [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
> [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
> @@ -395,6 +395,20 @@ displayed. See linkgit:git-help[1] for more information,
> because `git --help ...` is converted internally into `git
> help ...`.
>
> +-C <path>::
> + Run as if git was started in <path> instead of the current working
> + directory. When multiple -C options are given, each subsequent
> + non-absolute "-C <path>" is interpreted relative to the preceding "-C
> + <path>".
> +
> + This option affects options that expect path name like --git-dir and
> + --work-tree in that their interpretations of the path names would be
> + made relative to the working directory caused by the -C option. For
> + example the following invocations are equivalent:
> +
> + git --git-dir=a.git --work-tree=b -C c status
> + git --git-dir=c/a.git --work-tree=c/b status
> +
Does the above format correctly without the usual "second and
subsequent paragraphs are not indented, but has '+' in place of
a blank line"?
> diff --git a/git.c b/git.c
> index 2025f77..52bce74 100644
> --- a/git.c
> +++ b/git.c
> @@ -7,7 +7,7 @@
> #include "commit.h"
>
> const char git_usage_string[] =
> - "git [--version] [--help] [-c name=value]\n"
> + "git [--version] [--help] [-C <path>] [-c name=value]\n"
> " [--exec-path[=<path>]] [--html-path] [--man-path]
> [--info-path]\n"
> " [-p|--paginate|--no-pager] [--no-replace-objects]
> [--bare]\n"
> " [--git-dir=<path>] [--work-tree=<path>]
> [--namespace=<name>]\n"
> @@ -54,7 +54,18 @@ static int handle_options(const char ***argv, int *argc,
> int *envchanged)
> /*
> * Check remaining flags.
> */
> - if (!prefixcmp(cmd, "--exec-path")) {
> + if (!strcmp(cmd, "-C")) {
> + if (*argc < 2) {
> + fprintf(stderr, "No directory given for -C.\n"
> );
> + usage(git_usage_string);
> + }
> + if (chdir((*argv)[1]))
> + die_errno("Cannot change to '%s'", (*argv)[1]);
> + if (envchanged)
> + *envchanged = 1;
> + (*argv)++;
> + (*argc)--;
> + } else if (!prefixcmp(cmd, "--exec-path")) {
We usually do not prepend to an existing if/else if/ chain unless
there is a very good reason (e.g. the new "if" condition is very
often triggered and we are better off checking it early) exactly
because doing so would make a patch that is ugly like the above.
You are not touching the codepath that deal with --exec-path, but
the resulting patch makes it appear as if you are doing something to
it.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html