From: Ronnie Sahlberg <sahlb...@google.com>

Move update_ref() to the refs.c file since this function does not
contain any backend specific code.  Move the ref classifier functions
and write_pseudoref as well, since update_ref depends on them.

Based on Ronnie Sahlberg's patch

Signed-off-by: Ronnie Sahlberg <sahlb...@google.com>
Signed-off-by: David Turner <dtur...@twopensource.com>
Signed-off-by: Junio C Hamano <gits...@pobox.com>
---
 refs-be-files.c | 117 +-------------------------------------------------------
 refs.c          | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 117 insertions(+), 116 deletions(-)

diff --git a/refs-be-files.c b/refs-be-files.c
index fe71ea0..f03d68c 100644
--- a/refs-be-files.c
+++ b/refs-be-files.c
@@ -2675,8 +2675,6 @@ struct pack_refs_cb_data {
        struct ref_to_prune *ref_to_prune;
 };
 
-static int is_per_worktree_ref(const char *refname);
-
 /*
  * An each_ref_entry_fn that is run over loose references only.  If
  * the loose reference can be packed, add an entry in the packed ref
@@ -2691,7 +2689,7 @@ static int pack_if_possible_fn(struct ref_entry *entry, 
void *cb_data)
        int is_tag_ref = starts_with(entry->name, "refs/tags/");
 
        /* Do not pack per-worktree refs: */
-       if (is_per_worktree_ref(entry->name))
+       if (ref_type(entry->name) == REF_TYPE_PER_WORKTREE)
                return 0;
 
        /* ALWAYS pack tags */
@@ -2886,77 +2884,6 @@ static int delete_ref_loose(struct ref_lock *lock, int 
flag, struct strbuf *err)
        return 0;
 }
 
-static int is_per_worktree_ref(const char *refname)
-{
-       return !strcmp(refname, "HEAD") ||
-               starts_with(refname, "refs/bisect/");
-}
-
-static int is_pseudoref_syntax(const char *refname)
-{
-       const char *c;
-
-       for (c = refname; *c; c++) {
-               if (!isupper(*c) && *c != '-' && *c != '_')
-                       return 0;
-       }
-
-       return 1;
-}
-
-enum ref_type ref_type(const char *refname)
-{
-       if (is_per_worktree_ref(refname))
-               return REF_TYPE_PER_WORKTREE;
-       if (is_pseudoref_syntax(refname))
-               return REF_TYPE_PSEUDOREF;
-       return REF_TYPE_NORMAL;
-}
-
-static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
-                          const unsigned char *old_sha1, struct strbuf *err)
-{
-       const char *filename;
-       int fd;
-       static struct lock_file lock;
-       struct strbuf buf = STRBUF_INIT;
-       int ret = -1;
-
-       strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
-
-       filename = git_path("%s", pseudoref);
-       fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
-       if (fd < 0) {
-               strbuf_addf(err, "Could not open '%s' for writing: %s",
-                           filename, strerror(errno));
-               return -1;
-       }
-
-       if (old_sha1) {
-               unsigned char actual_old_sha1[20];
-
-               if (read_ref(pseudoref, actual_old_sha1))
-                       die("could not read ref '%s'", pseudoref);
-               if (hashcmp(actual_old_sha1, old_sha1)) {
-                       strbuf_addf(err, "Unexpected sha1 when writing %s", 
pseudoref);
-                       rollback_lock_file(&lock);
-                       goto done;
-               }
-       }
-
-       if (write_in_full(fd, buf.buf, buf.len) != buf.len) {
-               strbuf_addf(err, "Could not write to '%s'", filename);
-               rollback_lock_file(&lock);
-               goto done;
-       }
-
-       commit_lock_file(&lock);
-       ret = 0;
-done:
-       strbuf_release(&buf);
-       return ret;
-}
-
 static int delete_pseudoref(const char *pseudoref, const unsigned char 
*old_sha1)
 {
        static struct lock_file lock;
@@ -4105,48 +4032,6 @@ int ref_transaction_verify(struct ref_transaction 
*transaction,
                                      flags, NULL, err);
 }
 
-int update_ref(const char *msg, const char *refname,
-              const unsigned char *new_sha1, const unsigned char *old_sha1,
-              unsigned int flags, enum action_on_err onerr)
-{
-       struct ref_transaction *t = NULL;
-       struct strbuf err = STRBUF_INIT;
-       int ret = 0;
-
-       if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
-               ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
-       } else {
-               t = ref_transaction_begin(&err);
-               if (!t ||
-                   ref_transaction_update(t, refname, new_sha1, old_sha1,
-                                          flags, msg, &err) ||
-                   ref_transaction_commit(t, &err)) {
-                       ret = 1;
-                       ref_transaction_free(t);
-               }
-       }
-       if (ret) {
-               const char *str = "update_ref failed for ref '%s': %s";
-
-               switch (onerr) {
-               case UPDATE_REFS_MSG_ON_ERR:
-                       error(str, refname, err.buf);
-                       break;
-               case UPDATE_REFS_DIE_ON_ERR:
-                       die(str, refname, err.buf);
-                       break;
-               case UPDATE_REFS_QUIET_ON_ERR:
-                       break;
-               }
-               strbuf_release(&err);
-               return 1;
-       }
-       strbuf_release(&err);
-       if (t)
-               ref_transaction_free(t);
-       return 0;
-}
-
 static int ref_update_reject_duplicates(struct string_list *refnames,
                                        struct strbuf *err)
 {
diff --git a/refs.c b/refs.c
index 77492ff..610fab0 100644
--- a/refs.c
+++ b/refs.c
@@ -1,3 +1,119 @@
 /*
  * Common refs code for all backends.
  */
+#include "cache.h"
+#include "refs.h"
+#include "lockfile.h"
+
+static int is_per_worktree_ref(const char *refname)
+{
+       return !strcmp(refname, "HEAD") ||
+               starts_with(refname, "refs/bisect/");
+}
+
+static int is_pseudoref_syntax(const char *refname)
+{
+       const char *c;
+
+       for (c = refname; *c; c++) {
+               if (!isupper(*c) && *c != '-' && *c != '_')
+                       return 0;
+       }
+
+       return 1;
+}
+
+enum ref_type ref_type(const char *refname)
+{
+       if (is_per_worktree_ref(refname))
+               return REF_TYPE_PER_WORKTREE;
+       if (is_pseudoref_syntax(refname))
+               return REF_TYPE_PSEUDOREF;
+       return REF_TYPE_NORMAL;
+}
+
+static int write_pseudoref(const char *pseudoref, const unsigned char *sha1,
+                          const unsigned char *old_sha1, struct strbuf *err)
+{
+       const char *filename;
+       int fd;
+       static struct lock_file lock;
+       struct strbuf buf = STRBUF_INIT;
+       int ret = -1;
+
+       strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
+
+       filename = git_path("%s", pseudoref);
+       fd = hold_lock_file_for_update(&lock, filename, LOCK_DIE_ON_ERROR);
+       if (fd < 0) {
+               strbuf_addf(err, "Could not open '%s' for writing: %s",
+                           filename, strerror(errno));
+               return -1;
+       }
+
+       if (old_sha1) {
+               unsigned char actual_old_sha1[20];
+
+               if (read_ref(pseudoref, actual_old_sha1))
+                       die("could not read ref '%s'", pseudoref);
+               if (hashcmp(actual_old_sha1, old_sha1)) {
+                       strbuf_addf(err, "Unexpected sha1 when writing %s", 
pseudoref);
+                       rollback_lock_file(&lock);
+                       goto done;
+               }
+       }
+
+       if (write_in_full(fd, buf.buf, buf.len) != buf.len) {
+               strbuf_addf(err, "Could not write to '%s'", filename);
+               rollback_lock_file(&lock);
+               goto done;
+       }
+
+       commit_lock_file(&lock);
+       ret = 0;
+done:
+       strbuf_release(&buf);
+       return ret;
+}
+
+int update_ref(const char *msg, const char *refname,
+              const unsigned char *new_sha1, const unsigned char *old_sha1,
+              unsigned int flags, enum action_on_err onerr)
+{
+       struct ref_transaction *t = NULL;
+       struct strbuf err = STRBUF_INIT;
+       int ret = 0;
+
+       if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
+               ret = write_pseudoref(refname, new_sha1, old_sha1, &err);
+       } else {
+               t = ref_transaction_begin(&err);
+               if (!t ||
+                   ref_transaction_update(t, refname, new_sha1, old_sha1,
+                                          flags, msg, &err) ||
+                   ref_transaction_commit(t, &err)) {
+                       ret = 1;
+                       ref_transaction_free(t);
+               }
+       }
+       if (ret) {
+               const char *str = "update_ref failed for ref '%s': %s";
+
+               switch (onerr) {
+               case UPDATE_REFS_MSG_ON_ERR:
+                       error(str, refname, err.buf);
+                       break;
+               case UPDATE_REFS_DIE_ON_ERR:
+                       die(str, refname, err.buf);
+                       break;
+               case UPDATE_REFS_QUIET_ON_ERR:
+                       break;
+               }
+               strbuf_release(&err);
+               return 1;
+       }
+       strbuf_release(&err);
+       if (t)
+               ref_transaction_free(t);
+       return 0;
+}
-- 
2.4.2.658.g6d8523e-twtrsrc

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to