Skip to content

Commit

Permalink
Teach git-branch to delete tracking branches with -r -d
Browse files Browse the repository at this point in the history
Because -r already means "remote" when listing, you can say:

	$ git branch -d -r origin/todo origin/html origin/man

I just twisted it not to check fast-forwardness with the current
branch when you are removing a tracking branch.  Most likely,
removal of a tracking branch is not because you are "done with"
it (for a local branch, it usually means "you merged it up"),
but because you are not even interested in it.  In other words,
remote tracking branches are more like tags than branches.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Dec 19, 2006
1 parent 8336afa commit f3d985c
Showing 1 changed file with 28 additions and 13 deletions.
41 changes: 28 additions & 13 deletions builtin-branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@
#include "builtin.h"

static const char builtin_branch_usage[] =
"git-branch (-d | -D) <branchname> | [-l] [-f] <branchname> [<start-point>] | (-m | -M) [<oldbranch>] <newbranch> | [-r | -a] [-v [--abbrev=<length>]]";
"git-branch [-r] (-d | -D) <branchname> | [-l] [-f] <branchname> [<start-point>] | (-m | -M) [<oldbranch>] <newbranch> | [-r | -a] [-v [--abbrev=<length>]]";

#define REF_UNKNOWN_TYPE 0x00
#define REF_LOCAL_BRANCH 0x01
#define REF_REMOTE_BRANCH 0x02
#define REF_TAG 0x04

static const char *head;
static unsigned char head_sha1[20];
Expand Down Expand Up @@ -89,25 +93,40 @@ static int in_merge_bases(const unsigned char *sha1,
return ret;
}

static void delete_branches(int argc, const char **argv, int force)
static void delete_branches(int argc, const char **argv, int force, int kinds)
{
struct commit *rev, *head_rev = head_rev;
unsigned char sha1[20];
char *name;
const char *fmt, *remote;
int i;

switch (kinds) {
case REF_REMOTE_BRANCH:
fmt = "refs/remotes/%s";
remote = "remote ";
force = 1;
break;
case REF_LOCAL_BRANCH:
fmt = "refs/heads/%s";
remote = "";
break;
default:
die("cannot use -a with -d");
}

if (!force) {
head_rev = lookup_commit_reference(head_sha1);
if (!head_rev)
die("Couldn't look up commit object for HEAD");
}
for (i = 0; i < argc; i++) {
if (!strcmp(head, argv[i]))
if (kinds == REF_LOCAL_BRANCH && !strcmp(head, argv[i]))
die("Cannot delete the branch you are currently on.");

name = xstrdup(mkpath("refs/heads/%s", argv[i]));
name = xstrdup(mkpath(fmt, argv[i]));
if (!resolve_ref(name, sha1, 1, NULL))
die("Branch '%s' not found.", argv[i]);
die("%sbranch '%s' not found.", remote, argv[i]);

rev = lookup_commit_reference(sha1);
if (!rev)
Expand All @@ -128,19 +147,15 @@ static void delete_branches(int argc, const char **argv, int force)
}

if (delete_ref(name, sha1))
printf("Error deleting branch '%s'\n", argv[i]);
printf("Error deleting %sbranch '%s'\n", remote,
argv[i]);
else
printf("Deleted branch %s.\n", argv[i]);
printf("Deleted %sbranch %s.\n", remote, argv[i]);

free(name);
}
}

#define REF_UNKNOWN_TYPE 0x00
#define REF_LOCAL_BRANCH 0x01
#define REF_REMOTE_BRANCH 0x02
#define REF_TAG 0x04

struct ref_item {
char *name;
unsigned int kind;
Expand Down Expand Up @@ -435,7 +450,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
head += 11;

if (delete)
delete_branches(argc - i, argv + i, force_delete);
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))
Expand Down

0 comments on commit f3d985c

Please sign in to comment.