зеркало из https://github.com/microsoft/git.git
connect: detect algorithm when fetching refs
If we're fetching refs, detect the hash algorithm and parse the refs using that algorithm. As mentioned in the documentation, if multiple versions of the object-format capability are provided, we use the first. No known implementation supports multiple algorithms now, but they may in the future. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
48bf141589
Коммит
7c601dc333
21
connect.c
21
connect.c
|
@ -220,12 +220,25 @@ static void annotate_refs_with_symref_info(struct ref *ref)
|
|||
|
||||
static void process_capabilities(struct packet_reader *reader, int *linelen)
|
||||
{
|
||||
const char *feat_val;
|
||||
int feat_len;
|
||||
const char *line = reader->line;
|
||||
int nul_location = strlen(line);
|
||||
if (nul_location == *linelen)
|
||||
return;
|
||||
server_capabilities_v1 = xstrdup(line + nul_location + 1);
|
||||
*linelen = nul_location;
|
||||
|
||||
feat_val = server_feature_value("object-format", &feat_len);
|
||||
if (feat_val) {
|
||||
char *hash_name = xstrndup(feat_val, feat_len);
|
||||
int hash_algo = hash_algo_by_name(hash_name);
|
||||
if (hash_algo != GIT_HASH_UNKNOWN)
|
||||
reader->hash_algo = &hash_algos[hash_algo];
|
||||
free(hash_name);
|
||||
} else {
|
||||
reader->hash_algo = &hash_algos[GIT_HASH_SHA1];
|
||||
}
|
||||
}
|
||||
|
||||
static int process_dummy_ref(const struct packet_reader *reader)
|
||||
|
@ -234,7 +247,7 @@ static int process_dummy_ref(const struct packet_reader *reader)
|
|||
struct object_id oid;
|
||||
const char *name;
|
||||
|
||||
if (parse_oid_hex(line, &oid, &name))
|
||||
if (parse_oid_hex_algop(line, &oid, &name, reader->hash_algo))
|
||||
return 0;
|
||||
if (*name != ' ')
|
||||
return 0;
|
||||
|
@ -258,7 +271,7 @@ static int process_ref(const struct packet_reader *reader, int len,
|
|||
struct object_id old_oid;
|
||||
const char *name;
|
||||
|
||||
if (parse_oid_hex(line, &old_oid, &name))
|
||||
if (parse_oid_hex_algop(line, &old_oid, &name, reader->hash_algo))
|
||||
return 0;
|
||||
if (*name != ' ')
|
||||
return 0;
|
||||
|
@ -270,7 +283,7 @@ static int process_ref(const struct packet_reader *reader, int len,
|
|||
die(_("protocol error: unexpected capabilities^{}"));
|
||||
} else if (check_ref(name, flags)) {
|
||||
struct ref *ref = alloc_ref(name);
|
||||
oidcpy(&ref->old_oid, &old_oid);
|
||||
memcpy(ref->old_oid.hash, old_oid.hash, reader->hash_algo->rawsz);
|
||||
**list = ref;
|
||||
*list = &ref->next;
|
||||
}
|
||||
|
@ -288,7 +301,7 @@ static int process_shallow(const struct packet_reader *reader, int len,
|
|||
if (!skip_prefix(line, "shallow ", &arg))
|
||||
return 0;
|
||||
|
||||
if (get_oid_hex(arg, &old_oid))
|
||||
if (get_oid_hex_algop(arg, &old_oid, reader->hash_algo))
|
||||
die(_("protocol error: expected shallow sha-1, got '%s'"), arg);
|
||||
if (!shallow_points)
|
||||
die(_("repository on the other end cannot be shallow"));
|
||||
|
|
Загрузка…
Ссылка в новой задаче