summaryrefslogtreecommitdiff
path: root/builtin/fetch.c
diff options
context:
space:
mode:
authorLibravatar Glen Choo <chooglen@google.com>2022-01-18 16:00:55 -0800
committerLibravatar Junio C Hamano <gitster@pobox.com>2022-01-18 16:22:57 -0800
commit135a12bc1472290ca6b9a4c2f06c838a1495a612 (patch)
treef35a1c2886cda9e518476eb325d8c672c4d4b26a /builtin/fetch.c
parentfetch: use goto cleanup in cmd_fetch() (diff)
downloadtgif-135a12bc1472290ca6b9a4c2f06c838a1495a612.tar.xz
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>
Diffstat (limited to 'builtin/fetch.c')
-rw-r--r--builtin/fetch.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/builtin/fetch.c b/builtin/fetch.c
index eab73d7417..06e514b07e 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -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 &&