From: Jonathan Nieder Date: Wed, 25 Sep 2013 06:35:24 +0000 (-0700) Subject: Merge branch 'cc/replace-with-the-same-type' X-Git-Tag: v1.8.5-rc0~76 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/80f165a58a41ffd37ec24022db8e568bc5165075?ds=inline;hp=-c Merge branch 'cc/replace-with-the-same-type' * 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 --- 80f165a58a41ffd37ec24022db8e568bc5165075 diff --combined builtin/replace.c index 301b45ce6a,d4d1b75ade..b1bd3ef994 --- a/builtin/replace.c +++ b/builtin/replace.c @@@ -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; @@@ -100,12 -101,21 +101,21 @@@ 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() };