Thread (78 messages) flat view 78 messages, 4 authors, 2016-06-15

Re: [PATCH v6 13/42] commit.c: use ref transactions for updates

From: Ronnie Sahlberg <hidden>
Date: 2016-06-15 23:01:10

On Wed, May 14, 2014 at 6:11 PM, Jonathan Nieder [off-list ref] wrote:
Ronnie Sahlberg wrote:

[...]
quoted
+++ b/builtin/commit.c
@@ -1541,11 +1541,12 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
[...]
quoted
@@ -1667,16 +1668,6 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
      strbuf_release(&author_ident);
      free_commit_extra_headers(extra);

-     ref_lock = lock_any_ref_for_update("HEAD",
-                                        !current_head
-                                        ? NULL
-                                        : current_head->object.sha1,
-                                        0, NULL);
-     if (!ref_lock) {
-             rollback_index_files();
-             die(_("cannot lock HEAD ref"));
-     }
-
      nl = strchr(sb.buf, '\n');
      if (nl)
              strbuf_setlen(&sb, nl + 1 - sb.buf);
      else
              strbuf_addch(&sb, '\n');
      strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
      strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);

-     if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
+     transaction = ref_transaction_begin();
+     if (!transaction ||
+         ref_transaction_update(transaction, "HEAD", sha1,
+                                current_head ?
+                                current_head->object.sha1 : NULL,
+                                0, !!current_head) ||
+         ref_transaction_commit(transaction, sb.buf, &err)) {
              rollback_index_files();
-             die(_("cannot update HEAD ref"));
+             die(_("HEAD: cannot update ref: %s"), err.buf);
Same question about !transaction (it also applies to later patches but I
won't mention it any more).

The error message changed from

        fatal: cannot lock HEAD ref

to

        fatal: HEAD: cannot update ref: Cannot lock the ref 'HEAD'.

Does the message from ref_transaction_commit always say what ref
was being updated when it failed?  If so, it's tempting to just use
the message as-is:

        fatal: Cannot lock the ref 'HEAD'

If the caller should add to the message, it could say something about
the context --- e.g.,

        fatal: cannot update HEAD with new commit: cannot lock the ref 'HEAD'

Looking at that,

        die("%s", err.buf)

seems simplest since even if "git commit" was being called in a loop,
it's already clear that git was trying to lock HEAD to advance it.
Changed it to
        die("%s", err.buf)
as you suggested.



Many thanks for the reviews so far!

regards
ronnie sahlberg
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help