Skip to content

Commit ae2948f

Browse files
bmwillgitster
authored andcommitted
upload-pack: factor out processing lines
Factor out the logic for processing shallow, deepen, deepen_since, and deepen_not lines into their own functions to simplify the 'receive_needs()' function in addition to making it easier to reuse some of this logic when implementing protocol_v2. Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent a3d6b53 commit ae2948f

File tree

1 file changed

+74
-39
lines changed

1 file changed

+74
-39
lines changed

upload-pack.c

Lines changed: 74 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,75 @@ static void deepen_by_rev_list(int ac, const char **av,
724724
packet_flush(1);
725725
}
726726

727+
static int process_shallow(const char *line, struct object_array *shallows)
728+
{
729+
const char *arg;
730+
if (skip_prefix(line, "shallow ", &arg)) {
731+
struct object_id oid;
732+
struct object *object;
733+
if (get_oid_hex(arg, &oid))
734+
die("invalid shallow line: %s", line);
735+
object = parse_object(&oid);
736+
if (!object)
737+
return 1;
738+
if (object->type != OBJ_COMMIT)
739+
die("invalid shallow object %s", oid_to_hex(&oid));
740+
if (!(object->flags & CLIENT_SHALLOW)) {
741+
object->flags |= CLIENT_SHALLOW;
742+
add_object_array(object, NULL, shallows);
743+
}
744+
return 1;
745+
}
746+
747+
return 0;
748+
}
749+
750+
static int process_deepen(const char *line, int *depth)
751+
{
752+
const char *arg;
753+
if (skip_prefix(line, "deepen ", &arg)) {
754+
char *end = NULL;
755+
*depth = (int)strtol(arg, &end, 0);
756+
if (!end || *end || *depth <= 0)
757+
die("Invalid deepen: %s", line);
758+
return 1;
759+
}
760+
761+
return 0;
762+
}
763+
764+
static int process_deepen_since(const char *line, timestamp_t *deepen_since, int *deepen_rev_list)
765+
{
766+
const char *arg;
767+
if (skip_prefix(line, "deepen-since ", &arg)) {
768+
char *end = NULL;
769+
*deepen_since = parse_timestamp(arg, &end, 0);
770+
if (!end || *end || !deepen_since ||
771+
/* revisions.c's max_age -1 is special */
772+
*deepen_since == -1)
773+
die("Invalid deepen-since: %s", line);
774+
*deepen_rev_list = 1;
775+
return 1;
776+
}
777+
return 0;
778+
}
779+
780+
static int process_deepen_not(const char *line, struct string_list *deepen_not, int *deepen_rev_list)
781+
{
782+
const char *arg;
783+
if (skip_prefix(line, "deepen-not ", &arg)) {
784+
char *ref = NULL;
785+
struct object_id oid;
786+
if (expand_ref(arg, strlen(arg), &oid, &ref) != 1)
787+
die("git upload-pack: ambiguous deepen-not: %s", line);
788+
string_list_append(deepen_not, ref);
789+
free(ref);
790+
*deepen_rev_list = 1;
791+
return 1;
792+
}
793+
return 0;
794+
}
795+
727796
static void receive_needs(void)
728797
{
729798
struct object_array shallows = OBJECT_ARRAY_INIT;
@@ -745,49 +814,15 @@ static void receive_needs(void)
745814
if (!line)
746815
break;
747816

748-
if (skip_prefix(line, "shallow ", &arg)) {
749-
struct object_id oid;
750-
struct object *object;
751-
if (get_oid_hex(arg, &oid))
752-
die("invalid shallow line: %s", line);
753-
object = parse_object(&oid);
754-
if (!object)
755-
continue;
756-
if (object->type != OBJ_COMMIT)
757-
die("invalid shallow object %s", oid_to_hex(&oid));
758-
if (!(object->flags & CLIENT_SHALLOW)) {
759-
object->flags |= CLIENT_SHALLOW;
760-
add_object_array(object, NULL, &shallows);
761-
}
817+
if (process_shallow(line, &shallows))
762818
continue;
763-
}
764-
if (skip_prefix(line, "deepen ", &arg)) {
765-
char *end = NULL;
766-
depth = strtol(arg, &end, 0);
767-
if (!end || *end || depth <= 0)
768-
die("Invalid deepen: %s", line);
819+
if (process_deepen(line, &depth))
769820
continue;
770-
}
771-
if (skip_prefix(line, "deepen-since ", &arg)) {
772-
char *end = NULL;
773-
deepen_since = parse_timestamp(arg, &end, 0);
774-
if (!end || *end || !deepen_since ||
775-
/* revisions.c's max_age -1 is special */
776-
deepen_since == -1)
777-
die("Invalid deepen-since: %s", line);
778-
deepen_rev_list = 1;
821+
if (process_deepen_since(line, &deepen_since, &deepen_rev_list))
779822
continue;
780-
}
781-
if (skip_prefix(line, "deepen-not ", &arg)) {
782-
char *ref = NULL;
783-
struct object_id oid;
784-
if (expand_ref(arg, strlen(arg), &oid, &ref) != 1)
785-
die("git upload-pack: ambiguous deepen-not: %s", line);
786-
string_list_append(&deepen_not, ref);
787-
free(ref);
788-
deepen_rev_list = 1;
823+
if (process_deepen_not(line, &deepen_not, &deepen_rev_list))
789824
continue;
790-
}
825+
791826
if (!skip_prefix(line, "want ", &arg) ||
792827
get_oid_hex(arg, &oid_buf))
793828
die("git upload-pack: protocol error, "

0 commit comments

Comments
 (0)