upload-pack: reject shallow requests that would return nothing
commite34de73c5653c713e6edddc5a12c8befc50d311f
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 26 May 2018 11:35:18 +0000 (26 13:35 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 4 Jun 2018 02:03:10 +0000 (4 11:03 +0900)
treeab28b21660707a509922094d990c20bb699ad8b3
parenta42a58d7b62cc1d6301440e81a83feed9d7c118c
upload-pack: reject shallow requests that would return nothing

Shallow clones with --shallow-since or --shalow-exclude work by
running rev-list to get all reachable commits, then draw a boundary
between reachable and unreachable and send "shallow" requests based on
that.

The code does miss one corner case: if rev-list returns nothing, we'll
have no border and we'll send no shallow requests back to the client
(i.e. no history cuts). This essentially means a full clone (or a full
branch if the client requests just one branch). One example is the
oldest commit is older than what is specified by --shallow-since.

To avoid this, if rev-list returns nothing, we abort the clone/fetch.
The user could adjust their request (e.g. --shallow-since further back
in the past) and retry.

Another possible option for this case is to fall back to a default
depth (like depth 1). But I don't like too much magic that way because
we may return something unexpected to the user. If they request
"history since 2008" and we return a single depth at 2000, that might
break stuff for them. It is better to tell them that something is
wrong and let them take the best course of action.

Note that we need to die() in get_shallow_commits_by_rev_list()
instead of just checking for empty result from its caller
deepen_by_rev_list() and handling the error there. The reason is,
empty result could be a valid case: if you have commits in year 2013
and you request --shallow-since=year.2000 then you should get a full
clone (i.e. empty result).

Reported-by: Andreas Krey <a.krey@gmx.de>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
shallow.c
t/t5500-fetch-pack.sh