builtin-update-ref.con commit Merge branch 'rs/archive' (6972ab7)
   1#include "cache.h"
   2#include "refs.h"
   3#include "builtin.h"
   4
   5static const char git_update_ref_usage[] =
   6"git-update-ref [-m <reason>] (-d <refname> <value> | [--no-deref] <refname> <value> [<oldval>])";
   7
   8int cmd_update_ref(int argc, const char **argv, const char *prefix)
   9{
  10        const char *refname=NULL, *value=NULL, *oldval=NULL, *msg=NULL;
  11        unsigned char sha1[20], oldsha1[20];
  12        int i, delete, ref_flags;
  13
  14        delete = 0;
  15        ref_flags = 0;
  16        git_config(git_default_config);
  17
  18        for (i = 1; i < argc; i++) {
  19                if (!strcmp("-m", argv[i])) {
  20                        if (i+1 >= argc)
  21                                usage(git_update_ref_usage);
  22                        msg = argv[++i];
  23                        if (!*msg)
  24                                die("Refusing to perform update with empty message.");
  25                        continue;
  26                }
  27                if (!strcmp("-d", argv[i])) {
  28                        delete = 1;
  29                        continue;
  30                }
  31                if (!strcmp("--no-deref", argv[i])) {
  32                        ref_flags |= REF_NODEREF;
  33                        continue;
  34                }
  35                if (!refname) {
  36                        refname = argv[i];
  37                        continue;
  38                }
  39                if (!value) {
  40                        value = argv[i];
  41                        continue;
  42                }
  43                if (!oldval) {
  44                        oldval = argv[i];
  45                        continue;
  46                }
  47        }
  48        if (!refname || !value)
  49                usage(git_update_ref_usage);
  50
  51        if (get_sha1(value, sha1))
  52                die("%s: not a valid SHA1", value);
  53
  54        if (delete) {
  55                if (oldval)
  56                        usage(git_update_ref_usage);
  57                return delete_ref(refname, sha1);
  58        }
  59
  60        hashclr(oldsha1);
  61        if (oldval && *oldval && get_sha1(oldval, oldsha1))
  62                die("%s: not a valid old SHA1", oldval);
  63
  64        return update_ref(msg, refname, sha1, oldval ? oldsha1 : NULL,
  65                          ref_flags, DIE_ON_ERR);
  66}