git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Kaartic Sivaraam <kaarticsivaraam91196@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com
Subject: [RFC PATCH 3/5] branch: cleanup branch name validation
Date: Tue, 19 Sep 2017 12:45:23 +0530	[thread overview]
Message-ID: <20170919071525.9404-4-kaarticsivaraam91196@gmail.com> (raw)
In-Reply-To: <20170919071525.9404-1-kaarticsivaraam91196@gmail.com>

The function that validates a new branch name was clumsy because,

  1. It did more than just validating the branch name

  2. Despite it's name, it is more often than not used to validate
     existing branch names through the 'force' and 'attr_only'
     parameters (whose names by the way weren't communicative).

  3. The 'attr_only' parameter should have been "true" only when
     callers like to update some attribute of the branch and "false"
     when they were updating where the branch points to. It was misused
     by callers by setting it to "true" (to skip tests) even though they
     were force updating where the current branch was pointing to!

     This is an example of spoiling code clarity by making the caller
     rely on how the function is implemented thus making it hard to
     modify/maintain.

This makes it unclear what the function does at all and would confuse
the people who would ever want to it for the first time.

So, refactor it into a function that validates whether the branch could
be updated. This doesn't bear the uncommunicative 'new'. Further replace
the 'force' parameter with a 'could_exist' parameter which specifies
whether the given branch name could exist or not (it's just a better name
for 'force'). Also replace  the 'attr_only' with 'clobber_head' which is
a more communicative way of seeing "If the branch could exist, it's OK if
it is the current branch".

Separate the validation of an existing branch into another function.
This (at last!) addresses the NEEDSWORK that was added in fa7993767
(branch --set-upstream: regression fix, 2011-09-16)

This refactor has only one functional change. It enforces strictly that
an existing branch should be updated only with the 'force' switch. So,
it's no more possible to do,

        $ git branch -m master master

(which doesn't seem that useful). This strongly enforces the following
statement of the 'git branch' documentation,

        "If <newbranch> exists, -M must be used to force the
         rename to happen."

Signed-off-by: Kaartic Sivaraam <kaarticsivaraam91196@gmail.com>
---
 branch.c           | 41 ++++++++++++++++++++++++++++++-----------
 branch.h           | 20 ++++++++------------
 builtin/branch.c   |  2 +-
 builtin/checkout.c |  4 ++--
 t/t3200-branch.sh  |  4 ++++
 5 files changed, 45 insertions(+), 26 deletions(-)

diff --git a/branch.c b/branch.c
index 703ded69c..2020dedf6 100644
--- a/branch.c
+++ b/branch.c
@@ -178,18 +178,19 @@ int read_branch_desc(struct strbuf *buf, const char *branch_name)
 	return 0;
 }
 
-int validate_new_branchname(const char *name, struct strbuf *ref,
-			    int force, int attr_only)
+int validate_branch_update(const char *name, struct strbuf *ref,
+			   int could_exist, int clobber_head)
 {
 	if (strbuf_check_branch_ref(ref, name))
 		die(_("'%s' is not a valid branch name."), name);
 
 	if (!ref_exists(ref->buf))
 		return 0;
-	else if (!force && !attr_only)
+
+	if (!could_exist)
 		die(_("A branch named '%s' already exists."), ref->buf + strlen("refs/heads/"));
 
-	if (!attr_only) {
+	if (!clobber_head) {
 		const char *head;
 		struct object_id oid;
 
@@ -197,9 +198,29 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
 		if (!is_bare_repository() && head && !strcmp(head, ref->buf))
 			die(_("Cannot force update the current branch."));
 	}
+
 	return 1;
 }
 
+/*
+ * Validates whether the branch with the given name exists, returning the
+ * interpreted ref in ref.
+ *
+ * This method is invoked if the caller merely wants to know if it is OK
+ * to change some attribute for the named branch (e.g. tracking upstream).
+ *
+ */
+static void validate_existing_branch(const char *name, struct strbuf *ref)
+{
+	if (strbuf_check_branch_ref(ref, name))
+		die(_("'%s' is not a valid branch name."), name);
+
+	if (ref_exists(ref->buf))
+		return;
+	else
+		die(_("branch '%s' doesn't exist"), name);
+}
+
 static int check_tracking_branch(struct remote *remote, void *cb_data)
 {
 	char *tracking_branch = cb_data;
@@ -243,13 +264,11 @@ void create_branch(const char *name, const char *start_name,
 	if (track == BRANCH_TRACK_EXPLICIT || track == BRANCH_TRACK_OVERRIDE)
 		explicit_tracking = 1;
 
-	if (validate_new_branchname(name, &ref, force,
-				    track == BRANCH_TRACK_OVERRIDE ||
-				    clobber_head)) {
-		if (!force)
-			dont_change_ref = 1;
-		else
-			forcing = 1;
+	if (track == BRANCH_TRACK_OVERRIDE) {
+		validate_existing_branch(name, &ref);
+		dont_change_ref = 1;
+	} else {
+		forcing = validate_branch_update(name, &ref, force, clobber_head);
 	}
 
 	real_ref = NULL;
diff --git a/branch.h b/branch.h
index 33b7f5d88..b4bfff84a 100644
--- a/branch.h
+++ b/branch.h
@@ -28,22 +28,18 @@ void create_branch(const char *name, const char *start_name,
 		   int clobber_head, int quiet, enum branch_track track);
 
 /*
- * Validates that the requested branch may be created, returning the
- * interpreted ref in ref, force indicates whether (non-head) branches
- * may be overwritten. A non-zero return value indicates that the force
- * parameter was non-zero and the branch already exists.
+ * Validates whether the branch with the given name may be updated (created, renamed etc.,)
+ * with respect to the given conditions. It returns the interpreted ref in ref.
  *
- * Contrary to all of the above, when attr_only is 1, the caller is
- * not interested in verifying if it is Ok to update the named
- * branch to point at a potentially different commit. It is merely
- * asking if it is OK to change some attribute for the named branch
- * (e.g. tracking upstream).
+ * could_exist indicates whether the branch could exist or not.
  *
- * NEEDSWORK: This needs to be split into two separate functions in the
- * longer run for sanity.
+ * if 'could_exist' is true, clobber_head indicates whether the branch could be the
+ * current branch; else it has no effect.
+ *
+ * A non-zero return value indicates that a branch already exists and can be force updated.
  *
  */
-int validate_new_branchname(const char *name, struct strbuf *ref, int force, int attr_only);
+int validate_branch_update(const char *name, struct strbuf *ref, int could_exist, int clobber_head);
 
 /*
  * Remove information about the state of working on the current
diff --git a/builtin/branch.c b/builtin/branch.c
index 355f9ef5d..27ddcad97 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -483,7 +483,7 @@ static void rename_branch(const char *oldname, const char *newname, int force)
 	 */
 	clobber_head_ok = !strcmp(oldname, newname);
 
-	validate_new_branchname(newname, &newref, force, clobber_head_ok);
+	validate_branch_update(newname, &newref, force, clobber_head_ok);
 
 	reject_rebase_or_bisect_branch(oldref.buf);
 
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 76859da9d..2e870ab4b 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1283,8 +1283,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
 		struct strbuf buf = STRBUF_INIT;
 		int force = opts.new_branch_force != NULL;
 
-		opts.branch_exists = validate_new_branchname(opts.new_branch, &buf,
-							     force, force);
+		opts.branch_exists = validate_branch_update(opts.new_branch, &buf,
+							    force, force);
 
 		strbuf_release(&buf);
 	}
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index d97164997..ec85cd959 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -137,6 +137,10 @@ test_expect_success 'git branch -m -f o/q o/p should work when o/p exists' '
 	git branch -m -f o/q o/p
 '
 
+test_expect_success 'git branch -m o/o o/o should fail when o/o exists' '
+	test_must_fail git branch -m o/o o/o
+'
+
 test_expect_success 'git branch -m q r/q should fail when r exists' '
 	git branch q &&
 	git branch r &&
-- 
2.14.1.1006.g90ad9a07c


  parent reply	other threads:[~2017-09-19  7:15 UTC|newest]

Thread overview: 127+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-24 15:41 [PATCH/RFC] branch: warn user about non-existent branch Kaartic Sivaraam
2017-07-24 19:16 ` Change in output as a result of patch Kaartic Sivaraam
2017-07-24 21:25   ` Junio C Hamano
2017-07-25 18:54     ` Kaartic Sivaraam
2017-07-26 22:29       ` Junio C Hamano
2017-08-07 14:39         ` Can the '--set-upstream' option of branch be removed ? Kaartic Sivaraam
2017-08-07 14:39           ` [PATCH 1/2 / RFC] builtin/branch: remove the deprecated '--set-upstream' option Kaartic Sivaraam
2017-08-07 14:39           ` [PATCH 2/2 / RFC] branch: quote branch/ref names to improve readability Kaartic Sivaraam
2017-08-07 20:59           ` Can the '--set-upstream' option of branch be removed ? Junio C Hamano
2017-08-08 13:00             ` Kaartic Sivaraam
2017-08-08 16:47               ` Junio C Hamano
2017-08-08 17:11             ` [PATCH v2 1/2 / RFC] builtin/branch: stop supporting the use of --set-upstream option Kaartic Sivaraam
2017-08-08 17:11               ` [PATCH v2 2/2 / RFC] branch: quote branch/ref names to improve readability Kaartic Sivaraam
2017-08-08 18:55                 ` Stefan Beller
2017-08-08 19:43                   ` Junio C Hamano
2017-08-08 20:08                     ` Stefan Beller
2017-08-08 18:33               ` [PATCH v2 1/2 / RFC] builtin/branch: stop supporting the use of --set-upstream option Martin Ågren
2017-08-14  8:50                 ` Kaartic Sivaraam
2017-08-14  8:54               ` [PATCH v3 " Kaartic Sivaraam
2017-08-14 19:14                 ` Martin Ågren
2017-08-15 10:23                   ` Kaartic Sivaraam
2017-08-14 20:19                 ` Junio C Hamano
2017-08-15 10:56                   ` Kaartic Sivaraam
2017-08-15 18:58                     ` Junio C Hamano
2017-08-16 18:13                       ` Kaartic Sivaraam
2017-08-16 19:09                         ` Junio C Hamano
2017-08-17  2:04                           ` Kaartic Sivaraam
2017-09-12  6:49                             ` Junio C Hamano
2017-09-12  7:00                               ` Kaartic Sivaraam
2017-09-12 10:31                               ` [PATCH/RFC] branch: strictly don't allow a branch with name 'HEAD' Kaartic Sivaraam
2017-08-17  2:54                   ` [PATCH v4 1/3] test: cleanup cruft of a test Kaartic Sivaraam
2017-08-17  2:54                     ` [PATCH v4 2/3] builtin/branch: stop supporting the use of --set-upstream option Kaartic Sivaraam
2017-08-17 18:21                       ` Martin Ågren
2017-08-17 19:55                         ` Junio C Hamano
2017-08-18  2:41                           ` Kaartic Sivaraam
2017-08-18 16:30                             ` Junio C Hamano
2017-08-18 16:57                               ` Martin Ågren
2017-08-17 19:58                       ` Junio C Hamano
2017-08-18  2:39                         ` Kaartic Sivaraam
2017-08-18 16:31                           ` Junio C Hamano
2017-08-17  2:54                     ` [PATCH v4 3/3] branch: quote branch/ref names to improve readability Kaartic Sivaraam
2017-08-07 14:49     ` Change in output as a result of patch Kaartic Sivaraam
2017-09-19  7:15     ` [RFC PATCH 0/5] branch: improve error messages of branch renaming Kaartic Sivaraam
2017-09-19  7:15       ` [RFC PATCH 1/5] builtin/checkout: avoid usage of '!!' Kaartic Sivaraam
2017-09-20  4:00         ` Junio C Hamano
2017-09-20  8:09           ` Kaartic Sivaraam
2017-09-20 11:26             ` Kaartic Sivaraam
2017-09-21  1:31               ` Junio C Hamano
2017-09-23 12:17                 ` Kaartic Sivaraam
2017-09-19  7:15       ` [RFC PATCH 2/5] branch: document the usage of certain parameters Kaartic Sivaraam
2017-09-20  4:12         ` Junio C Hamano
2017-09-20  9:01           ` Kaartic Sivaraam
2017-09-21  1:33             ` Junio C Hamano
2017-09-19  7:15       ` Kaartic Sivaraam [this message]
2017-09-20  4:20         ` [RFC PATCH 3/5] branch: cleanup branch name validation Junio C Hamano
2017-09-20 12:04           ` Kaartic Sivaraam
2017-09-21  1:37             ` Junio C Hamano
2017-09-23 12:52               ` Kaartic Sivaraam
2017-09-20 14:52           ` Kaartic Sivaraam
2017-09-19  7:15       ` [RFC PATCH 4/5] branch: introduce dont_fail parameter for update validation Kaartic Sivaraam
2017-09-19  7:15       ` [RFC PATCH 5/5] builtin/branch: give more useful error messages when renaming Kaartic Sivaraam
2017-09-19  8:41         ` [RFC SAMPLE] " Kaartic Sivaraam
2017-09-19  9:33           ` Kaartic Sivaraam
2017-09-20 20:57         ` [RFC PATCH 5/5] " Stefan Beller
2017-09-23 10:50           ` Kaartic Sivaraam
2017-09-25  8:20       ` [RFC PATCH v2 0/5] Give more useful error messages when renaming a branch Kaartic Sivaraam
2017-09-25  8:20         ` [RFC PATCH v2 1/5] branch: improve documentation and naming of certain parameters Kaartic Sivaraam
2017-10-20 21:33           ` Stefan Beller
2017-10-20 21:51             ` Eric Sunshine
2017-10-21  2:32               ` Kaartic Sivaraam
2017-10-21  2:31             ` Kaartic Sivaraam
2017-09-25  8:20         ` [RFC PATCH v2 2/5] branch: re-order function arguments to group related arguments Kaartic Sivaraam
2017-10-20 21:50           ` Stefan Beller
2017-10-21  2:56             ` Kaartic Sivaraam
2017-10-23 19:32               ` Stefan Beller
2017-09-25  8:20         ` [RFC PATCH v2 3/5] branch: cleanup branch name validation Kaartic Sivaraam
2017-09-25  8:20         ` [RFC PATCH v2 4/5] branch: introduce dont_fail parameter for create validation Kaartic Sivaraam
2017-09-25  8:20         ` [RFC PATCH v2 5/5] builtin/branch: give more useful error messages when renaming Kaartic Sivaraam
2017-10-23 19:44           ` Stefan Beller
2017-10-24  3:37             ` Kaartic Sivaraam
2017-10-20  7:09         ` [RFC PATCH v2 0/5] Give more useful error messages when renaming a branch Kaartic Sivaraam
2017-10-20 18:58           ` Stefan Beller
2017-11-02  6:54         ` [RFC PATCH v3 0/4] give more useful error messages while renaming branch Kaartic Sivaraam
2017-11-02  6:54           ` [RFC PATCH v3 1/4] branch: improve documentation and naming of 'create_branch()' Kaartic Sivaraam
2017-11-02  6:54           ` [RFC PATCH v3 2/4] branch: re-order function arguments to group related arguments Kaartic Sivaraam
2017-11-06  2:06             ` Junio C Hamano
2017-11-12 13:27               ` Kaartic Sivaraam
2017-11-13  2:32                 ` Junio C Hamano
2017-11-13  3:06                   ` Kaartic Sivaraam
2017-11-02  6:54           ` [RFC PATCH v3 3/4] branch: introduce dont_fail parameter for branchname validation Kaartic Sivaraam
2017-11-02  8:39             ` Kaartic Sivaraam
2017-11-02 18:42               ` Stefan Beller
2017-11-03  2:58                 ` Kaartic Sivaraam
2017-11-06  2:24             ` Junio C Hamano
2017-11-12 13:33               ` Kaartic Sivaraam
2017-11-02  6:54           ` [RFC PATCH v3 4/4] builtin/branch: give more useful error messages when renaming Kaartic Sivaraam
2017-11-02 14:21             ` Eric Sunshine
2017-11-03  2:41               ` Kaartic Sivaraam
2017-11-06  2:30             ` Junio C Hamano
2017-11-12 14:05               ` Kaartic Sivaraam
2017-11-12 18:23             ` Kevin Daudt
2017-11-13  2:31               ` Kaartic Sivaraam
2017-11-13 11:30                 ` Kevin Daudt
2017-11-14  5:25                   ` Kaartic Sivaraam
2017-11-18 17:26           ` [PATCH 0/4] cleanups surrounding branch Kaartic Sivaraam
2017-11-18 17:26             ` [PATCH 1/4] branch: improve documentation and naming of create_branch() parameters Kaartic Sivaraam
2017-11-18 17:26             ` [PATCH 2/4] branch: group related arguments of create_branch() Kaartic Sivaraam
2017-11-18 17:26             ` [PATCH 3/4] branch: update warning message shown when copying a misnamed branch Kaartic Sivaraam
2017-11-18 17:26             ` [PATCH 4/4] builtin/branch: strip refs/heads/ using skip_prefix Kaartic Sivaraam
2017-11-19  1:04               ` Eric Sunshine
2017-11-19 17:21                 ` Kaartic Sivaraam
2017-11-19 18:06                   ` Eric Sunshine
2017-11-29  3:46               ` [PATCH v4 " Kaartic Sivaraam
2017-12-01  5:59                 ` [PATCH v5 " Kaartic Sivaraam
2017-12-04  4:29                   ` SZEDER Gábor
2017-12-07 23:00                     ` Junio C Hamano
2017-12-07 23:14                       ` Junio C Hamano
2017-12-08 17:39                         ` Kaartic Sivaraam
2018-03-10 15:54           ` [PATCH v4 0/3] give more useful error messages while renaming branch (reboot) Kaartic Sivaraam
2018-03-10 15:54             ` [PATCH v4 1/3] branch: introduce dont_fail parameter for branchname validation Kaartic Sivaraam
2018-03-15 20:27               ` Junio C Hamano
2018-03-16 18:12                 ` Kaartic Sivaraam
2018-03-10 15:54             ` [PATCH v4 2/3] builtin/branch: give more useful error messages when renaming Kaartic Sivaraam
2018-03-15 20:33               ` Junio C Hamano
2018-03-24 17:09                 ` Kaartic Sivaraam
2018-03-10 15:54             ` [PATCH v4 3/3] t/t3200: fix a typo in a test description Kaartic Sivaraam
2018-03-15 20:41               ` Junio C Hamano

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=20170919071525.9404-4-kaarticsivaraam91196@gmail.com \
    --to=kaarticsivaraam91196@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.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).