From: Ping Yin <pkufranky@gmail.com>
To: git@vger.kernel.org
Cc: Ping Yin <pkufranky@gmail.com>
Subject: [PATCH] status&commit: Teach them to show commits of modified submodules.
Date: Sun, 11 Nov 2007 03:27:43 +0800 [thread overview]
Message-ID: <1194722863-14741-1-git-send-email-pkufranky@gmail.com> (raw)
git status/commit just treats submodules as ordinary files when reporting status
changes. However, one may also wonder how submodules change (the commits).
This commit teaches git status/commit to also show commits of user-cared
modified submodules since HEAD (or HEAD^ if --amend option is on).
Notes:
1. Submodules already checked out are considered to be user-cared ones.
2. For submodules deleted or initially added, commits are not shown.
For example, when commiting, submodule sm1 and sm2 are both changed. sm1 has
commit C in HEAD and commit E in index. The history of sm1 is
--A-->B-->C (in HEAD:354cd45)
\
-->D->E (in index:3f751e5)
git status will give the following output (just output commits of submodules
before the original output) to show how to change from commit C (in HEAD) to
commit E (in index) for submodule sm1: backward ('<<<') to commit A, and then
forward ('>>>') to commit E. Similar illustration for output of sm2 is omitted.
#
# submodule modifiled: sm1 sm2
#
# * sm1 354cd45...3f751e5:
# <<<
# one line message for C
# one line message for B
# >>>
# one line message for D
# one line message for E
#
# * sm2 5c8bfb5...ac46d84:
# <<<
# msg
#
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: sm1
# modified: sm2
For sm1, if the commit recorded in HEAD/index (say commit C/E) is not found in
the work tree (say sm1 respository in the work tree), a warning will be issued.
#
# submodule modifiled: sm1
#
# * sm1 354cd45...3f751e5:
# Warn: sm1 doesn't contains commit 354cd45
#
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: sm1
Signed-off-by: Ping Yin <pkufranky@gmail.com>
---
git-commit.sh | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 68 insertions(+), 0 deletions(-)
diff --git a/git-commit.sh b/git-commit.sh
index fcb8443..29f2ebe 100755
--- a/git-commit.sh
+++ b/git-commit.sh
@@ -33,6 +33,68 @@ save_index () {
cp -p "$THIS_INDEX" "$NEXT_INDEX"
}
+# Show log of modified submodule (index modification since HEAD or $1)
+# $1 is the commit to be compared, default 'HEAD'
+show_module_log () {
+ cwd=$(pwd)
+ cd_to_toplevel
+
+ # get modified modules which have been checked out (i.e. cared by user)
+ modules=$(git diff --cached --name-only $1 |
+ (
+ IFS='' # handle the module name containing space or tab
+ while read name
+ do
+ git ls-files --stage "$name" | grep '^160000 ' >&/dev/null &&
+ GIT_DIR="$name/.git" git-rev-parse --git-dir >&/dev/null &&
+ echo "$name"
+ done
+ )
+ )
+
+ # TODO: quote module names containing space or tab
+ test -n "$modules" && echo -e "#\n# submodule modifiled: "$modules"\n#"
+ OLDIFS=$IFS
+ IFS=$'\n\r' # '\r' for mac os
+ for name in $modules
+ do
+ range=$(git diff --cached -- "$name" | sed -n '/^index.*160000$/ p' | awk '{print $2}')
+ indexone=${range#*..}
+ headone=${range%..*}
+ (
+ echo "* $name $headone...$indexone:"
+ headfail=
+ indexfail=
+ GIT_DIR="$name/.git" git-rev-parse $headone >&/dev/null || headfail='t'
+ GIT_DIR="$name/.git" git-rev-parse $indexone >&/dev/null || indexfail='t'
+ case "$headfail,$indexfail" in
+ t,)
+ echo " Warn: $name dosn't contains commit $headone"
+ ;;
+ ,t)
+ echo " Warn: $name dosn't contains commit $indexone"
+ ;;
+ t,t)
+ echo " Warn: $name dosn't contains commits $headone and $indexone"
+ ;;
+ *)
+ left=$(GIT_DIR="$name/.git" git log --pretty=oneline $indexone..$headone 2>&1 |
+ sed 's/^\w\+ / \t/')
+ right=$(GIT_DIR="$name/.git" git log --pretty=oneline --reverse $headone..$indexone 2>&1 |
+ sed 's/^\w\+ / \t/')
+
+ test -n "$left" && echo -e " <<<\n$left"
+ test -n "$right" && echo -e " >>>\n$right"
+ ;;
+ esac
+ echo
+ ) | sed 's/^/# /'
+ done
+ IFS=$OLDIFS
+
+ cd "$cwd"
+}
+
run_status () {
# If TMP_INDEX is defined, that means we are doing
# "--only" partial commit, and that index file is used
@@ -55,6 +117,12 @@ run_status () {
else
color=--nocolor
fi
+ if test -z "$amend"
+ then
+ show_module_log
+ else
+ show_module_log "HEAD^"
+ fi
git runstatus ${color} \
${verbose:+--verbose} \
${amend:+--amend} \
--
1.5.3.4
next reply other threads:[~2007-11-10 19:30 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-10 19:27 Ping Yin [this message]
2007-11-10 19:55 ` [PATCH] status&commit: Teach them to show commits of modified submodules Sven Verdoolaege
2007-11-10 20:00 ` Sven Verdoolaege
2007-11-11 5:30 ` Yin Ping
2007-11-10 21:14 ` Junio C Hamano
2007-11-11 6:18 ` Yin Ping
2007-11-11 20:34 ` Junio C Hamano
2007-11-12 5:38 ` Ping Yin
2007-11-12 7:26 ` Johannes Sixt
2007-11-12 9:51 ` Johannes Schindelin
2007-11-12 22:39 ` Junio C Hamano
2007-11-12 8:40 ` Johan Herland
2007-11-12 10:03 ` Johannes Sixt
2007-11-12 14:21 ` [PATCH] status&commit: Teach them to show submodule commit summary Ping Yin
2007-11-12 14:46 ` Ralf Wildenhues
2007-11-12 15:17 ` Ping Yin
2007-11-12 16:53 ` Brian Gernhardt
2007-11-12 15:37 ` Jakub Narebski
2007-11-12 15:46 ` Ping Yin
2007-11-12 15:59 ` Johannes Sixt
2007-11-12 16:12 ` Jakub Narebski
2007-11-12 16:42 ` Ping Yin
2007-11-12 16:13 ` Johannes Schindelin
2007-11-12 16:39 ` Ping Yin
2007-11-12 16:51 ` Johannes Sixt
2007-11-12 16:35 ` Ping Yin
2007-11-12 16:45 ` Johannes Sixt
2007-11-12 17:47 ` Lars Hjemli
2007-11-15 16:49 ` Ping Yin
2007-11-11 0:07 ` [PATCH] status&commit: Teach them to show commits of modified submodules Lars Hjemli
2007-11-11 6:24 ` Yin Ping
2007-11-11 8:27 ` Lars Hjemli
-- strict thread matches above, loose matches on Subject: below --
2007-11-02 11:53 Ping Yin
2007-11-02 20:29 ` Junio C Hamano
2007-11-02 23:50 ` Yin Ping
2007-11-03 0:01 ` Junio C Hamano
2007-11-04 9:22 ` Yin Ping
2007-11-04 9:25 ` Yin Ping
2007-11-04 9:56 ` Yin Ping
[not found] ` <46dff0320711040145k1edb1fcaq1daa5469c1158e81@mail.gmail.com>
2007-11-04 11:41 ` Junio C Hamano
2007-11-04 13:17 ` Yin Ping
2007-11-06 2:22 ` Junio C Hamano
2007-11-07 15:20 ` Yin Ping
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1194722863-14741-1-git-send-email-pkufranky@gmail.com \
--to=pkufranky@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).