From: Phillip Wood <phillip.wood123@gmail.com>
To: Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>,
git@vger.kernel.org
Cc: gitster@pobox.com, johannes.schindelin@gmx.de, me@ttaylorr.com,
"Jeff Hostetler" <git@jeffhostetler.com>,
"Elijah Newren" <newren@gmail.com>,
"Derrick Stolee" <derrickstolee@github.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Subject: Re: [PATCH 3/4] fetch: use new branch_checked_out() and add tests
Date: Tue, 14 Jun 2022 11:10:59 +0100 [thread overview]
Message-ID: <5137243d-ff20-e184-493b-29af64c408d9@gmail.com> (raw)
In-Reply-To: <4540dbeed385341f8c5b45134e1a65dc48c75b0c.1654718942.git.gitgitgadget@gmail.com>
Hi Stolee
On 08/06/2022 21:09, Derrick Stolee via GitGitGadget wrote:
> From: Derrick Stolee <derrickstolee@github.com>
> [...]
> diff --git a/builtin/fetch.c b/builtin/fetch.c
> index ac29c2b1ae3..1ba56240312 100644
> --- a/builtin/fetch.c
> +++ b/builtin/fetch.c
> @@ -885,7 +885,7 @@ static int update_local_ref(struct ref *ref,
> struct worktree **worktrees)
> {
> struct commit *current = NULL, *updated;
> - const struct worktree *wt;
> + char *path = NULL;
> const char *pretty_ref = prettify_refname(ref->name);
> int fast_forward = 0;
>
> @@ -900,17 +900,17 @@ static int update_local_ref(struct ref *ref,
> }
>
> if (!update_head_ok &&
> - (wt = find_shared_symref(worktrees, "HEAD", ref->name)) &&
> - !wt->is_bare && !is_null_oid(&ref->old_oid)) {
> + !is_null_oid(&ref->old_oid) &&
> + branch_checked_out(ref->name, &path)) {
> /*
> * If this is the head, and it's not okay to update
> * the head, and the old value of the head isn't empty...
> */
> format_display(display, '!', _("[rejected]"),
> - wt->is_current ?
> - _("can't fetch in current branch") :
> - _("checked out in another worktree"),
> + path ? _("can't fetch in current branch") :
> + _("checked out in another worktree"),
I'm confused by this, isn't path always non-null?
Best Wishes
Phillip
> remote, pretty_ref, summary_width);
> + free(path);
> return 1;
> }
>
> @@ -1434,19 +1434,16 @@ cleanup:
> return result;
> }
>
> -static void check_not_current_branch(struct ref *ref_map,
> - struct worktree **worktrees)
> +static void check_not_current_branch(struct ref *ref_map)
> {
> - const struct worktree *wt;
> + char *path;
> for (; ref_map; ref_map = ref_map->next)
> if (ref_map->peer_ref &&
> starts_with(ref_map->peer_ref->name, "refs/heads/") &&
> - (wt = find_shared_symref(worktrees, "HEAD",
> - ref_map->peer_ref->name)) &&
> - !wt->is_bare)
> + branch_checked_out(ref_map->peer_ref->name, &path))
> die(_("refusing to fetch into branch '%s' "
> "checked out at '%s'"),
> - ref_map->peer_ref->name, wt->path);
> + ref_map->peer_ref->name, path);
> }
>
> static int truncate_fetch_head(void)
> @@ -1650,7 +1647,7 @@ static int do_fetch(struct transport *transport,
> ref_map = get_ref_map(transport->remote, remote_refs, rs,
> tags, &autotags);
> if (!update_head_ok)
> - check_not_current_branch(ref_map, worktrees);
> + check_not_current_branch(ref_map);
>
> retcode = open_fetch_head(&fetch_head);
> if (retcode)
> diff --git a/t/t2407-worktree-heads.sh b/t/t2407-worktree-heads.sh
> index 12faca7f655..f3f8b0b2b79 100755
> --- a/t/t2407-worktree-heads.sh
> +++ b/t/t2407-worktree-heads.sh
> @@ -10,6 +10,15 @@ test_expect_success 'setup' '
> test_commit $i &&
> git branch wt-$i &&
> git worktree add wt-$i wt-$i || return 1
> + done &&
> +
> + # Create a server that updates each branch by one commit
> + git clone . server &&
> + git remote add server ./server &&
> + for i in 1 2 3 4
> + do
> + git -C server checkout wt-$i &&
> + test_commit -C server A-$i || return 1
> done
> '
>
> @@ -21,6 +30,16 @@ test_expect_success 'refuse to overwrite: checked out in worktree' '
> done
> '
>
> +test_expect_success 'refuse to overwrite during fetch' '
> + test_must_fail git fetch server +refs/heads/wt-3:refs/heads/wt-3 2>err &&
> + grep "refusing to fetch into branch '\''refs/heads/wt-3'\''" err &&
> +
> + # General fetch into refs/heads/ will fail on first ref,
> + # so use a generic error message check.
> + test_must_fail git fetch server +refs/heads/*:refs/heads/* 2>err &&
> + grep "refusing to fetch into branch" err
> +'
> +
> test_expect_success 'refuse to overwrite: worktree in bisect' '
> test_when_finished test_might_fail git -C wt-4 bisect reset &&
>
> @@ -31,7 +50,10 @@ test_expect_success 'refuse to overwrite: worktree in bisect' '
> ) &&
>
> test_must_fail git branch -f wt-4 HEAD 2>err &&
> - grep "cannot force update the branch '\''wt-4'\'' checked out at" err
> + grep "cannot force update the branch '\''wt-4'\'' checked out at" err &&
> +
> + test_must_fail git fetch server +refs/heads/wt-4:refs/heads/wt-4 2>err &&
> + grep "refusing to fetch into branch '\''refs/heads/wt-4'\''" err
> '
>
> . "$TEST_DIRECTORY"/lib-rebase.sh
> @@ -47,7 +69,10 @@ test_expect_success 'refuse to overwrite: worktree in rebase' '
> ) &&
>
> test_must_fail git branch -f wt-4 HEAD 2>err &&
> - grep "cannot force update the branch '\''wt-4'\'' checked out at" err
> + grep "cannot force update the branch '\''wt-4'\'' checked out at" err &&
> +
> + test_must_fail git fetch server +refs/heads/wt-4:refs/heads/wt-4 2>err &&
> + grep "refusing to fetch into branch '\''refs/heads/wt-4'\''" err
> '
>
> test_done
next prev parent reply other threads:[~2022-06-14 10:11 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-08 20:08 [PATCH 0/4] Create branch_checked_out() helper Derrick Stolee via GitGitGadget
2022-06-08 20:08 ` [PATCH 1/4] branch: add " Derrick Stolee via GitGitGadget
2022-06-09 23:47 ` Junio C Hamano
2022-06-13 23:59 ` Ævar Arnfjörð Bjarmason
2022-06-14 13:32 ` Derrick Stolee
2022-06-14 15:24 ` Ævar Arnfjörð Bjarmason
2022-06-14 10:09 ` Phillip Wood
2022-06-14 11:22 ` Phillip Wood
2022-06-14 13:48 ` Derrick Stolee
2022-06-08 20:09 ` [PATCH 2/4] branch: check for bisects and rebases Derrick Stolee via GitGitGadget
2022-06-08 22:03 ` Junio C Hamano
2022-06-08 20:09 ` [PATCH 3/4] fetch: use new branch_checked_out() and add tests Derrick Stolee via GitGitGadget
2022-06-14 0:05 ` Ævar Arnfjörð Bjarmason
2022-06-14 10:10 ` Phillip Wood [this message]
2022-06-14 14:06 ` Derrick Stolee
2022-06-08 20:09 ` [PATCH 4/4] branch: use branch_checked_out() when deleting refs Derrick Stolee via GitGitGadget
2022-06-13 14:59 ` [PATCH 5/5] branch: fix branch_checked_out() leaks Derrick Stolee
2022-06-13 23:03 ` Junio C Hamano
2022-06-14 0:33 ` Ævar Arnfjörð Bjarmason
2022-06-14 15:37 ` Derrick Stolee
2022-06-14 16:43 ` Ævar Arnfjörð Bjarmason
2022-06-14 19:27 ` [PATCH v2 0/5] Create branch_checked_out() helper Derrick Stolee via GitGitGadget
2022-06-14 19:27 ` [PATCH v2 1/5] branch: add " Derrick Stolee via GitGitGadget
2022-06-14 19:27 ` [PATCH v2 2/5] branch: check for bisects and rebases Derrick Stolee via GitGitGadget
2022-06-14 19:27 ` [PATCH v2 3/5] fetch: use new branch_checked_out() and add tests Derrick Stolee via GitGitGadget
2022-06-14 19:27 ` [PATCH v2 4/5] branch: use branch_checked_out() when deleting refs Derrick Stolee via GitGitGadget
2022-06-14 19:27 ` [PATCH v2 5/5] branch: fix branch_checked_out() leaks Derrick Stolee via GitGitGadget
2022-06-19 13:58 ` [PATCH v2 0/5] Create branch_checked_out() helper Phillip Wood
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=5137243d-ff20-e184-493b-29af64c408d9@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=avarab@gmail.com \
--cc=derrickstolee@github.com \
--cc=git@jeffhostetler.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=me@ttaylorr.com \
--cc=newren@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).