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

[PATCH v3] reachable.c: add HEAD to reachability starting commits

From
Max Kirillov <max@max630.net>
Date
Sep 3, 2014, 16:14 UTC
Message-ID
<1409760850-27322-1-git-send-email-max@max630.net>
In-Reply-To
<xmqq4mwp3oeb.fsf@gitster.dls.corp.google.com>

HEAD is not explicitly used as a starting commit for calculating reachability, so if it's detached and reflogs are disabled it may be pruned.

Add tests which demonstrate it. Test 'prune: prune former HEAD after checking out branch' also reverts changes to repository.

Signed-off-by: Max Kirillov <max@max630.net>
---
Fixed the notes.
(This filesystem stuff would not be needed if I had a separated repository
without reflogs from scratch, like in v1. Having to handle leftouts from
previous test cases does not add clarity here. Maybe it worth extracting all
cases with no reflogs into a separated script.)
 reachable.c      |  3 +++
 t/t5304-prune.sh | 22 ++++++++++++++++++++++
 2 files changed, 25 insertions(+)
diff --git a/reachable.c b/reachable.c
index 654a8c5..6f6835b 100644
--- a/reachable.c
+++ b/reachable.c
@@ -229,6 +229,9 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog,
 	/* Add all external refs */
 	for_each_ref(add_one_ref, revs);
 
+	/* detached HEAD is not included in the list above */
+	head_ref(add_one_ref, revs);
+
 	/* Add all reflog info */
 	if (mark_reflog)
 		for_each_reflog(add_one_reflog, revs);
diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh
index 377d3d3..01c6a3f 100755
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -104,6 +104,28 @@ test_expect_success 'prune: prune unreachable heads' '
 
 '
 
+test_expect_success 'prune: do not prune detached HEAD with no reflog' '
+
+	git checkout --detach --quiet &&
+	git commit --allow-empty -m "detached commit" &&
+	# verify that there is no reflogs
+	# (should be removed and disabled by previous test)
+	test ! -e .git/logs &&
+	git prune -n >prune_actual &&
+	: >prune_expected &&
+	test_cmp prune_actual prune_expected
+
+'
+
+test_expect_success 'prune: prune former HEAD after checking out branch' '
+
+	head_sha1=$(git rev-parse HEAD) &&
+	git checkout --quiet master &&
+	git prune -v >prune_actual &&
+	grep "$head_sha1" prune_actual
+
+'
+
 test_expect_success 'prune: do not prune heads listed as an argument' '
 
 	: > file2 &&
-- 
2.0.1.1697.g73c6810
Previous: Junio C Hamano
Message 5 of 5 in “reachable.c: add HEAD to reachability starting commits”
  1. reachable.c: add HEAD to reachability starting commitsMax Kirillov, Aug 30, 2014
  2. Jeff KingAug 31, 2014
  3. reachable.c: add HEAD to reachability starting commitsMax Kirillov, Aug 31, 2014
  4. Junio C HamanoSep 2, 2014
  5. reachable.c: add HEAD to reachability starting commitsMax Kirillov, Sep 3, 2014

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.