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

[PATCH v4 22/23] try_remove_empty_parents(): teach to remove parents of reflogs, too

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Jan 6, 2017, 16:22 UTC
Message-ID
<2dab5bf3cf9a0da59bf6f10bea32ba4d6d7a0f53.1483719289.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1483719289.git.mhagger@alum.mit.edu>

Add a new "flags" parameter that tells the function whether to remove empty parent directories of the loose reference file, of the reflog file, or both. The new functionality is not yet used.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs/files-backend.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 88f8c7a..bce0022 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2280,10 +2280,18 @@ static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
 	return 0;
 }
 
+enum {
+	REMOVE_EMPTY_PARENTS_REF = 0x01,
+	REMOVE_EMPTY_PARENTS_REFLOG = 0x02
+};
+
 /*
- * Remove empty parents, but spare refs/ and immediate subdirs.
+ * Remove empty parent directories associated with the specified
+ * reference and/or its reflog, but spare [logs/]refs/ and immediate
+ * subdirs. flags is a combination of REMOVE_EMPTY_PARENTS_REF and/or
+ * REMOVE_EMPTY_PARENTS_REFLOG.
  */
-static void try_remove_empty_parents(const char *refname)
+static void try_remove_empty_parents(const char *refname, unsigned int flags)
 {
 	struct strbuf buf = STRBUF_INIT;
 	char *p, *q;
@@ -2299,7 +2307,7 @@ static void try_remove_empty_parents(const char *refname)
 			p++;
 	}
 	q = buf.buf + buf.len;
-	while (1) {
+	while (flags & (REMOVE_EMPTY_PARENTS_REF | REMOVE_EMPTY_PARENTS_REFLOG)) {
 		while (q > p && *q != '/')
 			q--;
 		while (q > p && *(q-1) == '/')
@@ -2307,8 +2315,12 @@ static void try_remove_empty_parents(const char *refname)
 		if (q == p)
 			break;
 		strbuf_setlen(&buf, q - buf.buf);
-		if (rmdir(git_path("%s", buf.buf)))
-			break;
+		if ((flags & REMOVE_EMPTY_PARENTS_REF) &&
+		    rmdir(git_path("%s", buf.buf)))
+			flags &= ~REMOVE_EMPTY_PARENTS_REF;
+		if ((flags & REMOVE_EMPTY_PARENTS_REFLOG) &&
+		    rmdir(git_path("logs/%s", buf.buf)))
+			flags &= ~REMOVE_EMPTY_PARENTS_REFLOG;
 	}
 	strbuf_release(&buf);
 }
@@ -2334,7 +2346,7 @@ static void prune_ref(struct ref_to_prune *r)
 	}
 	ref_transaction_free(transaction);
 	strbuf_release(&err);
-	try_remove_empty_parents(r->name);
+	try_remove_empty_parents(r->name, REMOVE_EMPTY_PARENTS_REF);
 }
 
 static void prune_refs(struct ref_to_prune *r)
-- 
2.9.3
Previous: Michael HaggertyNext: Michael Haggerty
Message 17 of 25 in “Delete directories left empty after ref deletion”
  1. 00/23 Delete directories left empty after ref deletionMichael Haggerty, Jan 6, 2017
  2. 01/23 files_rename_ref(): tidy up whitespaceMichael Haggerty, Jan 6, 2017
  3. 03/23 t5505: use "for-each-ref" to test for the non-existence of referencesMichael Haggerty, Jan 6, 2017
  4. 06/23 raceproof_create_file(): new functionMichael Haggerty, Jan 6, 2017
  5. 02/23 refname_is_safe(): correct docstringMichael Haggerty, Jan 6, 2017
  6. 05/23 safe_create_leading_directories(): set errno on SCLD_EXISTSMichael Haggerty, Jan 6, 2017
  7. 10/23 rename_tmp_log(): improve error reportingMichael Haggerty, Jan 6, 2017
  8. 09/23 rename_tmp_log(): use raceproof_create_file()Michael Haggerty, Jan 6, 2017
  9. 04/23 safe_create_leading_directories_const(): preserve errnoMichael Haggerty, Jan 6, 2017
  10. 07/23 lock_ref_sha1_basic(): inline constantMichael Haggerty, Jan 6, 2017
  11. 13/23 log_ref_setup(): improve robustness against racesMichael Haggerty, Jan 6, 2017
  12. 08/23 lock_ref_sha1_basic(): use raceproof_create_file()Michael Haggerty, Jan 6, 2017
  13. 11/23 log_ref_write(): inline functionMichael Haggerty, Jan 6, 2017
  14. 23/23 files_transaction_commit(): clean up empty directoriesMichael Haggerty, Jan 6, 2017
  15. 18/23 delete_ref_loose(): derive loose reference path from lockMichael Haggerty, Jan 6, 2017
  16. 19/23 delete_ref_loose(): inline functionMichael Haggerty, Jan 6, 2017
  17. 22/23 try_remove_empty_parents(): teach to remove parents of reflogs, tooMichael Haggerty, Jan 6, 2017
  18. 21/23 try_remove_empty_parents(): don't trash argument contentsMichael Haggerty, Jan 6, 2017
  19. 20/23 try_remove_empty_parents(): rename parameter "name" -> "refname"Michael Haggerty, Jan 6, 2017
  20. 16/23 log_ref_setup(): manage the name of the reflog file internallyMichael Haggerty, Jan 6, 2017
  21. 12/23 log_ref_setup(): separate code for create vs non-createMichael Haggerty, Jan 6, 2017
  22. 15/23 log_ref_write_1(): don't depend on logfile argumentMichael Haggerty, Jan 6, 2017
  23. 17/23 log_ref_write_1(): inline functionMichael Haggerty, Jan 6, 2017
  24. 14/23 log_ref_setup(): pass the open file descriptor back to the callerMichael Haggerty, Jan 6, 2017
  25. Jeff KingJan 6, 2017

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.