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

[PATCH 5/6] refs.c: write to a lock file only once

From
Stefan Beller <sbeller@google.com>
Date
Jan 21, 2015, 23:23 UTC
Message-ID
<1421882625-916-6-git-send-email-sbeller@google.com>
In-Reply-To
<1421882625-916-1-git-send-email-sbeller@google.com>

Instead of having to call write_in_full_to_lock_file twice get a formatted string such that we only need to invoke writing to the lock file once.

This is helpful for the next patch when we only open the file descriptors as needed. The lock file API has a reopen_lock_file which currently doesn't open for appending.

No functional changes intended.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
 refs.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/refs.c b/refs.c
index 311599b..0161667 100644
--- a/refs.c
+++ b/refs.c
@@ -3078,8 +3078,8 @@ static ssize_t write_in_full_to_lockfile(struct lock_file *lock,
 static int write_ref_sha1(struct ref_lock *lock,
 	const unsigned char *sha1, const char *logmsg)
 {
-	static char term = '\n';
 	struct object *o;
+	const char *sha1_lf;
 
 	if (!lock) {
 		errno = EINVAL;
@@ -3104,8 +3104,9 @@ static int write_ref_sha1(struct ref_lock *lock,
 		errno = EINVAL;
 		return -1;
 	}
-	if (write_in_full_to_lockfile(lock->lk, sha1_to_hex(sha1), 40) != 40 ||
-	    write_in_full_to_lockfile(lock->lk, &term, 1) != 1 ||
+
+	sha1_lf = xstrfmt("%s\n",  sha1_to_hex(sha1));
+	if (write_in_full_to_lockfile(lock->lk, sha1_lf, 41) != 41 ||
 	    close_ref(lock) < 0) {
 		int save_errno = errno;
 		error("Couldn't write %s", lock->lk->filename.buf);
@@ -3113,6 +3114,7 @@ static int write_ref_sha1(struct ref_lock *lock,
 		errno = save_errno;
 		return -1;
 	}
+	free((void*)sha1_lf);
 	clear_loose_ref_cache(&ref_cache);
 	if (log_ref_write(lock->ref_name, lock->old_sha1, sha1, logmsg) < 0 ||
 	    (strcmp(lock->ref_name, lock->orig_ref_name) &&
@@ -4081,13 +4083,13 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
 	(*cleanup_fn)(cb.policy_cb);
 
 	if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
+		const char *sha1_lf = xstrfmt("%s\n",
+					      sha1_to_hex(cb.last_kept_sha1));
 		if (close_lock_file(&reflog_lock)) {
 			status |= error("couldn't write %s: %s", log_file,
 					strerror(errno));
 		} else if ((flags & EXPIRE_REFLOGS_UPDATE_REF) &&
-			(write_in_full_to_lockfile(lock->lk,
-				sha1_to_hex(cb.last_kept_sha1), 40) != 40 ||
-			 write_in_full_to_lockfile(lock->lk, "\n", 1) != 1 ||
+			(write_in_full_to_lockfile(lock->lk, sha1_lf, 41) != 41 ||
 			 close_ref(lock) < 0)) {
 			status |= error("couldn't write %s",
 					lock->lk->filename.buf);
@@ -4098,6 +4100,7 @@ int reflog_expire(const char *refname, const unsigned char *sha1,
 		} else if ((flags & EXPIRE_REFLOGS_UPDATE_REF) && commit_ref(lock)) {
 			status |= error("couldn't set %s", lock->ref_name);
 		}
+		free((void*)sha1_lf);
 	}
 	free(log_file);
 	unlock_ref(lock);
-- 
2.2.1.62.g3f15098
Previous: Jeff KingNext: Jeff King
Message 11 of 18 in “[PATCHv1 0/6] Fix bug in large transactions”
  1. Stefan BellerJan 21, 2015
  2. 1/6 update-ref: Test handling large transactions properlyStefan Beller, Jan 21, 2015
  3. Jeff KingJan 21, 2015
  4. 2/6 refs.c: remove lock_fd from struct ref_lockStefan Beller, Jan 21, 2015
  5. 3/6 refs.c: replace write_str_in_full by write_in_fullStefan Beller, Jan 21, 2015
  6. Jeff KingJan 21, 2015
  7. Stefan BellerJan 21, 2015
  8. Jeff KingJan 21, 2015
  9. 4/6 refs.c: Have a write_in_full_to_lock_file wrapping write_in_fullStefan Beller, Jan 21, 2015
  10. Jeff KingJan 21, 2015
  11. 5/6 refs.c: write to a lock file only onceStefan Beller, Jan 21, 2015
  12. Jeff KingJan 21, 2015
  13. 6/6 refs.c: enable large transactionsStefan Beller, Jan 21, 2015
  14. Jeff KingJan 21, 2015
  15. Junio C HamanoJan 22, 2015
  16. Stefan BellerJan 22, 2015
  17. Junio C HamanoJan 22, 2015
  18. Stefan BellerJan 22, 2015

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.