Download raw body.
got branch: support multiple -d options
Stefan Sperling <stsp@stsp.name> wrote: > If multiple -d options are passed to 'got branch' all arguments > except the last one end up being ignored. > > It seems more useful to delete all specified branches instead. agreed, and it's also the same behavior of `got send -d'. > ok? reads fine to me :) > diff 50fa49718233a5cfbfc5160b8dd184d7b203ad3a eb22755e7b25da7c4de1dc247d135cfb1a6c0d7f > blob - b91cfb2cb4963721a9a86be9c2cdb397bc1a9278 > blob + 8f10ab729ced9f0f2cc04a33336f59d048d9acb9 > --- got/got.1 > +++ got/got.1 > @@ -1155,9 +1155,11 @@ from the > or > .Dq refs/remotes > reference namespace. > +This option may be specified multiple times to build a list of branches > +to delete. > .Pp > -Only the branch reference is deleted. > -Any commit, tree, and blob objects belonging to the branch > +Only branch references are deleted. > +Any commit, tree, and blob objects belonging to a branch > remain in the repository and may be removed separately with > Git's garbage collector or > .Cm gotadmin cleanup . > blob - 80e5d2fbcd031246f1194edf450fa9da6e1a2901 > blob + 0333604cb5526b7fae12fa0535bed75d9a437843 > --- got/got.c > +++ got/got.c > @@ -6153,7 +6153,8 @@ cmd_branch(int argc, char *argv[]) > struct got_worktree *worktree = NULL; > char *cwd = NULL, *repo_path = NULL; > int ch, do_list = 0, do_show = 0, do_update = 1, sort_by_time = 0; > - const char *delref = NULL, *commit_id_arg = NULL; > + const char *commit_id_arg = NULL; > + struct got_pathlist_head delrefs; > struct got_reference *ref = NULL; > struct got_pathlist_head paths; > struct got_pathlist_entry *pe; > @@ -6161,6 +6162,7 @@ cmd_branch(int argc, char *argv[]) > char *commit_id_str = NULL; > > TAILQ_INIT(&paths); > + TAILQ_INIT(&delrefs); > > while ((ch = getopt(argc, argv, "c:d:r:lnt")) != -1) { > switch (ch) { > @@ -6168,7 +6170,9 @@ cmd_branch(int argc, char *argv[]) > commit_id_arg = optarg; > break; > case 'd': > - delref = optarg; > + error = got_pathlist_append(&delrefs, optarg, NULL); > + if (error) > + return error; > break; > case 'r': > repo_path = realpath(optarg, NULL); > @@ -6192,7 +6196,7 @@ cmd_branch(int argc, char *argv[]) > } > } > > - if (do_list && delref) > + if (do_list && !TAILQ_EMPTY(&delrefs)) > option_conflict('l', 'd'); > if (sort_by_time && !do_list) > errx(1, "-t option requires -l option"); > @@ -6200,13 +6204,14 @@ cmd_branch(int argc, char *argv[]) > argc -= optind; > argv += optind; > > - if (!do_list && !delref && argc == 0) > + if (!do_list && TAILQ_EMPTY(&delrefs) && argc == 0) > do_show = 1; > > - if ((do_list || delref || do_show) && commit_id_arg != NULL) > + if ((do_list || !TAILQ_EMPTY(&delrefs) || do_show) && > + commit_id_arg != NULL) > errx(1, "-c option can only be used when creating a branch"); > > - if (do_list || delref) { > + if (do_list || !TAILQ_EMPTY(&delrefs)) { > if (argc > 0) > usage_branch(); > } else if (!do_show && argc != 1) > @@ -6264,9 +6269,15 @@ cmd_branch(int argc, char *argv[]) > error = show_current_branch(repo, worktree); > else if (do_list) > error = list_branches(repo, worktree, sort_by_time); > - else if (delref) > - error = delete_branch(repo, worktree, delref); > - else { > + else if (!TAILQ_EMPTY(&delrefs)) { > + struct got_pathlist_entry *pe; > + TAILQ_FOREACH(pe, &delrefs, entry) { > + const char *delref = pe->path; > + error = delete_branch(repo, worktree, delref); > + if (error) > + goto done; > + } > + } else { > struct got_reflist_head refs; > TAILQ_INIT(&refs); > error = got_ref_list(&refs, repo, NULL, got_ref_cmp_by_name, > @@ -6344,6 +6355,7 @@ done: > TAILQ_FOREACH(pe, &paths, entry) > free((char *)pe->path); > got_pathlist_free(&paths); > + got_pathlist_free(&delrefs); > return error; > } > > blob - 8e459f575af5f369a7a0987fa5f5eb2e1680b947 > blob + c32a7e87abd5f17d60003589abc7aeccc08a3240 > --- regress/cmdline/branch.sh > +++ regress/cmdline/branch.sh > @@ -323,7 +323,8 @@ test_branch_delete() { > return 1 > fi > > - got branch -d origin/branch1 -r $testroot/repo > $testroot/stdout > + got branch -d origin/branch1 -d refs/remotes/origin/branch3 \ > + -r $testroot/repo > $testroot/stdout > ret=$? > if [ $ret -ne 0 ]; then > echo "got branch command failed unexpectedly" > @@ -331,15 +332,6 @@ test_branch_delete() { > return 1 > fi > > - got branch -d refs/remotes/origin/branch3 -r $testroot/repo \ > - > $testroot/stdout > - ret=$? > - if [ $ret -ne 0 ]; then > - echo "got branch command failed unexpectedly" > - test_done "$testroot" "$ret" > - return 1 > - fi > - > got ref -l -r $testroot/repo > $testroot/stdout > echo "HEAD: refs/heads/master" > $testroot/stdout.expected > echo "refs/heads/branch1: $commit_id" >> $testroot/stdout.expected
got branch: support multiple -d options