sha1_name.c: fix parsing of ":/token" syntax
The parser tried to clean up the object flags it used while finding commits with matching string, but was not doing a very good job at it. This caused "checkout -b new ':/token'", which internally tries to parse ':/token' twice as an object name, to fail when the commit in question was reachable from only one ref. The mask bits given to pop_most_recent_commit(&list, MASK) means "I have already been on the list to be processed, so please do not place me again even if I am found to be a parent of some other commit on the list." So mark them when we add them to the list at the beginning. Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
593ce2bea5
commit
f7bff00314
21
sha1_name.c
21
sha1_name.c
|
|
@ -659,6 +659,16 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1)
|
||||||
return get_short_sha1(name, len, sha1, 0);
|
return get_short_sha1(name, len, sha1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This interprets names like ':/Initial revision of "git"' by searching
|
||||||
|
* through history and returning the first commit whose message starts
|
||||||
|
* with the given string.
|
||||||
|
*
|
||||||
|
* For future extension, ':/!' is reserved. If you want to match a message
|
||||||
|
* beginning with a '!', you have to repeat the exclamation mark.
|
||||||
|
*/
|
||||||
|
#define ONELINE_SEEN (1u<<20)
|
||||||
|
|
||||||
static int handle_one_ref(const char *path,
|
static int handle_one_ref(const char *path,
|
||||||
const unsigned char *sha1, int flag, void *cb_data)
|
const unsigned char *sha1, int flag, void *cb_data)
|
||||||
{
|
{
|
||||||
|
|
@ -674,19 +684,10 @@ static int handle_one_ref(const char *path,
|
||||||
if (object->type != OBJ_COMMIT)
|
if (object->type != OBJ_COMMIT)
|
||||||
return 0;
|
return 0;
|
||||||
insert_by_date((struct commit *)object, list);
|
insert_by_date((struct commit *)object, list);
|
||||||
|
object->flags |= ONELINE_SEEN;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* This interprets names like ':/Initial revision of "git"' by searching
|
|
||||||
* through history and returning the first commit whose message starts
|
|
||||||
* with the given string.
|
|
||||||
*
|
|
||||||
* For future extension, ':/!' is reserved. If you want to match a message
|
|
||||||
* beginning with a '!', you have to repeat the exclamation mark.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ONELINE_SEEN (1u<<20)
|
|
||||||
static int get_sha1_oneline(const char *prefix, unsigned char *sha1)
|
static int get_sha1_oneline(const char *prefix, unsigned char *sha1)
|
||||||
{
|
{
|
||||||
struct commit_list *list = NULL, *backup = NULL, *l;
|
struct commit_list *list = NULL, *backup = NULL, *l;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue