static const char * const git_replace_usage[] = {
N_("git replace [-f] <object> <replacement>"),
+ N_("git replace [-f] --edit <object>"),
N_("git replace -d <object>..."),
N_("git replace [--format=<format>] [-l [<pattern>]]"),
NULL
return 0;
}
+static void check_ref_valid(unsigned char object[20],
+ unsigned char prev[20],
+ char *ref,
+ int ref_size,
+ int force)
+{
+ if (snprintf(ref, ref_size,
+ "refs/replace/%s",
+ sha1_to_hex(object)) > ref_size - 1)
+ die("replace ref name too long: %.*s...", 50, ref);
+ if (check_refname_format(ref, 0))
+ die("'%s' is not a valid ref name.", ref);
+
+ if (read_ref(ref, prev))
+ hashclr(prev);
+ else if (!force)
+ die("replace ref '%s' already exists", ref);
+}
+
static int replace_object_sha1(const char *object_ref,
unsigned char object[20],
const char *replace_ref,
char ref[PATH_MAX];
struct ref_lock *lock;
- if (snprintf(ref, sizeof(ref),
- "refs/replace/%s",
- sha1_to_hex(object)) > sizeof(ref) - 1)
- die("replace ref name too long: %.*s...", 50, ref);
- 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)
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);
+ check_ref_valid(object, prev, ref, sizeof(ref), force);
lock = lock_any_ref_for_update(ref, prev, 0, NULL);
if (!lock)
{
char *tmpfile = git_pathdup("REPLACE_EDITOBJ");
enum object_type type;
- unsigned char old[20], new[20];
+ unsigned char old[20], new[20], prev[20];
+ char ref[PATH_MAX];
if (get_sha1(object_ref, old) < 0)
die("Not a valid object name: '%s'", object_ref);
if (type < 0)
die("unable to get object type for %s", sha1_to_hex(old));
+ check_ref_valid(old, prev, ref, sizeof(ref), force);
+
export_object(old, tmpfile);
if (launch_editor(tmpfile, NULL, NULL) < 0)
die("editing object file failed");