From: Ronnie Sahlberg <sahlberg@google.com>
To: git@vger.kernel.org
Cc: Ronnie Sahlberg <sahlberg@google.com>
Subject: [PATCH v2 06/17] refs.c: add new function copy_reflog_into_strbuf
Date: Mon, 3 Nov 2014 11:02:08 -0800 [thread overview]
Message-ID: <1415041339-18450-7-git-send-email-sahlberg@google.com> (raw)
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
next prev parent reply other threads:[~2014-11-03 19:03 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-03 19:02 [PATCH v2 00/17] ref-transaction-rename Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 01/17] refs.c: allow passing raw git_committer_info as email to _update_reflog Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 02/17] refs.c: return error instead of dying when locking fails during transaction Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 03/17] refs.c: use packed refs when deleting refs during a transaction Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 04/17] refs.c: use a stringlist for repack_without_refs Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 05/17] refs.c: add transaction support for replacing a reflog Ronnie Sahlberg
2014-11-03 21:06 ` Junio C Hamano
2014-11-03 19:02 ` Ronnie Sahlberg [this message]
2014-11-03 19:02 ` [PATCH v2 07/17] refs.c: update rename_ref to use a transaction Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 08/17] refs.c: rollback the lockfile before we die() in repack_without_refs Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 09/17] refs.c: move reflog updates into its own function Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 10/17] refs.c: write updates to packed refs when a transaction has more than one ref Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 11/17] remote.c: use a transaction for deleting refs Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 12/17] refs.c: make repack_without_refs static Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 13/17] refs.c: make the *_packed_refs functions static Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 14/17] refs.c: replace the onerr argument in update_ref with a strbuf err Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 15/17] refs.c: make add_packed_ref return an error instead of calling die Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 16/17] refs.c: make lock_packed_refs take an err argument Ronnie Sahlberg
2014-11-03 19:02 ` [PATCH v2 17/17] refs.c: add an err argument to pack_refs Ronnie Sahlberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1415041339-18450-7-git-send-email-sahlberg@google.com \
--to=sahlberg@google.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).