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

Re: [PATCH] git-filter-branch could be confused by similar names

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 4, 2008, 20:28 UTC
Message-ID
<7vr6gxjpyn.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<20080104155114.GS3373@dpotapov.dyndns.org>
Dmitry Potapov <dpotapov@gmail.com> writes:
> It works only if the name "unambiguous" for git show-ref, which
> interprets refname differently than rev-list as I wrote above.
> Nevertheless, I believe we can use 'git show-ref' if we try
> something like this:
Ahh.

But at that point I would say that exposing the refname dwimming logic to the scripts could be a much cleaner solution. After all, get_sha1_basic() knows what ref it used to come up with the answer, but we are discarding that information.

How about making "rev-parse --symbolic-full-name" give what it eventually dwimmed the given ref to, perhaps like the attached patch? Then you can do:

  git rev-parse --revs-only --symbolic-full-name "$@" >"$tempdir"/heads
without any need for the loop there in filter-branch.
---
 builtin-rev-parse.c |   37 ++++++++++++++++++++++++++++++++++---
 1 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c
index 20d1789..b9af1a5 100644
--- a/builtin-rev-parse.c
+++ b/builtin-rev-parse.c
@@ -21,6 +21,9 @@ static const char *def;
 #define NORMAL 0
 #define REVERSED 1
 static int show_type = NORMAL;
+
+#define SHOW_SYMBOLIC_ASIS 1
+#define SHOW_SYMBOLIC_FULL 2
 static int symbolic;
 static int abbrev;
 static int output_sq;
@@ -103,8 +106,32 @@ static void show_rev(int type, const unsigned char *sha1, const char *name)
 
 	if (type != show_type)
 		putchar('^');
-	if (symbolic && name)
-		show(name);
+	if (symbolic && name) {
+		if (symbolic == SHOW_SYMBOLIC_FULL) {
+			unsigned char discard[20];
+			char *full;
+
+			switch (dwim_ref(name, strlen(name), discard, &full)) {
+			case 0:
+				/*
+				 * Not found -- not a ref.  We could
+				 * emit "name" here, but symbolic-full
+				 * users are interested in finding the
+				 * refs spelled in full, and they would
+				 * need to filter non-refs if we did so.
+				 */
+				break;
+			case 1: /* happy */
+				show(full);
+				break;
+			default: /* ambiguous */
+				error("refname '%s' is ambiguous", name);
+				break;
+			}
+		} else {
+			show(name);
+		}
+	}
 	else if (abbrev)
 		show(find_unique_abbrev(sha1, abbrev));
 	else
@@ -421,7 +448,11 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				continue;
 			}
 			if (!strcmp(arg, "--symbolic")) {
-				symbolic = 1;
+				symbolic = SHOW_SYMBOLIC_ASIS;
+				continue;
+			}
+			if (!strcmp(arg, "--symbolic-full-name")) {
+				symbolic = SHOW_SYMBOLIC_FULL;
 				continue;
 			}
 			if (!strcmp(arg, "--all")) {
Previous: Dmitry PotapovNext: Johannes Schindelin
Message 11 of 18 in “git-filter-branch could be confused by similar names”
  1. git-filter-branch could be confused by similar namesDmitry Potapov, Dec 25, 2007
  2. Johannes SchindelinDec 29, 2007
  3. Dmitry PotapovDec 30, 2007
  4. Johannes SchindelinDec 30, 2007
  5. Dmitry PotapovDec 30, 2007
  6. Johannes SchindelinDec 30, 2007
  7. Dmitry PotapovDec 30, 2007
  8. git-filter-branch could be confused by similar namesDmitry Potapov, Dec 30, 2007
  9. Junio C HamanoJan 3, 2008
  10. Dmitry PotapovJan 4, 2008
  11. Junio C HamanoJan 4, 2008
  12. Johannes SchindelinJan 5, 2008
  13. 1/2 git-rev-parse --symbolic-full-nameJunio C Hamano, Jan 5, 2008
  14. 2/2 filter-branch: work correctly with ambiguous refnamesJunio C Hamano, Jan 5, 2008
  15. Johannes SchindelinJan 6, 2008
  16. Junio C HamanoJan 6, 2008
  17. Johannes SchindelinJan 6, 2008
  18. Junio C HamanoJan 5, 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.