From: Ronnie Sahlberg <sahlberg@xxxxxxxxxx> Move update_ref() to refs/refs.c 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. Signed-off-by: Ronnie Sahlberg <sahlberg@xxxxxxxxxx> Signed-off-by: David Turner <dturner@xxxxxxxxxxxxxxxx> Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- refs/files-backend.c | 117 +-------------------------------------------------- refs/refs.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 116 deletions(-) diff --git a/refs/files-backend.c b/refs/files-backend.c index dc39b36..e8c592a 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -2683,8 +2683,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 @@ -2699,7 +2697,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 */ @@ -2894,77 +2892,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/refs.c b/refs/refs.c index 77492ff..a63a58d 100644 --- a/refs/refs.c +++ b/refs/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.6.2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html