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

[PATCH v2 08/24] Extract function should_expire_reflog_ent()

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Dec 12, 2014, 08:56 UTC
Message-ID
<1418374623-5566-9-git-send-email-mhagger@alum.mit.edu>
In-Reply-To
<1418374623-5566-1-git-send-email-mhagger@alum.mit.edu>

Extract from expire_reflog_ent() a function that is solely responsible for deciding whether a reflog entry should be expired. By separating this "business logic" from the mechanics of actually expiring entries, we are working towards the goal of encapsulating reflog expiry within the refs API, with policy decided by a callback function passed to it by its caller.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 builtin/reflog.c | 70 +++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 42 insertions(+), 28 deletions(-)
diff --git a/builtin/reflog.c b/builtin/reflog.c
index ba5b3d3..06ce8b1 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -288,51 +288,65 @@ static int unreachable(struct expire_reflog_cb *cb, struct commit *commit, unsig
 	return !(commit->object.flags & REACHABLE);
 }
 
-static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
-		const char *email, unsigned long timestamp, int tz,
-		const char *message, void *cb_data)
+/*
+ * Return true iff the specified reflog entry should be expired.
+ */
+static int should_expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
+				    const char *email, unsigned long timestamp, int tz,
+				    const char *message, void *cb_data)
 {
 	struct expire_reflog_cb *cb = cb_data;
 	struct commit *old, *new;
 
 	if (timestamp < cb->cmd->expire_total)
-		goto prune;
-
-	if (cb->cmd->rewrite)
-		osha1 = cb->last_kept_sha1;
+		return 1;
 
 	old = new = NULL;
 	if (cb->cmd->stalefix &&
 	    (!keep_entry(&old, osha1) || !keep_entry(&new, nsha1)))
-		goto prune;
+		return 1;
 
 	if (timestamp < cb->cmd->expire_unreachable) {
 		if (cb->unreachable_expire_kind == UE_ALWAYS)
-			goto prune;
+			return 1;
 		if (unreachable(cb, old, osha1) || unreachable(cb, new, nsha1))
-			goto prune;
+			return 1;
 	}
 
 	if (cb->cmd->recno && --(cb->cmd->recno) == 0)
-		goto prune;
-
-	if (cb->newlog) {
-		char sign = (tz < 0) ? '-' : '+';
-		int zone = (tz < 0) ? (-tz) : tz;
-		fprintf(cb->newlog, "%s %s %s %lu %c%04d\t%s",
-			sha1_to_hex(osha1), sha1_to_hex(nsha1),
-			email, timestamp, sign, zone,
-			message);
-		hashcpy(cb->last_kept_sha1, nsha1);
-	}
-	if (cb->cmd->verbose)
-		printf("keep %s", message);
+		return 1;
+
 	return 0;
- prune:
-	if (!cb->newlog)
-		printf("would prune %s", message);
-	else if (cb->cmd->verbose)
-		printf("prune %s", message);
+}
+
+static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
+		const char *email, unsigned long timestamp, int tz,
+		const char *message, void *cb_data)
+{
+	struct expire_reflog_cb *cb = cb_data;
+
+	if (cb->cmd->rewrite)
+		osha1 = cb->last_kept_sha1;
+
+	if (should_expire_reflog_ent(osha1, nsha1, email, timestamp, tz,
+				     message, cb_data)) {
+		if (!cb->newlog)
+			printf("would prune %s", message);
+		else if (cb->cmd->verbose)
+			printf("prune %s", message);
+	} else {
+		if (cb->newlog) {
+			char sign = (tz < 0) ? '-' : '+';
+			int zone = (tz < 0) ? (-tz) : tz;
+			fprintf(cb->newlog, "%s %s %s %lu %c%04d\t%s",
+				sha1_to_hex(osha1), sha1_to_hex(nsha1),
+				email, timestamp, sign, zone,
+				message);
+			hashcpy(cb->last_kept_sha1, nsha1);
+		}
+		if (cb->cmd->verbose)
+			printf("keep %s", message);
+	}
 	return 0;
 }
 
-- 
2.1.3
Previous: Stefan BellerNext: Stefan Beller
Message 12 of 31 in “Add reflog_expire() to the references API”
  1. 00/24 Add reflog_expire() to the references APIMichael Haggerty, Dec 12, 2014
  2. 01/24 refs.c: make ref_transaction_create a wrapper for ref_transaction_updateMichael Haggerty, Dec 12, 2014
  3. 02/24 refs.c: make ref_transaction_delete a wrapper for ref_transaction_updateMichael Haggerty, Dec 12, 2014
  4. 03/24 refs.c: add a function to append a reflog entry to a fdMichael Haggerty, Dec 12, 2014
  5. 04/24 expire_reflog(): it's not an each_ref_fn anymoreMichael Haggerty, Dec 12, 2014
  6. Stefan BellerDec 12, 2014
  7. 05/24 expire_reflog(): rename "ref" parameter to "refname"Michael Haggerty, Dec 12, 2014
  8. 06/24 expire_reflog(): return early if the reference has no reflogMichael Haggerty, Dec 12, 2014
  9. Stefan BellerDec 12, 2014
  10. 07/24 expire_reflog(): use a lock_file for rewriting the reflog fileMichael Haggerty, Dec 12, 2014
  11. Stefan BellerDec 12, 2014
  12. 08/24 Extract function should_expire_reflog_ent()Michael Haggerty, Dec 12, 2014
  13. Stefan BellerDec 12, 2014
  14. 09/24 expire_reflog(): extract two policy-related functionsMichael Haggerty, Dec 12, 2014
  15. 10/24 expire_reflog(): add a "flags" argumentMichael Haggerty, Dec 12, 2014
  16. 11/24 expire_reflog(): move dry_run to flags argumentMichael Haggerty, Dec 12, 2014
  17. 12/24 expire_reflog(): move updateref to flags argumentMichael Haggerty, Dec 12, 2014
  18. 13/24 Rename expire_reflog_cb to expire_reflog_policy_cbMichael Haggerty, Dec 12, 2014
  19. 14/24 struct expire_reflog_cb: a new callback data typeMichael Haggerty, Dec 12, 2014
  20. 15/24 expire_reflog(): pass flags through to expire_reflog_ent()Michael Haggerty, Dec 12, 2014
  21. 16/24 expire_reflog(): move verbose to flags argumentMichael Haggerty, Dec 12, 2014
  22. 17/24 expire_reflog(): move rewrite to flags argumentMichael Haggerty, Dec 12, 2014
  23. 18/24 Move newlog and last_kept_sha1 to "struct expire_reflog_cb"Michael Haggerty, Dec 12, 2014
  24. 19/24 expire_reflog(): treat the policy callback data as opaqueMichael Haggerty, Dec 12, 2014
  25. 20/24 reflog_expire(): new function in the reference APIMichael Haggerty, Dec 12, 2014
  26. 21/24 refs.c: remove unlock_ref/close_ref/commit_ref from the refs apiMichael Haggerty, Dec 12, 2014
  27. 22/24 lock_any_ref_for_update(): inline functionMichael Haggerty, Dec 12, 2014
  28. Stefan BellerDec 12, 2014
  29. 23/24 refs.c: don't expose the internal struct ref_lock in the header fileMichael Haggerty, Dec 12, 2014
  30. 24/24 refs.c: let fprintf handle the formattingMichael Haggerty, Dec 12, 2014
  31. Junio C HamanoDec 12, 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.