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

Re: [PATCH] log --reflog: use dwim_log

From
Junio C Hamano <junkio@cox.net>
Date
Feb 9, 2007, 07:19 UTC
Message-ID
<7v4ppvvluo.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<7vtzxwuhb1.fsf@assigned-by-dhcp.cox.net>

When refs/remotes/gfi/master and refs/remotes/gfi/HEAD exist, and the latter is a symref that points at the former, dwim_ref() resolves string "gfi" to "refs/remotes/gfi/master" as expected, but dwim_log() does not understand "gfi@{1.day}" and needs to be told "gfi/master@{1.day}". This is confusing.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 Junio C Hamano <junkio@cox.net> writes:
 > Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
 >
 >> Since "git log origin/master" uses dwim_log() to match
 >> "refs/remotes/origin/master", it makes sense to do that for
 >> "git log --reflog", too.
 >
 > This is a bit sad.
 >
 > When there is remotes/origin/HEAD symref that points at
 > remotes/origin/master (and usually there is, in a repository
 > initialized with the current git-clone), you can say "git log
 > origin".  Even with this patch, I do not think dwim_log would
 > allow you to say "git log -g origin" to mean "git log -g
 > origin/master".
 I think there should be a cleaner way to fix this, but at least
 this seems to work.
 sha1_name.c |   29 +++++++++++++++++++++--------
 1 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/sha1_name.c b/sha1_name.c
index f79a7c9..09c63ed 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -275,16 +275,29 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
 	*log = NULL;
 	for (p = ref_fmt; *p; p++) {
 		struct stat st;
-		char *path = mkpath(*p, len, str);
+		unsigned char hash[20];
+		char path[PATH_MAX];
+		char *ref, *it;
+
+		strcpy(path, mkpath(*p, len, str));
+		ref = resolve_ref(path, hash, 0, NULL);
+		if (!ref)
+			continue;
 		if (!stat(git_path("logs/%s", path), &st) &&
-		    S_ISREG(st.st_mode)) {
-			if (!logs_found++) {
-				*log = xstrdup(path);
-				resolve_ref(path, sha1, 0, NULL);
-			}
-			if (!warn_ambiguous_refs)
-				break;
+		    S_ISREG(st.st_mode))
+			it = path;
+		else if (strcmp(ref, path) &&
+			 !stat(git_path("logs/%s", ref), &st) &&
+			 S_ISREG(st.st_mode))
+			it = ref;
+		else
+			continue;
+		if (!logs_found++) {
+			*log = xstrdup(it);
+			hashcpy(sha1, hash);
 		}
+		if (!warn_ambiguous_refs)
+			break;
 	}
 	return logs_found;
 }
Previous: Junio C Hamano
Message 13 of 13 in “[BUG] Empty reflogs and "git log -g"”
  1. Santi BéjarFeb 8, 2007
  2. Santi BéjarFeb 8, 2007
  3. Johannes SchindelinFeb 8, 2007
  4. Nicolas PitreFeb 8, 2007
  5. Johannes SchindelinFeb 8, 2007
  6. Johannes SchindelinFeb 8, 2007
  7. Jakub NarebskiFeb 8, 2007
  8. Johannes SchindelinFeb 8, 2007
  9. Junio C HamanoFeb 8, 2007
  10. for_each_reflog_ent: be forgiving about missing messageJohannes Schindelin, Feb 8, 2007
  11. log --reflog: use dwim_logJohannes Schindelin, Feb 9, 2007
  12. Junio C HamanoFeb 9, 2007
  13. Junio C HamanoFeb 9, 2007

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.