All of lore.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.com \
    --cc=git@vger.kernel.org \
    --cc=junkio@cox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.