From: Quy Tonthat <qtonthat@gmail.com>
To: Junio C Hamano <junkio@cox.net>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] (Take 2) git-branch: deleting remote branches in new layout
Date: Tue, 19 Dec 2006 00:39:08 +1100 [thread overview]
Message-ID: <458699FC.9060407@gmail.com> (raw)
In-Reply-To: <7vodq11w49.fsf@assigned-by-dhcp.cox.net>
This patch is based on Junio's patch (all errors are my fault, of
course) to provide the following features to 'git-branch -d|-D'
o Option -r can be used with -d or -D to delete "remote" (tracking)
branch(es), for examples,
git branch -d -r origin/man origin/html
this command will delete the named branches in $GIT_DIR/refs/remotes,
according to the new layout.
(No, you can no longer mix "local" and "remote" branches in one
deletion command.)
o If there are more than one branches to be deleted, failure on one will
no longer stop git-branch to process the next ones.
o 'git-branch -d|-D' now returns error code 1 if at least one of
branches deleting is failed. (0 returned for fully success as before)
Signed-off-by: Quy Tonthat <qtonthat@gmail.com>
---
This patch is to replace my previous patch.
builtin-branch.c | 57 ++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 39 insertions(+), 18 deletions(-)
diff --git a/builtin-branch.c b/builtin-branch.c
index 7fb93e7..52b6b5a 100644
--- a/builtin-branch.c
+++ b/builtin-branch.c
@@ -93,13 +93,14 @@ static int in_merge_bases(const unsigned char *sha1,
return ret;
}
-static void delete_branches(int argc, const char **argv, int force, int kinds)
+static int delete_branches(int argc, const char **argv, int force, int kinds)
{
struct commit *rev, *head_rev = head_rev;
unsigned char sha1[20];
- char *name;
+ char *name = NULL;
const char *fmt, *remote;
int i;
+ int ret = 0;
switch (kinds) {
case REF_REMOTE_BRANCH:
@@ -121,16 +122,30 @@ static void delete_branches(int argc, const char **argv, int force, int kinds)
die("Couldn't look up commit object for HEAD");
}
for (i = 0; i < argc; i++) {
- if (kinds == REF_LOCAL_BRANCH && !strcmp(head, argv[i]))
- die("Cannot delete the branch you are currently on.");
+ if (kinds == REF_LOCAL_BRANCH && !strcmp(head, argv[i])) {
+ error("Cannot delete the branch '%s' "
+ "which you are currently on.", argv[i]);
+ ret = 1;
+ continue;
+ }
+
+ if (name)
+ free(name);
name = xstrdup(mkpath(fmt, argv[i]));
- if (!resolve_ref(name, sha1, 1, NULL))
- die("%sbranch '%s' not found.", remote, argv[i]);
+ if (!resolve_ref(name, sha1, 1, NULL)) {
+ error("%sbranch '%s' not found.",
+ remote, argv[i]);
+ ret = 1;
+ continue;
+ }
rev = lookup_commit_reference(sha1);
- if (!rev)
- die("Couldn't look up commit object for '%s'", name);
+ if (!rev) {
+ error("Couldn't look up commit object for '%s'", name);
+ ret = 1;
+ continue;
+ }
/* This checks whether the merge bases of branch and
* HEAD contains branch -- which means that the HEAD
@@ -139,21 +154,26 @@ static void delete_branches(int argc, const char **argv, int force, int kinds)
if (!force &&
!in_merge_bases(sha1, rev, head_rev)) {
- fprintf(stderr,
- "The branch '%s' is not a strict subset of your current HEAD.\n"
- "If you are sure you want to delete it, run 'git branch -D %s'.\n",
+ error("The branch '%s' is not a strict subset of your current HEAD."
+ "If you are sure you want to delete it, run 'git branch -D %s'.",
argv[i], argv[i]);
- exit(1);
+ ret = 1;
+ continue;
}
- if (delete_ref(name, sha1))
- printf("Error deleting %sbranch '%s'\n", remote,
+ if (delete_ref(name, sha1)) {
+ error("Error deleting %sbranch '%s'", remote,
argv[i]);
- else
+ ret = 1;
+ } else
printf("Deleted %sbranch %s.\n", remote, argv[i]);
- free(name);
}
+
+ if (name)
+ free(name);
+
+ return(ret);
}
struct ref_item {
@@ -372,6 +392,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
int reflog = 0;
int kinds = REF_LOCAL_BRANCH;
int i;
+ int status = 0;
setup_ident();
git_config(git_branch_config);
@@ -450,7 +471,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
head += 11;
if (delete)
- delete_branches(argc - i, argv + i, force_delete, kinds);
+ status = delete_branches(argc - i, argv + i, force_delete, kinds);
else if (i == argc)
print_ref_list(kinds, verbose, abbrev);
else if (rename && (i == argc - 1))
@@ -464,5 +485,5 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
else
usage(builtin_branch_usage);
- return 0;
+ return (status);
}
--
1.4.4.1.GIT
next prev parent reply other threads:[~2006-12-18 13:39 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-18 6:08 [PATCH] git-branch: deleting remote branches in new layout Quy Tonthat
2006-12-18 7:08 ` Junio C Hamano
2006-12-18 7:49 ` Junio C Hamano
2006-12-18 10:02 ` Quy Tonthat
2006-12-18 13:39 ` Quy Tonthat [this message]
2006-12-18 22:42 ` [PATCH] (Take 3) " Quy Tonthat
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=458699FC.9060407@gmail.com \
--to=qtonthat@gmail.com \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
/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.