At the end of the function it had a block of "shallow fetch" support code that assumed it will be the last protocol extension ever by returning early. Move the bulky code away into a separate function to make it maintainable. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- upload-pack.c | 97 ++++++++++++++++++++++++++++++--------------------------- 1 files changed, 51 insertions(+), 46 deletions(-) diff --git a/upload-pack.c b/upload-pack.c index e5adbc0..4029019 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -444,6 +444,56 @@ static int get_common_commits(void) } } +static void exchange_shallows(int depth, struct object_array *shallows) +{ + if (depth == 0 && shallows->nr == 0) + return; + if (depth > 0) { + struct commit_list *result, *backup; + int i; + backup = result = get_shallow_commits(&want_obj, depth, + SHALLOW, NOT_SHALLOW); + while (result) { + struct object *object = &result->item->object; + if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) { + packet_write(1, "shallow %s", + sha1_to_hex(object->sha1)); + register_shallow(object->sha1); + } + result = result->next; + } + free_commit_list(backup); + for (i = 0; i < shallows->nr; i++) { + struct object *object = shallows->objects[i].item; + if (object->flags & NOT_SHALLOW) { + struct commit_list *parents; + packet_write(1, "unshallow %s", + sha1_to_hex(object->sha1)); + object->flags &= ~CLIENT_SHALLOW; + /* make sure the real parents are parsed */ + unregister_shallow(object->sha1); + object->parsed = 0; + if (parse_commit((struct commit *)object)) + die("invalid commit"); + parents = ((struct commit *)object)->parents; + while (parents) { + add_object_array(&parents->item->object, + NULL, &want_obj); + parents = parents->next; + } + } + /* make sure commit traversal conforms to client */ + register_shallow(object->sha1); + } + packet_flush(1); + } else + if (shallows->nr > 0) { + int i; + for (i = 0; i < shallows->nr; i++) + register_shallow(shallows->objects[i].item->sha1); + } +} + static void receive_needs(void) { struct object_array shallows = {0, 0, NULL}; @@ -520,52 +570,7 @@ static void receive_needs(void) } if (debug_fd) write_in_full(debug_fd, "#E\n", 3); - if (depth == 0 && shallows.nr == 0) - return; - if (depth > 0) { - struct commit_list *result, *backup; - int i; - backup = result = get_shallow_commits(&want_obj, depth, - SHALLOW, NOT_SHALLOW); - while (result) { - struct object *object = &result->item->object; - if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) { - packet_write(1, "shallow %s", - sha1_to_hex(object->sha1)); - register_shallow(object->sha1); - } - result = result->next; - } - free_commit_list(backup); - for (i = 0; i < shallows.nr; i++) { - struct object *object = shallows.objects[i].item; - if (object->flags & NOT_SHALLOW) { - struct commit_list *parents; - packet_write(1, "unshallow %s", - sha1_to_hex(object->sha1)); - object->flags &= ~CLIENT_SHALLOW; - /* make sure the real parents are parsed */ - unregister_shallow(object->sha1); - object->parsed = 0; - if (parse_commit((struct commit *)object)) - die("invalid commit"); - parents = ((struct commit *)object)->parents; - while (parents) { - add_object_array(&parents->item->object, - NULL, &want_obj); - parents = parents->next; - } - } - /* make sure commit traversal conforms to client */ - register_shallow(object->sha1); - } - packet_flush(1); - } else - if (shallows.nr > 0) { - int i; - for (i = 0; i < shallows.nr; i++) - register_shallow(shallows.objects[i].item->sha1); - } + exchange_shallows(depth, &shallows); free(shallows.objects); } -- 1.6.0.4.850.g6bd829 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html