* [PATCH 0/5] submodule summary support @ 2008-01-12 7:37 Ping Yin 2008-01-12 7:37 ` [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework Ping Yin 0 siblings, 1 reply; 19+ messages in thread From: Ping Yin @ 2008-01-12 7:37 UTC (permalink / raw) To: git; +Cc: gitster This patch series introduces summary support for submodule. The first three patches teach git-submodule subcommand 'summary', and the last two patches teach git-status/git-commit 'status.submodulesummary' configuration to enable/disable submodule summary. ^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework 2008-01-12 7:37 [PATCH 0/5] submodule summary support Ping Yin @ 2008-01-12 7:37 ` Ping Yin 2008-01-12 7:37 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Ping Yin 2008-01-12 8:18 ` [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework Junio C Hamano 0 siblings, 2 replies; 19+ messages in thread From: Ping Yin @ 2008-01-12 7:37 UTC (permalink / raw) To: git; +Cc: gitster, Ping Yin Following patches teach git-submodule a new subcommand 'summary' to show commit summary of user-cared (i.e. checked out) submodules since a given commit (default HEAD) of super project. 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: a super project with modified/deleted submodules sm1 to sm3. -------------------------------------------- $ git submodule summary # Submodules modifiled: sm1 sm2 sm3 # # * 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 # -------------------------------------------- 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. If the src/dst commit for a submodule is not found in the work tree (say the submodule respository in the work tree), a warning will be issued. sm3 falls into this case. This patch just gives the framework. It just finds the submodules to be shown as follows. -------------------------------------------- $ git submodule summary # Submodules modifiled: sm1 sm2 sm3 # -------------------------------------------- Signed-off-by: Ping Yin <pkufranky@gmail.com> --- git-submodule.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 51 insertions(+), 6 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index ad9fe62..0e81484 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -4,7 +4,7 @@ # # Copyright (c) 2007 Lars Hjemli -USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]' +USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update|summary <commit>] [--] [<path>...]' OPTIONS_SPEC= . git-sh-setup require_work_tree @@ -255,7 +255,46 @@ set_name_rev () { ) ) test -z "$revname" || revname=" ($revname)" } +# +# Show commit summary for submodules in index or working tree relative to the given commit +# +# If '--cached' is given, show summary between index and given commit, +# or between working tree and given commit +# +# @ = [head counting commits from (default 'HEAD'),] requested paths (default to all) +# +modules_summary() +{ + cache_option=${cached:+--cached} + + if rev=$(git rev-parse --verify "$1^0" 2>/dev/null) + then + head=$rev + shift + else + head=HEAD + fi + cwd=$(pwd) + cd_to_toplevel + + # get modified modules which have been checked out (i.e. cared by user) + modules=$(git diff $cache_option --raw $head -- "$@" | + grep '^:160000\|:000000 160000' | + while read mod_src mod_dst sha1_src sha1_dst status name + do + test $status=D && echo "$name" && continue + GIT_DIR="$name/.git" git-rev-parse --git-dir >/dev/null 2>&1 && + echo "$name" + done + ) + + # TODO: quote module names containing space or tab + test -n "$modules" && + echo "# Submodules modified: "$modules && + echo "#" + cd "$cwd" +} # # List all submodules, prefixed with: # - submodule not initialized @@ -305,6 +344,9 @@ do update) update=1 ;; + summary) + summary=1 + ;; status) status=1 ;; @@ -345,17 +387,20 @@ case "$add,$branch" in ;; esac -case "$add,$init,$update,$status,$cached" in -1,,,,) +case "$add,$init,$update,$summary,$status,$cached" in +1,,,,,) module_add "$@" ;; -,1,,,) +,1,,,,) modules_init "$@" ;; -,,1,,) +,,1,,,) modules_update "$@" ;; -,,,*,*) +,,,1,,*) + modules_summary "$@" + ;; +,,,,*,*) modules_list "$@" ;; *) -- 1.5.4.rc2.9.gf5146-dirty ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work 2008-01-12 7:37 ` [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework Ping Yin @ 2008-01-12 7:37 ` Ping Yin 2008-01-12 7:37 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size Ping Yin ` (2 more replies) 2008-01-12 8:18 ` [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework Junio C Hamano 1 sibling, 3 replies; 19+ messages in thread From: Ping Yin @ 2008-01-12 7:37 UTC (permalink / raw) To: git; +Cc: gitster, Ping Yin This patch does the hard work of submodule summary and finally gives output shown in last patch. Signed-off-by: Ping Yin <pkufranky@gmail.com> --- git-submodule.sh | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 67 insertions(+), 1 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index 0e81484..cccb539 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -292,7 +292,73 @@ modules_summary() # TODO: quote module names containing space or tab test -n "$modules" && echo "# Submodules modified: "$modules && - echo "#" + echo "#" && + git diff $cache_option --raw $head -- $modules | + grep '^:160000\|:000000 160000' | + cut -c2- | + while read mod_src mod_dst sha1_src sha1_dst status name + do + sha1_dst=$(echo $sha1_dst | cut -c1-7) + sha1_src=$(echo $sha1_src | cut -c1-7) + check_dst=t + check_src=t + case $status in + D) + check_dst= + ;; + A) + check_src= + ;; + esac + + ( + errmsg= + unfound_src= + unfound_dst= + + test -z "$check_src" || + GIT_DIR="$name/.git" git-rev-parse $sha1_src >&/dev/null || + unfound_src=t + + test -z "$check_dst" || + GIT_DIR="$name/.git" git-rev-parse $sha1_dst >&/dev/null || + unfound_dst=t + + case "$unfound_src,$unfound_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 + + echo "* $name $sha1_src...$sha1_dst:" + if test -n "$errmsg" + then + echo "$errmsg" + else + test -n "$left" && echo "$left" + test -n "$right" && echo "$right" + fi + echo + ) | sed 's/^/# /' + done + cd "$cwd" } # -- 1.5.4.rc2.9.gf5146-dirty ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size 2008-01-12 7:37 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Ping Yin @ 2008-01-12 7:37 ` Ping Yin 2008-01-12 7:37 ` [PATCH 4/5] git-status: submodule summary support Ping Yin 2008-01-12 8:36 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit " Junio C Hamano 2008-01-12 8:32 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Junio C Hamano 2008-01-12 11:12 ` Ping Yin 2 siblings, 2 replies; 19+ messages in thread From: Ping Yin @ 2008-01-12 7:37 UTC (permalink / raw) To: git; +Cc: gitster, Ping Yin This patches teaches git-submodule an option '--summary-limit|-n <number>' to limit number of commits for the summary. Number 0 will disable summary and minus number will not limit the summary size. For beauty and clarification, the last commit for each section (backward and forward) will always be shown disregarding the given limit. So actual summary size may be greater than the given limit. In the same super project of these patch series, 'git submodule -n 2 summary sm1' and 'git submodule -n 3 summary sm1' will show the same. --------------------------------------- $ git submodule -n 2 summary sm1 # Submodules modifiled: sm1 # # * sm1 354cd45...3f751e5: # <one line message for C # <one line message for B # >... (1 more) # >one line message for E # --------------------------------------- Signed-off-by: Ping Yin <pkufranky@gmail.com> --- git-submodule.sh | 40 +++++++++++++++++++++++++++++++++++++--- 1 files changed, 37 insertions(+), 3 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index cccb539..58d0243 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -4,7 +4,8 @@ # # Copyright (c) 2007 Lars Hjemli -USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update|summary <commit>] [--] [<path>...]' +USAGE="[--quiet] [--cached] [-n|--summary-limit <number>] \ +[add <repo> [-b branch]|status|init|update|summary <commit>] [--] [<path>...]" OPTIONS_SPEC= . git-sh-setup require_work_tree @@ -16,6 +17,7 @@ update= status= quiet= cached= +summary_limit= # # print stuff on stdout unless -q was specified @@ -265,6 +267,10 @@ set_name_rev () { # modules_summary() { + summary_limit=${summary_limit:-1000000} + summary_limit=$((summary_limit<0?1000000:summary_limit)) + test $summary_limit = 0 && return + cache_option=${cached:+--cached} if rev=$(git rev-parse --verify "$1^0" 2>/dev/null) @@ -352,8 +358,29 @@ modules_summary() then echo "$errmsg" else - test -n "$left" && echo "$left" - test -n "$right" && echo "$right" + lc0=0 + rc0=0 + test -n "$left" && lc0=$(echo "$left" | wc -l) + test -n "$right" && rc0=$(echo "$right" | wc -l) + lc=$((lc0<summary_limit?lc0:summary_limit)) + rc=$((summary_limit>lc?summary_limit-lc:1)) + rc=$((rc<rc0?rc:rc0)) + + if test -n "$left" + then + skip=$((lc0-lc)) + echo "$left" | head -$((lc-1)) + test $skip != 0 && echo " <... ($skip more)" + echo "$left" | tail -1 + fi + + if test -n "$right" + then + skip=$((rc0-rc)) + echo "$right" | head -$((rc-1)) + test $skip != 0 && echo " >... ($skip more)" + echo "$right" | tail -1 + fi fi echo ) | sed 's/^/# /' @@ -430,6 +457,13 @@ do --cached) cached=1 ;; + -n|--summary-limit) + if [ -z "$2" ]; then + usage + fi + summary_limit="$2" + shift + ;; --) break ;; -- 1.5.4.rc2.9.gf5146-dirty ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH 4/5] git-status: submodule summary support 2008-01-12 7:37 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size Ping Yin @ 2008-01-12 7:37 ` Ping Yin 2008-01-12 7:37 ` [PATCH 5/5] git-status: configurable submodule summary size Ping Yin 2008-01-12 8:36 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit " Junio C Hamano 1 sibling, 1 reply; 19+ messages in thread From: Ping Yin @ 2008-01-12 7:37 UTC (permalink / raw) To: git; +Cc: gitster, Ping Yin By introducing this commit, 'git commit/status' will additionally show 'Submodules modified' section given by 'git --cached submodule summary' just before 'Untracked files' section. Signed-off-by: Ping Yin <pkufranky@gmail.com> --- wt-status.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) diff --git a/wt-status.c b/wt-status.c index c0c2472..df5be80 100644 --- a/wt-status.c +++ b/wt-status.c @@ -7,6 +7,7 @@ #include "diff.h" #include "revision.h" #include "diffcore.h" +#include "run-command.h" int wt_status_relative_paths = 1; int wt_status_use_color = 0; @@ -271,6 +272,30 @@ static void wt_status_print_changed(struct wt_status *s) wt_read_cache(s); run_diff_files(&rev, 0); } +static void wt_status_print_submodule_summary(struct wt_status *s) +{ + struct child_process sm_summary; + const char *argv[] = { + "submodule", + "summary", + "--cached", + s->amend ? "HEAD^" : "HEAD", + NULL + }; + char index[PATH_MAX]; + const char *env[2] = { index, NULL }; + snprintf(index, sizeof(index), "GIT_INDEX_FILE=%s", s->index_file); + + memset(&sm_summary, 0, sizeof(sm_summary)); + sm_summary.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.no_stderr = 1; + run_command(&sm_summary); +} static void wt_status_print_untracked(struct wt_status *s) { @@ -374,6 +399,9 @@ void wt_status_print(struct wt_status *s) } wt_status_print_changed(s); + // we must flush s->fp here since the following call will write to s->fp in a child process + fflush(s->fp); + wt_status_print_submodule_summary(s); wt_status_print_untracked(s); if (s->verbose && !s->is_initial) -- 1.5.4.rc2.9.gf5146-dirty ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH 5/5] git-status: configurable submodule summary size 2008-01-12 7:37 ` [PATCH 4/5] git-status: submodule summary support Ping Yin @ 2008-01-12 7:37 ` Ping Yin 0 siblings, 0 replies; 19+ messages in thread From: Ping Yin @ 2008-01-12 7:37 UTC (permalink / raw) To: git; +Cc: gitster, Ping Yin Add config variable status.submodulesummary which is passed as the arg for '--summary-limit' of 'git submodule' to limit the submodule summary size. The summary function is disabled by default by this config (say status.submodulesummary is 0 by default). Signed-off-by: Ping Yin <pkufranky@gmail.com> --- wt-status.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/wt-status.c b/wt-status.c index df5be80..25ce58b 100644 --- a/wt-status.c +++ b/wt-status.c @@ -11,6 +11,7 @@ int wt_status_relative_paths = 1; int wt_status_use_color = 0; +int wt_status_submodule_summary = 0; static char wt_status_colors[][COLOR_MAXLEN] = { "", /* WT_STATUS_HEADER: normal */ "\033[32m", /* WT_STATUS_UPDATED: green */ @@ -275,10 +276,14 @@ static void wt_status_print_changed(struct wt_status *s) static void wt_status_print_submodule_summary(struct wt_status *s) { struct child_process sm_summary; + char summary_limit[64]; + sprintf(summary_limit, "%d", wt_status_submodule_summary); const char *argv[] = { "submodule", "summary", "--cached", + "--summary-limit", + summary_limit, s->amend ? "HEAD^" : "HEAD", NULL }; @@ -424,6 +429,10 @@ void wt_status_print(struct wt_status *s) int git_status_config(const char *k, const char *v) { + if (!strcmp(k, "status.submodulesummary")) { + wt_status_submodule_summary = atoi(v); + return 0; + } if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) { wt_status_use_color = git_config_colorbool(k, v, -1); return 0; -- 1.5.4.rc2.9.gf5146-dirty ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size 2008-01-12 7:37 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size Ping Yin 2008-01-12 7:37 ` [PATCH 4/5] git-status: submodule summary support Ping Yin @ 2008-01-12 8:36 ` Junio C Hamano 2008-01-12 9:51 ` Ping Yin 1 sibling, 1 reply; 19+ messages in thread From: Junio C Hamano @ 2008-01-12 8:36 UTC (permalink / raw) To: Ping Yin; +Cc: git, gitster Ping Yin <pkufranky@gmail.com> writes: > @@ -265,6 +267,10 @@ set_name_rev () { > # > modules_summary() > { > + summary_limit=${summary_limit:-1000000} Why a million? > + summary_limit=$((summary_limit<0?1000000:summary_limit)) This is doubly bashism. Variables must be referenced with $, and $(( conditional ? iftrue : iffalse )) is not POSIX. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size 2008-01-12 8:36 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit " Junio C Hamano @ 2008-01-12 9:51 ` Ping Yin 2008-01-12 19:17 ` Junio C Hamano 0 siblings, 1 reply; 19+ messages in thread From: Ping Yin @ 2008-01-12 9:51 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 12, 2008 4:36 PM, Junio C Hamano <gitster@pobox.com> wrote: > Ping Yin <pkufranky@gmail.com> writes: > > > @@ -265,6 +267,10 @@ set_name_rev () { > > # > > modules_summary() > > { > > + summary_limit=${summary_limit:-1000000} > > Why a million? Because i think a million is big enough. I'd better define a constant for unlimited number. > > > + summary_limit=$((summary_limit<0?1000000:summary_limit)) > > This is doubly bashism. Variables must be referenced with $, > and $(( conditional ? iftrue : iffalse )) is not POSIX. > Ok, i'll fix this. -- Ping Yin ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size 2008-01-12 9:51 ` Ping Yin @ 2008-01-12 19:17 ` Junio C Hamano 2008-01-13 6:38 ` Ping Yin 0 siblings, 1 reply; 19+ messages in thread From: Junio C Hamano @ 2008-01-12 19:17 UTC (permalink / raw) To: Ping Yin; +Cc: Junio C Hamano, git "Ping Yin" <pkufranky@gmail.com> writes: > On Jan 12, 2008 4:36 PM, Junio C Hamano <gitster@pobox.com> wrote: >> Ping Yin <pkufranky@gmail.com> writes: >> >> > @@ -265,6 +267,10 @@ set_name_rev () { >> > # >> > modules_summary() >> > { >> > + summary_limit=${summary_limit:-1000000} >> >> Why a million? > Because i think a million is big enough. I'd better define a constant > for unlimited number. I think that is a wrong approach to begin with. You are assuming that you will always limit and by using improbably large limit to pretend it is unlimited. Why not making the summary list generator truely capable of produce an unlimited list? I also think using 100 or so as a sane default, allowing the user to override to say "I do not want any limitation", is a much better default. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size 2008-01-12 19:17 ` Junio C Hamano @ 2008-01-13 6:38 ` Ping Yin 0 siblings, 0 replies; 19+ messages in thread From: Ping Yin @ 2008-01-13 6:38 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 13, 2008 3:17 AM, Junio C Hamano <gitster@pobox.com> wrote: > "Ping Yin" <pkufranky@gmail.com> writes: > > > On Jan 12, 2008 4:36 PM, Junio C Hamano <gitster@pobox.com> wrote: > >> Ping Yin <pkufranky@gmail.com> writes: > >> > >> > @@ -265,6 +267,10 @@ set_name_rev () { > >> > # > >> > modules_summary() > >> > { > >> > + summary_limit=${summary_limit:-1000000} > >> > >> Why a million? > > Because i think a million is big enough. I'd better define a constant > > for unlimited number. > > I think that is a wrong approach to begin with. You are > assuming that you will always limit and by using improbably > large limit to pretend it is unlimited. Why not making the > summary list generator truely capable of produce an unlimited > list? > I used a pseudo unlimited number just to make code shorter. After considering it again, i find that the code is still brief by using a real unlimited number. So i'll correct it. > I also think using 100 or so as a sane default, allowing the > user to override to say "I do not want any limitation", is a > much better default. > Reasonable -- Ping Yin ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work 2008-01-12 7:37 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Ping Yin 2008-01-12 7:37 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size Ping Yin @ 2008-01-12 8:32 ` Junio C Hamano 2008-01-12 9:48 ` Ping Yin 2008-01-12 11:12 ` Ping Yin 2 siblings, 1 reply; 19+ messages in thread From: Junio C Hamano @ 2008-01-12 8:32 UTC (permalink / raw) To: Ping Yin; +Cc: git, gitster Ping Yin <pkufranky@gmail.com> writes: > + git diff $cache_option --raw $head -- $modules | > + grep '^:160000\|:000000 160000' | > + cut -c2- | > + while read mod_src mod_dst sha1_src sha1_dst status name > + do > + sha1_dst=$(echo $sha1_dst | cut -c1-7) > + sha1_src=$(echo $sha1_src | cut -c1-7) If you are willing to lose precision forever like this, I think you can run "git diff" with --abbrev and lose this cut. > + check_dst=t > + check_src=t > + case $status in > + D) > + check_dst= > + ;; > + A) > + check_src= > + ;; I'd loosen the above grep (see my comments to your 1/5) and also add this: *) continue ;# punt ;; so that the rest of the code won't break when seeing a path that was submodule in the HEAD but is a blob in the index. > + esac > + > + ( > + errmsg= > + unfound_src= > + unfound_dst= > + > + test -z "$check_src" || > + GIT_DIR="$name/.git" git-rev-parse $sha1_src >&/dev/null || And the precision of $sha1_src matter here. Be it done with "diff --abbrev" at the toplevel or your "cut", that may not be unique enough in the submodule. I think you would want to read full 40-char sha1_src and sha1_dst with "while read", and keep that full 40-char in these variables, and use them when calling rev-parse here. If you are checking if that the object exists in the submodule, use "rev-parse --verify", which was designed for exactly that purpose. If you also want to verify if the object is a commit, which may be a good idea anyway, "rev-parse --verify $sha1_src^0". To be portable, use traditional ">/dev/null 2>&1", not ">&/dev/null". > + case "$unfound_src,$unfound_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" > + ;; When reporting errors, you would want to give full 40-chars... > + *) > + 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 > + > + echo "* $name $sha1_src...$sha1_dst:" While reporting like this, you would want the shortened form, perhaps produced your "cut -c1-7". > + if test -n "$errmsg" > + then > + echo "$errmsg" > + else > + test -n "$left" && echo "$left" > + test -n "$right" && echo "$right" > + fi > + echo > + ) | sed 's/^/# /' > + done I'd prefer to always have "-e" before the sed expression. Any reason why you want separate invocation of sed inside the while loop? IOW, why isn't it like this? git diff --raw | while read ... do ... done | sed -e 's/^/# /' > + > cd "$cwd" Hmmm. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work 2008-01-12 8:32 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Junio C Hamano @ 2008-01-12 9:48 ` Ping Yin 2008-01-12 12:24 ` Ping Yin 0 siblings, 1 reply; 19+ messages in thread From: Ping Yin @ 2008-01-12 9:48 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 12, 2008 4:32 PM, Junio C Hamano <gitster@pobox.com> wrote: > Ping Yin <pkufranky@gmail.com> writes: > > > > + check_dst=t > > + check_src=t > > + case $status in > > + D) > > + check_dst= > > + ;; > > + A) > > + check_src= > > + ;; > > I'd loosen the above grep (see my comments to your 1/5) and also > add this: > > *) > continue ;# punt > ;; > > so that the rest of the code won't break when seeing a path that > was submodule in the HEAD but is a blob in the index. Right. I thought 'M' should be the default case because I missed the case 'T' (head blob but index submodule, or the reverse) . > > > + esac > > + > > + ( > > + errmsg= > > + unfound_src= > > + unfound_dst= > > + > > + test -z "$check_src" || > > + GIT_DIR="$name/.git" git-rev-parse $sha1_src >&/dev/null || > > > I think you would want to read full 40-char sha1_src and > sha1_dst with "while read", and keep that full 40-char in these > variables, and use them when calling rev-parse here. Hmm, precision is really a problem. However, "git diff --raw" will not always give full 40-char sha1, instead it will give sha1 with enough length. So maybe i can use the sha1 from "git diff --raw" ? > > If you are checking if that the object exists in the submodule, > use "rev-parse --verify", which was designed for exactly that > purpose. If you also want to verify if the object is a commit, > which may be a good idea anyway, "rev-parse --verify $sha1_src^0". Yes, --verify is better. ;; > > When reporting errors, you would want to give full 40-chars... > As said before, enough is ok? > > + *) > > + 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 > > + > > + echo "* $name $sha1_src...$sha1_dst:" > > While reporting like this, you would want the shortened form, > perhaps produced your "cut -c1-7". > > > + if test -n "$errmsg" > > + then > > + echo "$errmsg" > > + else > > + test -n "$left" && echo "$left" > > + test -n "$right" && echo "$right" > > + fi > > + echo > > + ) | sed 's/^/# /' > > + done > > I'd prefer to always have "-e" before the sed expression. Is it not portable without "-e"? > > Any reason why you want separate invocation of sed inside the > while loop? IOW, why isn't it like this? > > git diff --raw | > while read ... > do > ... > done | sed -e 's/^/# /' > Just because i'm stupid. :) -- Ping Yin ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work 2008-01-12 9:48 ` Ping Yin @ 2008-01-12 12:24 ` Ping Yin 2008-01-12 19:21 ` Junio C Hamano 0 siblings, 1 reply; 19+ messages in thread From: Ping Yin @ 2008-01-12 12:24 UTC (permalink / raw) To: Junio C Hamano; +Cc: git > > > > I think you would want to read full 40-char sha1_src and > > sha1_dst with "while read", and keep that full 40-char in these > > variables, and use them when calling rev-parse here. > > Hmm, precision is really a problem. However, "git diff --raw" will not > always give full 40-char sha1, instead it will give sha1 with enough > length. So maybe i can use the sha1 from "git diff --raw" ? > Oh, I'm wrong. It seems 'git diff --raw' will always give full 40-char sha1 for submodule entry and abbreviated sha1 for blob entry. -- Ping Yin ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work 2008-01-12 12:24 ` Ping Yin @ 2008-01-12 19:21 ` Junio C Hamano 0 siblings, 0 replies; 19+ messages in thread From: Junio C Hamano @ 2008-01-12 19:21 UTC (permalink / raw) To: Ping Yin; +Cc: Junio C Hamano, git "Ping Yin" <pkufranky@gmail.com> writes: >> > >> > I think you would want to read full 40-char sha1_src and >> > sha1_dst with "while read", and keep that full 40-char in these >> > variables, and use them when calling rev-parse here. >> >> Hmm, precision is really a problem. However, "git diff --raw" will not >> always give full 40-char sha1, instead it will give sha1 with enough >> length. So maybe i can use the sha1 from "git diff --raw" ? >> > Oh, I'm wrong. It seems 'git diff --raw' will always give full 40-char > sha1 for submodule entry and abbreviated sha1 for blob entry. It is not recommended to use "git diff" in scripts when you can use one of the "git diff-*" plumbing. In this case I think you would want "git-diff-index". Also see --abbrev option. You can never determine how many hexdigits are "enough" from the containing project, as it does not have to have access to the submodule object store. That's the reason I suggested to read full object name from diff-index and use it for error reporting and object retrieval, and shorten it in the UI for normal status noise. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work 2008-01-12 7:37 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Ping Yin 2008-01-12 7:37 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size Ping Yin 2008-01-12 8:32 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Junio C Hamano @ 2008-01-12 11:12 ` Ping Yin 2008-01-12 19:25 ` Junio C Hamano 2 siblings, 1 reply; 19+ messages in thread From: Ping Yin @ 2008-01-12 11:12 UTC (permalink / raw) To: git; +Cc: gitster > + echo "* $name $sha1_src...$sha1_dst:" If it's a type change (head submodule but index blob, or the the reverse), $sha1_dst or $sha1_src will be the sha1 of the blob. It's inapprociate to be shown as if it's a commit in the submodule. May 00000000 should be shown instead of the blob sha1? However, any good way to tell user the type change info? Is it ok to add an additional line such as ""Add file sm1" in the summary and also change the summary description as follows? ------------------------------------------------------------------------------------- $ git submodule summary sm1 # Submodules modifiled: sm1 # # * sm1 354cd45...0000000(3f751e5): # <one line message for C # <one line message for B # >Add file sm1 ------------------------------------------------------------------------------------- > 1.5.4.rc2.9.gf5146-dirty > > -- Ping Yin ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work 2008-01-12 11:12 ` Ping Yin @ 2008-01-12 19:25 ` Junio C Hamano 2008-01-13 6:28 ` Ping Yin 0 siblings, 1 reply; 19+ messages in thread From: Junio C Hamano @ 2008-01-12 19:25 UTC (permalink / raw) To: Ping Yin; +Cc: git, gitster "Ping Yin" <pkufranky@gmail.com> writes: >> + echo "* $name $sha1_src...$sha1_dst:" > > If it's a type change (head submodule but index blob, or the the > reverse), $sha1_dst or $sha1_src will be the sha1 of the blob. It's > inapprociate to be shown as if it's a commit in the submodule. May > 00000000 should be shown instead of the blob sha1? I do not think that adds much value. When A or B is a non-commit, you know that A...B notation does not apply, and because it is probably a rare situation you would want to make it even more clearer to the reader by using a different notation. Like echo "* $name have changed from submodule $sha1_src to blob $sha1_dst!!". perhaps in red bold letter in larger font ;-) ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work 2008-01-12 19:25 ` Junio C Hamano @ 2008-01-13 6:28 ` Ping Yin 0 siblings, 0 replies; 19+ messages in thread From: Ping Yin @ 2008-01-13 6:28 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 13, 2008 3:25 AM, Junio C Hamano <gitster@pobox.com> wrote: > "Ping Yin" <pkufranky@gmail.com> writes: > > >> + echo "* $name $sha1_src...$sha1_dst:" > > > > If it's a type change (head submodule but index blob, or the the > > reverse), $sha1_dst or $sha1_src will be the sha1 of the blob. It's > > inapprociate to be shown as if it's a commit in the submodule. May > > 00000000 should be shown instead of the blob sha1? > > I do not think that adds much value. When A or B is a > non-commit, you know that A...B notation does not apply, and > because it is probably a rare situation you would want to make > it even more clearer to the reader by using a different > notation. Like > > echo "* $name have changed from submodule $sha1_src to blob $sha1_dst!!". > > perhaps in red bold letter in larger font ;-) > OK, i will think over. -- Ping Yin ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework 2008-01-12 7:37 ` [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework Ping Yin 2008-01-12 7:37 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Ping Yin @ 2008-01-12 8:18 ` Junio C Hamano 2008-01-12 9:09 ` Ping Yin 1 sibling, 1 reply; 19+ messages in thread From: Junio C Hamano @ 2008-01-12 8:18 UTC (permalink / raw) To: Ping Yin; +Cc: git Ping Yin <pkufranky@gmail.com> writes: > + # get modified modules which have been checked out (i.e. cared by user) > + modules=$(git diff $cache_option --raw $head -- "$@" | > + grep '^:160000\|:000000 160000' | > + while read mod_src mod_dst sha1_src sha1_dst status name > + do You are listing paths that were already submodule in HEAD, or newly added submodule. What about a path that used to be a blob but is being made into submodule with the next commit (i.e. RHS is 160000 but LHS is not 000000)? > + # TODO: quote module names containing space or tab Yes, you would need to worry about *un*quoting them. > + test -n "$modules" && > + echo "# Submodules modified: "$modules && > + echo "#" > + cd "$cwd" Hmmmmmm.... > -case "$add,$init,$update,$status,$cached" in > -1,,,,) > +case "$add,$init,$update,$summary,$status,$cached" in > +1,,,,,) > module_add "$@" > ;; This is simply unsustainable. Please see the other thread with Imran M Yousuf regarding the command dispatcher. I think that should be the first thing to fix before doing any change. ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework 2008-01-12 8:18 ` [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework Junio C Hamano @ 2008-01-12 9:09 ` Ping Yin 0 siblings, 0 replies; 19+ messages in thread From: Ping Yin @ 2008-01-12 9:09 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 12, 2008 4:18 PM, Junio C Hamano <gitster@pobox.com> wrote: > > Ping Yin <pkufranky@gmail.com> writes: > > > + # get modified modules which have been checked out (i.e. cared by user) > > + modules=$(git diff $cache_option --raw $head -- "$@" | > > + grep '^:160000\|:000000 160000' | > > + while read mod_src mod_dst sha1_src sha1_dst status name > > + do > > You are listing paths that were already submodule in HEAD, or > newly added submodule. What about a path that used to be a blob > but is being made into submodule with the next commit (i.e. RHS > is 160000 but LHS is not 000000)? Hmm, i had ignored such a case. > > > > > -case "$add,$init,$update,$status,$cached" in > > -1,,,,) > > +case "$add,$init,$update,$summary,$status,$cached" in > > +1,,,,,) > > module_add "$@" > > ;; > > This is simply unsustainable. > > Please see the other thread with Imran M Yousuf regarding the > command dispatcher. I think that should be the first thing to > fix before doing any change. > Ok, i will resend my patches after this fix -- Ping Yin ^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2008-01-13 6:39 UTC | newest] Thread overview: 19+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-01-12 7:37 [PATCH 0/5] submodule summary support Ping Yin 2008-01-12 7:37 ` [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework Ping Yin 2008-01-12 7:37 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Ping Yin 2008-01-12 7:37 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit summary size Ping Yin 2008-01-12 7:37 ` [PATCH 4/5] git-status: submodule summary support Ping Yin 2008-01-12 7:37 ` [PATCH 5/5] git-status: configurable submodule summary size Ping Yin 2008-01-12 8:36 ` [PATCH 3/5] git-submodule: New subcommand 'summary' (3) - limit " Junio C Hamano 2008-01-12 9:51 ` Ping Yin 2008-01-12 19:17 ` Junio C Hamano 2008-01-13 6:38 ` Ping Yin 2008-01-12 8:32 ` [PATCH 2/5] git-submodule: New subcommand 'summary' (2) - hard work Junio C Hamano 2008-01-12 9:48 ` Ping Yin 2008-01-12 12:24 ` Ping Yin 2008-01-12 19:21 ` Junio C Hamano 2008-01-12 11:12 ` Ping Yin 2008-01-12 19:25 ` Junio C Hamano 2008-01-13 6:28 ` Ping Yin 2008-01-12 8:18 ` [PATCH 1/5] git-submodule: New subcommand 'summary' (1) - code framework Junio C Hamano 2008-01-12 9:09 ` Ping Yin
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).