fetch: skip tasks related to fetching objects

cmd_fetch() does the following with the assumption that objects are
fetched:

* Run gc
* Write commit graphs (if enabled by fetch.writeCommitGraph=true)

However, neither of these tasks makes sense if objects are not fetched
e.g. `git fetch --negotiate-only` never fetches objects.

Speed up cmd_fetch() by bailing out early if we know for certain that
objects will not be fetched. cmd_fetch() can bail out early whenever
objects are not fetched, but for now this only considers
--negotiate-only.

The same optimization does not apply to `git fetch --dry-run` because
that actually fetches objects; the dry run refers to not updating refs.

Signed-off-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Glen Choo 2022-01-18 16:00:55 -08:00 коммит произвёл Junio C Hamano
Родитель bec587d4c1
Коммит 135a12bc14
1 изменённых файлов: 11 добавлений и 0 удалений

Просмотреть файл

@ -2133,6 +2133,17 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
strvec_clear(&options);
}
/*
* Skip irrelevant tasks because we know objects were not
* fetched.
*
* NEEDSWORK: as a future optimization, we can return early
* whenever objects were not fetched e.g. if we already have all
* of them.
*/
if (negotiate_only)
goto cleanup;
prepare_repo_settings(the_repository);
if (fetch_write_commit_graph > 0 ||
(fetch_write_commit_graph < 0 &&