All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
To: git@vger.kernel.org
Cc: Kaartic Sivaraam <kaarticsivaraam91196@gmail.com>
Subject: [RFC PATCH v3 3/4] branch: introduce dont_fail parameter for branchname validation
Date: Thu,  2 Nov 2017 12:24:06 +0530	[thread overview]
Message-ID: <20171102065407.25404-4-kaartic.sivaraam@gmail.com> (raw)
In-Reply-To: <20171102065407.25404-1-kaartic.sivaraam@gmail.com>

This parameter allows the branchname validation functions to
optionally return a flag specifying the reason for failure, when
requested. This allows the caller to know why it was about to die.
This allows more useful error messages to be given to the user when
trying to rename a branch.

The flags are specified in the form of an enum and values for success
flags have been assigned explicitly to clearly express that certain
callers rely on those values and they cannot be arbitrary.

Only the logic has been added but no caller has been made to use it, yet.
So, no functional changes.

Signed-off-by: Kaartic Sivaraam <kaarticsivaraam91196@gmail.com>
Signed-off-by: Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
---
 branch.c           | 62 +++++++++++++++++++++++++++++++-----------------------
 branch.h           | 60 ++++++++++++++++++++++++++++++++++++++++++----------
 builtin/branch.c   |  4 ++--
 builtin/checkout.c |  5 +++--
 4 files changed, 90 insertions(+), 41 deletions(-)

diff --git a/branch.c b/branch.c
index 7c8093041..7db2e3296 100644
--- a/branch.c
+++ b/branch.c
@@ -178,41 +178,51 @@ int read_branch_desc(struct strbuf *buf, const char *branch_name)
 	return 0;
 }
 
-/*
- * Check if 'name' can be a valid name for a branch; die otherwise.
- * Return 1 if the named branch already exists; return 0 otherwise.
- * Fill ref with the full refname for the branch.
- */
-int validate_branchname(const char *name, struct strbuf *ref)
+enum branch_validation_result validate_branchname(const char *name, struct strbuf *ref, unsigned dont_fail)
 {
-	if (strbuf_check_branch_ref(ref, name))
-		die(_("'%s' is not a valid branch name."), name);
+	if (strbuf_check_branch_ref(ref, name)) {
+		if (dont_fail)
+			return INVALID_BRANCH_NAME;
+		else
+			die(_("'%s' is not a valid branch name."), name);
+	}
 
-	return ref_exists(ref->buf);
+	if(ref_exists(ref->buf))
+		return BRANCH_EXISTS;
+	else
+		return BRANCH_DOESNT_EXIST;
 }
 
-/*
- * Check if a branch 'name' can be created as a new branch; die otherwise.
- * 'force' can be used when it is OK for the named branch already exists.
- * Return 1 if the named branch already exists; return 0 otherwise.
- * Fill ref with the full refname for the branch.
- */
-int validate_new_branchname(const char *name, struct strbuf *ref, int force)
+enum branch_validation_result validate_new_branchname(const char *name, struct strbuf *ref, int force, unsigned dont_fail)
 {
 	const char *head;
 
-	if (!validate_branchname(name, ref))
-		return 0;
+	if(dont_fail) {
+		enum branch_validation_result res = validate_branchname(name, ref, 1);
+		if (res == INVALID_BRANCH_NAME || res == BRANCH_DOESNT_EXIST)
+				return res;
+	} else {
+		if(validate_branchname(name, ref, 0) == BRANCH_DOESNT_EXIST)
+			return BRANCH_DOESNT_EXIST;
+	}
 
-	if (!force)
-		die(_("A branch named '%s' already exists."),
-		    ref->buf + strlen("refs/heads/"));
+	if (!force) {
+		if (dont_fail)
+			return BRANCH_EXISTS_NO_FORCE;
+		else
+			die(_("A branch named '%s' already exists."),
+				ref->buf + strlen("refs/heads/"));
+	}
 
 	head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
-	if (!is_bare_repository() && head && !strcmp(head, ref->buf))
-		die(_("Cannot force update the current branch."));
+	if (!is_bare_repository() && head && !strcmp(head, ref->buf)) {
+		if (dont_fail)
+			return CANNOT_FORCE_UPDATE_CURRENT_BRANCH;
+		else
+			die(_("Cannot force update the current branch."));
+	}
 
-	return 1;
+	return BRANCH_EXISTS;
 }
 
 static int check_tracking_branch(struct remote *remote, void *cb_data)
@@ -259,8 +269,8 @@ void create_branch(const char *name, const char *start_name,
 		explicit_tracking = 1;
 
 	if ((track == BRANCH_TRACK_OVERRIDE || clobber_head_ok)
-	    ? validate_branchname(name, &ref)
-	    : validate_new_branchname(name, &ref, force)) {
+	    ? validate_branchname(name, &ref, 0)
+	    : validate_new_branchname(name, &ref, force, 0)) {
 		if (!force)
 			dont_change_ref = 1;
 		else
diff --git a/branch.h b/branch.h
index 85052628b..0c178ec5a 100644
--- a/branch.h
+++ b/branch.h
@@ -27,20 +27,58 @@ void create_branch(const char *name, const char *start_name,
 		   enum branch_track track, int force, int clobber_head_ok,
 		   int reflog, int quiet);
 
-/*
- * Check if 'name' can be a valid name for a branch; die otherwise.
- * Return 1 if the named branch already exists; return 0 otherwise.
- * Fill ref with the full refname for the branch.
- */
-extern int validate_branchname(const char *name, struct strbuf *ref);
+enum branch_validation_result {
+	/* Flags that convey that validation FAILED */
+	BRANCH_EXISTS_NO_FORCE = -3,
+	CANNOT_FORCE_UPDATE_CURRENT_BRANCH,
+	INVALID_BRANCH_NAME,
+	/* Flags that convey that validation SUCCEEDED */
+	BRANCH_DOESNT_EXIST = 0,
+	BRANCH_EXISTS = 1,
+};
 
 /*
- * Check if a branch 'name' can be created as a new branch; die otherwise.
- * 'force' can be used when it is OK for the named branch already exists.
- * Return 1 if the named branch already exists; return 0 otherwise.
- * Fill ref with the full refname for the branch.
+ * Check if 'name' can be a valid name for a branch; die otherwise.
+ *
+ *   - name is the new branch name
+ *
+ *   - ref is used to return the full refname for the branch
+ *
+ * The return values have the following meaning,
+ *
+ *   - If dont_fail is 0, the function dies in case of failure and returns flags of
+ *     'branch_validation_result' that indicate status of the given branch. The positive
+ *     non-zero flag implies that the branch exists.
+ *
+ *   - If dont_fail is 1, the function doesn't die in case of failure but returns flags
+ *     of 'branch_validaton_result' that specify the reason for failure. The behaviour in case of
+ *     success is same as above.
+ *
  */
-extern int validate_new_branchname(const char *name, struct strbuf *ref, int force);
+extern enum branch_validation_result validate_branchname(const char *name, struct strbuf *ref, unsigned dont_fail);
+
+/*
+ * Check if a branch 'name' can be created as a new branch.
+ *
+ *   - name is the new branch name
+ *
+ *   - ref is used to return the full refname for the branch
+ *
+ *   - force can be used when it is OK if the named branch already exists.
+ *     the currently checkout branch; with 'shouldnt_exist', it has no effect.
+ *
+ * The return values have the following meaning,
+ *
+ *   - If dont_fail is 0, the function dies in case of failure and returns flags of
+ *     'branch_validation_result' that indicate that convey status of given branch. The positive
+ *     non-zero flag implies that the branch can be force updated.
+ *
+ *   - If dont_fail is 1, the function doesn't die in case of failure but returns flags
+ *     of 'branch_validaton_result' that specify the reason for failure. The behaviour in case of
+ *     success is same as above.
+ *
+ */
+extern enum branch_validation_result validate_new_branchname(const char *name, struct strbuf *ref, int force, unsigned dont_fail);
 
 /*
  * Remove information about the state of working on the current
diff --git a/builtin/branch.c b/builtin/branch.c
index df06ac968..7018e5d75 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -487,9 +487,9 @@ static void copy_or_rename_branch(const char *oldname, const char *newname, int
 	 * cause the worktree to become inconsistent with HEAD, so allow it.
 	 */
 	if (!strcmp(oldname, newname))
-		validate_branchname(newname, &newref);
+		validate_branchname(newname, &newref, 0);
 	else
-		validate_new_branchname(newname, &newref, force);
+		validate_new_branchname(newname, &newref, force, 0);
 
 	reject_rebase_or_bisect_branch(oldref.buf);
 
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 5c34a9a0d..4adab3814 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1288,10 +1288,11 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
 		struct strbuf buf = STRBUF_INIT;
 
 		if (opts.new_branch_force)
-			opts.branch_exists = validate_branchname(opts.new_branch, &buf);
+			opts.branch_exists = validate_branchname(opts.new_branch, &buf, 0);
 		else
 			opts.branch_exists =
-				validate_new_branchname(opts.new_branch, &buf, 0);
+				validate_new_branchname(opts.new_branch, &buf, 0, 0);
+
 		strbuf_release(&buf);
 	}
 
-- 
2.15.0.461.gf957c703b.dirty


  parent reply	other threads:[~2017-11-02  6:54 UTC|newest]

Thread overview: 128+ 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       ` [RFC PATCH 3/5] branch: cleanup branch name validation Kaartic Sivaraam
2017-09-20  4:20         ` 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           ` Kaartic Sivaraam [this message]
2017-11-02  8:39             ` [RFC PATCH v3 3/4] branch: introduce dont_fail parameter for branchname validation 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
2017-11-02  6:52 [RFC PATCH v3 0/4] give more useful error messages while renaming branch Kaartic Sivaraam
2017-11-02  6:52 ` [RFC PATCH v3 3/4] branch: introduce dont_fail parameter for branchname validation Kaartic Sivaraam

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=20171102065407.25404-4-kaartic.sivaraam@gmail.com \
    --to=kaartic.sivaraam@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=kaarticsivaraam91196@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.
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.