submodule summary: ignore --for-status option
[gitweb.git] / wt-status.c
index bf84a86ee3d6b136bd83115f0bf15a55835817fc..853813f5607731a4c840269f5648f1aa21c17b0a 100644 (file)
@@ -8,6 +8,7 @@
 #include "diffcore.h"
 #include "quote.h"
 #include "run-command.h"
+#include "argv-array.h"
 #include "remote.h"
 #include "refs.h"
 #include "submodule.h"
@@ -127,6 +128,7 @@ void wt_status_prepare(struct wt_status *s)
        s->change.strdup_strings = 1;
        s->untracked.strdup_strings = 1;
        s->ignored.strdup_strings = 1;
+       s->show_branch = -1;  /* unspecified */
 }
 
 static void wt_status_print_unmerged_header(struct wt_status *s)
@@ -243,7 +245,7 @@ static void wt_status_print_unmerged_data(struct wt_status *s,
        struct strbuf onebuf = STRBUF_INIT;
        const char *one, *how = _("bug");
 
-       one = quote_path(it->string, -1, &onebuf, s->prefix);
+       one = quote_path(it->string, s->prefix, &onebuf);
        status_printf(s, color(WT_STATUS_HEADER, s), "\t");
        switch (d->stagemask) {
        case 1: how = _("both deleted:"); break;
@@ -297,8 +299,8 @@ static void wt_status_print_change_data(struct wt_status *s,
                    change_type);
        }
 
-       one = quote_path(one_name, -1, &onebuf, s->prefix);
-       two = quote_path(two_name, -1, &twobuf, s->prefix);
+       one = quote_path(one_name, s->prefix, &onebuf);
+       two = quote_path(two_name, s->prefix, &twobuf);
 
        status_printf(s, color(WT_STATUS_HEADER, s), "\t");
        switch (status) {
@@ -371,7 +373,7 @@ static void wt_status_collect_changed_cb(struct diff_queue_struct *q,
 static int unmerged_mask(const char *path)
 {
        int pos, mask;
-       struct cache_entry *ce;
+       const struct cache_entry *ce;
 
        pos = cache_name_pos(path, strlen(path));
        if (0 <= pos)
@@ -475,7 +477,7 @@ static void wt_status_collect_changes_initial(struct wt_status *s)
        for (i = 0; i < active_nr; i++) {
                struct string_list_item *it;
                struct wt_status_change_data *d;
-               struct cache_entry *ce = active_cache[i];
+               const struct cache_entry *ce = active_cache[i];
 
                if (!ce_path_match(ce, &pathspec))
                        continue;
@@ -662,29 +664,55 @@ static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitt
        char summary_limit[64];
        char index[PATH_MAX];
        const char *env[] = { NULL, NULL };
-       const char *argv[8];
-
-       env[0] =        index;
-       argv[0] =       "submodule";
-       argv[1] =       "summary";
-       argv[2] =       uncommitted ? "--files" : "--cached";
-       argv[3] =       "--for-status";
-       argv[4] =       "--summary-limit";
-       argv[5] =       summary_limit;
-       argv[6] =       uncommitted ? NULL : (s->amend ? "HEAD^" : "HEAD");
-       argv[7] =       NULL;
+       struct argv_array argv = ARGV_ARRAY_INIT;
+       struct strbuf cmd_stdout = STRBUF_INIT;
+       struct strbuf summary = STRBUF_INIT;
+       char *summary_content;
+       size_t len;
 
        sprintf(summary_limit, "%d", s->submodule_summary);
        snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", s->index_file);
 
+       env[0] = index;
+       argv_array_push(&argv, "submodule");
+       argv_array_push(&argv, "summary");
+       argv_array_push(&argv, uncommitted ? "--files" : "--cached");
+       argv_array_push(&argv, "--for-status");
+       argv_array_push(&argv, "--summary-limit");
+       argv_array_push(&argv, summary_limit);
+       if (!uncommitted)
+               argv_array_push(&argv, s->amend ? "HEAD^" : "HEAD");
+
        memset(&sm_summary, 0, sizeof(sm_summary));
-       sm_summary.argv = argv;
+       sm_summary.argv = argv.argv;
        sm_summary.env = env;
        sm_summary.git_cmd = 1;
        sm_summary.no_stdin = 1;
        fflush(s->fp);
-       sm_summary.out = dup(fileno(s->fp));    /* run_command closes it */
+       sm_summary.out = -1;
+
        run_command(&sm_summary);
+       argv_array_clear(&argv);
+
+       len = strbuf_read(&cmd_stdout, sm_summary.out, 1024);
+
+       /* prepend header, only if there's an actual output */
+       if (len) {
+               if (uncommitted)
+                       strbuf_addstr(&summary, _("Submodules changed but not updated:"));
+               else
+                       strbuf_addstr(&summary, _("Submodule changes to be committed:"));
+               strbuf_addstr(&summary, "\n\n");
+       }
+       strbuf_addbuf(&summary, &cmd_stdout);
+       strbuf_release(&cmd_stdout);
+
+       summary_content = strbuf_detach(&summary, &len);
+       strbuf_add_commented_lines(&summary, summary_content, len);
+       free(summary_content);
+
+       fputs(summary.buf, s->fp);
+       strbuf_release(&summary);
 }
 
 static void wt_status_print_other(struct wt_status *s,
@@ -706,8 +734,7 @@ static void wt_status_print_other(struct wt_status *s,
                struct string_list_item *it;
                const char *path;
                it = &(l->items[i]);
-               path = quote_path(it->string, strlen(it->string),
-                                 &buf, s->prefix);
+               path = quote_path(it->string, s->prefix, &buf);
                if (column_active(s->colopts)) {
                        string_list_append(&output, path);
                        continue;
@@ -826,7 +853,7 @@ static void show_am_in_progress(struct wt_status *s,
        if (advice_status_hints) {
                if (!state->am_empty_patch)
                        status_printf_ln(s, color,
-                               _("  (fix conflicts and then run \"git am --resolved\")"));
+                               _("  (fix conflicts and then run \"git am --continue\")"));
                status_printf_ln(s, color,
                        _("  (use \"git am --skip\" to skip this patch)"));
                status_printf_ln(s, color,
@@ -955,10 +982,12 @@ static void show_cherry_pick_in_progress(struct wt_status *s,
        if (advice_status_hints) {
                if (has_unmerged(s))
                        status_printf_ln(s, color,
-                               _("  (fix conflicts and run \"git commit\")"));
+                               _("  (fix conflicts and run \"git cherry-pick --continue\")"));
                else
                        status_printf_ln(s, color,
-                               _("  (all conflicts fixed: run \"git commit\")"));
+                               _("  (all conflicts fixed: run \"git cherry-pick --continue\")"));
+               status_printf_ln(s, color,
+                       _("  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"));
        }
        wt_status_print_trailer(s);
 }
@@ -1035,7 +1064,6 @@ static char *read_and_strip_branch(const char *path)
 }
 
 struct grab_1st_switch_cbdata {
-       int found;
        struct strbuf buf;
        unsigned char nsha1[20];
 };
@@ -1059,7 +1087,6 @@ static int grab_1st_switch(unsigned char *osha1, unsigned char *nsha1,
        for (end = target; *end && *end != '\n'; end++)
                ;
        strbuf_add(&cb->buf, target, end - target);
-       cb->found = 1;
        return 1;
 }
 
@@ -1176,7 +1203,10 @@ void wt_status_print(struct wt_status *s)
                        branch_name += 11;
                else if (!strcmp(branch_name, "HEAD")) {
                        branch_status_color = color(WT_STATUS_NOBRANCH, s);
-                       if (state.detached_from) {
+                       if (state.rebase_in_progress || state.rebase_interactive_in_progress) {
+                               on_what = _("rebase in progress; onto ");
+                               branch_name = state.onto;
+                       } else if (state.detached_from) {
                                unsigned char sha1[20];
                                branch_name = state.detached_from;
                                if (!get_sha1("HEAD", sha1) &&
@@ -1289,7 +1319,7 @@ static void wt_shortstatus_unmerged(struct string_list_item *it,
        } else {
                struct strbuf onebuf = STRBUF_INIT;
                const char *one;
-               one = quote_path(it->string, -1, &onebuf, s->prefix);
+               one = quote_path(it->string, s->prefix, &onebuf);
                printf(" %s\n", one);
                strbuf_release(&onebuf);
        }
@@ -1317,7 +1347,7 @@ static void wt_shortstatus_status(struct string_list_item *it,
                struct strbuf onebuf = STRBUF_INIT;
                const char *one;
                if (d->head_path) {
-                       one = quote_path(d->head_path, -1, &onebuf, s->prefix);
+                       one = quote_path(d->head_path, s->prefix, &onebuf);
                        if (*one != '"' && strchr(one, ' ') != NULL) {
                                putchar('"');
                                strbuf_addch(&onebuf, '"');
@@ -1326,7 +1356,7 @@ static void wt_shortstatus_status(struct string_list_item *it,
                        printf("%s -> ", one);
                        strbuf_release(&onebuf);
                }
-               one = quote_path(it->string, -1, &onebuf, s->prefix);
+               one = quote_path(it->string, s->prefix, &onebuf);
                if (*one != '"' && strchr(one, ' ') != NULL) {
                        putchar('"');
                        strbuf_addch(&onebuf, '"');
@@ -1345,7 +1375,7 @@ static void wt_shortstatus_other(struct string_list_item *it,
        } else {
                struct strbuf onebuf = STRBUF_INIT;
                const char *one;
-               one = quote_path(it->string, -1, &onebuf, s->prefix);
+               one = quote_path(it->string, s->prefix, &onebuf);
                color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "%s", sign);
                printf(" %s\n", one);
                strbuf_release(&onebuf);