Skip to content

remote: url-based pushRemote with renamed remotes

Harald Nordgren via GitGitGadget git 4 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v4 Latest2 patches 2 repliesIn review
  2. v32 patches 2 repliesSuperseded
  3. v22 patches 2 repliesSuperseded
Earlier versions · 1
VersionPostedPatchesRepliesStatus
v12 patches5 repliesSuperseded

Changes in v4 from the cover letter

* Match configured remotes by effective push URL, preferring pushurl over url.
* Update the documentation and rationale to describe where the remote would push.

Patches in v4 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/2remote: pass repository to push tracking helperremote.c+6 -50 replies
2/2remote: find tracking branches for URL push destinationsDocumentation/config/branch.adoc Documentation/revisions.adoc remote.c +3 more+198 -21 reply

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v4 yet.

Read the v4 thread

Cover letter [PATCH v4 0/2] remote: url-based pushRemote with renamed remotes

Fix git status not showing the push branch after remotes are renamed, when branch.<name>.pushRemote is a URL matching exactly one configured remote.

Changes in v4:

* Match configured remotes by effective push URL, preferring pushurl over url.
* Update the documentation and rationale to describe where the remote would push.

Changes in v3:

* Revamp commit messages to clarify motivation.

Changes in v2:

* Clarify that URL push destinations already work and that this change only restores their tracking information.
* Document URL values for branch.<name>.pushRemote and their @{push} behavior.

Harald Nordgren (2):
remote: pass repository to push tracking helper
remote: find tracking branches for URL push destinations

 Documentation/config/branch.adoc |   1 +
 Documentation/revisions.adoc     |   3 +
 remote.c                         |  54 ++++++++++--
 remote.h                         |   2 +
 t/t5505-remote.sh                | 144 +++++++++++++++++++++++++++++++
 transport.c                      |   5 +-
 6 files changed, 203 insertions(+), 6 deletions(-)

base-commit: 5d2e7709234afea1b6ddb25cd4f60d3d5fb3c200
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2358%2FHaraldNordgren%2Fremote-resolve-url-push-tracking-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2358/HaraldNordgren/remote-resolve-url-push-tracking-v4
Pull-Request: https://github.com/git/git/pull/2358

Range-diff vs v3:

 1:  b1ac49de87 = 1:  494287bade remote: pass repository to push tracking helper
 2:  a343af9d50 ! 2:  08c432a2d4 remote: find tracking branches for URL push destinations
     @@ Commit message
          "git status" cannot show the push branch, and an up-to-date push can
          leave its tracking information stale.
      
     -    When exactly one configured remote uses the push destination URL, use
     -    that remote for push tracking. Continue to push to the URL so the
     -    configured remote's push settings do not change existing behavior. Keep
     -    the current behavior when no remote matches or multiple remotes match.
     +    When exactly one configured remote would push to the same URL, use that
     +    remote for push tracking. Continue to push to the URL so the configured
     +    remote's push settings do not change existing behavior. Keep the current
     +    behavior when no remote matches or multiple remotes match.
      
          Signed-off-by: Harald Nordgren <[email protected]>
      
     @@ Documentation/revisions.adoc: some output processing may assume ref names in UTF
         `git push` were run while `branchname` was checked out (or the current
         `HEAD` if no branchname is specified). Like for '@\{upstream\}', we report
         the remote-tracking branch that corresponds to that branch at the remote.
     -+  If the push destination is a URL and exactly one configured remote has
     -+  that URL among its `remote.<name>.url` values, '@\{push}' reports that
     -+  remote's remote-tracking branch.
     ++  If the push destination is a URL and exactly one configured remote uses
     ++  that URL for pushing, '@\{push}' reports that remote's remote-tracking
     ++  branch.
       +
       Here's an example to make it more clear:
       +
      
       ## remote.c ##
     +@@ remote.c: struct strvec *push_url_of_remote(struct remote *remote)
     + 	return remote->pushurl.nr ? &remote->pushurl : &remote->url;
     + }
     + 
     ++static bool remote_has_push_url(struct remote *remote, const char *url)
     ++{
     ++	const struct strvec *push_urls = push_url_of_remote(remote);
     ++
     ++	for (size_t i = 0; i < push_urls->nr; i++) {
     ++		if (!strcmp(push_urls->v[i], url))
     ++			return true;
     ++	}
     ++	return false;
     ++}
     ++
     + void ref_push_report_free(struct ref_push_report *report)
     + {
     + 	while (report) {
      @@ remote.c: const char *branch_get_upstream(struct branch *branch, struct strbuf *err)
       	return branch->merge[0]->dst;
       }
     @@ remote.c: const char *branch_get_upstream(struct branch *branch, struct strbuf *
      +
      +		if (!candidate || candidate == remote ||
      +		    !remote_is_configured(candidate, 0) ||
     -+		    !remote_has_url(candidate, check_url))
     ++		    !remote_has_push_url(candidate, check_url))
      +			continue;
      +		if (first_match)
      +			return remote;
     @@ t/t5505-remote.sh: test_expect_success 'rename a remote renames repo remote.push
      +	EOF
      +'
      +
     ++test_expect_success 'configured pushurl makes URL-valued pushRemote trackable' '
     ++	setup_url_pushremote &&
     ++
     ++	(
     ++		cd client &&
     ++		git remote rename origin upstream &&
     ++		git remote add -f origin ../fork.git &&
     ++		git remote set-url --push origin "$fork_url"
     ++	) &&
     ++
     ++	check_status <<-EOF
     ++	On branch topic
     ++	Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
     ++
     ++	Your branch is up to date with ${SQ}origin/topic${SQ}.
     ++
     ++	nothing to commit, working tree clean
     ++	EOF
     ++'
     ++
      +test_expect_success 'pushInsteadOf URL pushRemote is trackable' '
      +	setup_url_pushremote &&
      +	(
Signature · 1 line
gitgitgadget