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

[PATCH v2 06/17] refs.c: add new function copy_reflog_into_strbuf

From
Ronnie Sahlberg <sahlberg@google.com>
Date
Nov 3, 2014, 19:02 UTC
Message-ID
<1415041339-18450-7-git-send-email-sahlberg@google.com>
In-Reply-To
<1415041339-18450-1-git-send-email-sahlberg@google.com>

Add a new function copy_reflog_into_strbuf() that is a backend specific optimized way to read the whole reflog as is into a strbuf so we can copy it elsewhere instead of having to iterate over all the entries using the iterators.

For the current type of refs backend that use files we simple read_in_full the whole file into a strbuf. When we add other types of backends for refs we will need to implement similarly optimized versions of this functions for them.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
---
 refs.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)
diff --git a/refs.c b/refs.c
index 3d13624..1c968f5 100644
--- a/refs.c
+++ b/refs.c
@@ -2826,6 +2826,37 @@ static int rename_ref_available(const char *oldname, const char *newname)
 static int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1,
 			  const char *logmsg);
 
+/*
+ * This is an optimized function to read the whole reflog as a blob
+ * into a strbuf. It is used during ref_rename so that we can use an
+ * efficient method to read the whole log and later write it back to a
+ * different file.
+ */
+static int copy_reflog_into_strbuf(const char *refname, struct strbuf *buf)
+{
+	struct stat st;
+	int fd;
+
+	if (lstat(git_path("logs/%s", refname), &st) == -1)
+		return 1;
+	if ((fd = open(git_path("logs/%s", refname), O_RDONLY)) == -1) {
+		error("failed to open reflog %s, %s",
+		      refname, strerror(errno));
+		return 1;
+	}
+	strbuf_init(buf, st.st_size);
+	strbuf_setlen(buf, st.st_size);
+	if (read_in_full(fd, buf->buf, st.st_size) != st.st_size) {
+		close(fd);
+		error("failed to read reflog %s, %s",
+		      refname, strerror(errno));
+		return 1;
+	}
+	close(fd);
+
+	return 0;
+}
+
 int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsg)
 {
 	unsigned char sha1[20], orig_sha1[20];
-- 
2.1.0.rc2.206.gedb03e5
Previous: Junio C HamanoNext: Ronnie Sahlberg
Message 8 of 19 in “ref-transaction-rename”
  1. 00/17 ref-transaction-renameRonnie Sahlberg, Nov 3, 2014
  2. 01/17 refs.c: allow passing raw git_committer_info as email to _update_reflogRonnie Sahlberg, Nov 3, 2014
  3. 02/17 refs.c: return error instead of dying when locking fails during transactionRonnie Sahlberg, Nov 3, 2014
  4. 03/17 refs.c: use packed refs when deleting refs during a transactionRonnie Sahlberg, Nov 3, 2014
  5. 04/17 refs.c: use a stringlist for repack_without_refsRonnie Sahlberg, Nov 3, 2014
  6. 05/17 refs.c: add transaction support for replacing a reflogRonnie Sahlberg, Nov 3, 2014
  7. Junio C HamanoNov 3, 2014
  8. 06/17 refs.c: add new function copy_reflog_into_strbufRonnie Sahlberg, Nov 3, 2014
  9. 07/17 refs.c: update rename_ref to use a transactionRonnie Sahlberg, Nov 3, 2014
  10. 08/17 refs.c: rollback the lockfile before we die() in repack_without_refsRonnie Sahlberg, Nov 3, 2014
  11. 09/17 refs.c: move reflog updates into its own functionRonnie Sahlberg, Nov 3, 2014
  12. 10/17 refs.c: write updates to packed refs when a transaction has more than one refRonnie Sahlberg, Nov 3, 2014
  13. 11/17 remote.c: use a transaction for deleting refsRonnie Sahlberg, Nov 3, 2014
  14. 12/17 refs.c: make repack_without_refs staticRonnie Sahlberg, Nov 3, 2014
  15. 13/17 refs.c: make the *_packed_refs functions staticRonnie Sahlberg, Nov 3, 2014
  16. 14/17 refs.c: replace the onerr argument in update_ref with a strbuf errRonnie Sahlberg, Nov 3, 2014
  17. 15/17 refs.c: make add_packed_ref return an error instead of calling dieRonnie Sahlberg, Nov 3, 2014
  18. 16/17 refs.c: make lock_packed_refs take an err argumentRonnie Sahlberg, Nov 3, 2014
  19. 17/17 refs.c: add an err argument to pack_refsRonnie Sahlberg, Nov 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.