git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Felipe Contreras <felipe.contreras@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
	"Elijah Newren" <newren@gmail.com>,
	"Brandon Williams" <bwilliams.eng@gmail.com>,
	"René Scharfe" <l.s.r@web.de>,
	"Felipe Contreras" <felipe.contreras@gmail.com>
Subject: [PATCH v2 00/13] push: revamp push.default
Date: Mon, 31 May 2021 14:51:11 -0500	[thread overview]
Message-ID: <20210531195124.218325-1-felipe.contreras@gmail.com> (raw)
In-Reply-To: <20210531193237.216726-1-felipe.contreras@gmail.com>

This patch series is the new second part of [1] and it's mostly a ton of
cleanups.

In theory there should be no functional changes.

Most of the changes since v1 are due to the fact that
s/!triangular/same_remote/ was done early in the previous series. Other
than that there's a few changes to the code and commit messages
suggested by Junio C Hamano.

The end result is almost identical to v1, only the way we get there
changes (plus there's an extra cosmetic break).

There's too many changes to list them all, it's much easier to see the
end result:

static const char *get_upstream_ref(struct branch *branch, const char *remote_name)
{
	if (!branch->merge_nr || !branch->merge || !branch->remote_name)
		die(_("The current branch %s has no upstream branch.\n"
		    "To push the current branch and set the remote as upstream, use\n"
		    "\n"
		    "    git push --set-upstream %s %s\n"),
		    branch->name,
		    remote_name,
		    branch->name);
	if (branch->merge_nr != 1)
		die(_("The current branch %s has multiple upstream branches, "
		    "refusing to push."), branch->name);

	return branch->merge[0]->src;
}

static void setup_default_push_refspecs(struct remote *remote)
{
	struct branch *branch;
	const char *dst;
	int same_remote;

	switch (push_default) {
	case PUSH_DEFAULT_MATCHING:
		refspec_append(&rs, ":");
		return;

	case PUSH_DEFAULT_NOTHING:
		die(_("You didn't specify any refspecs to push, and "
		    "push.default is \"nothing\"."));
		return;
	default:
		break;
	}

	branch = branch_get(NULL);
	if (!branch)
		die(_(message_detached_head_die), remote->name);

	dst = branch->refname;
	same_remote = !strcmp(remote->name, remote_for_branch(branch, NULL));

	switch (push_default) {
	default:
	case PUSH_DEFAULT_UNSPECIFIED:
	case PUSH_DEFAULT_SIMPLE:
		if (!same_remote)
			break;
		if (strcmp(branch->refname, get_upstream_ref(branch, remote->name)))
			die_push_simple(branch, remote);
		break;

	case PUSH_DEFAULT_UPSTREAM:
		if (!same_remote)
			die(_("You are pushing to remote '%s', which is not the upstream of\n"
			      "your current branch '%s', without telling me what to push\n"
			      "to update which remote branch."),
			    remote->name, branch->name);
		dst = get_upstream_ref(branch, remote->name);
		break;

	case PUSH_DEFAULT_CURRENT:
		break;
	}

	refspec_appendf(&rs, "%s:%s", branch->refname, dst);
}

[1] https://lore.kernel.org/git/20210531193237.216726-1-felipe.contreras@gmail.com

Felipe Contreras (13):
  push: create new get_upstream_ref() helper
  push: return immediately in trivial switch case
  push: split switch cases
  push: factor out null branch check
  push: only get the branch when needed
  push: make setup_push_* return the dst
  push: trivial simplifications
  push: get rid of all the setup_push_* functions
  push: factor out the typical case
  push: remove redundant check
  push: remove trivial function
  push: only check same_remote when needed
  push: don't get a full remote object

 builtin/push.c | 93 ++++++++++++++++++--------------------------------
 1 file changed, 34 insertions(+), 59 deletions(-)

Range-diff against v1:
 1:  9d9d800b11 !  1:  675528cf7a push: create new get_upstream_ref() helper
    @@ builtin/push.c: static const char message_detached_head_die[] =
      	   "    git push %s HEAD:<name-of-remote-branch>\n");
      
     -static void setup_push_upstream(struct remote *remote, struct branch *branch,
    --				int triangular)
    +-				int same_remote)
     +static const char *get_upstream_ref(struct branch *branch, const char *remote_name)
      {
     -	if (!branch)
    @@ builtin/push.c: static const char message_detached_head_die[] =
     +}
     +
     +static void setup_push_upstream(struct remote *remote, struct branch *branch,
    -+				int triangular)
    ++				int same_remote)
     +{
     +	const char *upstream_ref;
     +	if (!branch)
     +		die(_(message_detached_head_die), remote->name);
     +	upstream_ref = get_upstream_ref(branch, remote->name);
    - 	if (triangular)
    + 	if (!same_remote)
      		die(_("You are pushing to remote '%s', which is not the upstream of\n"
      		      "your current branch '%s', without telling me what to push\n"
      		      "to update which remote branch."),
    @@ builtin/push.c: static const char message_detached_head_die[] =
     @@ builtin/push.c: static void setup_push_simple(struct remote *remote, struct branch *branch, int
      		die(_(message_detached_head_die), remote->name);
      
    - 	if (!triangular) {
    + 	if (same_remote) {
     -		if (!branch->merge_nr || !branch->merge || !branch->remote_name)
     -			die(_("The current branch %s has no upstream branch.\n"
     -			    "To push the current branch and set the remote as upstream, use\n"
 2:  9d24821512 !  2:  dcbe8c53b5 push: return immediately in trivial switch case
    @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
      
      	case PUSH_DEFAULT_UNSPECIFIED:
      	case PUSH_DEFAULT_SIMPLE:
    - 		setup_push_simple(remote, branch, triangular);
    + 		setup_push_simple(remote, branch, same_remote);
     -		break;
     +		return;
      
      	case PUSH_DEFAULT_UPSTREAM:
    - 		setup_push_upstream(remote, branch, triangular);
    + 		setup_push_upstream(remote, branch, same_remote);
     -		break;
     +		return;
      
 3:  160b8bee93 !  3:  55b227151f push: reorder switch cases
    @@ Metadata
     Author: Felipe Contreras <felipe.contreras@gmail.com>
     
      ## Commit message ##
    -    push: reorder switch cases
    +    push: split switch cases
     
         We want all the cases that don't do anything with a branch first, and
    -    then the rest.
    -
    -    Will help further patches.
    +    then the rest. That way we will be able to get the branch and die if
    +    there's a problem in the parent function, instead of inside the function
    +    of each mode.
     
         Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
     
      ## builtin/push.c ##
     @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
    - 	int triangular = is_workflow_triangular(remote);
    + 	int same_remote = is_same_remote(remote);
      
      	switch (push_default) {
     -	default:
    @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
     +		    "push.default is \"nothing\"."));
     +		return;
     +	default:
    ++		break;
     +	}
     +
     +	switch (push_default) {
     +	default:
      	case PUSH_DEFAULT_UNSPECIFIED:
      	case PUSH_DEFAULT_SIMPLE:
    - 		setup_push_simple(remote, branch, triangular);
    + 		setup_push_simple(remote, branch, same_remote);
     @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
      	case PUSH_DEFAULT_CURRENT:
      		setup_push_current(remote, branch);
 4:  2b299e2e5a !  4:  4ea0ee4631 push: factor out null branch check
    @@ Commit message
     
      ## builtin/push.c ##
     @@ builtin/push.c: static void setup_push_upstream(struct remote *remote, struct branch *branch,
    - 				int triangular)
    + 				int same_remote)
      {
      	const char *upstream_ref;
     -	if (!branch)
     -		die(_(message_detached_head_die), remote->name);
      	upstream_ref = get_upstream_ref(branch, remote->name);
    - 	if (triangular)
    + 	if (!same_remote)
      		die(_("You are pushing to remote '%s', which is not the upstream of\n"
     @@ builtin/push.c: static void setup_push_upstream(struct remote *remote, struct branch *branch,
      
    @@ builtin/push.c: static void setup_push_upstream(struct remote *remote, struct br
      	refspec_appendf(&rs, "%s:%s", branch->refname, branch->refname);
      }
      
    - static void setup_push_simple(struct remote *remote, struct branch *branch, int triangular)
    + static void setup_push_simple(struct remote *remote, struct branch *branch, int same_remote)
      {
     -	if (!branch)
     -		die(_(message_detached_head_die), remote->name);
     -
    - 	if (!triangular) {
    + 	if (same_remote) {
      		const char *upstream_ref;
      
     @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
    - 	default:
    + 		break;
      	}
      
     +	if (!branch)
 5:  4a721c99f1 !  5:  ae3d0dfdfe push: only get the branch when needed
    @@ Commit message
         Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
     
      ## builtin/push.c ##
    -@@ builtin/push.c: static int is_workflow_triangular(struct remote *remote)
    +@@ builtin/push.c: static int is_same_remote(struct remote *remote)
      
      static void setup_default_push_refspecs(struct remote *remote)
      {
     -	struct branch *branch = branch_get(NULL);
     +	struct branch *branch;
    - 	int triangular = is_workflow_triangular(remote);
    + 	int same_remote = is_same_remote(remote);
      
      	switch (push_default) {
     @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
    - 	default:
    + 		break;
      	}
      
     +	branch = branch_get(NULL);
 6:  30d5c43c28 !  6:  9d9a9ebfbe push: make setup_push_* return the dst
    @@ Commit message
         push: make setup_push_* return the dst
     
         All of the setup_push_* functions are appending a refspec. Do this only
    -    once in the parent function.
    +    once on the parent function.
     
         Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
     
    @@ builtin/push.c: static const char *get_upstream_ref(struct branch *branch, const
      }
      
     -static void setup_push_upstream(struct remote *remote, struct branch *branch,
    --				int triangular)
    +-				int same_remote)
     +static const char *setup_push_upstream(struct remote *remote, struct branch *branch,
    -+	int triangular)
    ++	int same_remote)
      {
      	const char *upstream_ref;
      	upstream_ref = get_upstream_ref(branch, remote->name);
    @@ builtin/push.c: static void setup_push_upstream(struct remote *remote, struct br
     +	return branch->refname;
      }
      
    --static void setup_push_simple(struct remote *remote, struct branch *branch, int triangular)
    -+static const char *setup_push_simple(struct remote *remote, struct branch *branch, int triangular)
    +-static void setup_push_simple(struct remote *remote, struct branch *branch, int same_remote)
    ++static const char *setup_push_simple(struct remote *remote, struct branch *branch, int same_remote)
      {
    - 	if (!triangular) {
    + 	if (same_remote) {
      		const char *upstream_ref;
     @@ builtin/push.c: static void setup_push_simple(struct remote *remote, struct branch *branch, int
      		if (strcmp(branch->refname, upstream_ref))
    @@ builtin/push.c: static void setup_push_simple(struct remote *remote, struct bran
     +	return branch->refname;
      }
      
    - static int is_workflow_triangular(struct remote *remote)
    + static int is_same_remote(struct remote *remote)
     @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
      {
      	struct branch *branch;
    - 	int triangular = is_workflow_triangular(remote);
    + 	int same_remote = is_same_remote(remote);
     +	const char *dst;
      
      	switch (push_default) {
    @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
      	default:
      	case PUSH_DEFAULT_UNSPECIFIED:
      	case PUSH_DEFAULT_SIMPLE:
    --		setup_push_simple(remote, branch, triangular);
    +-		setup_push_simple(remote, branch, same_remote);
     -		return;
    -+		dst = setup_push_simple(remote, branch, triangular);
    ++		dst = setup_push_simple(remote, branch, same_remote);
     +		break;
      
      	case PUSH_DEFAULT_UPSTREAM:
    --		setup_push_upstream(remote, branch, triangular);
    +-		setup_push_upstream(remote, branch, same_remote);
     -		return;
    -+		dst = setup_push_upstream(remote, branch, triangular);
    ++		dst = setup_push_upstream(remote, branch, same_remote);
     +		break;
      
      	case PUSH_DEFAULT_CURRENT:
 7:  88cd2572a3 !  7:  f96581291a push: trivial simplifications
    @@ Commit message
      ## builtin/push.c ##
     @@ builtin/push.c: static const char *get_upstream_ref(struct branch *branch, const char *remote_na
      static const char *setup_push_upstream(struct remote *remote, struct branch *branch,
    - 	int triangular)
    + 	int same_remote)
      {
     -	const char *upstream_ref;
     -	upstream_ref = get_upstream_ref(branch, remote->name);
    - 	if (triangular)
    + 	if (!same_remote)
      		die(_("You are pushing to remote '%s', which is not the upstream of\n"
      		      "your current branch '%s', without telling me what to push\n"
      		      "to update which remote branch."),
    @@ builtin/push.c: static const char *get_upstream_ref(struct branch *branch, const
      static const char *setup_push_current(struct remote *remote, struct branch *branch)
     @@ builtin/push.c: static const char *setup_push_current(struct remote *remote, struct branch *bran
      
    - static const char *setup_push_simple(struct remote *remote, struct branch *branch, int triangular)
    + static const char *setup_push_simple(struct remote *remote, struct branch *branch, int same_remote)
      {
    --	if (!triangular) {
    +-	if (same_remote) {
     -		const char *upstream_ref;
     -
     -		upstream_ref = get_upstream_ref(branch, remote->name);
     -
     -		/* Additional safety */
     -		if (strcmp(branch->refname, upstream_ref))
    -+	if (!triangular)
    ++	if (same_remote)
     +		if (strcmp(branch->refname, get_upstream_ref(branch, remote->name)))
      			die_push_simple(branch, remote);
     -	}
 8:  e31eba87d8 !  8:  d0cedd5c81 push: get rid of all the setup_push_* functions
    @@ builtin/push.c: static const char *get_upstream_ref(struct branch *branch, const
      }
      
     -static const char *setup_push_upstream(struct remote *remote, struct branch *branch,
    --	int triangular)
    +-	int same_remote)
     -{
    --	if (triangular)
    +-	if (!same_remote)
     -		die(_("You are pushing to remote '%s', which is not the upstream of\n"
     -		      "your current branch '%s', without telling me what to push\n"
     -		      "to update which remote branch."),
    @@ builtin/push.c: static const char *get_upstream_ref(struct branch *branch, const
     -	return branch->refname;
     -}
     -
    --static const char *setup_push_simple(struct remote *remote, struct branch *branch, int triangular)
    +-static const char *setup_push_simple(struct remote *remote, struct branch *branch, int same_remote)
     -{
    --	if (!triangular)
    +-	if (same_remote)
     -		if (strcmp(branch->refname, get_upstream_ref(branch, remote->name)))
     -			die_push_simple(branch, remote);
     -	return branch->refname;
     -}
     -
    - static int is_workflow_triangular(struct remote *remote)
    + static int is_same_remote(struct remote *remote)
      {
      	struct remote *fetch_remote = remote_get(NULL);
     @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
      	default:
      	case PUSH_DEFAULT_UNSPECIFIED:
      	case PUSH_DEFAULT_SIMPLE:
    --		dst = setup_push_simple(remote, branch, triangular);
    -+		if (!triangular)
    +-		dst = setup_push_simple(remote, branch, same_remote);
    ++		if (same_remote)
     +			if (strcmp(branch->refname, get_upstream_ref(branch, remote->name)))
     +				die_push_simple(branch, remote);
     +		dst = branch->refname;
      		break;
      
      	case PUSH_DEFAULT_UPSTREAM:
    --		dst = setup_push_upstream(remote, branch, triangular);
    -+		if (triangular)
    +-		dst = setup_push_upstream(remote, branch, same_remote);
    ++		if (!same_remote)
     +			die(_("You are pushing to remote '%s', which is not the upstream of\n"
     +			      "your current branch '%s', without telling me what to push\n"
     +			      "to update which remote branch."),
 9:  d5f60ad791 !  9:  47bbad5a47 push: factor out the typical case
    @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
      	default:
      	case PUSH_DEFAULT_UNSPECIFIED:
      	case PUSH_DEFAULT_SIMPLE:
    --		if (!triangular)
    +-		if (same_remote)
     -			if (strcmp(branch->refname, get_upstream_ref(branch, remote->name)))
     -				die_push_simple(branch, remote);
     -		dst = branch->refname;
    -+		if (triangular)
    ++		if (!same_remote)
     +			break;
     +		if (strcmp(branch->refname, get_upstream_ref(branch, remote->name)))
     +			die_push_simple(branch, remote);
10:  e1945bb451 <  -:  ---------- push: remove redundant check
11:  93f8b38364 <  -:  ---------- push: fix Yoda condition
12:  cdf961d231 <  -:  ---------- push: remove trivial function
 -:  ---------- > 10:  6a8e30bf38 push: remove redundant check
 -:  ---------- > 11:  976d7b9f3a push: remove trivial function
13:  e5e55c00e7 ! 12:  d9df139855 push: only get triangular when needed
    @@ Metadata
     Author: Felipe Contreras <felipe.contreras@gmail.com>
     
      ## Commit message ##
    -    push: only get triangular when needed
    +    push: only check same_remote when needed
     
         Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
     
    @@ builtin/push.c: static const char *get_upstream_ref(struct branch *branch, const
      static void setup_default_push_refspecs(struct remote *remote)
      {
      	struct branch *branch;
    --	int triangular = remote != remote_get(NULL);
    +-	int same_remote = remote == remote_get(NULL);
      	const char *dst;
    -+	int triangular;
    ++	int same_remote;
      
      	switch (push_default) {
      	case PUSH_DEFAULT_MATCHING:
    @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
      		die(_(message_detached_head_die), remote->name);
      
      	dst = branch->refname;
    -+	triangular = remote != remote_get(NULL);
    ++	same_remote = remote == remote_get(NULL);
      
      	switch (push_default) {
      	default:
14:  2fd84a4312 ! 13:  ffc52d649c push: don't get a full remote object
    @@ Metadata
      ## Commit message ##
         push: don't get a full remote object
     
    -    All we need to know is that their names are different.
    +    All we need to know is that their names are the same.
    +
    +    Additionally this might be easier to parse for some since
    +    remote_for_branch is more descriptive than remote_get(NULL).
     
         Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
     
    @@ builtin/push.c: static void setup_default_push_refspecs(struct remote *remote)
      		die(_(message_detached_head_die), remote->name);
      
      	dst = branch->refname;
    --	triangular = remote != remote_get(NULL);
    -+	triangular = strcmp(remote->name, remote_for_branch(branch, NULL));
    +-	same_remote = remote == remote_get(NULL);
    ++	same_remote = !strcmp(remote->name, remote_for_branch(branch, NULL));
      
      	switch (push_default) {
      	default:
15:  2a203239e4 <  -:  ---------- push: rename !triangular to same_remote
-- 
2.32.0.rc0


  parent reply	other threads:[~2021-05-31 19:51 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-31 19:32 [PATCH v3 0/7] Unconvolutize push.default=simple Felipe Contreras
2021-05-31 19:32 ` [PATCH v3 1/7] push: rename !triangular to same_remote Felipe Contreras
2021-05-31 19:32 ` [PATCH v3 2/7] push: hedge code of default=simple Felipe Contreras
2021-05-31 19:32 ` [PATCH v3 3/7] push: copy code to setup_push_simple() Felipe Contreras
2021-05-31 19:32 ` [PATCH v3 4/7] push: reorganize setup_push_simple() Felipe Contreras
2021-05-31 19:32 ` [PATCH v3 5/7] push: simplify setup_push_simple() Felipe Contreras
2021-05-31 19:32 ` [PATCH v3 6/7] push: remove unused code in setup_push_upstream() Felipe Contreras
2021-05-31 19:32 ` [PATCH v3 7/7] doc: push: explain default=simple correctly Felipe Contreras
2021-05-31 19:51 ` Felipe Contreras [this message]
2021-05-31 19:51   ` [PATCH v2 01/13] push: create new get_upstream_ref() helper Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 02/13] push: return immediately in trivial switch case Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 03/13] push: split switch cases Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 04/13] push: factor out null branch check Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 05/13] push: only get the branch when needed Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 06/13] push: make setup_push_* return the dst Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 07/13] push: trivial simplifications Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 08/13] push: get rid of all the setup_push_* functions Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 09/13] push: factor out the typical case Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 10/13] push: remove redundant check Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 11/13] push: remove trivial function Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 12/13] push: only check same_remote when needed Felipe Contreras
2021-05-31 19:51   ` [PATCH v2 13/13] push: don't get a full remote object Felipe Contreras
2021-06-02  1:16   ` [PATCH v2 00/13] push: revamp push.default Junio C Hamano
2021-06-02  4:05     ` Felipe Contreras

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210531195124.218325-1-felipe.contreras@gmail.com \
    --to=felipe.contreras@gmail.com \
    --cc=bwilliams.eng@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=l.s.r@web.de \
    --cc=newren@gmail.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).