Skip to content

Commit 3642617

Browse files
committed
Merge branch 'py/submodule'
* py/submodule: builtin-status: Add tests for submodule summary builtin-status: submodule summary support git-submodule summary: --for-status option
2 parents d523016 + e5e4a7f commit 3642617

File tree

5 files changed

+207
-2
lines changed

5 files changed

+207
-2
lines changed

Documentation/git-status.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ If the config variable `status.relativePaths` is set to false, then all
5252
paths shown are relative to the repository root, not to the current
5353
directory.
5454

55+
If `status.submodulesummary` is set to a non zero number or true (identical
56+
to -1 or an unlimited number), the submodule summary will be enabled and a
57+
summary of commits for modified submodules will be shown (see --summary-limit
58+
option of linkgit:git-submodule[1]).
59+
5560
See Also
5661
--------
5762
linkgit:gitignore[5]

git-submodule.sh

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ set_name_rev () {
343343
#
344344
cmd_summary() {
345345
summary_limit=-1
346+
for_status=
346347

347348
# parse $args after "submodule ... summary".
348349
while test $# -ne 0
@@ -351,6 +352,9 @@ cmd_summary() {
351352
--cached)
352353
cached="$1"
353354
;;
355+
--for-status)
356+
for_status="$1"
357+
;;
354358
-n|--summary-limit)
355359
if summary_limit=$(($2 + 0)) 2>/dev/null && test "$summary_limit" = "$2"
356360
then
@@ -398,7 +402,8 @@ cmd_summary() {
398402
done
399403
)
400404

401-
test -n "$modules" &&
405+
test -z "$modules" && return
406+
402407
git diff-index $cached --raw $head -- $modules |
403408
grep -e '^:160000' -e '^:[0-7]* 160000' |
404409
cut -c2- |
@@ -500,7 +505,14 @@ cmd_summary() {
500505
echo
501506
fi
502507
echo
503-
done
508+
done |
509+
if test -n "$for_status"; then
510+
echo "# Modified submodules:"
511+
echo "#"
512+
sed -e 's|^|# |' -e 's|^# $|#|'
513+
else
514+
cat
515+
fi
504516
}
505517
#
506518
# List all submodules, prefixed with:

t/t7401-submodule-summary.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,4 +192,17 @@ test_expect_success 'given commit' "
192192
EOF
193193
"
194194

195+
test_expect_success '--for-status' "
196+
git submodule summary --for-status HEAD^ >actual &&
197+
test_cmp actual - <<EOF
198+
# Modified submodules:
199+
#
200+
# * sm1 $head6...0000000:
201+
#
202+
# * sm2 0000000...$head7 (2):
203+
# > Add foo9
204+
#
205+
EOF
206+
"
207+
195208
test_done

t/t7502-status.sh

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,138 @@ test_expect_success 'status of partial commit excluding new file in index' '
149149
test_cmp expect output
150150
'
151151

152+
test_expect_success 'setup status submodule summary' '
153+
test_create_repo sm && (
154+
cd sm &&
155+
>foo &&
156+
git add foo &&
157+
git commit -m "Add foo"
158+
) &&
159+
git add sm
160+
'
161+
162+
cat >expect <<EOF
163+
# On branch master
164+
# Changes to be committed:
165+
# (use "git reset HEAD <file>..." to unstage)
166+
#
167+
# new file: dir2/added
168+
# new file: sm
169+
#
170+
# Changed but not updated:
171+
# (use "git add <file>..." to update what will be committed)
172+
#
173+
# modified: dir1/modified
174+
#
175+
# Untracked files:
176+
# (use "git add <file>..." to include in what will be committed)
177+
#
178+
# dir1/untracked
179+
# dir2/modified
180+
# dir2/untracked
181+
# expect
182+
# output
183+
# untracked
184+
EOF
185+
test_expect_success 'status submodule summary is disabled by default' '
186+
git status >output &&
187+
test_cmp expect output
188+
'
189+
190+
head=$(cd sm && git rev-parse --short=7 --verify HEAD)
191+
192+
cat >expect <<EOF
193+
# On branch master
194+
# Changes to be committed:
195+
# (use "git reset HEAD <file>..." to unstage)
196+
#
197+
# new file: dir2/added
198+
# new file: sm
199+
#
200+
# Changed but not updated:
201+
# (use "git add <file>..." to update what will be committed)
202+
#
203+
# modified: dir1/modified
204+
#
205+
# Modified submodules:
206+
#
207+
# * sm 0000000...$head (1):
208+
# > Add foo
209+
#
210+
# Untracked files:
211+
# (use "git add <file>..." to include in what will be committed)
212+
#
213+
# dir1/untracked
214+
# dir2/modified
215+
# dir2/untracked
216+
# expect
217+
# output
218+
# untracked
219+
EOF
220+
test_expect_success 'status submodule summary' '
221+
git config status.submodulesummary 10 &&
222+
git status >output &&
223+
test_cmp expect output
224+
'
225+
226+
227+
cat >expect <<EOF
228+
# On branch master
229+
# Changed but not updated:
230+
# (use "git add <file>..." to update what will be committed)
231+
#
232+
# modified: dir1/modified
233+
#
234+
# Untracked files:
235+
# (use "git add <file>..." to include in what will be committed)
236+
#
237+
# dir1/untracked
238+
# dir2/modified
239+
# dir2/untracked
240+
# expect
241+
# output
242+
# untracked
243+
no changes added to commit (use "git add" and/or "git commit -a")
244+
EOF
245+
test_expect_success 'status submodule summary (clean submodule)' '
246+
git commit -m "commit submodule" &&
247+
git config status.submodulesummary 10 &&
248+
test_must_fail git status >output &&
249+
test_cmp expect output
250+
'
251+
252+
cat >expect <<EOF
253+
# On branch master
254+
# Changes to be committed:
255+
# (use "git reset HEAD^1 <file>..." to unstage)
256+
#
257+
# new file: dir2/added
258+
# new file: sm
259+
#
260+
# Changed but not updated:
261+
# (use "git add <file>..." to update what will be committed)
262+
#
263+
# modified: dir1/modified
264+
#
265+
# Modified submodules:
266+
#
267+
# * sm 0000000...$head (1):
268+
# > Add foo
269+
#
270+
# Untracked files:
271+
# (use "git add <file>..." to include in what will be committed)
272+
#
273+
# dir1/untracked
274+
# dir2/modified
275+
# dir2/untracked
276+
# expect
277+
# output
278+
# untracked
279+
EOF
280+
test_expect_success 'status submodule summary (--amend)' '
281+
git config status.submodulesummary 10 &&
282+
git status --amend >output &&
283+
test_cmp expect output
284+
'
285+
152286
test_done

wt-status.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
#include "revision.h"
99
#include "diffcore.h"
1010
#include "quote.h"
11+
#include "run-command.h"
1112

1213
int wt_status_relative_paths = 1;
1314
int wt_status_use_color = -1;
15+
int wt_status_submodule_summary;
1416
static char wt_status_colors[][COLOR_MAXLEN] = {
1517
"", /* WT_STATUS_HEADER: normal */
1618
"\033[32m", /* WT_STATUS_UPDATED: green */
@@ -220,6 +222,36 @@ static void wt_status_print_changed(struct wt_status *s)
220222
run_diff_files(&rev, 0);
221223
}
222224

225+
static void wt_status_print_submodule_summary(struct wt_status *s)
226+
{
227+
struct child_process sm_summary;
228+
char summary_limit[64];
229+
char index[PATH_MAX];
230+
const char *env[] = { index, NULL };
231+
const char *argv[] = {
232+
"submodule",
233+
"summary",
234+
"--cached",
235+
"--for-status",
236+
"--summary-limit",
237+
summary_limit,
238+
s->amend ? "HEAD^" : "HEAD",
239+
NULL
240+
};
241+
242+
sprintf(summary_limit, "%d", wt_status_submodule_summary);
243+
snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", s->index_file);
244+
245+
memset(&sm_summary, 0, sizeof(sm_summary));
246+
sm_summary.argv = argv;
247+
sm_summary.env = env;
248+
sm_summary.git_cmd = 1;
249+
sm_summary.no_stdin = 1;
250+
fflush(s->fp);
251+
sm_summary.out = dup(fileno(s->fp)); /* run_command closes it */
252+
run_command(&sm_summary);
253+
}
254+
223255
static void wt_status_print_untracked(struct wt_status *s)
224256
{
225257
struct dir_struct dir;
@@ -308,6 +340,8 @@ void wt_status_print(struct wt_status *s)
308340
}
309341

310342
wt_status_print_changed(s);
343+
if (wt_status_submodule_summary)
344+
wt_status_print_submodule_summary(s);
311345
wt_status_print_untracked(s);
312346

313347
if (s->verbose && !s->is_initial)
@@ -330,6 +364,13 @@ void wt_status_print(struct wt_status *s)
330364

331365
int git_status_config(const char *k, const char *v)
332366
{
367+
if (!strcmp(k, "status.submodulesummary")) {
368+
int is_bool;
369+
wt_status_submodule_summary = git_config_bool_or_int(k, v, &is_bool);
370+
if (is_bool && wt_status_submodule_summary)
371+
wt_status_submodule_summary = -1;
372+
return 0;
373+
}
333374
if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
334375
wt_status_use_color = git_config_colorbool(k, v, -1);
335376
return 0;

0 commit comments

Comments
 (0)