]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/branch.c
Merge branch 'js/branch-track-inherit'
[thirdparty/git.git] / builtin / branch.c
index c5de1207e48e78f8ac882177d20dd68e885b3e9e..4ce2a247542ba07012a954dacd7ed2c5284e61d1 100644 (file)
@@ -77,12 +77,11 @@ define_list_config_array(color_branch_slots);
 static int git_branch_config(const char *var, const char *value, void *cb)
 {
        const char *slot_name;
-       struct ref_sorting **sorting_tail = (struct ref_sorting **)cb;
 
        if (!strcmp(var, "branch.sort")) {
                if (!value)
                        return config_error_nonbool(var);
-               parse_ref_sorting(sorting_tail, value);
+               string_list_append(cb, value);
                return 0;
        }
 
@@ -193,6 +192,7 @@ static void delete_branch_config(const char *branchname)
 static int delete_branches(int argc, const char **argv, int force, int kinds,
                           int quiet)
 {
+       struct worktree **worktrees;
        struct commit *head_rev = NULL;
        struct object_id oid;
        char *name = NULL;
@@ -229,6 +229,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
                if (!head_rev)
                        die(_("Couldn't look up commit object for HEAD"));
        }
+
+       worktrees = get_worktrees();
+
        for (i = 0; i < argc; i++, strbuf_reset(&bname)) {
                char *target = NULL;
                int flags = 0;
@@ -239,7 +242,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 
                if (kinds == FILTER_REFS_BRANCHES) {
                        const struct worktree *wt =
-                               find_shared_symref("HEAD", name);
+                               find_shared_symref(worktrees, "HEAD", name);
                        if (wt) {
                                error(_("Cannot delete branch '%s' "
                                        "checked out at '%s'"),
@@ -300,6 +303,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 
        free(name);
        strbuf_release(&bname);
+       free_worktrees(worktrees);
 
        return ret;
 }
@@ -407,7 +411,8 @@ static char *build_format(struct ref_filter *filter, int maxwidth, const char *r
        return strbuf_detach(&fmt, NULL);
 }
 
-static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting, struct ref_format *format)
+static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sorting,
+                          struct ref_format *format, struct string_list *output)
 {
        int i;
        struct ref_array array;
@@ -449,7 +454,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
                if (column_active(colopts)) {
                        assert(!filter->verbose && "--column and --verbose are incompatible");
                         /* format to a string_list to let print_columns() do its job */
-                       string_list_append(&output, out.buf);
+                       string_list_append(output, out.buf);
                } else {
                        fwrite(out.buf, 1, out.len, stdout);
                        putchar('\n');
@@ -624,7 +629,8 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
        enum branch_track track;
        struct ref_filter filter;
        int icase = 0;
-       static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
+       static struct ref_sorting *sorting;
+       struct string_list sorting_options = STRING_LIST_INIT_DUP;
        struct ref_format format = REF_FORMAT_INIT;
 
        struct option options[] = {
@@ -667,7 +673,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                OPT_MERGED(&filter, N_("print only branches that are merged")),
                OPT_NO_MERGED(&filter, N_("print only branches that are not merged")),
                OPT_COLUMN(0, "column", &colopts, N_("list branches in columns")),
-               OPT_REF_SORT(sorting_tail),
+               OPT_REF_SORT(&sorting_options),
                OPT_CALLBACK(0, "points-at", &filter.points_at, N_("object"),
                        N_("print only branches of the object"), parse_opt_object_name),
                OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
@@ -684,7 +690,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage_with_options(builtin_branch_usage, options);
 
-       git_config(git_branch_config, sorting_tail);
+       git_config(git_branch_config, &sorting_options);
 
        track = git_branch_track;
 
@@ -718,7 +724,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
        finalize_colopts(&colopts, -1);
        if (filter.verbose) {
                if (explicitly_enable_column(colopts))
-                       die(_("--column and --verbose are incompatible"));
+                       die(_("options '%s' and '%s' cannot be used together"), "--column", "--verbose");
                colopts = 0;
        }
 
@@ -750,14 +756,14 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
                 * local branches 'refs/heads/...' and finally remote-tracking
                 * branches 'refs/remotes/...'.
                 */
-               if (!sorting)
-                       sorting = ref_default_sorting();
+               sorting = ref_sorting_options(&sorting_options);
                ref_sorting_set_sort_flags_all(sorting, REF_SORTING_ICASE, icase);
                ref_sorting_set_sort_flags_all(
                        sorting, REF_SORTING_DETACHED_HEAD_FIRST, 1);
-               print_ref_list(&filter, sorting, &format);
+               print_ref_list(&filter, sorting, &format, &output);
                print_columns(&output, colopts, NULL);
                string_list_clear(&output, 0);
+               ref_sorting_release(sorting);
                return 0;
        } else if (edit_description) {
                const char *branch_name;