Merge branch 'mm/verify-filename-fix' into maint
"git diff COPYING HEAD:COPYING" gave a nonsense error message that claimed that the treeish HEAD did not have COPYING in it. * mm/verify-filename-fix: verify_filename(): ask the caller to chose the kind of diagnosis sha1_name: do not trigger detailed diagnosis for file arguments
This commit is contained in:
commit
9ca724933a
@ -928,7 +928,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
|
|||||||
if (!seen_dashdash) {
|
if (!seen_dashdash) {
|
||||||
int j;
|
int j;
|
||||||
for (j = i; j < argc; j++)
|
for (j = i; j < argc; j++)
|
||||||
verify_filename(prefix, argv[j]);
|
verify_filename(prefix, argv[j], j == i);
|
||||||
}
|
}
|
||||||
|
|
||||||
paths = get_pathspec(prefix, argv + i);
|
paths = get_pathspec(prefix, argv + i);
|
||||||
|
@ -285,7 +285,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
|
|||||||
rev = argv[i++];
|
rev = argv[i++];
|
||||||
} else {
|
} else {
|
||||||
/* Otherwise we treat this as a filename */
|
/* Otherwise we treat this as a filename */
|
||||||
verify_filename(prefix, argv[i]);
|
verify_filename(prefix, argv[i], 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -486,7 +486,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
if (as_is) {
|
if (as_is) {
|
||||||
if (show_file(arg) && as_is < 2)
|
if (show_file(arg) && as_is < 2)
|
||||||
verify_filename(prefix, arg);
|
verify_filename(prefix, arg, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg,"-n")) {
|
if (!strcmp(arg,"-n")) {
|
||||||
@ -734,7 +734,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
|||||||
as_is = 1;
|
as_is = 1;
|
||||||
if (!show_file(arg))
|
if (!show_file(arg))
|
||||||
continue;
|
continue;
|
||||||
verify_filename(prefix, arg);
|
verify_filename(prefix, arg, 1);
|
||||||
}
|
}
|
||||||
if (verify) {
|
if (verify) {
|
||||||
if (revs_count == 1) {
|
if (revs_count == 1) {
|
||||||
|
4
cache.h
4
cache.h
@ -409,7 +409,9 @@ 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 const char *prefix_filename(const char *prefix, int len, const char *path);
|
extern const char *prefix_filename(const char *prefix, int len, 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, const char *name);
|
extern void verify_filename(const char *prefix,
|
||||||
|
const char *name,
|
||||||
|
int diagnose_misspelt_rev);
|
||||||
extern void verify_non_filename(const char *prefix, const char *name);
|
extern void verify_non_filename(const char *prefix, const char *name);
|
||||||
|
|
||||||
#define INIT_DB_QUIET 0x0001
|
#define INIT_DB_QUIET 0x0001
|
||||||
|
@ -1781,7 +1781,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
|
|||||||
* but the latter we have checked in the main loop.
|
* but the latter we have checked in the main loop.
|
||||||
*/
|
*/
|
||||||
for (j = i; j < argc; j++)
|
for (j = i; j < argc; j++)
|
||||||
verify_filename(revs->prefix, argv[j]);
|
verify_filename(revs->prefix, argv[j], j == i);
|
||||||
|
|
||||||
append_prune_data(&prune_data, argv + i);
|
append_prune_data(&prune_data, argv + i);
|
||||||
break;
|
break;
|
||||||
|
27
setup.c
27
setup.c
@ -53,11 +53,17 @@ int check_filename(const char *prefix, const char *arg)
|
|||||||
die_errno("failed to stat '%s'", arg);
|
die_errno("failed to stat '%s'", arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NORETURN die_verify_filename(const char *prefix, const char *arg)
|
static void NORETURN die_verify_filename(const char *prefix,
|
||||||
|
const char *arg,
|
||||||
|
int diagnose_misspelt_rev)
|
||||||
{
|
{
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
unsigned mode;
|
unsigned mode;
|
||||||
|
|
||||||
|
if (!diagnose_misspelt_rev)
|
||||||
|
die("%s: no such path in the working tree.\n"
|
||||||
|
"Use '-- <path>...' to specify paths that do not exist locally.",
|
||||||
|
arg);
|
||||||
/*
|
/*
|
||||||
* Saying "'(icase)foo' does not exist in the index" when the
|
* Saying "'(icase)foo' does not exist in the index" when the
|
||||||
* user gave us ":(icase)foo" is just stupid. A magic pathspec
|
* user gave us ":(icase)foo" is just stupid. A magic pathspec
|
||||||
@ -80,14 +86,29 @@ static void NORETURN die_verify_filename(const char *prefix, const char *arg)
|
|||||||
* as true, because even if such a filename were to exist, we want
|
* as true, because even if such a filename were to exist, we want
|
||||||
* it to be preceded by the "--" marker (or we want the user to
|
* it to be preceded by the "--" marker (or we want the user to
|
||||||
* use a format like "./-filename")
|
* use a format like "./-filename")
|
||||||
|
*
|
||||||
|
* The "diagnose_misspelt_rev" is used to provide a user-friendly
|
||||||
|
* diagnosis when dying upon finding that "name" is not a pathname.
|
||||||
|
* If set to 1, the diagnosis will try to diagnose "name" as an
|
||||||
|
* invalid object name (e.g. HEAD:foo). If set to 0, the diagnosis
|
||||||
|
* will only complain about an inexisting file.
|
||||||
|
*
|
||||||
|
* This function is typically called to check that a "file or rev"
|
||||||
|
* argument is unambiguous. In this case, the caller will want
|
||||||
|
* diagnose_misspelt_rev == 1 when verifying the first non-rev
|
||||||
|
* argument (which could have been a revision), and
|
||||||
|
* diagnose_misspelt_rev == 0 for the next ones (because we already
|
||||||
|
* saw a filename, there's not ambiguity anymore).
|
||||||
*/
|
*/
|
||||||
void verify_filename(const char *prefix, const char *arg)
|
void verify_filename(const char *prefix,
|
||||||
|
const char *arg,
|
||||||
|
int diagnose_misspelt_rev)
|
||||||
{
|
{
|
||||||
if (*arg == '-')
|
if (*arg == '-')
|
||||||
die("bad flag '%s' used after filename", arg);
|
die("bad flag '%s' used after filename", arg);
|
||||||
if (check_filename(prefix, arg))
|
if (check_filename(prefix, arg))
|
||||||
return;
|
return;
|
||||||
die_verify_filename(prefix, arg);
|
die_verify_filename(prefix, arg, diagnose_misspelt_rev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1127,7 +1127,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
|
|||||||
if (new_filename)
|
if (new_filename)
|
||||||
filename = new_filename;
|
filename = new_filename;
|
||||||
ret = get_tree_entry(tree_sha1, filename, sha1, &oc->mode);
|
ret = get_tree_entry(tree_sha1, filename, sha1, &oc->mode);
|
||||||
if (only_to_die) {
|
if (ret && only_to_die) {
|
||||||
diagnose_invalid_sha1_path(prefix, filename,
|
diagnose_invalid_sha1_path(prefix, filename,
|
||||||
tree_sha1, object_name);
|
tree_sha1, object_name);
|
||||||
free(object_name);
|
free(object_name);
|
||||||
|
@ -171,4 +171,15 @@ test_expect_success 'relative path when startup_info is NULL' '
|
|||||||
grep "BUG: startup_info struct is not initialized." error
|
grep "BUG: startup_info struct is not initialized." error
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '<commit>:file correctly diagnosed after a pathname' '
|
||||||
|
test_must_fail git rev-parse file.txt HEAD:file.txt 1>actual 2>error &&
|
||||||
|
test_i18ngrep ! "exists on disk" error &&
|
||||||
|
test_i18ngrep "no such path in the working tree" error &&
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
file.txt
|
||||||
|
HEAD:file.txt
|
||||||
|
EOF
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user