From: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: tom.saeger@oracle.com, gitster@pobox.com,
sunshine@sunshineco.com, Derrick Stolee <stolee@gmail.com>,
Josh Steadmon <steadmon@google.com>,
Emily Shaffer <emilyshaffer@google.com>,
Ramsay Jones <ramsay@ramsayjones.plus.com>,
Derrick Stolee <derrickstolee@github.com>
Subject: [PATCH v4 0/4] Maintenance: adapt custom refspecs
Date: Fri, 16 Apr 2021 12:49:55 +0000 [thread overview]
Message-ID: <pull.924.v4.git.1618577399.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.924.v3.git.1618020225.gitgitgadget@gmail.com>
Tom Saeger rightly pointed out [1] that the prefetch task ignores custom
refspecs. This can lead to downloading more data than requested, and it
doesn't even help the future foreground fetches that use that custom
refspec.
[1]
https://lore.kernel.org/git/20210401184914.qmr7jhjbhp2mt3h6@dhcp-10-154-148-175.vpn.oracle.com/
This series fixes this problem by carefully replacing the start of each
refspec's destination with "refs/prefetch/". If the destination already
starts with "refs/", then that is replaced. Otherwise "refs/prefetch/" is
just prepended.
This happens inside of git fetch when a --prefetch option is given. This
allows us to maniuplate a struct refspec_item instead of a full refspec
string. It also simplifies our logic in testing the prefetch task.
Updates in V4
=============
* Two bugs were fixed. Thanks, Ramsay and Tom, for pointing out the issues.
Tests are added that prevent regressions.
* A new patch is added to respect remote.<name>.skipFetchAll. This is added
at the end to take advantage of the simpler test design after --prefetch
is added.
Update in V3
============
* The fix is almost completely rewritten as an update to 'git fetch'. See
the new PATCH 2 for this update.
* There was some discussion of rewriting test_subcommand, but that can be
delayed until a proper solution is found to complications around softer
matches.
Updates in V2
=============
Thanks for the close eye on this series. I appreciate the recommendations,
which I believe I have responded to them all:
* Fixed typos.
* Made refspec_item_format() re-entrant. Consumers must free the buffer.
* Cleaned up style (quoting and tabbing).
Thanks, -Stolee
Derrick Stolee (4):
maintenance: simplify prefetch logic
fetch: add --prefetch option
maintenance: use 'git fetch --prefetch'
maintenance: respect remote.*.skipFetchAll
Documentation/fetch-options.txt | 5 +++
Documentation/git-maintenance.txt | 6 ++--
builtin/fetch.c | 59 ++++++++++++++++++++++++++++++-
builtin/gc.c | 39 +++++++-------------
t/t5582-fetch-negative-refspec.sh | 43 ++++++++++++++++++++++
t/t7900-maintenance.sh | 22 +++++++-----
6 files changed, 134 insertions(+), 40 deletions(-)
base-commit: 89b43f80a514aee58b662ad606e6352e03eaeee4
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-924%2Fderrickstolee%2Fmaintenance%2Frefspec-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-924/derrickstolee/maintenance/refspec-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/924
Range-diff vs v3:
1: 4c0e983ba56f = 1: 4c0e983ba56f maintenance: simplify prefetch logic
2: 7f488eea6dbd ! 2: 73b4e8496746 fetch: add --prefetch option
@@ Commit message
Finally, we add the 'force' option to ensure that prefetch refs are
replaced as necessary.
+ There are some interesting cases that are worth testing.
+
+ An earlier version of this change dropped the "i--" from the loop that
+ deletes a refspec item and shifts the remaining entries down. This
+ allowed some refspecs to not be modified. The subtle part about the
+ first --prefetch test is that the "refs/tags/*" refspec appears directly
+ before the "refs/heads/bogus/*" refspec. Without that "i--", this
+ ordering would remove the "refs/tags/*" refspec and leave the last one
+ unmodified, placing the result in "refs/heads/*".
+
+ It is possible to have an empty refspec. This is typically the case for
+ remotes other than the origin, where users want to fetch a specific tag
+ or branch. To correctly test this case, we need to further remove the
+ upstream remote for the local branch. Thus, we are testing a refspec
+ that will be deleted, leaving nothing to fetch.
+
+ Helped-by: Tom Saeger <tom.saeger@oracle.com>
+ Helped-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
## Documentation/fetch-options.txt ##
@@ builtin/fetch.c: static void find_non_local_tags(const struct ref *refs,
+ rs->raw[j - 1] = rs->raw[j];
+ }
+ rs->nr--;
++ i--;
+ continue;
+ }
+
@@ builtin/fetch.c: static struct ref *get_ref_map(struct remote *remote,
if (rs->nr) {
struct refspec *fetch_refspec;
+@@ builtin/fetch.c: static struct ref *get_ref_map(struct remote *remote,
+ if (has_merge &&
+ !strcmp(branch->remote_name, remote->name))
+ add_merge_config(&ref_map, remote_refs, branch, &tail);
+- } else {
++ } else if (!prefetch) {
+ ref_map = get_remote_ref(remote_refs, "HEAD");
+ if (!ref_map)
+ die(_("Couldn't find remote ref HEAD"));
## t/t5582-fetch-negative-refspec.sh ##
@@ t/t5582-fetch-negative-refspec.sh: test_expect_success "push with matching +: and negative refspec" '
@@ t/t5582-fetch-negative-refspec.sh: test_expect_success "push with matching +: an
+test_expect_success '--prefetch correctly modifies refspecs' '
+ git -C one config --unset-all remote.origin.fetch &&
-+ git -C one config --add remote.origin.fetch "refs/tags/*:refs/tags/*" &&
+ git -C one config --add remote.origin.fetch ^refs/heads/bogus/ignore &&
++ git -C one config --add remote.origin.fetch "refs/tags/*:refs/tags/*" &&
+ git -C one config --add remote.origin.fetch "refs/heads/bogus/*:bogus/*" &&
+
+ git tag -a -m never never-fetch-tag HEAD &&
@@ t/t5582-fetch-negative-refspec.sh: test_expect_success "push with matching +: an
+ git -C one rev-parse refs/prefetch/bogus/fetched &&
+ test_must_fail git -C one rev-parse refs/prefetch/bogus/ignore
+'
++
++test_expect_success '--prefetch succeeds when refspec becomes empty' '
++ git checkout bogus/fetched &&
++ test_commit extra &&
++
++ git -C one config --unset-all remote.origin.fetch &&
++ git -C one config --unset branch.main.remote &&
++ git -C one config remote.origin.fetch "+refs/tags/extra" &&
++ git -C one config remote.origin.skipfetchall true &&
++ git -C one config remote.origin.tagopt "--no-tags" &&
++
++ git -C one fetch --prefetch
++'
+
test_done
3: ed055d772452 = 3: 565ed8a18929 maintenance: use 'git fetch --prefetch'
-: ------------ > 4: 92652fd9e6e1 maintenance: respect remote.*.skipFetchAll
--
gitgitgadget
next prev parent reply other threads:[~2021-04-16 12:50 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-05 13:04 [PATCH 0/5] Maintenance: adapt custom refspecs Derrick Stolee via GitGitGadget
2021-04-05 13:04 ` [PATCH 1/5] maintenance: simplify prefetch logic Derrick Stolee via GitGitGadget
2021-04-05 17:01 ` Tom Saeger
2021-04-05 13:04 ` [PATCH 2/5] test-lib: use exact match for test_subcommand Derrick Stolee via GitGitGadget
2021-04-05 17:31 ` Eric Sunshine
2021-04-05 17:43 ` Junio C Hamano
2021-04-05 13:04 ` [PATCH 3/5] refspec: output a refspec item Derrick Stolee via GitGitGadget
2021-04-05 16:57 ` Tom Saeger
2021-04-05 17:40 ` Eric Sunshine
2021-04-05 17:44 ` Junio C Hamano
2021-04-06 11:21 ` Derrick Stolee
2021-04-06 15:23 ` Eric Sunshine
2021-04-06 16:51 ` Derrick Stolee
2021-04-07 8:46 ` Ævar Arnfjörð Bjarmason
2021-04-07 20:53 ` Derrick Stolee
2021-04-07 22:05 ` Ævar Arnfjörð Bjarmason
2021-04-07 22:49 ` Junio C Hamano
2021-04-07 23:01 ` Ævar Arnfjörð Bjarmason
2021-04-08 7:33 ` Junio C Hamano
2021-04-05 13:04 ` [PATCH 4/5] test-tool: test refspec input/output Derrick Stolee via GitGitGadget
2021-04-05 17:52 ` Eric Sunshine
2021-04-06 11:13 ` Derrick Stolee
2021-04-07 8:54 ` Ævar Arnfjörð Bjarmason
2021-04-05 13:04 ` [PATCH 5/5] maintenance: allow custom refspecs during prefetch Derrick Stolee via GitGitGadget
2021-04-05 17:16 ` Tom Saeger
2021-04-06 11:15 ` Derrick Stolee
2021-04-07 8:53 ` Ævar Arnfjörð Bjarmason
2021-04-07 10:26 ` Ævar Arnfjörð Bjarmason
2021-04-09 11:48 ` Derrick Stolee
2021-04-09 19:28 ` Ævar Arnfjörð Bjarmason
2021-04-10 0:56 ` Derrick Stolee
2021-04-10 11:37 ` Ævar Arnfjörð Bjarmason
2021-04-07 13:47 ` Ævar Arnfjörð Bjarmason
2021-04-06 18:47 ` [PATCH v2 0/5] Maintenance: adapt custom refspecs Derrick Stolee via GitGitGadget
2021-04-06 18:47 ` [PATCH v2 1/5] maintenance: simplify prefetch logic Derrick Stolee via GitGitGadget
2021-04-07 23:23 ` Emily Shaffer
2021-04-09 19:00 ` Derrick Stolee
2021-04-06 18:47 ` [PATCH v2 2/5] test-lib: use exact match for test_subcommand Derrick Stolee via GitGitGadget
2021-04-06 18:47 ` [PATCH v2 3/5] refspec: output a refspec item Derrick Stolee via GitGitGadget
2021-04-06 18:47 ` [PATCH v2 4/5] test-tool: test refspec input/output Derrick Stolee via GitGitGadget
2021-04-07 23:08 ` Josh Steadmon
2021-04-07 23:26 ` Emily Shaffer
2021-04-06 18:47 ` [PATCH v2 5/5] maintenance: allow custom refspecs during prefetch Derrick Stolee via GitGitGadget
2021-04-06 19:36 ` Tom Saeger
2021-04-06 19:45 ` Derrick Stolee
2021-04-07 23:09 ` Josh Steadmon
2021-04-07 23:37 ` Emily Shaffer
2021-04-08 0:23 ` Jonathan Tan
2021-04-10 2:03 ` [PATCH v3 0/3] Maintenance: adapt custom refspecs Derrick Stolee via GitGitGadget
2021-04-10 2:03 ` [PATCH v3 1/3] maintenance: simplify prefetch logic Derrick Stolee via GitGitGadget
2021-04-12 20:13 ` Tom Saeger
2021-04-12 20:27 ` Derrick Stolee
2021-04-10 2:03 ` [PATCH v3 2/3] fetch: add --prefetch option Derrick Stolee via GitGitGadget
2021-04-11 21:09 ` Ramsay Jones
2021-04-12 20:23 ` Derrick Stolee
2021-04-10 2:03 ` [PATCH v3 3/3] maintenance: use 'git fetch --prefetch' Derrick Stolee via GitGitGadget
2021-04-11 1:35 ` [PATCH v3 0/3] Maintenance: adapt custom refspecs Junio C Hamano
2021-04-12 16:48 ` Tom Saeger
2021-04-12 17:24 ` Tom Saeger
2021-04-12 17:41 ` Tom Saeger
2021-04-12 20:25 ` Derrick Stolee
2021-04-16 12:49 ` Derrick Stolee via GitGitGadget [this message]
2021-04-16 12:49 ` [PATCH v4 1/4] maintenance: simplify prefetch logic Derrick Stolee via GitGitGadget
2021-04-16 18:02 ` Tom Saeger
2021-04-16 12:49 ` [PATCH v4 2/4] fetch: add --prefetch option Derrick Stolee via GitGitGadget
2021-04-16 17:52 ` Tom Saeger
2021-04-16 18:26 ` Tom Saeger
2021-04-16 12:49 ` [PATCH v4 3/4] maintenance: use 'git fetch --prefetch' Derrick Stolee via GitGitGadget
2021-04-16 12:49 ` [PATCH v4 4/4] maintenance: respect remote.*.skipFetchAll Derrick Stolee via GitGitGadget
2021-04-16 13:54 ` Ævar Arnfjörð Bjarmason
2021-04-16 14:33 ` Tom Saeger
2021-04-16 18:31 ` Tom Saeger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.924.v4.git.1618577399.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=derrickstolee@github.com \
--cc=emilyshaffer@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=ramsay@ramsayjones.plus.com \
--cc=steadmon@google.com \
--cc=stolee@gmail.com \
--cc=sunshine@sunshineco.com \
--cc=tom.saeger@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.