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

[PATCH] Introduce for_each_recent_reflog_ent().

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 20, 2009, 06:22 UTC
Message-ID
<7vpriimr93.fsf_-_@gitster.siamese.dyndns.org>
In-Reply-To
<alpine.DEB.1.00.0901191331590.3586@pacific.mpi-cbg.de>

This can be used to scan only the last few kilobytes of a reflog, as a cheap optimization when the data you are looking for is likely to be found near the end of it. The caller is expected to fall back to the full scan if that is not the case.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 refs.c      |   17 ++++++++++++++++-
 refs.h      |    1 +
 sha1_name.c |    8 +++++++-
 3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/refs.c b/refs.c
index 33ced65..024211d 100644
--- a/refs.c
+++ b/refs.c
@@ -1453,7 +1453,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *
 	return 1;
 }
 
-int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data)
+int for_each_recent_reflog_ent(const char *ref, each_reflog_ent_fn fn, long ofs, void *cb_data)
 {
 	const char *logfile;
 	FILE *logfp;
@@ -1464,6 +1464,16 @@ int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data)
 	logfp = fopen(logfile, "r");
 	if (!logfp)
 		return -1;
+
+	if (ofs) {
+		struct stat statbuf;
+		if (fstat(fileno(logfp), &statbuf) ||
+		    statbuf.st_size < ofs ||
+		    fseek(logfp, -ofs, SEEK_END) ||
+		    fgets(buf, sizeof(buf), logfp))
+			return -1;
+	}
+
 	while (fgets(buf, sizeof(buf), logfp)) {
 		unsigned char osha1[20], nsha1[20];
 		char *email_end, *message;
@@ -1497,6 +1507,11 @@ int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data)
 	return ret;
 }
 
+int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data)
+{
+	return for_each_recent_reflog_ent(ref, fn, 0, cb_data);
+}
+
 static int do_for_each_reflog(const char *base, each_ref_fn fn, void *cb_data)
 {
 	DIR *dir = opendir(git_path("logs/%s", base));
diff --git a/refs.h b/refs.h
index 06ad260..3bb529d 100644
--- a/refs.h
+++ b/refs.h
@@ -60,6 +60,7 @@ extern int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned
 /* iterate over reflog entries */
 typedef int each_reflog_ent_fn(unsigned char *osha1, unsigned char *nsha1, const char *, unsigned long, int, const char *, void *);
 int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data);
+int for_each_recent_reflog_ent(const char *ref, each_reflog_ent_fn fn, long, void *cb_data);
 
 /*
  * Calls the specified function for each reflog file until it returns nonzero,
diff --git a/sha1_name.c b/sha1_name.c
index 4c0370b..38c9f1b 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -775,7 +775,13 @@ int interpret_nth_last_branch(const char *name, struct strbuf *buf)
 		strbuf_init(&cb.buf[i], 20);
 	cb.cnt = 0;
 	retval = 0;
-	for_each_reflog_ent("HEAD", grab_nth_branch_switch, &cb);
+	for_each_recent_reflog_ent("HEAD", grab_nth_branch_switch, 40960, &cb);
+	if (cb.cnt < nth) {
+		cb.cnt = 0;
+		for (i = 0; i < nth; i++)
+			strbuf_release(&cb.buf[i]);
+		for_each_reflog_ent("HEAD", grab_nth_branch_switch, &cb);
+	}
 	if (cb.cnt < nth)
 		goto release_return;
 	i = cb.cnt % nth;
-- 
1.6.1.267.g11c6e
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 43 of 56 in “N-th last checked out branch”
  1. 0/6 N-th last checked out branchThomas Rast, Jan 17, 2009
  2. 1/6 reflog: refactor parsing and checkingThomas Rast, Jan 17, 2009
  3. 2/6 reflog: refactor log open+mmapThomas Rast, Jan 17, 2009
  4. 3/6 reflog: make for_each_reflog_ent use mmapThomas Rast, Jan 17, 2009
  5. 4/6 reflog: add backwards iteratorThomas Rast, Jan 17, 2009
  6. 5/6 sha1_name: implement @{-N} syntax for N-th last checked outThomas Rast, Jan 17, 2009
  7. 6/6 checkout: implement '@{-N}' and '-' special abbreviationsThomas Rast, Jan 17, 2009
  8. Johannes SchindelinJan 17, 2009
  9. Johannes SchindelinJan 17, 2009
  10. Johannes SchindelinJan 17, 2009
  11. Thomas RastJan 17, 2009
  12. 1/2 sha1_name: implement @{-N} syntax for N-th last checked outThomas Rast, Jan 17, 2009
  13. 2/2 checkout: implement '@{-N}' and '-' special abbreviationsThomas Rast, Jan 17, 2009
  14. interpret_nth_last_branch(): avoid traversing the reflogs twiceJohannes Schindelin, Jan 17, 2009
  15. 0/5 N-th last checked out branchThomas Rast, Jan 17, 2009
  16. 1/5 checkout: implement "@{-N}" shortcut name for N-th last branchThomas Rast, Jan 17, 2009
  17. 2/5 sha1_name: tweak @{-N} lookupThomas Rast, Jan 17, 2009
  18. 3/5 sha1_name: support @{-N} syntax in get_sha1()Thomas Rast, Jan 17, 2009
  19. 4/5 checkout: implement "-" abbreviation, add docs and testsThomas Rast, Jan 17, 2009
  20. 5/5 interpret_nth_last_branch(): avoid traversing the reflogs twiceThomas Rast, Jan 17, 2009
  21. 6/5 Fix parsing of @{-1}@{1}Johannes Schindelin, Jan 17, 2009
  22. Junio C HamanoJan 17, 2009
  23. Johannes SchindelinJan 17, 2009
  24. Junio C HamanoJan 17, 2009
  25. Johannes SchindelinJan 17, 2009
  26. Junio C HamanoJan 17, 2009
  27. Junio C HamanoJan 18, 2009
  28. Johannes SchindelinJan 17, 2009
  29. Junio C HamanoJan 17, 2009
  30. Johannes SchindelinJan 17, 2009
  31. Junio C HamanoJan 18, 2009
  32. Johannes SchindelinJan 18, 2009
  33. Junio C HamanoJan 18, 2009
  34. Johannes SchindelinJan 18, 2009
  35. Junio C HamanoJan 19, 2009
  36. Junio C HamanoJan 19, 2009
  37. Johannes SchindelinJan 19, 2009
  38. Thomas RastJan 20, 2009
  39. Johannes SchindelinJan 20, 2009
  40. Thomas RastJan 20, 2009
  41. interpret_nth_last_branch(): plug small memleakJunio C Hamano, Jan 20, 2009
  42. Johannes SchindelinJan 20, 2009
  43. Introduce for_each_recent_reflog_ent().Junio C Hamano, Jan 20, 2009
  44. Johannes SchindelinJan 20, 2009
  45. Junio C HamanoJan 20, 2009
  46. Fix invalid memory accessJohannes Schindelin, Jan 21, 2009
  47. Junio C HamanoJan 21, 2009
  48. Thomas RastJan 21, 2009
  49. Junio C HamanoJan 21, 2009
  50. Johannes SchindelinJan 21, 2009
  51. Thomas RastJan 24, 2009
  52. t1505: remove debugging cruftThomas Rast, Jan 24, 2009
  53. Junio C HamanoJan 25, 2009
  54. Johannes SchindelinJan 21, 2009
  55. @{-<n>}: avoid crash with corrupt reflogJohannes Schindelin, Jan 19, 2009
  56. Johannes SchindelinJan 19, 2009

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.