All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Let 'git <command> -h' show usage without a git dir
       [not found] <20080125173149.GA10287@edna.gwendoline.at>
@ 2009-11-08  7:11 ` Jonathan Nieder
  2009-11-08  7:26   ` [PATCH] Show usage string for 'git http-push -h' Jonathan Nieder
  2009-11-08  9:21   ` [PATCH] Let 'git <command> -h' show usage without a git dir Junio C Hamano
  0 siblings, 2 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-08  7:11 UTC (permalink / raw)
  To: git; +Cc: Gerfried Fuchs, 462557

Hi,

Gerfried Fuchs wrote:

>  I really wonder why "git <command> -h" depends on being inside a
> repository. I noticed it with "git diff -h" (add, branch does that, too):
> 
> #v+
> ~/git> git tag -h
> usage: git-tag [-n [<num>]] -l [<pattern>] | [-a | -s | -u <key-id>] [-f | -d | -v] [-m <msg> | -F <file>] <tagname> [<head>]
> ~/git> cd
> ~> git tag -h
> fatal: Not a git repository
> ~>
> #v-
 
This is a nuisance, I agree.

So how about something like this patch?  This just avoids looking for
a .git directory if the only option to a subcommand is '-h'.

-- %< --
Subject: [PATCH] Let 'git <command> -h' show usage without a git dir

There is no need for "git <command> -h" to depend on being inside
a repository.

Reported by Gerfried Fuchs through http://bugs.debian.org/462557

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Tested with all builtins and non-builtins written in C.  Some commands
do not show usage with '-h' and have been left unchanged.

 git.c            |   48 ++++++++++++++++++++++++++++++------------------
 http-fetch.c     |   13 ++++++++++++-
 index-pack.c     |    5 +++++
 pack-redundant.c |    5 +++++
 4 files changed, 52 insertions(+), 19 deletions(-)

diff --git a/git.c b/git.c
index bd2c5fe..bfa9518 100644
--- a/git.c
+++ b/git.c
@@ -220,6 +220,11 @@ const char git_version_string[] = GIT_VERSION;
  * RUN_SETUP for reading from the configuration file.
  */
 #define NEED_WORK_TREE	(1<<2)
+/*
+ * Let RUN_SETUP, USE_PAGER, and NEED_WORK_TREE take effect even if
+ * passed the -h option.
+ */
+#define H_IS_NOT_HELP	(1<<3)
 
 struct cmd_struct {
 	const char *cmd;
@@ -229,21 +234,25 @@ struct cmd_struct {
 
 static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
 {
-	int status;
+	int status, help;
 	struct stat st;
 	const char *prefix;
 
 	prefix = NULL;
-	if (p->option & RUN_SETUP)
-		prefix = setup_git_directory();
-
-	if (use_pager == -1 && p->option & RUN_SETUP)
-		use_pager = check_pager_config(p->cmd);
-	if (use_pager == -1 && p->option & USE_PAGER)
-		use_pager = 1;
+	help = argc == 2 && !(p->option & H_IS_NOT_HELP) &&
+		!strcmp(argv[1], "-h");
+	if (!help) {
+		if (p->option & RUN_SETUP && !help)
+			prefix = setup_git_directory();
+
+		if (use_pager == -1 && p->option & RUN_SETUP)
+			use_pager = check_pager_config(p->cmd);
+		if (use_pager == -1 && p->option & USE_PAGER)
+			use_pager = 1;
+	}
 	commit_pager_choice();
 
-	if (p->option & NEED_WORK_TREE)
+	if (!help && p->option & NEED_WORK_TREE)
 		setup_work_tree();
 
 	trace_argv_printf(argv, "trace: built-in: git");
@@ -278,7 +287,8 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "annotate", cmd_annotate, RUN_SETUP },
 		{ "apply", cmd_apply },
 		{ "archive", cmd_archive },
-		{ "bisect--helper", cmd_bisect__helper, RUN_SETUP | NEED_WORK_TREE },
+		{ "bisect--helper", cmd_bisect__helper,
+			RUN_SETUP | NEED_WORK_TREE },
 		{ "blame", cmd_blame, RUN_SETUP },
 		{ "branch", cmd_branch, RUN_SETUP },
 		{ "bundle", cmd_bundle },
@@ -288,12 +298,12 @@ static void handle_internal_command(int argc, const char **argv)
 			RUN_SETUP | NEED_WORK_TREE},
 		{ "check-ref-format", cmd_check_ref_format },
 		{ "check-attr", cmd_check_attr, RUN_SETUP },
-		{ "cherry", cmd_cherry, RUN_SETUP },
+		{ "cherry", cmd_cherry, RUN_SETUP | H_IS_NOT_HELP },
 		{ "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },
 		{ "clone", cmd_clone },
 		{ "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE },
 		{ "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
-		{ "commit-tree", cmd_commit_tree, RUN_SETUP },
+		{ "commit-tree", cmd_commit_tree, RUN_SETUP | H_IS_NOT_HELP },
 		{ "config", cmd_config },
 		{ "count-objects", cmd_count_objects, RUN_SETUP },
 		{ "describe", cmd_describe, RUN_SETUP },
@@ -304,7 +314,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "fast-export", cmd_fast_export, RUN_SETUP },
 		{ "fetch", cmd_fetch, RUN_SETUP },
 		{ "fetch-pack", cmd_fetch_pack, RUN_SETUP },
-		{ "fetch--tool", cmd_fetch__tool, RUN_SETUP },
+		{ "fetch--tool", cmd_fetch__tool, RUN_SETUP | H_IS_NOT_HELP },
 		{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
 		{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
 		{ "format-patch", cmd_format_patch, RUN_SETUP },
@@ -312,7 +322,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "fsck-objects", cmd_fsck, RUN_SETUP },
 		{ "gc", cmd_gc, RUN_SETUP },
 		{ "get-tar-commit-id", cmd_get_tar_commit_id },
-		{ "grep", cmd_grep, RUN_SETUP | USE_PAGER },
+		{ "grep", cmd_grep, RUN_SETUP | USE_PAGER | H_IS_NOT_HELP },
 		{ "help", cmd_help },
 		{ "init", cmd_init_db },
 		{ "init-db", cmd_init_db },
@@ -325,9 +335,11 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE },
 		{ "merge-base", cmd_merge_base, RUN_SETUP },
 		{ "merge-file", cmd_merge_file },
-		{ "merge-ours", cmd_merge_ours, RUN_SETUP },
-		{ "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
-		{ "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
+		{ "merge-ours", cmd_merge_ours, RUN_SETUP | H_IS_NOT_HELP },
+		{ "merge-recursive", cmd_merge_recursive,
+			RUN_SETUP | NEED_WORK_TREE | H_IS_NOT_HELP },
+		{ "merge-subtree", cmd_merge_recursive,
+			RUN_SETUP | NEED_WORK_TREE | H_IS_NOT_HELP },
 		{ "mktree", cmd_mktree, RUN_SETUP },
 		{ "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
 		{ "name-rev", cmd_name_rev, RUN_SETUP },
@@ -368,7 +380,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "whatchanged", cmd_whatchanged, RUN_SETUP | USE_PAGER },
 		{ "write-tree", cmd_write_tree, RUN_SETUP },
 		{ "verify-pack", cmd_verify_pack },
-		{ "show-ref", cmd_show_ref, RUN_SETUP },
+		{ "show-ref", cmd_show_ref, RUN_SETUP | H_IS_NOT_HELP },
 		{ "pack-refs", cmd_pack_refs, RUN_SETUP },
 	};
 	int i;
diff --git a/http-fetch.c b/http-fetch.c
index e8f44ba..85f5338 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -1,6 +1,10 @@
 #include "cache.h"
+#include "exec_cmd.h"
 #include "walker.h"
 
+static const char http_fetch_usage[] = "git http-fetch "
+	"[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url";
+
 int main(int argc, const char **argv)
 {
 	const char *prefix;
@@ -19,6 +23,13 @@ int main(int argc, const char **argv)
 	int get_verbosely = 0;
 	int get_recover = 0;
 
+	git_extract_argv0_path(argv[0]);
+
+	if (argc == 2 && !strcmp(argv[1], "-h")) {
+		fprintf(stderr, "%s\n", http_fetch_usage);
+		return 0;
+	}
+
 	prefix = setup_git_directory();
 
 	git_config(git_default_config, NULL);
@@ -45,7 +56,7 @@ int main(int argc, const char **argv)
 		arg++;
 	}
 	if (argc < arg + 2 - commits_on_stdin) {
-		usage("git http-fetch [-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url");
+		usage(http_fetch_usage);
 		return 1;
 	}
 	if (commits_on_stdin) {
diff --git a/index-pack.c b/index-pack.c
index b4f8278..4a7d405 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -882,6 +882,11 @@ int main(int argc, char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
+	if (argc == 2 && !strcmp(argv[1], "-h")) {
+		fprintf(stderr, "usage: %s\n", index_pack_usage);
+		return 0;
+	}
+
 	/*
 	 * We wish to read the repository's config file if any, and
 	 * for that it is necessary to call setup_git_directory_gently().
diff --git a/pack-redundant.c b/pack-redundant.c
index 69a7ab2..24d59f9 100644
--- a/pack-redundant.c
+++ b/pack-redundant.c
@@ -603,6 +603,11 @@ int main(int argc, char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
+	if (argc == 2 && !strcmp(argv[1], "-h")) {
+		fprintf(stderr, "usage: %s\n", pack_redundant_usage);
+		return 0;
+	}
+
 	setup_git_directory();
 
 	for (i = 1; i < argc; i++) {
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH] Show usage string for 'git http-push -h'
  2009-11-08  7:11 ` [PATCH] Let 'git <command> -h' show usage without a git dir Jonathan Nieder
@ 2009-11-08  7:26   ` Jonathan Nieder
  2009-11-09  8:52     ` Tay Ray Chuan
  2009-11-08  9:21   ` [PATCH] Let 'git <command> -h' show usage without a git dir Junio C Hamano
  1 sibling, 1 reply; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-08  7:26 UTC (permalink / raw)
  To: git; +Cc: Tay Ray Chuan

git http-push already knows how to dump usage if it is given no
options, but it interprets '-h' as the URL to a remote repository:

$ git http-push -h
error: Cannot access URL -h/, return code 6

Dump usage on -h, instead.  Humans wanting to pass the URL -h/ to
curl for some reason can use 'git http-push -h/' explicitly.
Scripts expecting to access an HTTP repository at URL '-h' will
break, though.

Cc: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Jonathan Nieder wrote:
> Some commands
> do not show usage with '-h' and have been left unchanged.

Like this one.  Full list of non-builtin commands in C like this:
http-push, fast-import, imap-send, remote-curl, show-index.

 http-push.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/http-push.c b/http-push.c
index 00e83dc..2e0782a 100644
--- a/http-push.c
+++ b/http-push.c
@@ -13,8 +13,8 @@
 
 #include <expat.h>
 
-static const char http_push_usage[] =
-"git http-push [--all] [--dry-run] [--force] [--verbose] <remote> [<head>...]\n";
+static const char http_push_usage[] = "git http-push "
+"[-h] [--all] [--dry-run] [--force] [--verbose] <remote> [<head>...]\n";
 
 #ifndef XML_STATUS_OK
 enum XML_Status {
@@ -1792,6 +1792,11 @@ int main(int argc, char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
+	if (argc == 2 && !strcmp(argv[1], "-h")) {
+		fprintf(stderr, "usage: %s\n", http_push_usage);
+		return 0;
+	}
+
 	setup_git_directory();
 
 	repo = xcalloc(sizeof(*repo), 1);
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* Re: [PATCH] Let 'git <command> -h' show usage without a git dir
  2009-11-08  7:11 ` [PATCH] Let 'git <command> -h' show usage without a git dir Jonathan Nieder
  2009-11-08  7:26   ` [PATCH] Show usage string for 'git http-push -h' Jonathan Nieder
@ 2009-11-08  9:21   ` Junio C Hamano
  2009-11-08 11:03     ` Jonathan Nieder
  1 sibling, 1 reply; 39+ messages in thread
From: Junio C Hamano @ 2009-11-08  9:21 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: git, Gerfried Fuchs, 462557

Jonathan Nieder <jrnieder@gmail.com> writes:

> diff --git a/git.c b/git.c
> index bd2c5fe..bfa9518 100644
> --- a/git.c
> +++ b/git.c
> @@ -220,6 +220,11 @@ const char git_version_string[] = GIT_VERSION;
>   * RUN_SETUP for reading from the configuration file.
>   */
>  #define NEED_WORK_TREE	(1<<2)
> +/*
> + * Let RUN_SETUP, USE_PAGER, and NEED_WORK_TREE take effect even if
> + * passed the -h option.
> + */
> +#define H_IS_NOT_HELP	(1<<3)

Yuck.  Let's think of a way to avoid this ugliness.

> @@ -278,7 +287,8 @@ static void handle_internal_command(int argc, const char **argv)
>  		{ "annotate", cmd_annotate, RUN_SETUP },
>  		{ "apply", cmd_apply },
>  		{ "archive", cmd_archive },
> -		{ "bisect--helper", cmd_bisect__helper, RUN_SETUP | NEED_WORK_TREE },
> +		{ "bisect--helper", cmd_bisect__helper,
> +			RUN_SETUP | NEED_WORK_TREE },

Besides, this hunk is totally unwarranted.

Here are the relevant parts (some of your H_IS_NOT_HELP are not visible
because you needlessly wrapped the lines):

> +		{ "cherry", cmd_cherry, RUN_SETUP | H_IS_NOT_HELP },
> +		{ "commit-tree", cmd_commit_tree, RUN_SETUP | H_IS_NOT_HELP },
> +		{ "fetch--tool", cmd_fetch__tool, RUN_SETUP | H_IS_NOT_HELP },
> +		{ "grep", cmd_grep, RUN_SETUP | USE_PAGER | H_IS_NOT_HELP },
> +		{ "merge-ours", cmd_merge_ours, RUN_SETUP | H_IS_NOT_HELP },
> +		{ "merge-recursive", cmd_merge_recursive,
> +		{ "merge-subtree", cmd_merge_recursive,
> +		{ "show-ref", cmd_show_ref, RUN_SETUP | H_IS_NOT_HELP },

Except for "grep" and "show-ref", none of these have a valid -h option
that means something else.

Considering that this niggle is strictly about "git cmd -h", and not about
"git cmd --otheropt -h somearg", we can even say that "git grep -h" is
asking for help, and not "do not show filenames from match", as there is
no pattern specified.

So I think the right approach is something like how you handled http-push;
namely, check if the sole argument is "-h", and if so show help and exit.

	Clarification. the following description only talks about "cmd -h"
	without any other options and arguments.

Such a change cannot be breaking backward compatibility for...

 * "cherry -h" could be asking to compare histories that leads to our HEAD
   and a commit that can be named as "-h".  Strictly speaking, that may be
   a valid refname, but the user would have to say something like
   "tags/-h" to name such a pathological ref already, so I do not think it
   is such a big deal.

 * "commit-tree -h" is to make a root commit that records a tree-ish
   pointed by a tag whose name is "-h".  Same as above.

 * The first word to "fetch--tool" is a subcommand name, so "fetch--tool -h"
   is an error and there cannot be any existing callers.  Besides, is it
   still being used?

 * "grep -h" cannot be asking for suppressing filenames as there is no
   match pattern specified.

 * "merge-*" strategy backends take the merge base (or "--") as the first
   parameter; it cannot sanely be "-h". The callers are supposed to run
   rev-parse to make it 40-hexdigit and the command won't see a refname
   anyway.

That leaves "show-ref -h".  It shows all the refs/* and HEAD, as opposed
to "show-ref" that shows all the refs/* and not HEAD.

Does anybody use "show-ref -h"?  It was in Linus's original, and I suspect
it was done only because he thought "it might be handy", not because "the
command should not show the HEAD by default for such and such reasons".
So I think it actually is Ok if "show-ref -h" (but not "show-ref --head")
gave help and exit.

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH] Let 'git <command> -h' show usage without a git dir
  2009-11-08  9:21   ` [PATCH] Let 'git <command> -h' show usage without a git dir Junio C Hamano
@ 2009-11-08 11:03     ` Jonathan Nieder
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
  0 siblings, 1 reply; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-08 11:03 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Gerfried Fuchs, 462557

Junio C Hamano wrote:
> Jonathan Nieder <jrnieder@gmail.com> writes:
> 
>> +/*
>> + * Let RUN_SETUP, USE_PAGER, and NEED_WORK_TREE take effect even if
>> + * passed the -h option.
>> + */
>> +#define H_IS_NOT_HELP	(1<<3)
> 
> Yuck.  Let's think of a way to avoid this ugliness.

Thank you. :)

> So I think the right approach is something like how you handled http-push;
> namely, check if the sole argument is "-h", and if so show help and exit.
> 
> 	Clarification. the following description only talks about "cmd -h"
> 	without any other options and arguments.
> 
> Such a change cannot be breaking backward compatibility for...
[...]
>  * "grep -h" cannot be asking for suppressing filenames as there is no
>    match pattern specified.

Okay, here’s a start.

-- %< --
Subject: Show usage string for 'git grep -h'

Clarification: the following description only talks about "git
grep -h" without any other options and arguments.

Such a change cannot be breaking backward compatibility.  "grep
-h" cannot be asking for suppressing filenames, as there is no
match pattern specified.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Is the long usage information really what is wanted here?  (I would
think yes, since there is no other way to get that, but sometimes all
I want is a reminder of the non-optional arguments.)

Without something like the previous patch, the usage information is
captured by a pager.  I know this is an accidental thing (not all
commands send their -h output through a pager), but it is very
convenient and mitigates the first effect somewhat.  Should
whatever -h always use with a pager?

The -h output is very long, and since it goes to standard error,
"git grep -h | head" does not succeed in capturing the best of it.

Usage errors caught in the same function die() currently.  I was going
to switch them to usage_msg_opt(), but because of the long usage
message, that would cause the error message to scroll off the
screen...

So I am not totally happy with this.  But it is certainly an
improvement over the output from before:

$ git grep -h
fatal: no pattern given.

I’ll sleep on it.  Thank you for the advice.

Good night,
Jonathan

 builtin-grep.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/builtin-grep.c b/builtin-grep.c
index 1df25b0..01be9bf 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -788,6 +788,13 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 
+	/*
+	 * 'git grep -h', unlike 'git grep -h <pattern>', is a request
+	 * to show usage information and exit.
+	 */
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage_with_options(grep_usage, options);
+
 	memset(&opt, 0, sizeof(opt));
 	opt.prefix = prefix;
 	opt.prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* Re: [PATCH] Show usage string for 'git http-push -h'
  2009-11-08  7:26   ` [PATCH] Show usage string for 'git http-push -h' Jonathan Nieder
@ 2009-11-09  8:52     ` Tay Ray Chuan
  2009-11-09 10:47       ` [PATCH v2] " Jonathan Nieder
  0 siblings, 1 reply; 39+ messages in thread
From: Tay Ray Chuan @ 2009-11-09  8:52 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: Git Mailing List, Junio C Hamano

Hi,

On Sun, Nov 8, 2009 at 3:26 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:
> @@ -1792,6 +1792,11 @@ int main(int argc, char **argv)
>
>        git_extract_argv0_path(argv[0]);
>
> +       if (argc == 2 && !strcmp(argv[1], "-h")) {
> +               fprintf(stderr, "usage: %s\n", http_push_usage);
> +               return 0;
> +       }
> +
>        setup_git_directory();
>
>        repo = xcalloc(sizeof(*repo), 1);

just curious, I'm wondering why isn't the check for "-h" done in the
argv loop later on? I see this being done already in the builtins
diff, log, ls-remote and update-index.

Also, unlike grep, -h <arg> is not an option we're looking out for, so
I'm not sure if we should allow the user to mix -h with a valid set of
arguments (which is what Johnathan's patch would allow).

-- 
Cheers,
Ray Chuan

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH v2] Show usage string for 'git http-push -h'
  2009-11-09  8:52     ` Tay Ray Chuan
@ 2009-11-09 10:47       ` Jonathan Nieder
  2009-11-09 13:56         ` Tay Ray Chuan
  0 siblings, 1 reply; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 10:47 UTC (permalink / raw)
  To: Tay Ray Chuan; +Cc: Git Mailing List, Junio C Hamano

http-push already knows how to dump usage if it is given no
options, but it interprets '-h' as the URL to a remote
repository:

$ git http-push -h
error: Cannot access URL -h/, return code 6

Dump usage instead.  Humans wanting to pass the URL -h/ to curl
for some reason can use 'git http-push -h/' explicitly.  Scripts
expecting to access an HTTP repository at URL '-h' will break,
though.

Also delay finding a git directory until after option parsing, so
"http-push -h" can be used outside any git repository.

Cc: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Tay Ray Chuan wrote:

> just curious, I'm wondering why isn't the check for "-h" done in the
> argv loop later on? I see this being done already in the builtins
> diff, log, ls-remote and update-index.

Good question. :)

(I was making sure "git http-push -h" would work without a git
directory by putting the check for -h before setup_git_directory().
But nothing in the argv loop requires a git repository, so it is
better and simpler to move the setup_git_directory() call to after the
loop.  Thanks for the catch.)

> Also, unlike grep, -h <arg> is not an option we're looking out for, so
> I'm not sure if we should allow the user to mix -h with a valid set of
> arguments (which is what Johnathan's patch would allow).

Makes sense.

 http-push.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/http-push.c b/http-push.c
index 00e83dc..ad1a6c9 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1792,8 +1792,6 @@ int main(int argc, char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
-	setup_git_directory();
-
 	repo = xcalloc(sizeof(*repo), 1);
 
 	argv++;
@@ -1827,6 +1825,8 @@ int main(int argc, char **argv)
 				force_delete = 1;
 				continue;
 			}
+			if (!strcmp(arg, "-h"))
+				usage(http_push_usage);
 		}
 		if (!repo->url) {
 			char *path = strstr(arg, "//");
@@ -1854,6 +1854,8 @@ int main(int argc, char **argv)
 	if (delete_branch && nr_refspec != 1)
 		die("You must specify only one branch name when deleting a remote branch");
 
+	setup_git_directory();
+
 	memset(remote_dir_exists, -1, 256);
 
 	/*
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* Re: [PATCH v2] Show usage string for 'git http-push -h'
  2009-11-09 10:47       ` [PATCH v2] " Jonathan Nieder
@ 2009-11-09 13:56         ` Tay Ray Chuan
  0 siblings, 0 replies; 39+ messages in thread
From: Tay Ray Chuan @ 2009-11-09 13:56 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: Git Mailing List, Junio C Hamano

Hi,

On Mon, Nov 9, 2009 at 6:47 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:
> (I was making sure "git http-push -h" would work without a git
> directory by putting the check for -h before setup_git_directory().
> But nothing in the argv loop requires a git repository, so it is
> better and simpler to move the setup_git_directory() call to after the
> loop.  Thanks for the catch.)

Actually, I didn't notice the removal of the "is in a git directory
for -h" requirement; I was only looking at the argument mix.

Thanks.

Acked-by: Tay Ray Chuan <rctay89@gmail.com>

-- 
Cheers,
Ray Chuan

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 00/24] Let 'git <command> -h' show usage without a git dir
  2009-11-08 11:03     ` Jonathan Nieder
@ 2009-11-09 15:02       ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 01/24] Retire fetch--tool helper to contrib/examples Jonathan Nieder
                           ` (23 more replies)
  0 siblings, 24 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:02 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Junio C Hamano wrote:

> So I think the right approach is something like how you handled http-push;
> namely, check if the sole argument is "-h", and if so show help and exit.

I took a more aggressive approach with some commands.  As long as it
was obviously safe and not too complicated to implement, I let -h work
wherever other options work.

Tested with

git_home=$(pwd)
while read a b
do
	cmd=${a#git-}
	test "$cmd" = "$a" && continue
	echo "$cmd"
	( cd /tmp && "$git_home/git" "$cmd" -h 2>&1 | head -1 )
done |
less

and the test suite.

Thoughts?

Jonathan Nieder (24):
  Retire fetch--tool helper to contrib/examples
  Show usage string for 'git grep -h'
  Show usage string for 'git cherry -h'
  Show usage string for 'git commit-tree -h'
  Show usage string for 'git merge-ours -h'
  Show usage string for 'git show-ref -h'
  check-ref-format: update usage string
  Show usage string for 'git check-ref-format -h'
  Show usage string for 'git fast-import -h'
  Show usage string for 'git get-tar-commit-id -h'
  Show usage string for 'git imap-send -h'
  Show usage string for 'git mailsplit -h'
  Show usage string for 'git merge-one-file -h'
  Show usage string for 'git rev-parse -h'
  Show usage string for 'git show-index -h'
  Show usage string for 'git unpack-file -h'
  Show usage string for 'git stripspace -h'
  merge: do not setup worktree twice
  Let 'git http-fetch -h' show usage outside any git repository
  http-fetch: add missing initialization of argv0_path
  Let 'git <command> -h' show usage without a git dir
  Let usage() take a printf-style format
  merge-{recursive,subtree}: use usage() to print usage
  diff --no-index: make the usage string less scary

 Documentation/git-show-ref.txt                     |    3 +-
 Makefile                                           |    1 -
 builtin-check-ref-format.c                         |    9 +++++++-
 builtin-commit-tree.c                              |    2 +-
 builtin-grep.c                                     |    7 ++++++
 builtin-log.c                                      |    9 ++++++++
 builtin-mailsplit.c                                |    2 +
 builtin-merge-ours.c                               |    6 +++++
 builtin-merge-recursive.c                          |    2 +-
 builtin-merge.c                                    |    1 -
 builtin-mv.c                                       |    8 +++---
 builtin-read-tree.c                                |    4 +-
 builtin-reflog.c                                   |    3 ++
 builtin-rerere.c                                   |    3 ++
 builtin-rev-parse.c                                |   10 +++++++++
 builtin-show-ref.c                                 |   10 +++++++-
 builtin-stripspace.c                               |    4 ++-
 builtin-tar-tree.c                                 |    6 +++++
 builtin.h                                          |    1 -
 .../examples/builtin-fetch--tool.c                 |    0
 diff-no-index.c                                    |    2 +-
 fast-import.c                                      |    3 ++
 git-compat-util.h                                  |    2 +-
 git-merge-one-file.sh                              |   12 ++++++++++
 git.c                                              |   22 ++++++++++---------
 http-fetch.c                                       |   21 ++++++++++++------
 imap-send.c                                        |    5 ++++
 index-pack.c                                       |    3 ++
 pack-redundant.c                                   |    3 ++
 show-index.c                                       |    5 ++++
 unpack-file.c                                      |    2 +-
 usage.c                                            |   14 ++++++++----
 32 files changed, 143 insertions(+), 42 deletions(-)
 rename builtin-fetch--tool.c => contrib/examples/builtin-fetch--tool.c (100%)

^ permalink raw reply	[flat|nested] 39+ messages in thread

* [PATCH 01/24] Retire fetch--tool helper to contrib/examples
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 02/24] Show usage string for 'git grep -h' Jonathan Nieder
                           ` (22 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

When git-fetch was builtin-ized, the previous script was moved to
contrib/examples.  Now, it is the sole remaining user for
'git fetch--tool'.

The fetch--tool code is still worth keeping around so people can
try out the old git-fetch.sh, for example when investigating
regressions from the builtinifaction.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
See also <http://thread.gmane.org/gmane.comp.version-control.git/65122/focus=65191>.

 Makefile                                           |    1 -
 builtin.h                                          |    1 -
 .../examples/builtin-fetch--tool.c                 |    0
 git.c                                              |    1 -
 4 files changed, 0 insertions(+), 3 deletions(-)
 rename builtin-fetch--tool.c => contrib/examples/builtin-fetch--tool.c (100%)

diff --git a/Makefile b/Makefile
index 5d5976f..c0ba479 100644
--- a/Makefile
+++ b/Makefile
@@ -601,7 +601,6 @@ BUILTIN_OBJS += builtin-diff-index.o
 BUILTIN_OBJS += builtin-diff-tree.o
 BUILTIN_OBJS += builtin-diff.o
 BUILTIN_OBJS += builtin-fast-export.o
-BUILTIN_OBJS += builtin-fetch--tool.o
 BUILTIN_OBJS += builtin-fetch-pack.o
 BUILTIN_OBJS += builtin-fetch.o
 BUILTIN_OBJS += builtin-fmt-merge-msg.o
diff --git a/builtin.h b/builtin.h
index a2174dc..c3f83c0 100644
--- a/builtin.h
+++ b/builtin.h
@@ -48,7 +48,6 @@ extern int cmd_diff_tree(int argc, const char **argv, const char *prefix);
 extern int cmd_fast_export(int argc, const char **argv, const char *prefix);
 extern int cmd_fetch(int argc, const char **argv, const char *prefix);
 extern int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
-extern int cmd_fetch__tool(int argc, const char **argv, const char *prefix);
 extern int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix);
 extern int cmd_for_each_ref(int argc, const char **argv, const char *prefix);
 extern int cmd_format_patch(int argc, const char **argv, const char *prefix);
diff --git a/builtin-fetch--tool.c b/contrib/examples/builtin-fetch--tool.c
similarity index 100%
rename from builtin-fetch--tool.c
rename to contrib/examples/builtin-fetch--tool.c
diff --git a/git.c b/git.c
index bd2c5fe..f295561 100644
--- a/git.c
+++ b/git.c
@@ -304,7 +304,6 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "fast-export", cmd_fast_export, RUN_SETUP },
 		{ "fetch", cmd_fetch, RUN_SETUP },
 		{ "fetch-pack", cmd_fetch_pack, RUN_SETUP },
-		{ "fetch--tool", cmd_fetch__tool, RUN_SETUP },
 		{ "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP },
 		{ "for-each-ref", cmd_for_each_ref, RUN_SETUP },
 		{ "format-patch", cmd_format_patch, RUN_SETUP },
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 02/24] Show usage string for 'git grep -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 01/24] Retire fetch--tool helper to contrib/examples Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 03/24] Show usage string for 'git cherry -h' Jonathan Nieder
                           ` (21 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Junio C Hamano

Clarification: the following description only talks about "git
grep -h" without any other options and arguments.

Such a change cannot be breaking backward compatibility.  "grep
-h" cannot be asking for suppressing filenames, as there is no
match pattern specified.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin-grep.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/builtin-grep.c b/builtin-grep.c
index 1df25b0..01be9bf 100644
--- a/builtin-grep.c
+++ b/builtin-grep.c
@@ -788,6 +788,13 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 
+	/*
+	 * 'git grep -h', unlike 'git grep -h <pattern>', is a request
+	 * to show usage information and exit.
+	 */
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage_with_options(grep_usage, options);
+
 	memset(&opt, 0, sizeof(opt));
 	opt.prefix = prefix;
 	opt.prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 03/24] Show usage string for 'git cherry -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 01/24] Retire fetch--tool helper to contrib/examples Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 02/24] Show usage string for 'git grep -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 04/24] Show usage string for 'git commit-tree -h' Jonathan Nieder
                           ` (20 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Treat an "-h" option as a request for help, rather than an
"Unknown commit -h" error.

"cherry -h" could be asking to compare histories that leads to
our HEAD and a commit that can be named as "-h".  Strictly
speaking, that may be a valid refname, but the user would have to
say something like "tags/-h" to name such a pathological ref
already, so it is not such a big deal.

The "-h" option keeps its meaning even if preceded by other
options or followed by other arguments.  This keeps the
command-line syntax closer to what parse_options would give and
supports shell aliases like 'alias cherry="git cherry -v"' a
little better.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-log.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/builtin-log.c b/builtin-log.c
index 207a361..5248507 100644
--- a/builtin-log.c
+++ b/builtin-log.c
@@ -1237,6 +1237,9 @@ int cmd_cherry(int argc, const char **argv, const char *prefix)
 		argv++;
 	}
 
+	if (argc > 1 && !strcmp(argv[1], "-h"))
+		usage(cherry_usage);
+
 	switch (argc) {
 	case 4:
 		limit = argv[3];
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 04/24] Show usage string for 'git commit-tree -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (2 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 03/24] Show usage string for 'git cherry -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 05/24] Show usage string for 'git merge-ours -h' Jonathan Nieder
                           ` (19 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Treat an "-h" option as a request for help, rather than a "Not a
valid object name" error.

"commit-tree -h" could be asking to create a new commit from a
treeish named "-h".  Strictly speaking, such a pathological ref
name is possible, but the user would have to had said something
like "tags/-h" to name such a pathological already.  commit-tree
is usually used in scripts with raw object ids, anyway.

For consistency, the "-h" option uses its new meaning even if
followed by other arguments.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-commit-tree.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/builtin-commit-tree.c b/builtin-commit-tree.c
index 6467077..ddcb7a4 100644
--- a/builtin-commit-tree.c
+++ b/builtin-commit-tree.c
@@ -105,7 +105,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
 
 	git_config(git_default_config, NULL);
 
-	if (argc < 2)
+	if (argc < 2 || !strcmp(argv[1], "-h"))
 		usage(commit_tree_usage);
 	if (get_sha1(argv[1], tree_sha1))
 		die("Not a valid object name %s", argv[1]);
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 05/24] Show usage string for 'git merge-ours -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (3 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 04/24] Show usage string for 'git commit-tree -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH/RFC 06/24] Show usage string for 'git show-ref -h' Jonathan Nieder
                           ` (18 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

This change is strictly about 'git merge-ours -h' without
any other options and arguments.

This change cannot break compatibility since merge drivers are
always passed '--', among other arguments.

Any usage string for this command is a lie, since it ignored its
arguments until now.  Still, it makes sense to let the user know
the expected usage when asked.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-merge-ours.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/builtin-merge-ours.c b/builtin-merge-ours.c
index 8f5bbaf..6844116 100644
--- a/builtin-merge-ours.c
+++ b/builtin-merge-ours.c
@@ -10,6 +10,9 @@
 #include "git-compat-util.h"
 #include "builtin.h"
 
+static const char builtin_merge_ours_usage[] =
+	"git merge-ours <base>... -- HEAD <remote>...";
+
 static const char *diff_index_args[] = {
 	"diff-index", "--quiet", "--cached", "HEAD", "--", NULL
 };
@@ -17,6 +20,9 @@ static const char *diff_index_args[] = {
 
 int cmd_merge_ours(int argc, const char **argv, const char *prefix)
 {
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage(builtin_merge_ours_usage);
+
 	/*
 	 * We need to exit with 2 if the index does not match our HEAD tree,
 	 * because the current index is what we will be committing as the
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH/RFC 06/24] Show usage string for 'git show-ref -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (4 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 05/24] Show usage string for 'git merge-ours -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 07/24] check-ref-format: update usage string Jonathan Nieder
                           ` (17 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

This only changes the behavior of "git show-ref -h" without any
other options and arguments.

"show-ref -h" currently is short for "show-ref --head", which
shows all the refs/* and HEAD, as opposed to "show-ref" that
shows all the refs/* and not HEAD.

Does anybody use "show-ref -h"?  It was in Linus's original, most
likely only because "it might be handy", not because "the command
should not show the HEAD by default for such and such reasons".
So I think it is okay if "show-ref -h" (but not "show-ref
--head") gives help and exits.

If a current script uses "git show-ref -h" without any other
arguments, it would have to be adapted by changing "-h" to
"--head".

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 Documentation/git-show-ref.txt |    3 +--
 builtin-show-ref.c             |   10 ++++++++--
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt
index f4429bd..70f400b 100644
--- a/Documentation/git-show-ref.txt
+++ b/Documentation/git-show-ref.txt
@@ -8,7 +8,7 @@ git-show-ref - List references in a local repository
 SYNOPSIS
 --------
 [verse]
-'git show-ref' [-q|--quiet] [--verify] [-h|--head] [-d|--dereference]
+'git show-ref' [-q|--quiet] [--verify] [--head] [-d|--dereference]
 	     [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags]
 	     [--heads] [--] <pattern>...
 'git show-ref' --exclude-existing[=<pattern>] < ref-list
@@ -30,7 +30,6 @@ the `.git` directory.
 OPTIONS
 -------
 
--h::
 --head::
 
 	Show the HEAD reference.
diff --git a/builtin-show-ref.c b/builtin-show-ref.c
index c46550c..17ada88 100644
--- a/builtin-show-ref.c
+++ b/builtin-show-ref.c
@@ -7,7 +7,7 @@
 #include "parse-options.h"
 
 static const char * const show_ref_usage[] = {
-	"git show-ref [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] ",
+	"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] ",
 	"git show-ref --exclude-existing[=pattern] < ref-list",
 	NULL
 };
@@ -183,7 +183,10 @@ static const struct option show_ref_options[] = {
 	OPT_BOOLEAN(0, "heads", &heads_only, "only show heads (can be combined with tags)"),
 	OPT_BOOLEAN(0, "verify", &verify, "stricter reference checking, "
 		    "requires exact ref path"),
-	OPT_BOOLEAN('h', "head", &show_head, "show the HEAD reference"),
+	{ OPTION_BOOLEAN, 'h', NULL, &show_head, NULL,
+	  "show the HEAD reference",
+	  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
+	OPT_BOOLEAN(0, "head", &show_head, "show the HEAD reference"),
 	OPT_BOOLEAN('d', "dereference", &deref_tags,
 		    "dereference tags into object IDs"),
 	{ OPTION_CALLBACK, 's', "hash", &abbrev, "n",
@@ -201,6 +204,9 @@ static const struct option show_ref_options[] = {
 
 int cmd_show_ref(int argc, const char **argv, const char *prefix)
 {
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage_with_options(show_ref_usage, show_ref_options);
+
 	argc = parse_options(argc, argv, prefix, show_ref_options,
 			     show_ref_usage, PARSE_OPT_NO_INTERNAL_HELP);
 
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 07/24] check-ref-format: update usage string
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (5 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH/RFC 06/24] Show usage string for 'git show-ref -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-10 20:11           ` Junio C Hamano
  2009-11-09 15:04         ` [PATCH 08/24] Show usage string for 'git check-ref-format -h' Jonathan Nieder
                           ` (16 subsequent siblings)
  23 siblings, 1 reply; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

'git check-ref-format' has learned --branch and --print options
since the usage string was last updated.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-check-ref-format.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/builtin-check-ref-format.c b/builtin-check-ref-format.c
index e3e7bdf..513f134 100644
--- a/builtin-check-ref-format.c
+++ b/builtin-check-ref-format.c
@@ -7,6 +7,10 @@
 #include "builtin.h"
 #include "strbuf.h"
 
+static const char builtin_check_ref_format_usage[] =
+"git check-ref-format [--print] <refname>\n"
+"   or: git check-ref-format --branch <branchname-shorthand>";
+
 /*
  * Replace each run of adjacent slashes in src with a single slash,
  * and write the result to dst.
@@ -49,6 +53,6 @@ int cmd_check_ref_format(int argc, const char **argv, const char *prefix)
 		exit(0);
 	}
 	if (argc != 2)
-		usage("git check-ref-format refname");
+		usage(builtin_check_ref_format_usage);
 	return !!check_ref_format(argv[1]);
 }
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 08/24] Show usage string for 'git check-ref-format -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (6 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 07/24] check-ref-format: update usage string Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 09/24] Show usage string for 'git fast-import -h' Jonathan Nieder
                           ` (15 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

This only changes the behavior of "git check-ref-format -h"
without any other options and arguments.

This change cannot be breaking backward compatibility, since any
valid refname must contain a /.   Most existing scripts use
arguments such as "heads/$foo".  If some script checks the
refname "-h" alone, git check-ref-format will still exit with
nonzero status, and the only detrimental side-effect will be a
usage string sent to stderr.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-check-ref-format.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/builtin-check-ref-format.c b/builtin-check-ref-format.c
index 513f134..b106c65 100644
--- a/builtin-check-ref-format.c
+++ b/builtin-check-ref-format.c
@@ -35,6 +35,9 @@ static void collapse_slashes(char *dst, const char *src)
 
 int cmd_check_ref_format(int argc, const char **argv, const char *prefix)
 {
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage(builtin_check_ref_format_usage);
+
 	if (argc == 3 && !strcmp(argv[1], "--branch")) {
 		struct strbuf sb = STRBUF_INIT;
 
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 09/24] Show usage string for 'git fast-import -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (7 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 08/24] Show usage string for 'git check-ref-format -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 10/24] Show usage string for 'git get-tar-commit-id -h' Jonathan Nieder
                           ` (14 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Shawn O. Pearce

Let "git fast-import -h" (with no other arguments) print usage
before exiting, even when run outside any repository.

Cc: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 fast-import.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/fast-import.c b/fast-import.c
index 6faaaac..f4f1de6 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -2405,6 +2405,9 @@ int main(int argc, const char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage(fast_import_usage);
+
 	setup_git_directory();
 	git_config(git_pack_config, NULL);
 	if (!pack_compression_seen && core_compression_seen)
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 10/24] Show usage string for 'git get-tar-commit-id -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (8 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 09/24] Show usage string for 'git fast-import -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 11/24] Show usage string for 'git imap-send -h' Jonathan Nieder
                           ` (13 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-tar-tree.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/builtin-tar-tree.c b/builtin-tar-tree.c
index 8b3a35e..3f1e701 100644
--- a/builtin-tar-tree.c
+++ b/builtin-tar-tree.c
@@ -11,6 +11,9 @@ static const char tar_tree_usage[] =
 "git tar-tree [--remote=<repo>] <tree-ish> [basedir]\n"
 "*** Note that this command is now deprecated; use \"git archive\" instead.";
 
+static const char builtin_get_tar_commit_id_usage[] =
+"git get-tar-commit-id < <tarfile>";
+
 int cmd_tar_tree(int argc, const char **argv, const char *prefix)
 {
 	/*
@@ -81,6 +84,9 @@ int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix)
 	char *content = buffer + RECORDSIZE;
 	ssize_t n;
 
+	if (argc != 1)
+		usage(builtin_get_tar_commit_id_usage);
+
 	n = read_in_full(0, buffer, HEADERSIZE);
 	if (n < HEADERSIZE)
 		die("git get-tar-commit-id: read error");
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 11/24] Show usage string for 'git imap-send -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (9 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 10/24] Show usage string for 'git get-tar-commit-id -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 12/24] Show usage string for 'git mailsplit -h' Jonathan Nieder
                           ` (12 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 imap-send.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/imap-send.c b/imap-send.c
index 3847fd1..04e5374 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -93,6 +93,8 @@ struct msg_data {
 	unsigned int crlf:1;
 };
 
+static const char imap_send_usage[] = "git imap-send < <mbox>";
+
 #define DRV_OK          0
 #define DRV_MSG_BAD     -1
 #define DRV_BOX_BAD     -2
@@ -1491,6 +1493,9 @@ int main(int argc, char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
+	if (argc != 1)
+		usage(imap_send_usage);
+
 	/* init the random number generator */
 	arc4_init();
 
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 12/24] Show usage string for 'git mailsplit -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (10 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 11/24] Show usage string for 'git imap-send -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 13/24] Show usage string for 'git merge-one-file -h' Jonathan Nieder
                           ` (11 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-mailsplit.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/builtin-mailsplit.c b/builtin-mailsplit.c
index dfe5b15..207e358 100644
--- a/builtin-mailsplit.c
+++ b/builtin-mailsplit.c
@@ -231,6 +231,8 @@ int cmd_mailsplit(int argc, const char **argv, const char *prefix)
 			continue;
 		} else if ( arg[1] == 'f' ) {
 			nr = strtol(arg+2, NULL, 10);
+		} else if ( arg[1] == 'h' ) {
+			usage(git_mailsplit_usage);
 		} else if ( arg[1] == 'b' && !arg[2] ) {
 			allow_bare = 1;
 		} else if (!strcmp(arg, "--keep-cr")) {
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 13/24] Show usage string for 'git merge-one-file -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (11 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 12/24] Show usage string for 'git mailsplit -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 14/24] Show usage string for 'git rev-parse -h' Jonathan Nieder
                           ` (10 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 git-merge-one-file.sh |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh
index 9c2c1b7..d067894 100755
--- a/git-merge-one-file.sh
+++ b/git-merge-one-file.sh
@@ -16,6 +16,18 @@
 # been handled already by git read-tree, but that one doesn't
 # do any merges that might change the tree layout.
 
+USAGE='<orig blob> <our blob> <their blob> <path>'
+USAGE="$USAGE <orig mode> <our mode> <their mode>"
+LONG_USAGE="Usage: git merge-one-file $USAGE
+
+Blob ids and modes should be empty for missing files."
+
+if ! test "$#" -eq 7
+then
+	echo "$LONG_USAGE"
+	exit 1
+fi
+
 case "${1:-.}${2:-.}${3:-.}" in
 #
 # Deleted in both or deleted in one and unchanged in the other
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 14/24] Show usage string for 'git rev-parse -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (12 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 13/24] Show usage string for 'git merge-one-file -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 15/24] Show usage string for 'git show-index -h' Jonathan Nieder
                           ` (9 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-rev-parse.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c
index 45bead6..24ee8b3 100644
--- a/builtin-rev-parse.c
+++ b/builtin-rev-parse.c
@@ -426,6 +426,13 @@ static void die_no_single_rev(int quiet)
 		die("Needed a single revision");
 }
 
+static const char builtin_rev_parse_usage[] =
+"git rev-parse --parseopt [options] -- [<args>...]\n"
+"   or: git rev-parse --sq-quote [<arg>...]\n"
+"   or: git rev-parse [options] [<arg>...]\n"
+"\n"
+"Run \"git rev-parse --parseopt -h\" for more information on the first usage.";
+
 int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 {
 	int i, as_is = 0, verify = 0, quiet = 0, revs_count = 0, type = 0;
@@ -438,6 +445,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 	if (argc > 1 && !strcmp("--sq-quote", argv[1]))
 		return cmd_sq_quote(argc - 2, argv + 2);
 
+	if (argc > 1 && !strcmp("-h", argv[1]))
+		usage(builtin_rev_parse_usage);
+
 	prefix = setup_git_directory();
 	git_config(git_default_config, NULL);
 	for (i = 1; i < argc; i++) {
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 15/24] Show usage string for 'git show-index -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (13 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 14/24] Show usage string for 'git rev-parse -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 16/24] Show usage string for 'git unpack-file -h' Jonathan Nieder
                           ` (8 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 show-index.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/show-index.c b/show-index.c
index 45bb535..63f9da5 100644
--- a/show-index.c
+++ b/show-index.c
@@ -1,6 +1,9 @@
 #include "cache.h"
 #include "pack.h"
 
+static const char show_index_usage[] =
+"git show-index < <packed archive index>";
+
 int main(int argc, char **argv)
 {
 	int i;
@@ -8,6 +11,8 @@ int main(int argc, char **argv)
 	unsigned int version;
 	static unsigned int top_index[256];
 
+	if (argc != 1)
+		usage(show_index_usage);
 	if (fread(top_index, 2 * 4, 1, stdin) != 1)
 		die("unable to read header");
 	if (top_index[0] == htonl(PACK_IDX_SIGNATURE)) {
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 16/24] Show usage string for 'git unpack-file -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (14 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 15/24] Show usage string for 'git show-index -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 17/24] Show usage string for 'git stripspace -h' Jonathan Nieder
                           ` (7 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

"unpack-file -h" could be asking to save the contents of a blob
named "-h".  Strictly speaking, such a pathological ref name is
possible, but the user would have to had said something like
"tags/-h" to name such a pathological ref already.  When used in
scripts, unpack-file is typically not passed a user-supplied tag
name directly.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 unpack-file.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/unpack-file.c b/unpack-file.c
index ac9cbf7..e9d8934 100644
--- a/unpack-file.c
+++ b/unpack-file.c
@@ -28,7 +28,7 @@ int main(int argc, char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
-	if (argc != 2)
+	if (argc != 2 || !strcmp(argv[1], "-h"))
 		usage("git unpack-file <sha1>");
 	if (get_sha1(argv[1], sha1))
 		die("Not a valid object name %s", argv[1]);
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 17/24] Show usage string for 'git stripspace -h'
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (15 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 16/24] Show usage string for 'git unpack-file -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:04         ` [PATCH 18/24] merge: do not setup worktree twice Jonathan Nieder
                           ` (6 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-stripspace.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/builtin-stripspace.c b/builtin-stripspace.c
index 1fd2205..4d3b93f 100644
--- a/builtin-stripspace.c
+++ b/builtin-stripspace.c
@@ -73,9 +73,11 @@ int cmd_stripspace(int argc, const char **argv, const char *prefix)
 	struct strbuf buf = STRBUF_INIT;
 	int strip_comments = 0;
 
-	if (argc > 1 && (!strcmp(argv[1], "-s") ||
+	if (argc == 2 && (!strcmp(argv[1], "-s") ||
 				!strcmp(argv[1], "--strip-comments")))
 		strip_comments = 1;
+	else if (argc > 1)
+		usage("git stripspace [-s | --strip-comments] < <stream>");
 
 	if (strbuf_read(&buf, 0, 1024) < 0)
 		die_errno("could not read the input");
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 18/24] merge: do not setup worktree twice
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (16 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 17/24] Show usage string for 'git stripspace -h' Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-10 20:11           ` Junio C Hamano
  2009-11-09 15:04         ` [PATCH 19/24] Let 'git http-fetch -h' show usage outside any git repository Jonathan Nieder
                           ` (5 subsequent siblings)
  23 siblings, 1 reply; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Builtins do not need to run setup_worktree() for themselves, since
the builtin machinery runs it for them.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
This matter since '-h' cannot suppress _this_ setup_work_tree()
through the builtin machinery.

 builtin-merge.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/builtin-merge.c b/builtin-merge.c
index c69a305..1857138 100644
--- a/builtin-merge.c
+++ b/builtin-merge.c
@@ -843,7 +843,6 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 	const char *best_strategy = NULL, *wt_strategy = NULL;
 	struct commit_list **remotes = &remoteheads;
 
-	setup_work_tree();
 	if (file_exists(git_path("MERGE_HEAD")))
 		die("You have not concluded your merge. (MERGE_HEAD exists)");
 	if (read_cache_unmerged())
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 19/24] Let 'git http-fetch -h' show usage outside any git repository
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (17 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 18/24] merge: do not setup worktree twice Jonathan Nieder
@ 2009-11-09 15:04         ` Jonathan Nieder
  2009-11-09 15:05         ` [PATCH 20/24] http-fetch: add missing initialization of argv0_path Jonathan Nieder
                           ` (4 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:04 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Delay search for a git directory until option parsing has finished.
None of the functions used in option parsing look for or read any
files other than stdin, so this is safe.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 http-fetch.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/http-fetch.c b/http-fetch.c
index e8f44ba..52a4f6d 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -1,6 +1,10 @@
 #include "cache.h"
+#include "exec_cmd.h"
 #include "walker.h"
 
+static const char http_fetch_usage[] = "git http-fetch "
+"[-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url";
+
 int main(int argc, const char **argv)
 {
 	const char *prefix;
@@ -19,10 +23,6 @@ int main(int argc, const char **argv)
 	int get_verbosely = 0;
 	int get_recover = 0;
 
-	prefix = setup_git_directory();
-
-	git_config(git_default_config, NULL);
-
 	while (arg < argc && argv[arg][0] == '-') {
 		if (argv[arg][1] == 't') {
 			get_tree = 1;
@@ -37,6 +37,8 @@ int main(int argc, const char **argv)
 		} else if (argv[arg][1] == 'w') {
 			write_ref = &argv[arg + 1];
 			arg++;
+		} else if (argv[arg][1] == 'h') {
+			usage(http_fetch_usage);
 		} else if (!strcmp(argv[arg], "--recover")) {
 			get_recover = 1;
 		} else if (!strcmp(argv[arg], "--stdin")) {
@@ -44,10 +46,8 @@ int main(int argc, const char **argv)
 		}
 		arg++;
 	}
-	if (argc < arg + 2 - commits_on_stdin) {
-		usage("git http-fetch [-c] [-t] [-a] [-v] [--recover] [-w ref] [--stdin] commit-id url");
-		return 1;
-	}
+	if (argc != arg + 2 - commits_on_stdin)
+		usage(http_fetch_usage);
 	if (commits_on_stdin) {
 		commits = walker_targets_stdin(&commit_id, &write_ref);
 	} else {
@@ -55,6 +55,11 @@ int main(int argc, const char **argv)
 		commits = 1;
 	}
 	url = argv[arg];
+
+	prefix = setup_git_directory();
+
+	git_config(git_default_config, NULL);
+
 	if (url && url[strlen(url)-1] != '/') {
 		rewritten_url = xmalloc(strlen(url)+2);
 		strcpy(rewritten_url, url);
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 20/24] http-fetch: add missing initialization of argv0_path
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (18 preceding siblings ...)
  2009-11-09 15:04         ` [PATCH 19/24] Let 'git http-fetch -h' show usage outside any git repository Jonathan Nieder
@ 2009-11-09 15:05         ` Jonathan Nieder
  2009-11-10 20:12           ` Junio C Hamano
  2009-11-09 15:05         ` [PATCH 21/24] Let 'git <command> -h' show usage without a git dir Jonathan Nieder
                           ` (3 subsequent siblings)
  23 siblings, 1 reply; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:05 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 http-fetch.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/http-fetch.c b/http-fetch.c
index 52a4f6d..ffd0ad7 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -23,6 +23,8 @@ int main(int argc, const char **argv)
 	int get_verbosely = 0;
 	int get_recover = 0;
 
+	git_extract_argv0_path(argv[0]);
+
 	while (arg < argc && argv[arg][0] == '-') {
 		if (argv[arg][1] == 't') {
 			get_tree = 1;
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 21/24] Let 'git <command> -h' show usage without a git dir
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (19 preceding siblings ...)
  2009-11-09 15:05         ` [PATCH 20/24] http-fetch: add missing initialization of argv0_path Jonathan Nieder
@ 2009-11-09 15:05         ` Jonathan Nieder
  2009-11-09 15:05         ` [PATCH 22/24] Let usage() take a printf-style format Jonathan Nieder
                           ` (2 subsequent siblings)
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:05 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

There is no need for "git <command> -h" to depend on being inside
a repository.

Reported by Gerfried Fuchs through http://bugs.debian.org/462557

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-log.c       |    6 ++++++
 builtin-mv.c        |    8 ++++----
 builtin-read-tree.c |    4 ++--
 builtin-reflog.c    |    3 +++
 builtin-rerere.c    |    3 +++
 git.c               |   21 ++++++++++++---------
 index-pack.c        |    3 +++
 pack-redundant.c    |    3 +++
 8 files changed, 36 insertions(+), 15 deletions(-)

diff --git a/builtin-log.c b/builtin-log.c
index 5248507..a0fa30c 100644
--- a/builtin-log.c
+++ b/builtin-log.c
@@ -50,6 +50,12 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix,
 	if (default_date_mode)
 		rev->date_mode = parse_date_format(default_date_mode);
 
+	/*
+	 * Check for -h before setup_revisions(), or "git log -h" will
+	 * fail when run without a git directory.
+	 */
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage(builtin_log_usage);
 	argc = setup_revisions(argc, argv, rev, "HEAD");
 
 	if (rev->diffopt.pickaxe || rev->diffopt.filter)
diff --git a/builtin-mv.c b/builtin-mv.c
index 1b20028..f633d81 100644
--- a/builtin-mv.c
+++ b/builtin-mv.c
@@ -64,15 +64,15 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
 	git_config(git_default_config, NULL);
 
-	newfd = hold_locked_index(&lock_file, 1);
-	if (read_cache() < 0)
-		die("index file corrupt");
-
 	argc = parse_options(argc, argv, prefix, builtin_mv_options,
 			     builtin_mv_usage, 0);
 	if (--argc < 1)
 		usage_with_options(builtin_mv_usage, builtin_mv_options);
 
+	newfd = hold_locked_index(&lock_file, 1);
+	if (read_cache() < 0)
+		die("index file corrupt");
+
 	source = copy_pathspec(prefix, argv, argc, 0);
 	modes = xcalloc(argc, sizeof(enum update_mode));
 	dest_path = copy_pathspec(prefix, argv + argc, 1, 0);
diff --git a/builtin-read-tree.c b/builtin-read-tree.c
index 14c836b..2a3a32c 100644
--- a/builtin-read-tree.c
+++ b/builtin-read-tree.c
@@ -108,11 +108,11 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
 
 	git_config(git_default_config, NULL);
 
-	newfd = hold_locked_index(&lock_file, 1);
-
 	argc = parse_options(argc, argv, unused_prefix, read_tree_options,
 			     read_tree_usage, 0);
 
+	newfd = hold_locked_index(&lock_file, 1);
+
 	prefix_set = opts.prefix ? 1 : 0;
 	if (1 < opts.merge + opts.reset + prefix_set)
 		die("Which one? -m, --reset, or --prefix?");
diff --git a/builtin-reflog.c b/builtin-reflog.c
index e23b5ef..7498210 100644
--- a/builtin-reflog.c
+++ b/builtin-reflog.c
@@ -698,6 +698,9 @@ static const char reflog_usage[] =
 
 int cmd_reflog(int argc, const char **argv, const char *prefix)
 {
+	if (argc > 1 && !strcmp(argv[1], "-h"))
+		usage(reflog_usage);
+
 	/* With no command, we default to showing it. */
 	if (argc < 2 || *argv[1] == '-')
 		return cmd_log_reflog(argc, argv, prefix);
diff --git a/builtin-rerere.c b/builtin-rerere.c
index adfb7b5..343d6cd 100644
--- a/builtin-rerere.c
+++ b/builtin-rerere.c
@@ -106,6 +106,9 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
 	if (argc < 2)
 		return rerere();
 
+	if (!strcmp(argv[1], "-h"))
+		usage(git_rerere_usage);
+
 	fd = setup_rerere(&merge_rr);
 	if (fd < 0)
 		return 0;
diff --git a/git.c b/git.c
index f295561..743ee57 100644
--- a/git.c
+++ b/git.c
@@ -229,21 +229,24 @@ struct cmd_struct {
 
 static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
 {
-	int status;
+	int status, help;
 	struct stat st;
 	const char *prefix;
 
 	prefix = NULL;
-	if (p->option & RUN_SETUP)
-		prefix = setup_git_directory();
-
-	if (use_pager == -1 && p->option & RUN_SETUP)
-		use_pager = check_pager_config(p->cmd);
-	if (use_pager == -1 && p->option & USE_PAGER)
-		use_pager = 1;
+	help = argc == 2 && !strcmp(argv[1], "-h");
+	if (!help) {
+		if (p->option & RUN_SETUP)
+			prefix = setup_git_directory();
+
+		if (use_pager == -1 && p->option & RUN_SETUP)
+			use_pager = check_pager_config(p->cmd);
+		if (use_pager == -1 && p->option & USE_PAGER)
+			use_pager = 1;
+	}
 	commit_pager_choice();
 
-	if (p->option & NEED_WORK_TREE)
+	if (!help && p->option & NEED_WORK_TREE)
 		setup_work_tree();
 
 	trace_argv_printf(argv, "trace: built-in: git");
diff --git a/index-pack.c b/index-pack.c
index b4f8278..190f372 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -882,6 +882,9 @@ int main(int argc, char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage(index_pack_usage);
+
 	/*
 	 * We wish to read the repository's config file if any, and
 	 * for that it is necessary to call setup_git_directory_gently().
diff --git a/pack-redundant.c b/pack-redundant.c
index 69a7ab2..21c61db 100644
--- a/pack-redundant.c
+++ b/pack-redundant.c
@@ -603,6 +603,9 @@ int main(int argc, char **argv)
 
 	git_extract_argv0_path(argv[0]);
 
+	if (argc == 2 && !strcmp(argv[1], "-h"))
+		usage(pack_redundant_usage);
+
 	setup_git_directory();
 
 	for (i = 1; i < argc; i++) {
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 22/24] Let usage() take a printf-style format
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (20 preceding siblings ...)
  2009-11-09 15:05         ` [PATCH 21/24] Let 'git <command> -h' show usage without a git dir Jonathan Nieder
@ 2009-11-09 15:05         ` Jonathan Nieder
  2009-11-10 20:16           ` Junio C Hamano
  2009-11-09 15:05         ` [PATCH 23/24] merge-{recursive,subtree}: use usage() to print usage Jonathan Nieder
  2009-11-09 15:05         ` [PATCH 24/24] diff --no-index: make the usage string less scary Jonathan Nieder
  23 siblings, 1 reply; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:05 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

merge-recursive and diff --no-index are not able to use usage()
because their usage strings depend on the circumstances in which
they are called.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 git-compat-util.h |    2 +-
 usage.c           |   14 +++++++++-----
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/git-compat-util.h b/git-compat-util.h
index ef60803..42048e7 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -188,7 +188,7 @@ extern char *gitbasename(char *);
 #include "compat/bswap.h"
 
 /* General helper functions */
-extern NORETURN void usage(const char *err);
+extern NORETURN void usage(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
diff --git a/usage.c b/usage.c
index c488f3a..f6d9ff5 100644
--- a/usage.c
+++ b/usage.c
@@ -12,9 +12,9 @@ static void report(const char *prefix, const char *err, va_list params)
 	fprintf(stderr, "%s%s\n", prefix, msg);
 }
 
-static NORETURN void usage_builtin(const char *err)
+static NORETURN void usage_builtin(const char *err, va_list params)
 {
-	fprintf(stderr, "usage: %s\n", err);
+	report("usage: ", err, params);
 	exit(129);
 }
 
@@ -36,7 +36,7 @@ static void warn_builtin(const char *warn, va_list params)
 
 /* If we are in a dlopen()ed .so write to a global variable would segfault
  * (ugh), so keep things static. */
-static NORETURN_PTR void (*usage_routine)(const char *err) = usage_builtin;
+static NORETURN_PTR void (*usage_routine)(const char *err, va_list params) = usage_builtin;
 static NORETURN_PTR void (*die_routine)(const char *err, va_list params) = die_builtin;
 static void (*error_routine)(const char *err, va_list params) = error_builtin;
 static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
@@ -46,9 +46,13 @@ void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list param
 	die_routine = routine;
 }
 
-void usage(const char *err)
+void usage(const char *err, ...)
 {
-	usage_routine(err);
+	va_list params;
+
+	va_start(params, err);
+	usage_routine(err, params);
+	va_end(params);
 }
 
 void die(const char *err, ...)
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 23/24] merge-{recursive,subtree}: use usage() to print usage
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (21 preceding siblings ...)
  2009-11-09 15:05         ` [PATCH 22/24] Let usage() take a printf-style format Jonathan Nieder
@ 2009-11-09 15:05         ` Jonathan Nieder
  2009-11-09 15:05         ` [PATCH 24/24] diff --no-index: make the usage string less scary Jonathan Nieder
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:05 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Usage messages (for example, from "git merge-recursive -h") are
friendlier when not preceded by "fatal".

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-merge-recursive.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/builtin-merge-recursive.c b/builtin-merge-recursive.c
index d26a96e..add5900 100644
--- a/builtin-merge-recursive.c
+++ b/builtin-merge-recursive.c
@@ -33,7 +33,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
 	}
 
 	if (argc < 4)
-		die("Usage: %s <base>... -- <head> <remote> ...", argv[0]);
+		usage("%s <base>... -- <head> <remote> ...", argv[0]);
 
 	for (i = 1; i < argc; ++i) {
 		if (!strcmp(argv[i], "--"))
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* [PATCH 24/24] diff --no-index: make the usage string less scary
  2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
                           ` (22 preceding siblings ...)
  2009-11-09 15:05         ` [PATCH 23/24] merge-{recursive,subtree}: use usage() to print usage Jonathan Nieder
@ 2009-11-09 15:05         ` Jonathan Nieder
  23 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-09 15:05 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Start the diff --no-index usage string with "usage:" instead of
"fatal:".

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 diff-no-index.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/diff-no-index.c b/diff-no-index.c
index 4ebc1db..a1f6fdf 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -201,7 +201,7 @@ void diff_no_index(struct rev_info *revs,
 			return;
 	}
 	if (argc != i + 2)
-		die("git diff %s takes two paths",
+		usage("git diff %s <path> <path>",
 		    no_index ? "--no-index" : "[--no-index]");
 
 	diff_setup(&revs->diffopt);
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* Re: [PATCH 07/24] check-ref-format: update usage string
  2009-11-09 15:04         ` [PATCH 07/24] check-ref-format: update usage string Jonathan Nieder
@ 2009-11-10 20:11           ` Junio C Hamano
  0 siblings, 0 replies; 39+ messages in thread
From: Junio C Hamano @ 2009-11-10 20:11 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: git

This deserves to go to maint, so I ejected it out of the series.

Thanks.

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 18/24] merge: do not setup worktree twice
  2009-11-09 15:04         ` [PATCH 18/24] merge: do not setup worktree twice Jonathan Nieder
@ 2009-11-10 20:11           ` Junio C Hamano
  2009-11-11  1:58             ` Jonathan Nieder
  0 siblings, 1 reply; 39+ messages in thread
From: Junio C Hamano @ 2009-11-10 20:11 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: git

Jonathan Nieder <jrnieder@gmail.com> writes:

> Builtins do not need to run setup_worktree() for themselves, since
> the builtin machinery runs it for them.
>
> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
> This matter since '-h' cannot suppress _this_ setup_work_tree()
> through the builtin machinery.

I think this should directly go to 'maint'.  I ejected it from the
series.

Thanks.

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 20/24] http-fetch: add missing initialization of argv0_path
  2009-11-09 15:05         ` [PATCH 20/24] http-fetch: add missing initialization of argv0_path Jonathan Nieder
@ 2009-11-10 20:12           ` Junio C Hamano
  2009-11-10 21:56             ` Johannes Sixt
  2009-11-11  1:52             ` Jonathan Nieder
  0 siblings, 2 replies; 39+ messages in thread
From: Junio C Hamano @ 2009-11-10 20:12 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: git, Johannes Sixt

Jonathan Nieder <jrnieder@gmail.com> writes:

> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---

Why do you have inclusion of "exec_cmd.h" in [19/24]?  As far as I can
tell, nothing you do in that patch depends on it.

According to c6dfb39 (remote-curl: add missing initialization of
argv0_path, 2009-10-13), this patch is necessary (and you must include
"exec_cmd.h") on MinGW, regardless of the "give help upon -h" topic.

I think this should be ejected from your series go directly to 'maint', or
am I mistaken?

 http-fetch.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/http-fetch.c b/http-fetch.c
index e8f44ba..88f7dc8 100644
--- a/http-fetch.c
+++ b/http-fetch.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "exec_cmd.h"
 #include "walker.h"
 
 int main(int argc, const char **argv)
@@ -19,8 +20,8 @@ int main(int argc, const char **argv)
 	int get_verbosely = 0;
 	int get_recover = 0;
 
+	git_extract_argv0_path(argv[0]);
 	prefix = setup_git_directory();
-
 	git_config(git_default_config, NULL);
 
 	while (arg < argc && argv[arg][0] == '-') {

^ permalink raw reply related	[flat|nested] 39+ messages in thread

* Re: [PATCH 22/24] Let usage() take a printf-style format
  2009-11-09 15:05         ` [PATCH 22/24] Let usage() take a printf-style format Jonathan Nieder
@ 2009-11-10 20:16           ` Junio C Hamano
  0 siblings, 0 replies; 39+ messages in thread
From: Junio C Hamano @ 2009-11-10 20:16 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: git

Jonathan Nieder <jrnieder@gmail.com> writes:

> merge-recursive and diff --no-index are not able to use usage()
> because their usage strings depend on the circumstances in which
> they are called.

Since die() and warn() are already printf-like, it may be tempting
to do this, but this is wrong.

I do not want to vet all the existing call sites to usage() of make sure
that all of them _happen_ to pass constant strings that do not have any
'%' in them.

Much more importantly, without a patch to future-proof all existing
callsites to modify from

	usage(blame_usage);

to

	usage("%s", blame_usage);

everybody needs to remember that some *_usage strings are special and have
to double % in it forever, which is a maintenance nightmare.

Besides, the majority of usage strings are _expected_ to be constant.
That is an important difference from die/warn whose purpose is to diagnose
and give appropriate message to the situation (hence they benefit from
formatting).

I've renamed this to usagef() and updated your two callers to use it in
the version I queued to 'pu'.

Thanks.

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 20/24] http-fetch: add missing initialization of argv0_path
  2009-11-10 20:12           ` Junio C Hamano
@ 2009-11-10 21:56             ` Johannes Sixt
  2009-11-11  1:52             ` Jonathan Nieder
  1 sibling, 0 replies; 39+ messages in thread
From: Johannes Sixt @ 2009-11-10 21:56 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Jonathan Nieder, git

On Dienstag, 10. November 2009, Junio C Hamano wrote:
> Jonathan Nieder <jrnieder@gmail.com> writes:
> > Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> > ---
>
> Why do you have inclusion of "exec_cmd.h" in [19/24]?  As far as I can
> tell, nothing you do in that patch depends on it.
>
> According to c6dfb39 (remote-curl: add missing initialization of
> argv0_path, 2009-10-13), this patch is necessary (and you must include
> "exec_cmd.h") on MinGW, regardless of the "give help upon -h" topic.
>
> I think this should be ejected from your series go directly to 'maint', or
> am I mistaken?

You are right.

This command (in bash):

comm <(git grepc -l main\( *.c) <(git grepc -l extract_argv0 *.c)

shows programs in the 1st column that have main(), but do not call 
git_extract_argv0_path. One remaining candidate is show-index.c, but its only 
call-out is sha1_to_hex(), which doesn't use any other services.

http-fetch.c is the only file that needs this patch.

-- Hannes

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 20/24] http-fetch: add missing initialization of argv0_path
  2009-11-10 20:12           ` Junio C Hamano
  2009-11-10 21:56             ` Johannes Sixt
@ 2009-11-11  1:52             ` Jonathan Nieder
  1 sibling, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-11  1:52 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Johannes Sixt

Junio C Hamano wrote:

> Why do you have inclusion of "exec_cmd.h" in [19/24]?  As far as I can
> tell, nothing you do in that patch depends on it.

No good reason.  Thanks for cleaning up my mess.

Jonathan

^ permalink raw reply	[flat|nested] 39+ messages in thread

* Re: [PATCH 18/24] merge: do not setup worktree twice
  2009-11-10 20:11           ` Junio C Hamano
@ 2009-11-11  1:58             ` Jonathan Nieder
  0 siblings, 0 replies; 39+ messages in thread
From: Jonathan Nieder @ 2009-11-11  1:58 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

Junio C Hamano wrote:
> Jonathan Nieder <jrnieder@gmail.com> writes:
>
>> Builtins do not need to run setup_worktree() for themselves, since
>> the builtin machinery runs it for them.
>>
>> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
>> ---
>> This matter since '-h' cannot suppress _this_ setup_work_tree()
>> through the builtin machinery.
>
> I think this should directly go to 'maint'.  I ejected it from the
> series.

Thanks.  I think something like this should go on top on maint, then
reverted in master.

Sorry for the trouble,
Jonathan

-- %< --
Subject: check-ref-format does not know --print yet

Don’t advertise the --print option of the future in the current
usage string.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 builtin-check-ref-format.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/builtin-check-ref-format.c b/builtin-check-ref-format.c
index 96382e3..a5ba4ea 100644
--- a/builtin-check-ref-format.c
+++ b/builtin-check-ref-format.c
@@ -8,7 +8,7 @@
 #include "strbuf.h"
 
 static const char builtin_check_ref_format_usage[] =
-"git check-ref-format [--print] <refname>\n"
+"git check-ref-format <refname>\n"
 "   or: git check-ref-format --branch <branchname-shorthand>";
 
 int cmd_check_ref_format(int argc, const char **argv, const char *prefix)
-- 
1.6.5.2

^ permalink raw reply related	[flat|nested] 39+ messages in thread

end of thread, other threads:[~2009-11-11  1:48 UTC | newest]

Thread overview: 39+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20080125173149.GA10287@edna.gwendoline.at>
2009-11-08  7:11 ` [PATCH] Let 'git <command> -h' show usage without a git dir Jonathan Nieder
2009-11-08  7:26   ` [PATCH] Show usage string for 'git http-push -h' Jonathan Nieder
2009-11-09  8:52     ` Tay Ray Chuan
2009-11-09 10:47       ` [PATCH v2] " Jonathan Nieder
2009-11-09 13:56         ` Tay Ray Chuan
2009-11-08  9:21   ` [PATCH] Let 'git <command> -h' show usage without a git dir Junio C Hamano
2009-11-08 11:03     ` Jonathan Nieder
2009-11-09 15:02       ` [PATCH 00/24] " Jonathan Nieder
2009-11-09 15:04         ` [PATCH 01/24] Retire fetch--tool helper to contrib/examples Jonathan Nieder
2009-11-09 15:04         ` [PATCH 02/24] Show usage string for 'git grep -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 03/24] Show usage string for 'git cherry -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 04/24] Show usage string for 'git commit-tree -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 05/24] Show usage string for 'git merge-ours -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH/RFC 06/24] Show usage string for 'git show-ref -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 07/24] check-ref-format: update usage string Jonathan Nieder
2009-11-10 20:11           ` Junio C Hamano
2009-11-09 15:04         ` [PATCH 08/24] Show usage string for 'git check-ref-format -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 09/24] Show usage string for 'git fast-import -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 10/24] Show usage string for 'git get-tar-commit-id -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 11/24] Show usage string for 'git imap-send -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 12/24] Show usage string for 'git mailsplit -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 13/24] Show usage string for 'git merge-one-file -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 14/24] Show usage string for 'git rev-parse -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 15/24] Show usage string for 'git show-index -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 16/24] Show usage string for 'git unpack-file -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 17/24] Show usage string for 'git stripspace -h' Jonathan Nieder
2009-11-09 15:04         ` [PATCH 18/24] merge: do not setup worktree twice Jonathan Nieder
2009-11-10 20:11           ` Junio C Hamano
2009-11-11  1:58             ` Jonathan Nieder
2009-11-09 15:04         ` [PATCH 19/24] Let 'git http-fetch -h' show usage outside any git repository Jonathan Nieder
2009-11-09 15:05         ` [PATCH 20/24] http-fetch: add missing initialization of argv0_path Jonathan Nieder
2009-11-10 20:12           ` Junio C Hamano
2009-11-10 21:56             ` Johannes Sixt
2009-11-11  1:52             ` Jonathan Nieder
2009-11-09 15:05         ` [PATCH 21/24] Let 'git <command> -h' show usage without a git dir Jonathan Nieder
2009-11-09 15:05         ` [PATCH 22/24] Let usage() take a printf-style format Jonathan Nieder
2009-11-10 20:16           ` Junio C Hamano
2009-11-09 15:05         ` [PATCH 23/24] merge-{recursive,subtree}: use usage() to print usage Jonathan Nieder
2009-11-09 15:05         ` [PATCH 24/24] diff --no-index: make the usage string less scary Jonathan Nieder

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.