mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
![Jeff King](/assets/img/avatar_default.png)
All builtins receive a "prefix" parameter, but it is only useful if they need to adjust filenames given by the user on the command line. For builtins that do not even call parse_options(), they often don't look at the prefix at all, and -Wunused-parameter complains. Let's annotate those to silence the compiler warning. I gave a quick scan of each of these cases, and it seems like they don't have anything they _should_ be using the prefix for (i.e., there is no hidden bug that we are missing). The only questionable cases I saw were: - in git-unpack-file, we create a tempfile which will always be at the root of the repository, even if the command is run from a subdir. Arguably this should be created in the subdir from which we're run (as we report the path only as a relative name). However, nobody has complained, and I'm hesitant to change something that is deep plumbing going back to April 2005 (though I think within our scripts, the sole caller in git-merge-one-file would be OK, as it moves to the toplevel itself). - in fetch-pack, local-filesystem remotes are taken as relative to the project root, not the current directory. So: git init server.git [...put stuff in server.git...] git init client.git cd client.git mkdir subdir cd subdir git fetch-pack ../../server.git ... won't work, as we quietly move to the top of the repository before interpreting the path (so "../server.git" would work). This is weird, but again, nobody has complained and this is how it has always worked. And this is how "git fetch" works, too. Plus it raises questions about how a configured remote like: git config remote.origin.url ../server.git should behave. I can certainly come up with a reasonable set of behavior, but it may not be worth stirring up complications in a plumbing tool. So I've left the behavior untouched in both of those cases. If anybody really wants to revisit them, it's easy enough to drop the UNUSED marker. This commit is just about removing them as obstacles to turning on -Wunused-parameter all the time. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
93 lines
2.4 KiB
C
93 lines
2.4 KiB
C
#include "cache.h"
|
|
#include "builtin.h"
|
|
#include "commit.h"
|
|
#include "tag.h"
|
|
#include "merge-recursive.h"
|
|
#include "xdiff-interface.h"
|
|
|
|
static const char builtin_merge_recursive_usage[] =
|
|
"git %s <base>... -- <head> <remote> ...";
|
|
|
|
static char *better_branch_name(const char *branch)
|
|
{
|
|
static char githead_env[8 + GIT_MAX_HEXSZ + 1];
|
|
char *name;
|
|
|
|
if (strlen(branch) != the_hash_algo->hexsz)
|
|
return xstrdup(branch);
|
|
xsnprintf(githead_env, sizeof(githead_env), "GITHEAD_%s", branch);
|
|
name = getenv(githead_env);
|
|
return xstrdup(name ? name : branch);
|
|
}
|
|
|
|
int cmd_merge_recursive(int argc, const char **argv, const char *prefix UNUSED)
|
|
{
|
|
const struct object_id *bases[21];
|
|
unsigned bases_count = 0;
|
|
int i, failed;
|
|
struct object_id h1, h2;
|
|
struct merge_options o;
|
|
char *better1, *better2;
|
|
struct commit *result;
|
|
|
|
init_merge_options(&o, the_repository);
|
|
if (argv[0] && ends_with(argv[0], "-subtree"))
|
|
o.subtree_shift = "";
|
|
|
|
if (argc < 4)
|
|
usagef(builtin_merge_recursive_usage, argv[0]);
|
|
|
|
for (i = 1; i < argc; ++i) {
|
|
const char *arg = argv[i];
|
|
|
|
if (starts_with(arg, "--")) {
|
|
if (!arg[2])
|
|
break;
|
|
if (parse_merge_opt(&o, arg + 2))
|
|
die(_("unknown option %s"), arg);
|
|
continue;
|
|
}
|
|
if (bases_count < ARRAY_SIZE(bases)-1) {
|
|
struct object_id *oid = xmalloc(sizeof(struct object_id));
|
|
if (get_oid(argv[i], oid))
|
|
die(_("could not parse object '%s'"), argv[i]);
|
|
bases[bases_count++] = oid;
|
|
}
|
|
else
|
|
warning(Q_("cannot handle more than %d base. "
|
|
"Ignoring %s.",
|
|
"cannot handle more than %d bases. "
|
|
"Ignoring %s.",
|
|
ARRAY_SIZE(bases)-1),
|
|
(int)ARRAY_SIZE(bases)-1, argv[i]);
|
|
}
|
|
if (argc - i != 3) /* "--" "<head>" "<remote>" */
|
|
die(_("not handling anything other than two heads merge."));
|
|
|
|
if (repo_read_index_unmerged(the_repository))
|
|
die_resolve_conflict("merge");
|
|
|
|
o.branch1 = argv[++i];
|
|
o.branch2 = argv[++i];
|
|
|
|
if (get_oid(o.branch1, &h1))
|
|
die(_("could not resolve ref '%s'"), o.branch1);
|
|
if (get_oid(o.branch2, &h2))
|
|
die(_("could not resolve ref '%s'"), o.branch2);
|
|
|
|
o.branch1 = better1 = better_branch_name(o.branch1);
|
|
o.branch2 = better2 = better_branch_name(o.branch2);
|
|
|
|
if (o.verbosity >= 3)
|
|
printf(_("Merging %s with %s\n"), o.branch1, o.branch2);
|
|
|
|
failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result);
|
|
|
|
free(better1);
|
|
free(better2);
|
|
|
|
if (failed < 0)
|
|
return 128; /* die() error code */
|
|
return failed;
|
|
}
|