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

Re: Re: "git stash list" shows HEAD reflog

From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
Date
Mar 13, 2010, 20:11 UTC
Message-ID
<4B9BF171.2000102@lsrfire.ath.cx>
In-Reply-To
<alpine.DEB.2.00.1003130939240.796@narbuckle.genericorp.net>
Am 13.03.2010 18:41, schrieb Dave Olszewski:
Show 23 quoted lines
> On Sat, 13 Mar 2010, Ren? Scharfe wrote:
> 
>> Am 12.03.2010 15:52, schrieb Vladimir Panteleev:
> 
>>> That doesn't explain why git displayed the HEAD reflog, though. That
>>> seems to happen thanks to the check (revs->def && !revs->pending.nr) in
>>> setup_revisions ("HEAD" is the default, as specified in the caller
>>> cmd_log_init). It looks like (ideally) git shouldn't rely on whether
>>> revs->pending is empty to decide whether to use the default, but rather
>>> if a ref was specified by the user or not.
>>
>> We could add some kind of check there, but with the patch applied I can't
>> trigger this second issue any more.  It would be nice to have a test
>> script
>> along with such a sanity check.  Any idea how to cause this error,
>> perhaps
>> with another type of invalid reflog file?
> 
> I actually noticed this last week.  You can reproduce it by doing "git
> reflog" on a branch which has been idle for longer than the expiration.
> Any 0-byte files in logs/refs/heads would give me this same behavior.
> 
>     Dave
Perhaps something like this?
---
 revision.c             |    4 ++++
 t/t1411-reflog-show.sh |   13 +++++++++++++
 2 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/revision.c b/revision.c
index 29721ec..6991475 100644
--- a/revision.c
+++ b/revision.c
@@ -896,6 +896,7 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,
 	struct object *object;
 	unsigned char sha1[20];
 	int local_flags;
+	int empty_after, empty_before = !revs->pending.nr;
 
 	dotdot = strstr(arg, "..");
 	if (dotdot) {
@@ -971,6 +972,9 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,
 		verify_non_filename(revs->prefix, arg);
 	object = get_reference(revs, arg, sha1, flags ^ local_flags);
 	add_pending_object_with_mode(revs, object, arg, mode);
+	empty_after = !revs->pending.nr;
+	if (empty_before && empty_after)
+		die("bad revision '%s' (empty reflog?)", arg);
 	return 0;
 }
 
diff --git a/t/t1411-reflog-show.sh b/t/t1411-reflog-show.sh
index c18ed8e..3f48c2d 100755
--- a/t/t1411-reflog-show.sh
+++ b/t/t1411-reflog-show.sh
@@ -64,4 +64,17 @@ test_expect_success 'using --date= shows reflog date (oneline)' '
 	test_cmp expect actual
 '
 
+: >expected.out
+cat >expected.err <<'EOF'
+fatal: bad revision 'empty' (empty reflog?)
+EOF
+test_expect_success 'empty reflog file' '
+	git branch empty &&
+	: >.git/logs/refs/heads/empty &&
+
+	test_must_fail git log -g empty >actual.out 2>actual.err &&
+	test_cmp expected.out actual.out &&
+	test_cmp expected.err actual.err
+'
+
 test_done
-- 
1.7.0.2
Previous: Dave OlszewskiNext: Dave Olszewski
Message 4 of 11 in “"git stash list" shows HEAD reflog”
  1. Vladimir PanteleevMar 12, 2010
  2. René ScharfeMar 13, 2010
  3. Dave OlszewskiMar 13, 2010
  4. René ScharfeMar 13, 2010
  5. Dave OlszewskiMar 13, 2010
  6. René ScharfeMar 13, 2010
  7. don't use default revision if a rev was specifiedDave Olszewski, Mar 13, 2010
  8. René ScharfeMar 13, 2010
  9. Junio C HamanoMar 14, 2010
  10. Pete HarlanMar 13, 2010
  11. René ScharfeMar 13, 2010

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.