Merge branch 'jk/prefix-filename'
Code clean-up with minor bugfixes. * jk/prefix-filename: bundle: use prefix_filename with bundle path prefix_filename: simplify windows #ifdef prefix_filename: return newly allocated string prefix_filename: drop length parameter prefix_filename: move docstring to header file hash-object: fix buffer reuse with --path in a subdirectory
This commit is contained in:
commit
a026bde1ac
30
abspath.c
30
abspath.c
@ -246,29 +246,21 @@ char *absolute_pathdup(const char *path)
|
|||||||
return strbuf_detach(&sb, NULL);
|
return strbuf_detach(&sb, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
char *prefix_filename(const char *pfx, const char *arg)
|
||||||
* Unlike prefix_path, this should be used if the named file does
|
|
||||||
* not have to interact with index entry; i.e. name of a random file
|
|
||||||
* on the filesystem.
|
|
||||||
*/
|
|
||||||
const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
|
|
||||||
{
|
{
|
||||||
static struct strbuf path = STRBUF_INIT;
|
struct strbuf path = STRBUF_INIT;
|
||||||
#ifndef GIT_WINDOWS_NATIVE
|
size_t pfx_len = pfx ? strlen(pfx) : 0;
|
||||||
if (!pfx_len || is_absolute_path(arg))
|
|
||||||
return arg;
|
if (!pfx_len)
|
||||||
strbuf_reset(&path);
|
; /* nothing to prefix */
|
||||||
strbuf_add(&path, pfx, pfx_len);
|
else if (is_absolute_path(arg))
|
||||||
strbuf_addstr(&path, arg);
|
|
||||||
#else
|
|
||||||
/* don't add prefix to absolute paths, but still replace '\' by '/' */
|
|
||||||
strbuf_reset(&path);
|
|
||||||
if (is_absolute_path(arg))
|
|
||||||
pfx_len = 0;
|
pfx_len = 0;
|
||||||
else if (pfx_len)
|
else
|
||||||
strbuf_add(&path, pfx, pfx_len);
|
strbuf_add(&path, pfx, pfx_len);
|
||||||
|
|
||||||
strbuf_addstr(&path, arg);
|
strbuf_addstr(&path, arg);
|
||||||
|
#ifdef GIT_WINDOWS_NATIVE
|
||||||
convert_slashes(path.buf + pfx_len);
|
convert_slashes(path.buf + pfx_len);
|
||||||
#endif
|
#endif
|
||||||
return path.buf;
|
return strbuf_detach(&path, NULL);
|
||||||
}
|
}
|
||||||
|
11
apply.c
11
apply.c
@ -2046,7 +2046,7 @@ static void prefix_one(struct apply_state *state, char **name)
|
|||||||
char *old_name = *name;
|
char *old_name = *name;
|
||||||
if (!old_name)
|
if (!old_name)
|
||||||
return;
|
return;
|
||||||
*name = xstrdup(prefix_filename(state->prefix, state->prefix_length, *name));
|
*name = prefix_filename(state->prefix, *name);
|
||||||
free(old_name);
|
free(old_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4805,6 +4805,7 @@ int apply_all_patches(struct apply_state *state,
|
|||||||
|
|
||||||
for (i = 0; i < argc; i++) {
|
for (i = 0; i < argc; i++) {
|
||||||
const char *arg = argv[i];
|
const char *arg = argv[i];
|
||||||
|
char *to_free = NULL;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
if (!strcmp(arg, "-")) {
|
if (!strcmp(arg, "-")) {
|
||||||
@ -4814,21 +4815,21 @@ int apply_all_patches(struct apply_state *state,
|
|||||||
errs |= res;
|
errs |= res;
|
||||||
read_stdin = 0;
|
read_stdin = 0;
|
||||||
continue;
|
continue;
|
||||||
} else if (0 < state->prefix_length)
|
} else
|
||||||
arg = prefix_filename(state->prefix,
|
arg = to_free = prefix_filename(state->prefix, arg);
|
||||||
state->prefix_length,
|
|
||||||
arg);
|
|
||||||
|
|
||||||
fd = open(arg, O_RDONLY);
|
fd = open(arg, O_RDONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
error(_("can't open patch '%s': %s"), arg, strerror(errno));
|
error(_("can't open patch '%s': %s"), arg, strerror(errno));
|
||||||
res = -128;
|
res = -128;
|
||||||
|
free(to_free);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
read_stdin = 0;
|
read_stdin = 0;
|
||||||
set_default_whitespace_mode(state);
|
set_default_whitespace_mode(state);
|
||||||
res = apply_patch(state, fd, arg, options);
|
res = apply_patch(state, fd, arg, options);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
free(to_free);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
goto end;
|
goto end;
|
||||||
errs |= res;
|
errs |= res;
|
||||||
|
@ -20,21 +20,15 @@ int cmd_bundle(int argc, const char **argv, const char *prefix)
|
|||||||
struct bundle_header header;
|
struct bundle_header header;
|
||||||
const char *cmd, *bundle_file;
|
const char *cmd, *bundle_file;
|
||||||
int bundle_fd = -1;
|
int bundle_fd = -1;
|
||||||
char buffer[PATH_MAX];
|
|
||||||
|
|
||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
usage(builtin_bundle_usage);
|
usage(builtin_bundle_usage);
|
||||||
|
|
||||||
cmd = argv[1];
|
cmd = argv[1];
|
||||||
bundle_file = argv[2];
|
bundle_file = prefix_filename(prefix, argv[2]);
|
||||||
argc -= 2;
|
argc -= 2;
|
||||||
argv += 2;
|
argv += 2;
|
||||||
|
|
||||||
if (prefix && bundle_file[0] != '/') {
|
|
||||||
snprintf(buffer, sizeof(buffer), "%s/%s", prefix, bundle_file);
|
|
||||||
bundle_file = buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&header, 0, sizeof(header));
|
memset(&header, 0, sizeof(header));
|
||||||
if (strcmp(cmd, "create") && (bundle_fd =
|
if (strcmp(cmd, "create") && (bundle_fd =
|
||||||
read_bundle_header(bundle_file, &header)) < 0)
|
read_bundle_header(bundle_file, &header)) < 0)
|
||||||
|
@ -527,9 +527,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
|
|||||||
else if (given_config_source.file) {
|
else if (given_config_source.file) {
|
||||||
if (!is_absolute_path(given_config_source.file) && prefix)
|
if (!is_absolute_path(given_config_source.file) && prefix)
|
||||||
given_config_source.file =
|
given_config_source.file =
|
||||||
xstrdup(prefix_filename(prefix,
|
prefix_filename(prefix, given_config_source.file);
|
||||||
strlen(prefix),
|
|
||||||
given_config_source.file));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (respect_includes == -1)
|
if (respect_includes == -1)
|
||||||
|
@ -102,7 +102,6 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
|
|||||||
OPT_END()
|
OPT_END()
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
int prefix_length = -1;
|
|
||||||
const char *errstr = NULL;
|
const char *errstr = NULL;
|
||||||
|
|
||||||
argc = parse_options(argc, argv, NULL, hash_object_options,
|
argc = parse_options(argc, argv, NULL, hash_object_options,
|
||||||
@ -113,9 +112,8 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
|
|||||||
else
|
else
|
||||||
prefix = setup_git_directory_gently(&nongit);
|
prefix = setup_git_directory_gently(&nongit);
|
||||||
|
|
||||||
prefix_length = prefix ? strlen(prefix) : 0;
|
|
||||||
if (vpath && prefix)
|
if (vpath && prefix)
|
||||||
vpath = prefix_filename(prefix, prefix_length, vpath);
|
vpath = xstrdup(prefix_filename(prefix, vpath));
|
||||||
|
|
||||||
git_config(git_default_config, NULL);
|
git_config(git_default_config, NULL);
|
||||||
|
|
||||||
@ -144,11 +142,13 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
for (i = 0 ; i < argc; i++) {
|
for (i = 0 ; i < argc; i++) {
|
||||||
const char *arg = argv[i];
|
const char *arg = argv[i];
|
||||||
|
char *to_free = NULL;
|
||||||
|
|
||||||
if (0 <= prefix_length)
|
if (prefix)
|
||||||
arg = prefix_filename(prefix, prefix_length, arg);
|
arg = to_free = prefix_filename(prefix, arg);
|
||||||
hash_object(arg, type, no_filters ? NULL : vpath ? vpath : arg,
|
hash_object(arg, type, no_filters ? NULL : vpath ? vpath : arg,
|
||||||
flags, literally);
|
flags, literally);
|
||||||
|
free(to_free);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stdin_paths)
|
if (stdin_paths)
|
||||||
|
@ -1084,8 +1084,7 @@ static const char *set_outdir(const char *prefix, const char *output_directory)
|
|||||||
if (!output_directory)
|
if (!output_directory)
|
||||||
return prefix;
|
return prefix;
|
||||||
|
|
||||||
return xstrdup(prefix_filename(prefix, outdir_offset,
|
return prefix_filename(prefix, output_directory);
|
||||||
output_directory));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char * const builtin_format_patch_usage[] = {
|
static const char * const builtin_format_patch_usage[] = {
|
||||||
|
@ -11,13 +11,6 @@
|
|||||||
static const char mailinfo_usage[] =
|
static const char mailinfo_usage[] =
|
||||||
"git mailinfo [-k | -b] [-m | --message-id] [-u | --encoding=<encoding> | -n] [--scissors | --no-scissors] <msg> <patch> < mail >info";
|
"git mailinfo [-k | -b] [-m | --message-id] [-u | --encoding=<encoding> | -n] [--scissors | --no-scissors] <msg> <patch> < mail >info";
|
||||||
|
|
||||||
static char *prefix_copy(const char *prefix, const char *filename)
|
|
||||||
{
|
|
||||||
if (!prefix || is_absolute_path(filename))
|
|
||||||
return xstrdup(filename);
|
|
||||||
return xstrdup(prefix_filename(prefix, strlen(prefix), filename));
|
|
||||||
}
|
|
||||||
|
|
||||||
int cmd_mailinfo(int argc, const char **argv, const char *prefix)
|
int cmd_mailinfo(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
const char *def_charset;
|
const char *def_charset;
|
||||||
@ -60,8 +53,8 @@ int cmd_mailinfo(int argc, const char **argv, const char *prefix)
|
|||||||
mi.input = stdin;
|
mi.input = stdin;
|
||||||
mi.output = stdout;
|
mi.output = stdout;
|
||||||
|
|
||||||
msgfile = prefix_copy(prefix, argv[1]);
|
msgfile = prefix_filename(prefix, argv[1]);
|
||||||
patchfile = prefix_copy(prefix, argv[2]);
|
patchfile = prefix_filename(prefix, argv[2]);
|
||||||
|
|
||||||
status = !!mailinfo(&mi, msgfile, patchfile);
|
status = !!mailinfo(&mi, msgfile, patchfile);
|
||||||
clear_mailinfo(&mi);
|
clear_mailinfo(&mi);
|
||||||
|
@ -28,7 +28,6 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
|
|||||||
xmparam_t xmp = {{0}};
|
xmparam_t xmp = {{0}};
|
||||||
int ret = 0, i = 0, to_stdout = 0;
|
int ret = 0, i = 0, to_stdout = 0;
|
||||||
int quiet = 0;
|
int quiet = 0;
|
||||||
int prefixlen = 0;
|
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
OPT_BOOL('p', "stdout", &to_stdout, N_("send results to standard output")),
|
OPT_BOOL('p', "stdout", &to_stdout, N_("send results to standard output")),
|
||||||
OPT_SET_INT(0, "diff3", &xmp.style, N_("use a diff3 based merge"), XDL_MERGE_DIFF3),
|
OPT_SET_INT(0, "diff3", &xmp.style, N_("use a diff3 based merge"), XDL_MERGE_DIFF3),
|
||||||
@ -65,15 +64,19 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
|
|||||||
return error_errno("failed to redirect stderr to /dev/null");
|
return error_errno("failed to redirect stderr to /dev/null");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prefix)
|
|
||||||
prefixlen = strlen(prefix);
|
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
const char *fname = prefix_filename(prefix, prefixlen, argv[i]);
|
char *fname;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!names[i])
|
if (!names[i])
|
||||||
names[i] = argv[i];
|
names[i] = argv[i];
|
||||||
if (read_mmfile(mmfs + i, fname))
|
|
||||||
|
fname = prefix_filename(prefix, argv[i]);
|
||||||
|
ret = read_mmfile(mmfs + i, fname);
|
||||||
|
free(fname);
|
||||||
|
if (ret)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (mmfs[i].size > MAX_XDIFF_SIZE ||
|
if (mmfs[i].size > MAX_XDIFF_SIZE ||
|
||||||
buffer_is_binary(mmfs[i].ptr, mmfs[i].size))
|
buffer_is_binary(mmfs[i].ptr, mmfs[i].size))
|
||||||
return error("Cannot merge binary files: %s",
|
return error("Cannot merge binary files: %s",
|
||||||
@ -90,7 +93,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
const char *filename = argv[0];
|
const char *filename = argv[0];
|
||||||
const char *fpath = prefix_filename(prefix, prefixlen, argv[0]);
|
char *fpath = prefix_filename(prefix, argv[0]);
|
||||||
FILE *f = to_stdout ? stdout : fopen(fpath, "wb");
|
FILE *f = to_stdout ? stdout : fopen(fpath, "wb");
|
||||||
|
|
||||||
if (!f)
|
if (!f)
|
||||||
@ -102,6 +105,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
|
|||||||
else if (fclose(f))
|
else if (fclose(f))
|
||||||
ret = error_errno("Could not close %s", filename);
|
ret = error_errno("Could not close %s", filename);
|
||||||
free(result.ptr);
|
free(result.ptr);
|
||||||
|
free(fpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret > 127)
|
if (ret > 127)
|
||||||
|
@ -228,9 +228,9 @@ static int show_file(const char *arg, int output_prefix)
|
|||||||
if ((filter & (DO_NONFLAGS|DO_NOREV)) == (DO_NONFLAGS|DO_NOREV)) {
|
if ((filter & (DO_NONFLAGS|DO_NOREV)) == (DO_NONFLAGS|DO_NOREV)) {
|
||||||
if (output_prefix) {
|
if (output_prefix) {
|
||||||
const char *prefix = startup_info->prefix;
|
const char *prefix = startup_info->prefix;
|
||||||
show(prefix_filename(prefix,
|
char *fname = prefix_filename(prefix, arg);
|
||||||
prefix ? strlen(prefix) : 0,
|
show(fname);
|
||||||
arg));
|
free(fname);
|
||||||
} else
|
} else
|
||||||
show(arg);
|
show(arg);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -318,7 +318,8 @@ static int add(int ac, const char **av, const char *prefix)
|
|||||||
{
|
{
|
||||||
struct add_opts opts;
|
struct add_opts opts;
|
||||||
const char *new_branch_force = NULL;
|
const char *new_branch_force = NULL;
|
||||||
const char *path, *branch;
|
char *path;
|
||||||
|
const char *branch;
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
OPT__FORCE(&opts.force, N_("checkout <branch> even if already checked out in other worktree")),
|
OPT__FORCE(&opts.force, N_("checkout <branch> even if already checked out in other worktree")),
|
||||||
OPT_STRING('b', NULL, &opts.new_branch, N_("branch"),
|
OPT_STRING('b', NULL, &opts.new_branch, N_("branch"),
|
||||||
@ -338,7 +339,7 @@ static int add(int ac, const char **av, const char *prefix)
|
|||||||
if (ac < 1 || ac > 2)
|
if (ac < 1 || ac > 2)
|
||||||
usage_with_options(worktree_usage, options);
|
usage_with_options(worktree_usage, options);
|
||||||
|
|
||||||
path = prefix_filename(prefix, strlen(prefix), av[0]);
|
path = prefix_filename(prefix, av[0]);
|
||||||
branch = ac < 2 ? "HEAD" : av[1];
|
branch = ac < 2 ? "HEAD" : av[1];
|
||||||
|
|
||||||
if (!strcmp(branch, "-"))
|
if (!strcmp(branch, "-"))
|
||||||
|
14
cache.h
14
cache.h
@ -529,7 +529,19 @@ extern const char *setup_git_directory_gently(int *);
|
|||||||
extern const char *setup_git_directory(void);
|
extern const char *setup_git_directory(void);
|
||||||
extern char *prefix_path(const char *prefix, int len, const char *path);
|
extern char *prefix_path(const char *prefix, int len, const char *path);
|
||||||
extern char *prefix_path_gently(const char *prefix, int len, int *remaining, const char *path);
|
extern char *prefix_path_gently(const char *prefix, int len, int *remaining, const char *path);
|
||||||
extern const char *prefix_filename(const char *prefix, int len, const char *path);
|
|
||||||
|
/*
|
||||||
|
* Concatenate "prefix" (if len is non-zero) and "path", with no
|
||||||
|
* connecting characters (so "prefix" should end with a "/").
|
||||||
|
* Unlike prefix_path, this should be used if the named file does
|
||||||
|
* not have to interact with index entry; i.e. name of a random file
|
||||||
|
* on the filesystem.
|
||||||
|
*
|
||||||
|
* The return value is always a newly allocated string (even if the
|
||||||
|
* prefix was empty).
|
||||||
|
*/
|
||||||
|
extern char *prefix_filename(const char *prefix, const char *path);
|
||||||
|
|
||||||
extern int check_filename(const char *prefix, const char *name);
|
extern int check_filename(const char *prefix, const char *name);
|
||||||
extern void verify_filename(const char *prefix,
|
extern void verify_filename(const char *prefix,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
@ -236,7 +236,7 @@ static void fixup_paths(const char **path, struct strbuf *replacement)
|
|||||||
void diff_no_index(struct rev_info *revs,
|
void diff_no_index(struct rev_info *revs,
|
||||||
int argc, const char **argv)
|
int argc, const char **argv)
|
||||||
{
|
{
|
||||||
int i, prefixlen;
|
int i;
|
||||||
const char *paths[2];
|
const char *paths[2];
|
||||||
struct strbuf replacement = STRBUF_INIT;
|
struct strbuf replacement = STRBUF_INIT;
|
||||||
const char *prefix = revs->prefix;
|
const char *prefix = revs->prefix;
|
||||||
@ -257,7 +257,6 @@ void diff_no_index(struct rev_info *revs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prefixlen = prefix ? strlen(prefix) : 0;
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
const char *p = argv[argc - 2 + i];
|
const char *p = argv[argc - 2 + i];
|
||||||
if (!strcmp(p, "-"))
|
if (!strcmp(p, "-"))
|
||||||
@ -266,8 +265,8 @@ void diff_no_index(struct rev_info *revs,
|
|||||||
* path that is "-", spell it as "./-".
|
* path that is "-", spell it as "./-".
|
||||||
*/
|
*/
|
||||||
p = file_from_standard_input;
|
p = file_from_standard_input;
|
||||||
else if (prefixlen)
|
else if (prefix)
|
||||||
p = xstrdup(prefix_filename(prefix, prefixlen, p));
|
p = prefix_filename(prefix, p);
|
||||||
paths[i] = p;
|
paths[i] = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
diff.c
6
diff.c
@ -4023,8 +4023,7 @@ int diff_opt_parse(struct diff_options *options,
|
|||||||
else if (!strcmp(arg, "--pickaxe-regex"))
|
else if (!strcmp(arg, "--pickaxe-regex"))
|
||||||
options->pickaxe_opts |= DIFF_PICKAXE_REGEX;
|
options->pickaxe_opts |= DIFF_PICKAXE_REGEX;
|
||||||
else if ((argcount = short_opt('O', av, &optarg))) {
|
else if ((argcount = short_opt('O', av, &optarg))) {
|
||||||
const char *path = prefix_filename(prefix, strlen(prefix), optarg);
|
options->orderfile = prefix_filename(prefix, optarg);
|
||||||
options->orderfile = xstrdup(path);
|
|
||||||
return argcount;
|
return argcount;
|
||||||
}
|
}
|
||||||
else if ((argcount = parse_long_opt("diff-filter", av, &optarg))) {
|
else if ((argcount = parse_long_opt("diff-filter", av, &optarg))) {
|
||||||
@ -4071,13 +4070,14 @@ int diff_opt_parse(struct diff_options *options,
|
|||||||
else if (!strcmp(arg, "--no-function-context"))
|
else if (!strcmp(arg, "--no-function-context"))
|
||||||
DIFF_OPT_CLR(options, FUNCCONTEXT);
|
DIFF_OPT_CLR(options, FUNCCONTEXT);
|
||||||
else if ((argcount = parse_long_opt("output", av, &optarg))) {
|
else if ((argcount = parse_long_opt("output", av, &optarg))) {
|
||||||
const char *path = prefix_filename(prefix, strlen(prefix), optarg);
|
char *path = prefix_filename(prefix, optarg);
|
||||||
options->file = fopen(path, "w");
|
options->file = fopen(path, "w");
|
||||||
if (!options->file)
|
if (!options->file)
|
||||||
die_errno("Could not open '%s'", path);
|
die_errno("Could not open '%s'", path);
|
||||||
options->close_file = 1;
|
options->close_file = 1;
|
||||||
if (options->use_color != GIT_COLOR_ALWAYS)
|
if (options->use_color != GIT_COLOR_ALWAYS)
|
||||||
options->use_color = GIT_COLOR_NEVER;
|
options->use_color = GIT_COLOR_NEVER;
|
||||||
|
free(path);
|
||||||
return argcount;
|
return argcount;
|
||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -40,7 +40,7 @@ static void fix_filename(const char *prefix, const char **file)
|
|||||||
if (!file || !*file || !prefix || is_absolute_path(*file)
|
if (!file || !*file || !prefix || is_absolute_path(*file)
|
||||||
|| !strcmp("-", *file))
|
|| !strcmp("-", *file))
|
||||||
return;
|
return;
|
||||||
*file = xstrdup(prefix_filename(prefix, strlen(prefix), *file));
|
*file = prefix_filename(prefix, *file);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int opt_command_mode_error(const struct option *opt,
|
static int opt_command_mode_error(const struct option *opt,
|
||||||
|
11
setup.c
11
setup.c
@ -135,6 +135,7 @@ int path_inside_repo(const char *prefix, const char *path)
|
|||||||
int check_filename(const char *prefix, const char *arg)
|
int check_filename(const char *prefix, const char *arg)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
|
char *to_free = NULL;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
if (starts_with(arg, ":/")) {
|
if (starts_with(arg, ":/")) {
|
||||||
@ -142,13 +143,17 @@ int check_filename(const char *prefix, const char *arg)
|
|||||||
return 1;
|
return 1;
|
||||||
name = arg + 2;
|
name = arg + 2;
|
||||||
} else if (prefix)
|
} else if (prefix)
|
||||||
name = prefix_filename(prefix, strlen(prefix), arg);
|
name = to_free = prefix_filename(prefix, arg);
|
||||||
else
|
else
|
||||||
name = arg;
|
name = arg;
|
||||||
if (!lstat(name, &st))
|
if (!lstat(name, &st)) {
|
||||||
|
free(to_free);
|
||||||
return 1; /* file exists */
|
return 1; /* file exists */
|
||||||
if (errno == ENOENT || errno == ENOTDIR)
|
}
|
||||||
|
if (errno == ENOENT || errno == ENOTDIR) {
|
||||||
|
free(to_free);
|
||||||
return 0; /* file does not exist */
|
return 0; /* file does not exist */
|
||||||
|
}
|
||||||
die_errno("failed to stat '%s'", arg);
|
die_errno("failed to stat '%s'", arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,6 +134,16 @@ test_expect_success 'gitattributes also work in a subdirectory' '
|
|||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '--path works in a subdirectory' '
|
||||||
|
(
|
||||||
|
cd subdir &&
|
||||||
|
path1_sha=$(git hash-object --path=../file1 ../file0) &&
|
||||||
|
path0_sha=$(git hash-object --path=../file0 ../file1) &&
|
||||||
|
test "$file0_sha" = "$path0_sha" &&
|
||||||
|
test "$file1_sha" = "$path1_sha"
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'check that --no-filters option works' '
|
test_expect_success 'check that --no-filters option works' '
|
||||||
nofilters_file1=$(git hash-object --no-filters file1) &&
|
nofilters_file1=$(git hash-object --no-filters file1) &&
|
||||||
test "$file0_sha" = "$nofilters_file1" &&
|
test "$file0_sha" = "$nofilters_file1" &&
|
||||||
|
@ -250,16 +250,19 @@ struct worktree *find_worktree(struct worktree **list,
|
|||||||
{
|
{
|
||||||
struct worktree *wt;
|
struct worktree *wt;
|
||||||
char *path;
|
char *path;
|
||||||
|
char *to_free = NULL;
|
||||||
|
|
||||||
if ((wt = find_worktree_by_suffix(list, arg)))
|
if ((wt = find_worktree_by_suffix(list, arg)))
|
||||||
return wt;
|
return wt;
|
||||||
|
|
||||||
arg = prefix_filename(prefix, strlen(prefix), arg);
|
if (prefix)
|
||||||
|
arg = to_free = prefix_filename(prefix, arg);
|
||||||
path = real_pathdup(arg, 1);
|
path = real_pathdup(arg, 1);
|
||||||
for (; *list; list++)
|
for (; *list; list++)
|
||||||
if (!fspathcmp(path, real_path((*list)->path)))
|
if (!fspathcmp(path, real_path((*list)->path)))
|
||||||
break;
|
break;
|
||||||
free(path);
|
free(path);
|
||||||
|
free(to_free);
|
||||||
return *list;
|
return *list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user