git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Extend "checkout --track" DWIM to support more cases

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 22, 2008, 05:54 UTC
Message-ID
<7vy72pd278.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<20080821172320.GA5119@blimp.local>
Alex Riesen <raa.lkml@gmail.com> writes:
Show 10 quoted lines
> The code handles additionally "refs/remotes/<something>/name",
> "remotes/<something>/name", and "refs/<namespace>/name".
>
> Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
> ---
> ...
> I just have another quiet evening, so I did that. Johannes, I changed
> your fix a bit: I see that argv[0] is used later (or if I'm blind and
> it actually isn't, it may be used in future: I have a feeling that
> builtint-checkout.c will be popular place).
Thanks; the documentation looks good to me.
Show 12 quoted lines
> +		char *argv0 = argv[0];
> +		if (!argc || !strcmp(argv0, "--"))
>  			die ("--track needs a branch name");
> +		slash = strchr(argv0, '/');
> +		if (slash && !prefixcmp(argv0, "refs/")) {
> +			argv0 = slash + 1;
> +			slash = strchr(argv0, '/');
> +		}
> +		if (slash && !prefixcmp(argv0, "remotes/"))
>  			slash = strchr(slash + 1, '/');
>  		if (!slash || !slash[1])
>  			die ("Missing branch name; try -b");
I however wonder if this is clearer.
 * "enum branch_track" was unsigned; comparing equality with -1 was Ok but
   we couldn't say 0 < opts.track;
 * argv[] is an array of constant strings; cannot point into it with
   opts.newbranch without making the latter also a constant string.
 * the logic is to strip "refs/" if there is one, "remotes/" if there is
   one after that, and then strip one level after that unconditionally.
   No need to look explicitly for a slash while doing the first two steps.
 cache.h            |    1 +
 builtin-checkout.c |   26 +++++++++++++-------------
 2 files changed, 14 insertions(+), 13 deletions(-)
diff --git i/cache.h w/cache.h
index 928ae9f..a097a95 100644
--- i/cache.h
+++ w/cache.h
@@ -451,6 +451,7 @@ enum safe_crlf {
 extern enum safe_crlf safe_crlf;
 
 enum branch_track {
+	BRANCH_TRACK_UNSPECIFIED = -1,
 	BRANCH_TRACK_NEVER = 0,
 	BRANCH_TRACK_REMOTE,
 	BRANCH_TRACK_ALWAYS,
diff --git i/builtin-checkout.c w/builtin-checkout.c
index e95eab9..b380ad6 100644
--- i/builtin-checkout.c
+++ w/builtin-checkout.c
@@ -157,7 +157,7 @@ struct checkout_opts {
 	int force;
 	int writeout_error;
 
-	char *new_branch;
+	const char *new_branch;
 	int new_branch_log;
 	enum branch_track track;
 };
@@ -437,27 +437,27 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
 
 	git_config(git_default_config, NULL);
 
-	opts.track = -1;
+	opts.track = BRANCH_TRACK_UNSPECIFIED;
 
 	argc = parse_options(argc, argv, options, checkout_usage,
 			     PARSE_OPT_KEEP_DASHDASH);
 
 	/* --track without -b should DWIM */
-	if (opts.track && opts.track != -1 && !opts.new_branch) {
-		char *slash;
-		if (!argc || !strcmp(argv[0], "--"))
+	if (0 < opts.track && !opts.new_branch) {
+		const char *argv0 = argv[0];
+		if (!argc || !strcmp(argv0, "--"))
 			die ("--track needs a branch name");
-		slash = strchr(argv[0], '/');
-		if (slash && !prefixcmp(argv[0], "refs/"))
-			slash = strchr(slash + 1, '/');
-		if (slash && !prefixcmp(argv[0], "remotes/"))
-			slash = strchr(slash + 1, '/');
-		if (!slash || !slash[1])
+		if (!prefixcmp(argv0, "refs/"))
+			argv0 += 5;
+		if (!prefixcmp(argv0, "remotes/"))
+			argv0 += 8;
+		argv0 = strchr(argv0, '/');
+		if (!argv0 || !argv0[1])
 			die ("Missing branch name; try -b");
-		opts.new_branch = slash + 1;
+		opts.new_branch = argv0 + 1;
 	}
 
-	if (opts.track == -1)
+	if (opts.track == BRANCH_TRACK_UNSPECIFIED)
 		opts.track = git_branch_track;
 
 	if (opts.force && opts.merge)
Previous: Alex RiesenNext: Alex Riesen
Message 8 of 11 in “Extend "checkout --track" DWIM to support more cases”
  1. Extend "checkout --track" DWIM to support more casesAlex Riesen, Aug 20, 2008
  2. Johannes SchindelinAug 20, 2008
  3. Alex RiesenAug 20, 2008
  4. Johannes SchindelinAug 20, 2008
  5. Alex RiesenAug 20, 2008
  6. Junio C HamanoAug 20, 2008
  7. Extend "checkout --track" DWIM to support more casesAlex Riesen, Aug 21, 2008
  8. Junio C HamanoAug 22, 2008
  9. Alex RiesenAug 22, 2008
  10. Junio C HamanoAug 22, 2008
  11. Jay SoffianAug 22, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.