sha1_name: convert struct disambiguate_state to object_id
Convert struct disambiguate_state to use struct object_id by changing the structure definition and applying the following semantic patch: @@ struct disambiguate_state E1; @@ - E1.bin_pfx + E1.bin_pfx.hash @@ struct disambiguate_state *E1; @@ - E1->bin_pfx + E1->bin_pfx.hash @@ struct disambiguate_state E1; @@ - E1.candidate + E1.candidate.hash @@ struct disambiguate_state *E1; @@ - E1->candidate + E1->candidate.hash This conversion is needed so we can convert disambiguate_hint_fn later. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
57836f10ad
commit
d2ee11859c
22
sha1_name.c
22
sha1_name.c
@ -16,11 +16,11 @@ typedef int (*disambiguate_hint_fn)(const unsigned char *, void *);
|
||||
struct disambiguate_state {
|
||||
int len; /* length of prefix in hex chars */
|
||||
char hex_pfx[GIT_MAX_HEXSZ + 1];
|
||||
unsigned char bin_pfx[GIT_MAX_RAWSZ];
|
||||
struct object_id bin_pfx;
|
||||
|
||||
disambiguate_hint_fn fn;
|
||||
void *cb_data;
|
||||
unsigned char candidate[GIT_MAX_RAWSZ];
|
||||
struct object_id candidate;
|
||||
unsigned candidate_exists:1;
|
||||
unsigned candidate_checked:1;
|
||||
unsigned candidate_ok:1;
|
||||
@ -37,10 +37,10 @@ static void update_candidates(struct disambiguate_state *ds, const unsigned char
|
||||
}
|
||||
if (!ds->candidate_exists) {
|
||||
/* this is the first candidate */
|
||||
hashcpy(ds->candidate, current);
|
||||
hashcpy(ds->candidate.hash, current);
|
||||
ds->candidate_exists = 1;
|
||||
return;
|
||||
} else if (!hashcmp(ds->candidate, current)) {
|
||||
} else if (!hashcmp(ds->candidate.hash, current)) {
|
||||
/* the same as what we already have seen */
|
||||
return;
|
||||
}
|
||||
@ -52,14 +52,14 @@ static void update_candidates(struct disambiguate_state *ds, const unsigned char
|
||||
}
|
||||
|
||||
if (!ds->candidate_checked) {
|
||||
ds->candidate_ok = ds->fn(ds->candidate, ds->cb_data);
|
||||
ds->candidate_ok = ds->fn(ds->candidate.hash, ds->cb_data);
|
||||
ds->disambiguate_fn_used = 1;
|
||||
ds->candidate_checked = 1;
|
||||
}
|
||||
|
||||
if (!ds->candidate_ok) {
|
||||
/* discard the candidate; we know it does not satisfy fn */
|
||||
hashcpy(ds->candidate, current);
|
||||
hashcpy(ds->candidate.hash, current);
|
||||
ds->candidate_checked = 0;
|
||||
return;
|
||||
}
|
||||
@ -151,7 +151,7 @@ static void unique_in_pack(struct packed_git *p,
|
||||
int cmp;
|
||||
|
||||
current = nth_packed_object_sha1(p, mid);
|
||||
cmp = hashcmp(ds->bin_pfx, current);
|
||||
cmp = hashcmp(ds->bin_pfx.hash, current);
|
||||
if (!cmp) {
|
||||
first = mid;
|
||||
break;
|
||||
@ -170,7 +170,7 @@ static void unique_in_pack(struct packed_git *p,
|
||||
*/
|
||||
for (i = first; i < num && !ds->ambiguous; i++) {
|
||||
current = nth_packed_object_sha1(p, i);
|
||||
if (!match_sha(ds->len, ds->bin_pfx, current))
|
||||
if (!match_sha(ds->len, ds->bin_pfx.hash, current))
|
||||
break;
|
||||
update_candidates(ds, current);
|
||||
}
|
||||
@ -213,12 +213,12 @@ static int finish_object_disambiguation(struct disambiguate_state *ds,
|
||||
* same repository!
|
||||
*/
|
||||
ds->candidate_ok = (!ds->disambiguate_fn_used ||
|
||||
ds->fn(ds->candidate, ds->cb_data));
|
||||
ds->fn(ds->candidate.hash, ds->cb_data));
|
||||
|
||||
if (!ds->candidate_ok)
|
||||
return SHORT_NAME_AMBIGUOUS;
|
||||
|
||||
hashcpy(sha1, ds->candidate);
|
||||
hashcpy(sha1, ds->candidate.hash);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -332,7 +332,7 @@ static int init_object_disambiguation(const char *name, int len,
|
||||
ds->hex_pfx[i] = c;
|
||||
if (!(i & 1))
|
||||
val <<= 4;
|
||||
ds->bin_pfx[i >> 1] |= val;
|
||||
ds->bin_pfx.hash[i >> 1] |= val;
|
||||
}
|
||||
|
||||
ds->len = len;
|
||||
|
Loading…
Reference in New Issue
Block a user