From: Ping Yin <pkufranky@gmail.com>
To: gitster@pobox.com
Cc: git@vger.kernel.org, Ping Yin <pkufranky@gmail.com>
Subject: [PATCH v3 2/4] git-submodule: New subcommand 'summary' (2) - show commit summary
Date: Mon, 3 Mar 2008 02:15:08 +0800 [thread overview]
Message-ID: <1204481710-29791-2-git-send-email-pkufranky@gmail.com> (raw)
In-Reply-To: <1204481710-29791-1-git-send-email-pkufranky@gmail.com>
This patch does the hard work to show submodule commit summary.
For a submodule in question, a series of commits will be shown as the path
from the src commit to the dst commit, where the src commit is from the given
super project commit, and the dst commit is from the index or working tree
(switched by --cached).
Example: commit summary for modified submodules sm1-sm5.
--------------------------------------------
$ git submodule summary
# Submodules modifiled: sm1 sm2 sm3 sm4 sm5
#
# * 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...000000:
# <one line message for F
#
# * sm3 354cd45...3f751e5:
# Warn: sm3 doesn't contain commit 354cd45
#
# * sm4 354cd34(submodule)->235efa(blob):
# <one line message for G
#
# * sm5 354cd34(blob)->235efa(submodule):
# >one line message for H
#
--------------------------------------------
sm1 has commit C as src (given commit or HEAD) and commit E as dst (index
or working tree) as following picture shows.
--A-->B-->C (in src:354cd45)
\
-->D-->E (in dst:3f751e5)
The 'Submodules modified' section for sm1 shows how to change sm1 from
src commit C to dst commit E: firstly backward (<) to commit A from
commit C via commit B, and then forward (>) to commit E via commit D.
Illustration for output of deleted sm2 is similar.
sm4 and sm5 are submodules with typechanging (blob<->submodule).
If the src/dst commit for a submodule is missing in the submodule
directory, a warning will be issued (sm3 falls into this case)
except in two cases where the submodule directory is deleted
(type 'D') or typechanged to blob (one case of type 'T').
Signed-off-by: Ping Yin <pkufranky@gmail.com>
---
git-submodule.sh | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 72 insertions(+), 1 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 787d083..3313d6c 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -375,7 +375,78 @@ cmd_summary() {
# TODO: quote module names containing space or tab
test -n "$modules" &&
echo "# Submodules modified: "$modules &&
- echo "#"
+ echo "#" &&
+ git diff-index $cache_option --raw $head -- $modules |
+ grep -e '^:160000' -e '^:[0-7]* 160000' |
+ cut -c2- |
+ while read mod_src mod_dst sha1_src sha1_dst status name
+ do
+ if test -z "$cache_option" &&
+ test $sha1_dst = 0000000000000000000000000000000000000000 &&
+ ( GIT_DIR="$name/.git" git rev-parse HEAD ) >/dev/null 2>&1
+ then
+ sha1_dst=$(GIT_DIR="$name/.git" git rev-parse HEAD)
+ fi
+ check_src=$(echo $mod_src | grep 160000)
+ check_dst=$(echo $mod_dst | grep 160000)
+ errmsg=
+ missing_src=
+ missing_dst=
+
+ test -z "$check_src" ||
+ GIT_DIR="$name/.git" git-rev-parse --verify $sha1_src >/dev/null 2>&1 ||
+ missing_src=t
+
+ test -z "$check_dst" ||
+ GIT_DIR="$name/.git" git-rev-parse --verify $sha1_dst >/dev/null 2>&1 ||
+ missing_dst=t
+
+ case "$missing_src,$missing_dst" in
+ t,)
+ errmsg=" Warn: $name doesn't contain commit $sha1_src"
+ ;;
+ ,t)
+ errmsg=" Warn: $name doesn't contain commit $sha1_dst"
+ ;;
+ t,t)
+ errmsg=" Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
+ ;;
+ *)
+ left=
+ right=
+ test -n "$check_src" &&
+ left=$(GIT_DIR="$name/.git" git log --pretty=format:" <%s" \
+ ${check_dst:+$sha1_dst..}$sha1_src 2>/dev/null)
+
+ test -n "$check_dst" &&
+ right=$(GIT_DIR="$name/.git" git log --reverse --pretty=format:" >%s" \
+ ${check_src:+$sha1_src..}$sha1_dst 2>/dev/null)
+ ;;
+ esac
+
+ sha1_src=$(echo $sha1_src | cut -c1-7)
+ sha1_dst=$(echo $sha1_dst | cut -c1-7)
+ if test $status = T
+ then
+ if test $mod_dst = 160000
+ then
+ echo "* $name $sha1_src(blob)->$sha1_dst(submodule):"
+ else
+ echo "* $name $sha1_src(submodule)->$sha1_dst(blob):"
+ fi
+ else
+ echo "* $name $sha1_src...$sha1_dst:"
+ fi
+ if test -n "$errmsg"
+ then
+ # Don't give error msg for modification whose dst is not submodule, i.e. deleted or changed to blob
+ test $mod_dst = 160000 && echo "$errmsg"
+ else
+ test -n "$left" && echo "$left"
+ test -n "$right" && echo "$right"
+ fi
+ echo
+ done | sed -e 's/^/# /'
}
#
# List all submodules, prefixed with:
--
1.5.4.3.347.g5314c
next prev parent reply other threads:[~2008-03-02 18:16 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-02 18:15 [PATCH v3 1/4] git-submodule: New subcommand 'summary' (1) - code framework Ping Yin
2008-03-02 18:15 ` Ping Yin [this message]
2008-03-05 23:57 ` [PATCH v3 2/4] git-submodule: New subcommand 'summary' (2) - show commit summary Junio C Hamano
2008-03-06 2:16 ` Ping Yin
2008-03-06 4:10 ` Junio C Hamano
2008-03-06 5:56 ` Ping Yin
2008-03-06 10:42 ` Junio C Hamano
2008-03-06 11:36 ` Ping Yin
2008-03-02 18:15 ` [PATCH v3 3/4] git-submodule: New subcommand 'summary' (3) - limit summary size Ping Yin
2008-03-06 0:24 ` Junio C Hamano
2008-03-06 2:24 ` Ping Yin
2008-03-07 1:50 ` Ping Yin
2008-03-02 18:15 ` [PATCH v3 4/4] git-submodule: New subcommand 'summary' (4) - Update the document Ping Yin
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=1204481710-29791-2-git-send-email-pkufranky@gmail.com \
--to=pkufranky@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/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).