Merge branch 'cc/replace-with-the-same-type'
authorJonathan Nieder <jrnieder@gmail.com>
Wed, 25 Sep 2013 06:35:24 +0000 (23:35 -0700)
committerJonathan Nieder <jrnieder@gmail.com>
Wed, 25 Sep 2013 06:35:24 +0000 (23:35 -0700)
* cc/replace-with-the-same-type:
Doc: 'replace' merge and non-merge commits
t6050-replace: use some long option names
replace: allow long option names
Documentation/replace: add Creating Replacement Objects section
t6050-replace: add test to clean up all the replace refs
t6050-replace: test that objects are of the same type
Documentation/replace: state that objects must be of the same type
replace: forbid replacing an object with one of a different type

1  2 
builtin/replace.c
diff --combined builtin/replace.c
index 301b45ce6a453c472566278521bb51fcbd91ee10,d4d1b75aded73dd0224096dbd2a82012e01ac8d6..b1bd3ef9946761b146a38d5977a7378175cda047
@@@ -85,6 -85,7 +85,7 @@@ static int replace_object(const char *o
                          int force)
  {
        unsigned char object[20], prev[20], repl[20];
+       enum object_type obj_type, repl_type;
        char ref[PATH_MAX];
        struct ref_lock *lock;
  
        if (check_refname_format(ref, 0))
                die("'%s' is not a valid ref name.", ref);
  
+       obj_type = sha1_object_info(object, NULL);
+       repl_type = sha1_object_info(repl, NULL);
+       if (!force && obj_type != repl_type)
+               die("Objects must be of the same type.\n"
+                   "'%s' points to a replaced object of type '%s'\n"
+                   "while '%s' points to a replacement object of type '%s'.",
+                   object_ref, typename(obj_type),
+                   replace_ref, typename(repl_type));
        if (read_ref(ref, prev))
                hashclr(prev);
        else if (!force)
                die("replace ref '%s' already exists", ref);
  
 -      lock = lock_any_ref_for_update(ref, prev, 0);
 +      lock = lock_any_ref_for_update(ref, prev, 0, NULL);
        if (!lock)
                die("%s: cannot lock the ref", ref);
        if (write_ref_sha1(lock, repl, NULL) < 0)
@@@ -118,9 -128,9 +128,9 @@@ int cmd_replace(int argc, const char **
  {
        int list = 0, delete = 0, force = 0;
        struct option options[] = {
-               OPT_BOOL('l', NULL, &list, N_("list replace refs")),
-               OPT_BOOL('d', NULL, &delete, N_("delete replace refs")),
-               OPT_BOOL('f', NULL, &force, N_("replace the ref if it exists")),
 -              OPT_BOOLEAN('l', "list", &list, N_("list replace refs")),
 -              OPT_BOOLEAN('d', "delete", &delete, N_("delete replace refs")),
 -              OPT_BOOLEAN('f', "force", &force, N_("replace the ref if it exists")),
++              OPT_BOOL('l', "list", &list, N_("list replace refs")),
++              OPT_BOOL('d', "delete", &delete, N_("delete replace refs")),
++              OPT_BOOL('f', "force", &force, N_("replace the ref if it exists")),
                OPT_END()
        };