Re: [PATCH 4/4] builtin/refs: add "rename" subcommand
From: Junio C Hamano <hidden>
Date: 2026-06-16 14:53:04
Patrick Steinhardt [off-list ref] writes:
+static int cmd_refs_rename(int argc, const char **argv, const char *prefix,
+ struct repository *repo)
+{
+ static char const * const refs_rename_usage[] = {
+ REFS_RENAME_USAGE,
+ NULL
+ };
+ const char *message = NULL;
+ struct option opts[] = {
+ OPT_STRING(0, "message", &message, N_("reason"),
+ N_("reason of the update")),
+ OPT_END(),
+ };
+ const char *oldref, *newref;
+
+ argc = parse_options(argc, argv, prefix, opts, refs_rename_usage, 0);
+ if (argc != 2)
+ usage(_("rename requires old and new reference name"));
+ if (message && !*message)
+ die(_("refusing to perform update with empty message"));
+
+ oldref = argv[0];
+ newref = argv[1];
+
+ if (check_refname_format(oldref, 0))
+ die(_("invalid ref format: %s"), oldref);
+ if (check_refname_format(newref, 0))
+ die(_("invalid ref format: %s"), newref);Do we want to quote the value? What other subcommands do in "git refs"?
+ if (!refs_ref_exists(get_main_ref_store(repo), oldref))
+ die(_("reference does not exist: '%s'"), oldref);
+ if (refs_ref_exists(get_main_ref_store(repo), newref))
+ die(_("reference already exists: '%s'"), newref);
+
+ return refs_rename_ref(get_main_ref_store(repo), oldref, newref, message);
+}I suspect that my version shared the same issue, but doesn't refs_rename_ref() return -1 for failure, which we may want to turn to positive 1 before returning? This is a tangent but git.c:handle_builtin() that calls git.c:run_builtin() may want to do the "negative return? flip the polarity" conversion to make this worry go away. I dunno what such a change would break, though. If we rename a ref that does not have a reflog, would it leave the ref under the new name without reflog, or would we get a reflog with a single entry that marks the fact the old ref was renamed into the new ref? Should that be controlled via --create-reflog option?