fix overslow :/no-such-string-ever-existed diagnostics
"git cmd :/no-such-string-ever-existed" runs an extra round of get_sha1()
since 009fee4
(Detailed diagnosis when parsing an object name fails.,
2009-12-07). Once without error diagnosis to see there is no commit with
such a string in the log message (hence "it cannot be a ref"), and after
seeing that :/no-such-string-ever-existed is not a filename (hence "it
cannot be a path, either"), another time to give "better diagnosis".
The thing is, the second time it runs, we already know that traversing the
history all the way down to the root will _not_ find any matching commit.
Rename misguided "gently" parameter, which is turned off _only_ when the
"detailed diagnosis" codepath knows that it cannot be a ref and making the
call only for the caller to die with a message. Flip its meaning (and
adjust the callers) and call it "only_to_die", which is not a great name,
but it describes far more clearly what the codepaths that switches their
behaviour based on this variable do.
On my box, the command spends ~1.8 seconds without the patch to make the
report; with the patch it spends ~1.12 seconds.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
9619617d33
commit
2e83b66c32
8
cache.h
8
cache.h
@ -785,15 +785,15 @@ struct object_context {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern int get_sha1(const char *str, unsigned char *sha1);
|
extern int get_sha1(const char *str, unsigned char *sha1);
|
||||||
extern int get_sha1_with_mode_1(const char *str, unsigned char *sha1, unsigned *mode, int gently, const char *prefix);
|
extern int get_sha1_with_mode_1(const char *str, unsigned char *sha1, unsigned *mode, int only_to_die, const char *prefix);
|
||||||
static inline int get_sha1_with_mode(const char *str, unsigned char *sha1, unsigned *mode)
|
static inline int get_sha1_with_mode(const char *str, unsigned char *sha1, unsigned *mode)
|
||||||
{
|
{
|
||||||
return get_sha1_with_mode_1(str, sha1, mode, 1, NULL);
|
return get_sha1_with_mode_1(str, sha1, mode, 0, NULL);
|
||||||
}
|
}
|
||||||
extern int get_sha1_with_context_1(const char *name, unsigned char *sha1, struct object_context *orc, int gently, const char *prefix);
|
extern int get_sha1_with_context_1(const char *name, unsigned char *sha1, struct object_context *orc, int only_to_die, const char *prefix);
|
||||||
static inline int get_sha1_with_context(const char *str, unsigned char *sha1, struct object_context *orc)
|
static inline int get_sha1_with_context(const char *str, unsigned char *sha1, struct object_context *orc)
|
||||||
{
|
{
|
||||||
return get_sha1_with_context_1(str, sha1, orc, 1, NULL);
|
return get_sha1_with_context_1(str, sha1, orc, 0, NULL);
|
||||||
}
|
}
|
||||||
extern int get_sha1_hex(const char *hex, unsigned char *sha1);
|
extern int get_sha1_hex(const char *hex, unsigned char *sha1);
|
||||||
extern char *sha1_to_hex(const unsigned char *sha1); /* static buffer result! */
|
extern char *sha1_to_hex(const unsigned char *sha1); /* static buffer result! */
|
||||||
|
2
setup.c
2
setup.c
@ -86,7 +86,7 @@ static void NORETURN die_verify_filename(const char *prefix, const char *arg)
|
|||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
unsigned mode;
|
unsigned mode;
|
||||||
/* try a detailed diagnostic ... */
|
/* try a detailed diagnostic ... */
|
||||||
get_sha1_with_mode_1(arg, sha1, &mode, 0, prefix);
|
get_sha1_with_mode_1(arg, sha1, &mode, 1, prefix);
|
||||||
/* ... or fall back the most general message. */
|
/* ... or fall back the most general message. */
|
||||||
die("ambiguous argument '%s': unknown revision or path not in the working tree.\n"
|
die("ambiguous argument '%s': unknown revision or path not in the working tree.\n"
|
||||||
"Use '--' to separate paths from revisions", arg);
|
"Use '--' to separate paths from revisions", arg);
|
||||||
|
17
sha1_name.c
17
sha1_name.c
@ -1080,11 +1080,12 @@ static void diagnose_invalid_index_path(int stage,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int get_sha1_with_mode_1(const char *name, unsigned char *sha1, unsigned *mode, int gently, const char *prefix)
|
int get_sha1_with_mode_1(const char *name, unsigned char *sha1, unsigned *mode,
|
||||||
|
int only_to_die, const char *prefix)
|
||||||
{
|
{
|
||||||
struct object_context oc;
|
struct object_context oc;
|
||||||
int ret;
|
int ret;
|
||||||
ret = get_sha1_with_context_1(name, sha1, &oc, gently, prefix);
|
ret = get_sha1_with_context_1(name, sha1, &oc, only_to_die, prefix);
|
||||||
*mode = oc.mode;
|
*mode = oc.mode;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1108,7 +1109,7 @@ static char *resolve_relative_path(const char *rel)
|
|||||||
|
|
||||||
int get_sha1_with_context_1(const char *name, unsigned char *sha1,
|
int get_sha1_with_context_1(const char *name, unsigned char *sha1,
|
||||||
struct object_context *oc,
|
struct object_context *oc,
|
||||||
int gently, const char *prefix)
|
int only_to_die, const char *prefix)
|
||||||
{
|
{
|
||||||
int ret, bracket_depth;
|
int ret, bracket_depth;
|
||||||
int namelen = strlen(name);
|
int namelen = strlen(name);
|
||||||
@ -1130,7 +1131,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
|
|||||||
struct cache_entry *ce;
|
struct cache_entry *ce;
|
||||||
char *new_path = NULL;
|
char *new_path = NULL;
|
||||||
int pos;
|
int pos;
|
||||||
if (namelen > 2 && name[1] == '/') {
|
if (!only_to_die && namelen > 2 && name[1] == '/') {
|
||||||
struct commit_list *list = NULL;
|
struct commit_list *list = NULL;
|
||||||
for_each_ref(handle_one_ref, &list);
|
for_each_ref(handle_one_ref, &list);
|
||||||
return get_sha1_oneline(name + 2, sha1, list);
|
return get_sha1_oneline(name + 2, sha1, list);
|
||||||
@ -1173,7 +1174,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
|
|||||||
}
|
}
|
||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
if (!gently && name[1] && name[1] != '/')
|
if (only_to_die && name[1] && name[1] != '/')
|
||||||
diagnose_invalid_index_path(stage, prefix, cp);
|
diagnose_invalid_index_path(stage, prefix, cp);
|
||||||
free(new_path);
|
free(new_path);
|
||||||
return -1;
|
return -1;
|
||||||
@ -1189,7 +1190,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
|
|||||||
if (*cp == ':') {
|
if (*cp == ':') {
|
||||||
unsigned char tree_sha1[20];
|
unsigned char tree_sha1[20];
|
||||||
char *object_name = NULL;
|
char *object_name = NULL;
|
||||||
if (!gently) {
|
if (only_to_die) {
|
||||||
object_name = xmalloc(cp-name+1);
|
object_name = xmalloc(cp-name+1);
|
||||||
strncpy(object_name, name, cp-name);
|
strncpy(object_name, name, cp-name);
|
||||||
object_name[cp-name] = '\0';
|
object_name[cp-name] = '\0';
|
||||||
@ -1202,7 +1203,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 (!gently) {
|
if (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);
|
||||||
@ -1215,7 +1216,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
|
|||||||
free(new_filename);
|
free(new_filename);
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
if (!gently)
|
if (only_to_die)
|
||||||
die("Invalid object name '%s'.", object_name);
|
die("Invalid object name '%s'.", object_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user