summaryrefslogtreecommitdiff
path: root/wt-status.c
diff options
context:
space:
mode:
Diffstat (limited to 'wt-status.c')
-rw-r--r--wt-status.c85
1 files changed, 48 insertions, 37 deletions
diff --git a/wt-status.c b/wt-status.c
index cdbc8d798a..eaed4fed32 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -585,6 +585,8 @@ static void wt_status_collect_untracked(struct wt_status *s)
DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES;
if (s->show_ignored_files)
dir.flags |= DIR_SHOW_IGNORED_TOO;
+ else
+ dir.untracked = the_index.untracked;
setup_standard_excludes(&dir);
fill_directory(&dir, &s->pathspec);
@@ -726,37 +728,29 @@ static void wt_status_print_changed(struct wt_status *s)
static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitted)
{
struct child_process sm_summary = CHILD_PROCESS_INIT;
- struct argv_array argv = ARGV_ARRAY_INIT;
struct strbuf cmd_stdout = STRBUF_INIT;
struct strbuf summary = STRBUF_INIT;
char *summary_content;
- size_t len;
argv_array_pushf(&sm_summary.env_array, "GIT_INDEX_FILE=%s",
s->index_file);
- 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_pushf(&argv, "%d", s->submodule_summary);
+ argv_array_push(&sm_summary.args, "submodule");
+ argv_array_push(&sm_summary.args, "summary");
+ argv_array_push(&sm_summary.args, uncommitted ? "--files" : "--cached");
+ argv_array_push(&sm_summary.args, "--for-status");
+ argv_array_push(&sm_summary.args, "--summary-limit");
+ argv_array_pushf(&sm_summary.args, "%d", s->submodule_summary);
if (!uncommitted)
- argv_array_push(&argv, s->amend ? "HEAD^" : "HEAD");
+ argv_array_push(&sm_summary.args, s->amend ? "HEAD^" : "HEAD");
- sm_summary.argv = argv.argv;
sm_summary.git_cmd = 1;
sm_summary.no_stdin = 1;
- fflush(s->fp);
- sm_summary.out = -1;
-
- run_command(&sm_summary);
- argv_array_clear(&argv);
- len = strbuf_read(&cmd_stdout, sm_summary.out, 1024);
+ capture_command(&sm_summary, &cmd_stdout, 1024);
/* prepend header, only if there's an actual output */
- if (len) {
+ if (cmd_stdout.len) {
if (uncommitted)
strbuf_addstr(&summary, _("Submodules changed but not updated:"));
else
@@ -767,6 +761,7 @@ static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitt
strbuf_release(&cmd_stdout);
if (s->display_comment_prefix) {
+ size_t len;
summary_content = strbuf_detach(&summary, &len);
strbuf_add_commented_lines(&summary, summary_content, len);
free(summary_content);
@@ -830,10 +825,11 @@ void wt_status_truncate_message_at_cut_line(struct strbuf *buf)
const char *p;
struct strbuf pattern = STRBUF_INIT;
- strbuf_addf(&pattern, "%c %s", comment_line_char, cut_line);
- p = strstr(buf->buf, pattern.buf);
- if (p && (p == buf->buf || p[-1] == '\n'))
- strbuf_setlen(buf, p - buf->buf);
+ strbuf_addf(&pattern, "\n%c %s", comment_line_char, cut_line);
+ if (starts_with(buf->buf, pattern.buf + 1))
+ strbuf_setlen(buf, 0);
+ else if ((p = strstr(buf->buf, pattern.buf)))
+ strbuf_setlen(buf, p - buf->buf + 1);
strbuf_release(&pattern);
}
@@ -852,6 +848,8 @@ static void wt_status_print_verbose(struct wt_status *s)
{
struct rev_info rev;
struct setup_revision_opt opt;
+ int dirty_submodules;
+ const char *c = color(WT_STATUS_HEADER, s);
init_revisions(&rev, NULL);
DIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV);
@@ -876,7 +874,25 @@ static void wt_status_print_verbose(struct wt_status *s)
rev.diffopt.use_color = 0;
wt_status_add_cut_line(s->fp);
}
+ if (s->verbose > 1 && s->commitable) {
+ /* print_updated() printed a header, so do we */
+ if (s->fp != stdout)
+ wt_status_print_trailer(s);
+ status_printf_ln(s, c, _("Changes to be committed:"));
+ rev.diffopt.a_prefix = "c/";
+ rev.diffopt.b_prefix = "i/";
+ } /* else use prefix as per user config */
run_diff_index(&rev, 1);
+ if (s->verbose > 1 &&
+ wt_status_check_worktree_changes(s, &dirty_submodules)) {
+ status_printf_ln(s, c,
+ "--------------------------------------------------");
+ status_printf_ln(s, c, _("Changes not staged for commit:"));
+ setup_work_tree();
+ rev.diffopt.a_prefix = "i/";
+ rev.diffopt.b_prefix = "w/";
+ run_diff_files(&rev, 0);
+ }
}
static void wt_status_print_tracking(struct wt_status *s)
@@ -1143,7 +1159,7 @@ static char *read_and_strip_branch(const char *path)
if (strbuf_read_file(&sb, git_path("%s", path), 0) <= 0)
goto got_nothing;
- while (&sb.len && sb.buf[sb.len - 1] == '\n')
+ while (sb.len && sb.buf[sb.len - 1] == '\n')
strbuf_setlen(&sb, sb.len - 1);
if (!sb.len)
goto got_nothing;
@@ -1225,6 +1241,8 @@ static void wt_status_get_detached_from(struct wt_status_state *state)
state->detached_from =
xstrdup(find_unique_abbrev(cb.nsha1, DEFAULT_ABBREV));
hashcpy(state->detached_sha1, cb.nsha1);
+ state->detached_at = !get_sha1("HEAD", sha1) &&
+ !hashcmp(sha1, state->detached_sha1);
free(ref);
strbuf_release(&cb.buf);
@@ -1313,10 +1331,8 @@ void wt_status_print(struct wt_status *s)
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) &&
- !hashcmp(sha1, state.detached_sha1))
+ if (state.detached_at)
on_what = _("HEAD detached at ");
else
on_what = _("HEAD detached from ");
@@ -1519,24 +1535,19 @@ static void wt_shortstatus_print_tracking(struct wt_status *s)
color_fprintf(s->fp, branch_color_local, "%s", branch_name);
- switch (stat_tracking_info(branch, &num_ours, &num_theirs)) {
- case 0:
- /* no base */
- fputc(s->null_termination ? '\0' : '\n', s->fp);
- return;
- case -1:
- /* with "gone" base */
+ if (stat_tracking_info(branch, &num_ours, &num_theirs, &base) < 0) {
+ if (!base) {
+ fputc(s->null_termination ? '\0' : '\n', s->fp);
+ return;
+ }
+
upstream_is_gone = 1;
- break;
- default:
- /* with base */
- break;
}
- base = branch->merge[0]->dst;
base = shorten_unambiguous_ref(base, 0);
color_fprintf(s->fp, header_color, "...");
color_fprintf(s->fp, branch_color_remote, "%s", base);
+ free((char *)base);
if (!upstream_is_gone && !num_ours && !num_theirs) {
fputc(s->null_termination ? '\0' : '\n', s->fp);