public inbox for git@vger.kernel.org 
 help / color / mirror / Atom feed
From: Lars Hjemli <hjemli@gmail•com>
To: git@vger•kernel.org
Cc: Junio C Hamano <junkio@cox•net>
Subject: [PATCH] git-branch: show detached HEAD
Date: Wed,  3 Jan 2007 00:22:11 +0100	[thread overview]
Message-ID: <1167780131528-git-send-email-hjemli@gmail.com> (raw)
In-Reply-To: <7vac11yirf.fsf@assigned-by-dhcp.cox.net>

This makes git-branch show a detached HEAD as '* (no branch)'.

Signed-off-by: Lars Hjemli <hjemli@gmail•com>
---

This might be a premature patch. But if/when we allow HEAD to be detached, 
git-branch should tell us that HEAD is the current 'branch'.

 builtin-branch.c |  103 +++++++++++++++++++++++++++++-------------------------
 1 files changed, 55 insertions(+), 48 deletions(-)

diff --git a/builtin-branch.c b/builtin-branch.c
index 71f88f2..16f86cc 100644
--- a/builtin-branch.c
+++ b/builtin-branch.c
@@ -231,29 +231,54 @@ static int ref_cmp(const void *r1, const void *r2)
 	return strcmp(c1->name, c2->name);
 }
 
-static void print_ref_info(const unsigned char *sha1, int abbrev)
+static void print_ref_item(struct ref_item *item, int maxwidth, int verbose, 
+			   int abbrev, int current)
 {
+	char c;
+	int color;
 	struct commit *commit;
 	char subject[256];
 
+	switch (item->kind) {
+	case REF_LOCAL_BRANCH:
+		color = COLOR_BRANCH_LOCAL;
+		break;
+	case REF_REMOTE_BRANCH:
+		color = COLOR_BRANCH_REMOTE;
+		break;
+	default:
+		color = COLOR_BRANCH_PLAIN;
+		break;
+	}
 
-	commit = lookup_commit(sha1);
-	if (commit && !parse_commit(commit))
-		pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
-				    subject, sizeof(subject), 0,
-				    NULL, NULL, 0);
-	else
-		strcpy(subject, " **** invalid ref ****");
+	c = ' ';
+	if (current) {
+		c = '*';
+		color = COLOR_BRANCH_CURRENT;
+	}
 
-	printf(" %s %s\n", find_unique_abbrev(sha1, abbrev), subject);
+	if (verbose) {
+		commit = lookup_commit(item->sha1);
+		if (commit && !parse_commit(commit))
+			pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
+					    subject, sizeof(subject), 0,
+					    NULL, NULL, 0);
+		else
+			strcpy(subject, " **** invalid ref ****");
+		printf("%c %s%-*s%s %s %s\n", c, branch_get_color(color),
+		       maxwidth, item->name,
+		       branch_get_color(COLOR_BRANCH_RESET),
+		       find_unique_abbrev(item->sha1, abbrev), subject);
+	} else {
+		printf("%c %s%s%s\n", c, branch_get_color(color), item->name,
+		       branch_get_color(COLOR_BRANCH_RESET));
+	}
 }
 
-static void print_ref_list(int kinds, int verbose, int abbrev)
+static void print_ref_list(int kinds, int verbose, int abbrev, int detached)
 {
 	int i;
-	char c;
 	struct ref_list ref_list;
-	int color;
 
 	memset(&ref_list, 0, sizeof(ref_list));
 	ref_list.kinds = kinds;
@@ -261,39 +286,22 @@ static void print_ref_list(int kinds, int verbose, int abbrev)
 
 	qsort(ref_list.list, ref_list.index, sizeof(struct ref_item), ref_cmp);
 
-	for (i = 0; i < ref_list.index; i++) {
-		switch( ref_list.list[i].kind ) {
-			case REF_LOCAL_BRANCH:
-				color = COLOR_BRANCH_LOCAL;
-				break;
-			case REF_REMOTE_BRANCH:
-				color = COLOR_BRANCH_REMOTE;
-				break;
-			default:
-				color = COLOR_BRANCH_PLAIN;
-				break;
-		}
-
-		c = ' ';
-		if (ref_list.list[i].kind == REF_LOCAL_BRANCH &&
-				!strcmp(ref_list.list[i].name, head)) {
-			c = '*';
-			color = COLOR_BRANCH_CURRENT;
-		}
+	if (detached && (kinds & REF_LOCAL_BRANCH)) {
+		struct ref_item item;
+		item.name = "(no branch)";
+		item.kind = REF_LOCAL_BRANCH;
+		hashcpy(item.sha1, head_sha1);
+		if (strlen(item.name) > ref_list.maxwidth)
+			      ref_list.maxwidth = strlen(item.name);
+		print_ref_item(&item, ref_list.maxwidth, verbose, abbrev, 1);
+	}
 
-		if (verbose) {
-			printf("%c %s%-*s%s", c,
-					branch_get_color(color),
-					ref_list.maxwidth,
-					ref_list.list[i].name,
-					branch_get_color(COLOR_BRANCH_RESET));
-			print_ref_info(ref_list.list[i].sha1, abbrev);
-		}
-		else
-			printf("%c %s%s%s\n", c,
-					branch_get_color(color),
-					ref_list.list[i].name,
-					branch_get_color(COLOR_BRANCH_RESET));
+	for (i = 0; i < ref_list.index; i++) {
+		int current = !(detached && (kinds & REF_LOCAL_BRANCH)) &&
+			(ref_list.list[i].kind == REF_LOCAL_BRANCH) &&
+			!strcmp(ref_list.list[i].name, head);
+		print_ref_item(&ref_list.list[i], ref_list.maxwidth, verbose, 
+			       abbrev, current);
 	}
 
 	free_ref_list(&ref_list);
@@ -380,7 +388,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 {
 	int delete = 0, force_delete = 0, force_create = 0;
 	int rename = 0, force_rename = 0;
-	int verbose = 0, abbrev = DEFAULT_ABBREV;
+	int verbose = 0, abbrev = DEFAULT_ABBREV, detached = 0;
 	int reflog = 0;
 	int kinds = REF_LOCAL_BRANCH;
 	int i;
@@ -458,8 +466,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 	if (!head)
 		die("Failed to resolve HEAD as a valid ref.");
 	if (!strcmp(head, "HEAD")) {
-		/* detached HEAD */
-		;
+		detached = 1;
 	}
 	else {
 		if (strncmp(head, "refs/heads/", 11))
@@ -470,7 +477,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 	if (delete)
 		return delete_branches(argc - i, argv + i, force_delete, kinds);
 	else if (i == argc)
-		print_ref_list(kinds, verbose, abbrev);
+		print_ref_list(kinds, verbose, abbrev, detached);
 	else if (rename && (i == argc - 1))
 		rename_branch(head, argv[i], force_rename);
 	else if (rename && (i == argc - 2))
-- 
1.5.0.rc0.g76033

  parent reply	other threads:[~2007-01-03  5:12 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-02  7:45 [PATCH] Detached HEAD (experimental) Junio C Hamano
2007-01-02 19:59 ` Edgar Toernig
2007-01-02 21:56 ` Carl Worth
2007-01-02 22:18   ` Jakub Narebski
2007-01-03  0:34     ` Carl Worth
2007-01-06 18:58       ` J. Bruce Fields
2007-01-06 20:48         ` Alan Chandler
2007-01-06 22:52           ` J. Bruce Fields
2007-01-02 22:44   ` Junio C Hamano
2007-01-02 23:34     ` Carl Worth
2007-01-03  2:45       ` Junio C Hamano
2007-01-08 11:19       ` Junio C Hamano
2007-01-08 13:17         ` Jeff King
2007-01-09  0:19           ` Junio C Hamano
2007-01-09  0:43             ` Carl Worth
2007-01-09  1:05               ` Junio C Hamano
2007-01-09  1:15                 ` Carl Worth
2007-01-09  3:26                   ` Shawn O. Pearce
2007-01-09  7:07                     ` Junio C Hamano
2007-01-09 10:41                       ` [PATCH 0/6] Expose in_merge_bases() via merge-base Junio C Hamano
2007-01-09  8:12                   ` [PATCH] Detached HEAD (experimental) Luben Tuikov
2007-01-09 14:21             ` Jeff King
2007-01-09 21:20               ` Junio C Hamano
2007-01-09 21:31                 ` J. Bruce Fields
2007-01-09 21:43                   ` Carl Worth
2007-01-09 21:53                     ` J. Bruce Fields
2007-01-09 23:44                     ` Shawn O. Pearce
2007-01-10  0:26                       ` Jakub Narebski
2007-01-10  0:34                         ` Shawn O. Pearce
2007-01-10  1:03                           ` J. Bruce Fields
2007-01-10  1:07                             ` Shawn O. Pearce
2007-01-10  1:15                           ` Nicolas Pitre
2007-01-10  1:24                             ` Junio C Hamano
2007-01-10  1:40                               ` Shawn O. Pearce
2007-01-10  1:54                                 ` Nicolas Pitre
2007-01-10  2:28                                   ` Shawn O. Pearce
2007-01-10  1:37                             ` Jakub Narebski
2007-01-10  9:08                     ` Andreas Ericsson
2007-01-10  9:46                       ` Junio C Hamano
2007-01-10 16:30                         ` Daniel Barkalow
2007-01-11  9:45                           ` Andreas Ericsson
2007-01-10  9:40                     ` Junio C Hamano
2007-01-09 22:37                   ` Junio C Hamano
2007-01-09 23:39                     ` Shawn O. Pearce
2007-01-09 23:46                     ` Linus Torvalds
2007-01-10  0:10                       ` Junio C Hamano
2007-01-10  0:18                         ` Shawn O. Pearce
2007-01-10  0:54                           ` Linus Torvalds
2007-01-10  0:51                       ` Carl Worth
2007-01-10  8:02                       ` Junio C Hamano
2007-01-10  9:04                       ` Andy Parkins
2007-01-10  9:05                         ` Shawn O. Pearce
2007-01-10  9:33                         ` Junio C Hamano
2007-01-10 10:10                           ` Andy Parkins
2007-01-10 10:25                             ` Shawn O. Pearce
2007-01-10 16:18                             ` Junio C Hamano
2007-01-10 14:04                       ` Jeff King
2007-01-11  0:34                         ` Junio C Hamano
2007-01-11  4:31                           ` J. Bruce Fields
2007-01-03 10:46     ` Jeff King
2007-01-03 11:59       ` Jeff King
2007-01-02 23:22 ` Lars Hjemli [this message]
2007-01-03  5:18   ` [PATCH] git-branch: show detached HEAD Shawn O. Pearce
2007-01-03  6:53     ` Junio C Hamano
2007-01-03  7:50       ` Lars Hjemli
2007-01-03  7:52         ` Junio C Hamano
2007-01-03  7:05   ` Junio C Hamano
2007-01-03  7:37     ` Lars Hjemli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1167780131528-git-send-email-hjemli@gmail.com \
    --to=hjemli@gmail$(echo .)com \
    --cc=git@vger$(echo .)kernel.org \
    --cc=junkio@cox$(echo .)net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox