Browse Source

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
Junio C Hamano 15 years ago
parent
commit
f7bff00314
  1. 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…
Cancel
Save