Merge branch 'jk/fsck-exit-code-fix'
[gitweb.git] / builtin / update-ref.c
index 3067b11310fb01e9e05a1988898566f211601e07..54a48c0cfaab57122fc7ce57c525638c2c95408c 100644 (file)
@@ -12,11 +12,8 @@ static const char * const git_update_ref_usage[] = {
        NULL
 };
 
-static struct ref_transaction *transaction;
-
 static char line_termination = '\n';
 static int update_flags;
-static struct strbuf err = STRBUF_INIT;
 
 /*
  * Parse one whitespace- or NUL-terminated, possibly C-quoted argument
@@ -177,8 +174,10 @@ static int parse_next_sha1(struct strbuf *input, const char **next,
  * depending on how line_termination is set.
  */
 
-static const char *parse_cmd_update(struct strbuf *input, const char *next)
+static const char *parse_cmd_update(struct ref_transaction *transaction,
+                                   struct strbuf *input, const char *next)
 {
+       struct strbuf err = STRBUF_INIT;
        char *refname;
        unsigned char new_sha1[20];
        unsigned char old_sha1[20];
@@ -204,12 +203,15 @@ static const char *parse_cmd_update(struct strbuf *input, const char *next)
 
        update_flags = 0;
        free(refname);
+       strbuf_release(&err);
 
        return next;
 }
 
-static const char *parse_cmd_create(struct strbuf *input, const char *next)
+static const char *parse_cmd_create(struct ref_transaction *transaction,
+                                   struct strbuf *input, const char *next)
 {
+       struct strbuf err = STRBUF_INIT;
        char *refname;
        unsigned char new_sha1[20];
 
@@ -226,16 +228,21 @@ static const char *parse_cmd_create(struct strbuf *input, const char *next)
        if (*next != line_termination)
                die("create %s: extra input: %s", refname, next);
 
-       ref_transaction_create(transaction, refname, new_sha1, update_flags);
+       if (ref_transaction_create(transaction, refname, new_sha1,
+                                  update_flags, &err))
+               die("%s", err.buf);
 
        update_flags = 0;
        free(refname);
+       strbuf_release(&err);
 
        return next;
 }
 
-static const char *parse_cmd_delete(struct strbuf *input, const char *next)
+static const char *parse_cmd_delete(struct ref_transaction *transaction,
+                                   struct strbuf *input, const char *next)
 {
+       struct strbuf err = STRBUF_INIT;
        char *refname;
        unsigned char old_sha1[20];
        int have_old;
@@ -256,17 +263,21 @@ static const char *parse_cmd_delete(struct strbuf *input, const char *next)
        if (*next != line_termination)
                die("delete %s: extra input: %s", refname, next);
 
-       ref_transaction_delete(transaction, refname, old_sha1,
-                              update_flags, have_old);
+       if (ref_transaction_delete(transaction, refname, old_sha1,
+                                  update_flags, have_old, &err))
+               die("%s", err.buf);
 
        update_flags = 0;
        free(refname);
+       strbuf_release(&err);
 
        return next;
 }
 
-static const char *parse_cmd_verify(struct strbuf *input, const char *next)
+static const char *parse_cmd_verify(struct ref_transaction *transaction,
+                                   struct strbuf *input, const char *next)
 {
+       struct strbuf err = STRBUF_INIT;
        char *refname;
        unsigned char new_sha1[20];
        unsigned char old_sha1[20];
@@ -294,6 +305,7 @@ static const char *parse_cmd_verify(struct strbuf *input, const char *next)
 
        update_flags = 0;
        free(refname);
+       strbuf_release(&err);
 
        return next;
 }
@@ -307,7 +319,7 @@ static const char *parse_cmd_option(struct strbuf *input, const char *next)
        return next + 8;
 }
 
-static void update_refs_stdin(void)
+static void update_refs_stdin(struct ref_transaction *transaction)
 {
        struct strbuf input = STRBUF_INIT;
        const char *next;
@@ -322,13 +334,13 @@ static void update_refs_stdin(void)
                else if (isspace(*next))
                        die("whitespace before command: %s", next);
                else if (starts_with(next, "update "))
-                       next = parse_cmd_update(&input, next + 7);
+                       next = parse_cmd_update(transaction, &input, next + 7);
                else if (starts_with(next, "create "))
-                       next = parse_cmd_create(&input, next + 7);
+                       next = parse_cmd_create(transaction, &input, next + 7);
                else if (starts_with(next, "delete "))
-                       next = parse_cmd_delete(&input, next + 7);
+                       next = parse_cmd_delete(transaction, &input, next + 7);
                else if (starts_with(next, "verify "))
-                       next = parse_cmd_verify(&input, next + 7);
+                       next = parse_cmd_verify(transaction, &input, next + 7);
                else if (starts_with(next, "option "))
                        next = parse_cmd_option(&input, next + 7);
                else
@@ -362,15 +374,21 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
                die("Refusing to perform update with empty message.");
 
        if (read_stdin) {
-               transaction = ref_transaction_begin();
+               struct strbuf err = STRBUF_INIT;
+               struct ref_transaction *transaction;
+
+               transaction = ref_transaction_begin(&err);
+               if (!transaction)
+                       die("%s", err.buf);
                if (delete || no_deref || argc > 0)
                        usage_with_options(git_update_ref_usage, options);
                if (end_null)
                        line_termination = '\0';
-               update_refs_stdin();
+               update_refs_stdin(transaction);
                if (ref_transaction_commit(transaction, msg, &err))
                        die("%s", err.buf);
                ref_transaction_free(transaction);
+               strbuf_release(&err);
                return 0;
        }