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

[PATCH v3 15/23] log_ref_setup(): manage the name of the reflog file internally

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Dec 31, 2016, 03:12 UTC
Message-ID
<18e824188fd9254d4649cd692aabb11ce6cd1c03.1483153436.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1483153436.git.mhagger@alum.mit.edu>

Instead of writing the name of the reflog file into a strbuf that is supplied by the caller but not needed there, write it into a local temporary buffer and remove the strbuf parameter entirely.

And while we're adjusting the function signature, reorder the arguments to move the input parameters before the output parameters.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs/files-backend.c | 69 ++++++++++++++++++++++++++--------------------------
 1 file changed, 34 insertions(+), 35 deletions(-)
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 5a96424..455652c 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2719,37 +2719,36 @@ static int open_or_create_logfile(const char *path, void *cb)
 }
 
 /*
- * Create a reflog for a ref. Store its path to *logfile. If
- * force_create = 0, only create the reflog for certain refs (those
- * for which should_autocreate_reflog returns non-zero). Otherwise,
- * create it regardless of the reference name. If the logfile already
- * existed or was created, return 0 and set *logfd to the file
- * descriptor opened for appending to the file. If no logfile exists
- * and we decided not to create one, return 0 and set *logfd to -1. On
- * failure, fill in *err, set *logfd to -1, and return -1.
+ * Create a reflog for a ref. If force_create = 0, only create the
+ * reflog for certain refs (those for which should_autocreate_reflog
+ * returns non-zero). Otherwise, create it regardless of the reference
+ * name. If the logfile already existed or was created, return 0 and
+ * set *logfd to the file descriptor opened for appending to the file.
+ * If no logfile exists and we decided not to create one, return 0 and
+ * set *logfd to -1. On failure, fill in *err, set *logfd to -1, and
+ * return -1.
  */
-static int log_ref_setup(const char *refname,
-			 struct strbuf *logfile, int *logfd,
-			 struct strbuf *err, int force_create)
+static int log_ref_setup(const char *refname, int force_create,
+			 int *logfd, struct strbuf *err)
 {
-	strbuf_git_path(logfile, "logs/%s", refname);
+	char *logfile = git_pathdup("logs/%s", refname);
 
 	if (force_create || should_autocreate_reflog(refname)) {
-		if (raceproof_create_file(logfile->buf, open_or_create_logfile, logfd)) {
+		if (raceproof_create_file(logfile, open_or_create_logfile, logfd)) {
 			if (errno == ENOENT)
 				strbuf_addf(err, "unable to create directory for '%s': "
-					    "%s", logfile->buf, strerror(errno));
+					    "%s", logfile, strerror(errno));
 			else if (errno == EISDIR)
 				strbuf_addf(err, "there are still logs under '%s'",
-					    logfile->buf);
+					    logfile);
 			else
 				strbuf_addf(err, "unable to append to '%s': %s",
-					    logfile->buf, strerror(errno));
+					    logfile, strerror(errno));
 
-			return -1;
+			goto error;
 		}
 	} else {
-		*logfd = open(logfile->buf, O_APPEND | O_WRONLY, 0666);
+		*logfd = open(logfile, O_APPEND | O_WRONLY, 0666);
 		if (*logfd < 0) {
 			if (errno == ENOENT || errno == EISDIR) {
 				/*
@@ -2760,34 +2759,39 @@ static int log_ref_setup(const char *refname,
 				 */
 			} else {
 				strbuf_addf(err, "unable to append to '%s': %s",
-					    logfile->buf, strerror(errno));
-				return -1;
+					    logfile, strerror(errno));
+				goto error;
 			}
 		}
 	}
 
 	if (*logfd >= 0)
-		adjust_shared_perm(logfile->buf);
+		adjust_shared_perm(logfile);
 
+	free(logfile);
 	return 0;
+
+error:
+	free(logfile);
+	return -1;
 }
 
 static int files_create_reflog(struct ref_store *ref_store,
 			       const char *refname, int force_create,
 			       struct strbuf *err)
 {
-	int ret;
-	struct strbuf sb = STRBUF_INIT;
 	int fd;
 
 	/* Check validity (but we don't need the result): */
 	files_downcast(ref_store, 0, "create_reflog");
 
-	ret = log_ref_setup(refname, &sb, &fd, err, force_create);
+	if (log_ref_setup(refname, force_create, &fd, err))
+		return -1;
+
 	if (fd >= 0)
 		close(fd);
-	strbuf_release(&sb);
-	return ret;
+
+	return 0;
 }
 
 static int log_ref_write_fd(int fd, const unsigned char *old_sha1,
@@ -2818,16 +2822,15 @@ static int log_ref_write_fd(int fd, const unsigned char *old_sha1,
 
 static int log_ref_write_1(const char *refname, const unsigned char *old_sha1,
 			   const unsigned char *new_sha1, const char *msg,
-			   struct strbuf *logfile, int flags,
-			   struct strbuf *err)
+			   int flags, struct strbuf *err)
 {
 	int logfd, result;
 
 	if (log_all_ref_updates < 0)
 		log_all_ref_updates = !is_bare_repository();
 
-	result = log_ref_setup(refname, logfile, &logfd, err,
-			       flags & REF_FORCE_CREATE_REFLOG);
+	result = log_ref_setup(refname, flags & REF_FORCE_CREATE_REFLOG,
+			       &logfd, err);
 
 	if (result)
 		return result;
@@ -2858,11 +2861,7 @@ int files_log_ref_write(const char *refname, const unsigned char *old_sha1,
 			const unsigned char *new_sha1, const char *msg,
 			int flags, struct strbuf *err)
 {
-	struct strbuf sb = STRBUF_INIT;
-	int ret = log_ref_write_1(refname, old_sha1, new_sha1, msg, &sb, flags,
-				  err);
-	strbuf_release(&sb);
-	return ret;
+	return log_ref_write_1(refname, old_sha1, new_sha1, msg, flags, err);
 }
 
 /*
-- 
2.9.3
Previous: Michael HaggertyNext: Michael Haggerty
Message 22 of 55 in “Delete directories left empty after ref deletion”
  1. 00/23 Delete directories left empty after ref deletionMichael Haggerty, Dec 31, 2016
  2. 01/23 files_rename_ref(): tidy up whitespaceMichael Haggerty, Dec 31, 2016
  3. 02/23 t5505: use "for-each-ref" to test for the non-existence of referencesMichael Haggerty, Dec 31, 2016
  4. 03/23 safe_create_leading_directories_const(): preserve errnoMichael Haggerty, Dec 31, 2016
  5. 05/23 raceproof_create_file(): new functionMichael Haggerty, Dec 31, 2016
  6. Jeff KingDec 31, 2016
  7. Michael HaggertyDec 31, 2016
  8. Junio C HamanoJan 1, 2017
  9. 06/23 lock_ref_sha1_basic(): inline constantMichael Haggerty, Dec 31, 2016
  10. 07/23 lock_ref_sha1_basic(): use raceproof_create_file()Michael Haggerty, Dec 31, 2016
  11. 13/23 log_ref_setup(): pass the open file descriptor back to the callerMichael Haggerty, Dec 31, 2016
  12. Jeff KingDec 31, 2016
  13. Michael HaggertyDec 31, 2016
  14. Jeff KingDec 31, 2016
  15. Junio C HamanoJan 1, 2017
  16. 12/23 log_ref_setup(): improve robustness against racesMichael Haggerty, Dec 31, 2016
  17. 11/23 log_ref_setup(): separate code for create vs non-createMichael Haggerty, Dec 31, 2016
  18. Jeff KingDec 31, 2016
  19. Michael HaggertyDec 31, 2016
  20. Junio C HamanoJan 1, 2017
  21. Michael HaggertyJan 1, 2017
  22. 15/23 log_ref_setup(): manage the name of the reflog file internallyMichael Haggerty, Dec 31, 2016
  23. 16/23 log_ref_write_1(): inline functionMichael Haggerty, Dec 31, 2016
  24. 19/23 try_remove_empty_parents(): rename parameter "name" -> "refname"Michael Haggerty, Dec 31, 2016
  25. 20/23 try_remove_empty_parents(): don't trash argument contentsMichael Haggerty, Dec 31, 2016
  26. Jeff KingDec 31, 2016
  27. Michael HaggertyJan 2, 2017
  28. Jeff KingJan 2, 2017
  29. 22/23 try_remove_empty_parents(): teach to remove parents of reflogs, tooMichael Haggerty, Dec 31, 2016
  30. 21/23 try_remove_empty_parents(): don't accommodate consecutive slashesMichael Haggerty, Dec 31, 2016
  31. Junio C HamanoJan 1, 2017
  32. Jeff KingJan 1, 2017
  33. Michael HaggertyJan 2, 2017
  34. Jeff KingJan 2, 2017
  35. 23/23 files_transaction_commit(): clean up empty directoriesMichael Haggerty, Dec 31, 2016
  36. 04/23 safe_create_leading_directories(): set errno on SCLD_EXISTSMichael Haggerty, Dec 31, 2016
  37. 08/23 rename_tmp_log(): use raceproof_create_file()Michael Haggerty, Dec 31, 2016
  38. 14/23 log_ref_write_1(): don't depend on logfile argumentMichael Haggerty, Dec 31, 2016
  39. Jeff KingDec 31, 2016
  40. Michael HaggertyDec 31, 2016
  41. 17/23 delete_ref_loose(): derive loose reference path from lockMichael Haggerty, Dec 31, 2016
  42. 18/23 delete_ref_loose(): inline functionMichael Haggerty, Dec 31, 2016
  43. 09/23 rename_tmp_log(): improve error reportingMichael Haggerty, Dec 31, 2016
  44. 10/23 log_ref_write(): inline functionMichael Haggerty, Dec 31, 2016
  45. Junio C HamanoJan 1, 2017
  46. Michael HaggertyJan 1, 2017
  47. Jeff KingDec 31, 2016
  48. Junio C HamanoJan 1, 2017
  49. Jacob KellerJan 1, 2017
  50. Jacob KellerJan 1, 2017
  51. Philip OakleyJan 1, 2017
  52. Jacob KellerJan 1, 2017
  53. Jeff KingJan 2, 2017
  54. Michael HaggertyJan 2, 2017
  55. Jacob KellerJan 2, 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.