From 23a485e3ee32a9445e1c20bd4fd4b93119cd4f7c Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 15 Jan 2008 02:35:49 -0800 Subject: git-submodule: rename shell functions for consistency This renames the shell functions used in git-submodule that implement top-level subcommands. The rule is that the subcommand $foo is implemented by cmd_$foo function. A noteworthy change is that modules_list() is now known as cmd_status(). There is no "submodule list" command. Signed-off-by: Junio C Hamano --- git-submodule.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index ad9fe628fd..3c104e30f7 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -86,9 +86,9 @@ module_name() # # Clone a submodule # -# Prior to calling, modules_update checks that a possibly existing +# Prior to calling, cmd_update checks that a possibly existing # path is not a git repository. -# Likewise, module_add checks that path does not exist at all, +# Likewise, cmd_add checks that path does not exist at all, # since it is the location of a new submodule. # module_clone() @@ -121,7 +121,7 @@ module_clone() # # optional branch is stored in global branch variable # -module_add() +cmd_add() { repo=$1 path=$2 @@ -174,7 +174,7 @@ module_add() # # $@ = requested paths (default to all) # -modules_init() +cmd_init() { git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path @@ -207,7 +207,7 @@ modules_init() # # $@ = requested paths (default to all) # -modules_update() +cmd_update() { git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path @@ -266,7 +266,7 @@ set_name_rev () { # # $@ = requested paths (default to all) # -modules_list() +cmd_status() { git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path @@ -347,16 +347,16 @@ esac case "$add,$init,$update,$status,$cached" in 1,,,,) - module_add "$@" + cmd_add "$@" ;; ,1,,,) - modules_init "$@" + cmd_init "$@" ;; ,,1,,) - modules_update "$@" + cmd_update "$@" ;; ,,,*,*) - modules_list "$@" + cmd_status "$@" ;; *) usage -- cgit v1.3-5-g9baa From 5c08dbbdf1a2d2565606bb43f7e42a5968fcbdf1 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 15 Jan 2008 02:48:45 -0800 Subject: git-submodule: fix subcommand parser The subcommand parser of "git submodule" made its subcommand names reserved words. As a consequence, a command like this: $ git submodule add init update which is meant to add a submodule called 'init' at path 'update' was misinterpreted as a request to invoke more than one mutually incompatible subcommands and incorrectly rejected. This patch fixes the issue by stopping the subcommand parsing at the first subcommand word, to allow the sample command line above to work as expected. It also introduces the usual -- option disambiguator, so that a submodule at path '-foo' can be updated with $ git submodule update -- -foo without triggering an "unrecognized option -foo" error. Signed-off-by: Junio C Hamano --- git-submodule.sh | 157 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 116 insertions(+), 41 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 3c104e30f7..a6aaf40b0a 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -9,11 +9,8 @@ OPTIONS_SPEC= . git-sh-setup require_work_tree -add= +command= branch= -init= -update= -status= quiet= cached= @@ -123,6 +120,32 @@ module_clone() # cmd_add() { + # parse $args after "submodule ... add". + while test $# -ne 0 + do + case "$1" in + -b | --branch) + case "$2" in '') usage ;; esac + branch=$2 + shift + ;; + -q|--quiet) + quiet=1 + ;; + --) + shift + break + ;; + -*) + usage + ;; + *) + break + ;; + esac + shift + done + repo=$1 path=$2 @@ -176,6 +199,27 @@ cmd_add() # cmd_init() { + # parse $args after "submodule ... init". + while test $# -ne 0 + do + case "$1" in + -q|--quiet) + quiet=1 + ;; + --) + shift + break + ;; + -*) + usage + ;; + *) + break + ;; + esac + shift + done + git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path do @@ -209,6 +253,27 @@ cmd_init() # cmd_update() { + # parse $args after "submodule ... update". + while test $# -ne 0 + do + case "$1" in + -q|--quiet) + quiet=1 + ;; + --) + shift + break + ;; + -*) + usage + ;; + *) + break + ;; + esac + shift + done + git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path do @@ -268,6 +333,30 @@ set_name_rev () { # cmd_status() { + # parse $args after "submodule ... status". + while test $# -ne 0 + do + case "$1" in + -q|--quiet) + quiet=1 + ;; + --cached) + cached=1 + ;; + --) + shift + break + ;; + -*) + usage + ;; + *) + break + ;; + esac + shift + done + git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path do @@ -293,20 +382,17 @@ cmd_status() done } -while test $# != 0 +# This loop parses the command line arguments to find the +# subcommand name to dispatch. Parsing of the subcommand specific +# options are primarily done by the subcommand implementations. +# Subcommand specific options such as --branch and --cached are +# parsed here as well, for backward compatibility. + +while test $# != 0 && test -z "$command" do case "$1" in - add) - add=1 - ;; - init) - init=1 - ;; - update) - update=1 - ;; - status) - status=1 + add | init | update | status) + command=$1 ;; -q|--quiet) quiet=1 @@ -335,30 +421,19 @@ do shift done -case "$add,$branch" in -1,*) - ;; -,) - ;; -,*) +# No command word defaults to "status" +test -n "$command" || command=status + +# "-b branch" is accepted only by "add" +if test -n "$branch" && test "$command" != add +then usage - ;; -esac - -case "$add,$init,$update,$status,$cached" in -1,,,,) - cmd_add "$@" - ;; -,1,,,) - cmd_init "$@" - ;; -,,1,,) - cmd_update "$@" - ;; -,,,*,*) - cmd_status "$@" - ;; -*) +fi + +# "--cached" is accepted only by "status" +if test -n "$cached" && test "$command" != status +then usage - ;; -esac +fi + +"cmd_$command" "$@" -- cgit v1.3-5-g9baa From fcbcfe707ae23b37d72025a229f31c450fb4d3b3 Mon Sep 17 00:00:00 2001 From: Ping Yin Date: Mon, 3 Mar 2008 10:03:18 +0800 Subject: git-submodule: Fix typo 'url' which should be '$url' Fix typo in 'test -z "url"' when checking whether a submodule url is empty. "url" should be "$url". Signed-off-by: Ping Yin Signed-off-by: Junio C Hamano --- git-submodule.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index a6aaf40b0a..67d3224c8c 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -362,7 +362,7 @@ cmd_status() do name=$(module_name "$path") || exit url=$(git config submodule."$name".url) - if test -z "url" || ! test -d "$path"/.git + if test -z "$url" || ! test -d "$path"/.git then say "-$sha1 $path" continue; -- cgit v1.3-5-g9baa From d4264ca3233e206ea927bc94befda530683b5836 Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Tue, 4 Mar 2008 20:15:02 -0500 Subject: git-submodule - Allow adding a submodule in-place When working in the top-level project, it is useful to create a new submodule as a git repo in a subdirectory, then add that submodule to the top-level in place. This patch allows "git submodule add subdir" to add the existing subdir to the current project. The presumption is the user will later push / clone the subdir to the so that future submodule init / updates will work. Absent this patch, "git submodule add" insists upon cloning the subdir from a repository at the given url, which is fine for adding an existing project in, but less useful when adding a new submodule from scratch to an existing project. The former functionality remains, and the clone is attempted if the subdir does not already exist as a valid git repo. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano --- Documentation/git-submodule.txt | 5 +++-- git-submodule.sh | 50 ++++++++++++++++++++++++----------------- 2 files changed, 33 insertions(+), 22 deletions(-) (limited to 'git-submodule.sh') diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index e818e6e789..b4d01605a5 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -18,8 +18,9 @@ COMMANDS -------- add:: Add the given repository as a submodule at the given path - to the changeset to be committed next. In particular, the - repository is cloned at the specified path, added to the + to the changeset to be committed next. If path is a valid + repository within the project, it is added as is. Otherwise, + repository is cloned at the specified path. path is added to the changeset and registered in .gitmodules. If no path is specified, the path is deduced from the repository specification. If the repository url begins with ./ or ../, it is stored as diff --git a/git-submodule.sh b/git-submodule.sh index 67d3224c8c..7171cb60ab 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -153,20 +153,6 @@ cmd_add() usage fi - case "$repo" in - ./*|../*) - # dereference source url relative to parent's url - realrepo="$(resolve_relative_url $repo)" ;; - *) - # Turn the source into an absolute path if - # it is local - if base=$(get_repo_base "$repo"); then - repo="$base" - fi - realrepo=$repo - ;; - esac - # Guess path from repo if not specified or strip trailing slashes if test -z "$path"; then path=$(echo "$repo" | sed -e 's|/*$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g') @@ -174,15 +160,39 @@ cmd_add() path=$(echo "$path" | sed -e 's|/*$||') fi - test -e "$path" && - die "'$path' already exists" - git ls-files --error-unmatch "$path" > /dev/null 2>&1 && die "'$path' already exists in the index" - module_clone "$path" "$realrepo" || exit - (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || - die "Unable to checkout submodule '$path'" + # perhaps the path exists and is already a git repo, else clone it + if test -e "$path" + then + if test -d "$path/.git" && + test "$(unset GIT_DIR; cd $path; git rev-parse --git-dir)" = ".git" + then + echo "Adding existing repo at '$path' to the index" + else + die "'$path' already exists and is not a valid git repo" + fi + else + case "$repo" in + ./*|../*) + # dereference source url relative to parent's url + realrepo="$(resolve_relative_url $repo)" ;; + *) + # Turn the source into an absolute path if + # it is local + if base=$(get_repo_base "$repo"); then + repo="$base" + fi + realrepo=$repo + ;; + esac + + module_clone "$path" "$realrepo" || exit + (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || + die "Unable to checkout submodule '$path'" + fi + git add "$path" || die "Failed to add submodule '$path'" -- cgit v1.3-5-g9baa From 28f9af5d25ec04288d8c501058d83ac76c8be6f4 Mon Sep 17 00:00:00 2001 From: Ping Yin Date: Tue, 11 Mar 2008 21:52:15 +0800 Subject: git-submodule summary: code framework These patches teach git-submodule a new subcommand 'summary' to show commit summary of checked out submodules between a given super project commit (defaults to HEAD) and working tree (or index, when --cached is given). This patch just introduces the framework to find submodules which have summary to show. A submodule will have summary if it falls into these cases: - type 'M': modified and checked out (1) - type 'A': added and checked out (2) - type 'D': deleted - type 'T': typechanged (blob <-> submodule) Notes: 1. There may be modified but not checked out cases. In the case of a merge conflict, even if the submodule is not checked out, there may be still a diff between index and HEAD on the submodule entry (i.e. modified). The summary will not be show for such a submodule. 2. A similar explanation applies to the added but not checked out case. Signed-off-by: Ping Yin Signed-off-by: Junio C Hamano --- git-submodule.sh | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 5 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 67d3224c8c..dbb866644a 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -4,7 +4,7 @@ # # Copyright (c) 2007 Lars Hjemli -USAGE='[--quiet] [--cached] [add [-b branch]|status|init|update] [--] [...]' +USAGE='[--quiet] [--cached] [add [-b branch]|status|init|update|summary []] [--] [...]' OPTIONS_SPEC= . git-sh-setup require_work_tree @@ -320,7 +320,58 @@ set_name_rev () { ) ) test -z "$revname" || revname=" ($revname)" } +# +# Show commit summary for submodules in index or working tree +# +# If '--cached' is given, show summary between index and given commit, +# or between working tree and given commit +# +# $@ = [commit (default 'HEAD'),] requested paths (default all) +# +cmd_summary() { + # parse $args after "submodule ... summary". + while test $# -ne 0 + do + case "$1" in + --cached) + cached="$1" + ;; + --) + shift + break + ;; + -*) + usage + ;; + *) + break + ;; + esac + shift + done + if rev=$(git rev-parse --verify "$1^0" 2>/dev/null) + then + head=$rev + shift + else + head=HEAD + fi + + cd_to_toplevel + # Get modified modules cared by user + modules=$(git diff-index $cached --raw $head -- "$@" | + grep -e '^:160000' -e '^:[0-7]* 160000' | + while read mod_src mod_dst sha1_src sha1_dst status name + do + # Always show modules deleted or type-changed (blob<->module) + test $status = D -o $status = T && echo "$name" && continue + # Also show added or modified modules which are checked out + GIT_DIR="$name/.git" git-rev-parse --git-dir >/dev/null 2>&1 && + echo "$name" + done + ) +} # # List all submodules, prefixed with: # - submodule not initialized @@ -391,7 +442,7 @@ cmd_status() while test $# != 0 && test -z "$command" do case "$1" in - add | init | update | status) + add | init | update | status | summary) command=$1 ;; -q|--quiet) @@ -406,7 +457,7 @@ do branch="$2"; shift ;; --cached) - cached=1 + cached="$1" ;; --) break @@ -430,8 +481,8 @@ then usage fi -# "--cached" is accepted only by "status" -if test -n "$cached" && test "$command" != status +# "--cached" is accepted only by "status" and "summary" +if test -n "$cached" && test "$command" != status -a "$command" != summary then usage fi -- cgit v1.3-5-g9baa From 1cb639e6b02d8740cd2d4516a34822b43660babc Mon Sep 17 00:00:00 2001 From: Ping Yin Date: Tue, 11 Mar 2008 21:52:16 +0800 Subject: git-submodule summary: show commit summary This patch does the hard work to show submodule commit summary. For a modified submodule, a series of commits will be shown with the following command: git log --pretty='format:%m %s' \ --first-parent sha1_src...sha1_dst where the sha1_src is from the given super project commit and the sha1_dst is from the index or working tree (switched by --cached). For a deleted, added, or typechanged (blob<->submodule) submodule, only one single newest commit from the existing end (for example, src end for submodule deleted or type changed from submodule to blob) will be shown. If the src/dst sha1 for a submodule is missing in the submodule directory, a warning will be issued except in two cases where the submodule directory is deleted (type 'D') or typechanged to blob (one case of type 'T'). In the title line for a submodule, the src/dst sha1 and the number of commits (--first-parent) between the two commits will be shown. The following example demonstrates most cases. Example: commit summary for modified submodules sm1-sm5. -------------------------------------------- $ git submodule summary * sm1 354cd45...3f751e5 (4): < one line message for C < one line message for B > one line message for D > one line message for E * sm2 5c8bfb5...000000 (3): < one line message for F * sm3 354cd45...3f751e5: Warn: sm3 doesn't contain commit 354cd45 * sm4 354cd34(submodule)-> 235efa(blob) (1): < one line message for G * sm5 354cd34(blob)-> 235efa(submodule) (5): > one line message for H -------------------------------------------- Signed-off-by: Ping Yin Signed-off-by: Junio C Hamano --- git-submodule.sh | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index dbb866644a..01f26d341c 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -371,6 +371,108 @@ cmd_summary() { echo "$name" done ) + + test -n "$modules" && + git diff-index $cached --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 "$cached" && + test $sha1_dst = 0000000000000000000000000000000000000000 + then + case "$mod_dst" in + 160000) + sha1_dst=$(GIT_DIR="$name/.git" git rev-parse HEAD) + ;; + 100644 | 100755 | 120000) + sha1_dst=$(git hash-object $name) + ;; + 000000) + ;; # removed + *) + # unexpected type + echo >&2 "unexpected mode $mod_dst" + continue ;; + esac + fi + missing_src= + missing_dst= + + test $mod_src = 160000 && + ! GIT_DIR="$name/.git" git-rev-parse --verify $sha1_src^0 >/dev/null 2>&1 && + missing_src=t + + test $mod_dst = 160000 && + ! GIT_DIR="$name/.git" git-rev-parse --verify $sha1_dst^0 >/dev/null 2>&1 && + missing_dst=t + + total_commits= + 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" + ;; + *) + errmsg= + total_commits=$( + if test $mod_src = 160000 -a $mod_dst = 160000 + then + range="$sha1_src...$sha1_dst" + elif test $mod_src = 160000 + then + range=$sha1_src + else + range=$sha1_dst + fi + GIT_DIR="$name/.git" \ + git log --pretty=oneline --first-parent $range | wc -l + ) + total_commits=" ($total_commits)" + ;; + esac + + sha1_abbr_src=$(echo $sha1_src | cut -c1-7) + sha1_abbr_dst=$(echo $sha1_dst | cut -c1-7) + if test $status = T + then + if test $mod_dst = 160000 + then + echo "* $name $sha1_abbr_src(blob)->$sha1_abbr_dst(submodule)$total_commits:" + else + echo "* $name $sha1_abbr_src(submodule)->$sha1_abbr_dst(blob)$total_commits:" + fi + else + echo "* $name $sha1_abbr_src...$sha1_abbr_dst$total_commits:" + 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 + if test $mod_src = 160000 -a $mod_dst = 160000 + then + GIT_DIR="$name/.git" \ + git log --pretty='format: %m %s' \ + --first-parent $sha1_src...$sha1_dst + elif test $mod_dst = 160000 + then + GIT_DIR="$name/.git" \ + git log --pretty='format: > %s' -1 $sha1_dst + else + GIT_DIR="$name/.git" \ + git log --pretty='format: < %s' -1 $sha1_src + fi + echo + fi + echo + done } # # List all submodules, prefixed with: -- cgit v1.3-5-g9baa From f2dc06a344257df7b9307fc8453af7342409b610 Mon Sep 17 00:00:00 2001 From: Ping Yin Date: Tue, 11 Mar 2008 21:52:17 +0800 Subject: git-submodule summary: limit summary size This patch teaches git-submodule an option '--summary-limit|-n ' to limit number of commits in total for the summary of each submodule in the modified case (only a single commit is shown in other cases). Giving 0 will disable the summary; a negative number means unlimted, which is the default. Signed-off-by: Ping Yin Signed-off-by: Junio C Hamano --- git-submodule.sh | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 01f26d341c..4d28fc0988 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -4,7 +4,9 @@ # # Copyright (c) 2007 Lars Hjemli -USAGE='[--quiet] [--cached] [add [-b branch]|status|init|update|summary []] [--] [...]' +USAGE="[--quiet] [--cached] \ +[add [-b branch]|status|init|update|summary [-n|--summary-limit ] []] \ +[--] [...]" OPTIONS_SPEC= . git-sh-setup require_work_tree @@ -329,6 +331,8 @@ set_name_rev () { # $@ = [commit (default 'HEAD'),] requested paths (default all) # cmd_summary() { + summary_limit=-1 + # parse $args after "submodule ... summary". while test $# -ne 0 do @@ -336,6 +340,15 @@ cmd_summary() { --cached) cached="$1" ;; + -n|--summary-limit) + if summary_limit=$(($2 + 0)) 2>/dev/null && test "$summary_limit" = "$2" + then + : + else + usage + fi + shift + ;; --) shift break @@ -350,6 +363,8 @@ cmd_summary() { shift done + test $summary_limit = 0 && return + if rev=$(git rev-parse --verify "$1^0" 2>/dev/null) then head=$rev @@ -458,8 +473,10 @@ cmd_summary() { else if test $mod_src = 160000 -a $mod_dst = 160000 then + limit= + test $summary_limit -gt 0 && limit="-$summary_limit" GIT_DIR="$name/.git" \ - git log --pretty='format: %m %s' \ + git log $limit --pretty='format: %m %s' \ --first-parent $sha1_src...$sha1_dst elif test $mod_dst = 160000 then -- cgit v1.3-5-g9baa From eed35595759a65d51279547af0f2d017dd928fa5 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Wed, 12 Mar 2008 09:30:01 +0100 Subject: git-submodule summary: fix that some "wc" flavors produce leading spaces We print the number of commits in parentheses, but without this change we would get an oddly looking line like this: * sm1 4c8d358...41fbea9 ( 4): Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- git-submodule.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 4d28fc0988..558a5ca107 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -448,7 +448,7 @@ cmd_summary() { GIT_DIR="$name/.git" \ git log --pretty=oneline --first-parent $range | wc -l ) - total_commits=" ($total_commits)" + total_commits=" ($(($total_commits + 0)))" ;; esac -- cgit v1.3-5-g9baa From aadbe44f883859536c5320e0ac1d6ed122c45671 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Wed, 12 Mar 2008 17:32:17 -0400 Subject: grep portability fix: don't use "-e" or "-q" System V versions of grep (such as Solaris /usr/bin/grep) don't understand either of these options. git's usage of "grep -e pattern" fell into one of two categories: 1. equivalent to "grep pattern". -e is only useful here if the pattern begins with a "-", but all of the patterns are hardcoded and do not begin with a dash. 2. stripping comments and blank lines with grep -v -e "^$" -e "^#" We can fortunately do this in the affirmative as grep '^[^#]' Uses of "-q" can be replaced with redirection to /dev/null. In many tests, however, "grep -q" is used as "if this string is in the expected output, we are OK". In this case, it is fine to just remove the "-q" entirely; it simply makes the "verbose" mode of the test slightly more verbose. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- git-rebase--interactive.sh | 6 +++--- git-submodule.sh | 6 +++--- t/t0030-stripspace.sh | 34 +++++++++++++++++----------------- t/t3404-rebase-interactive.sh | 3 +-- t/t3800-mktag.sh | 2 +- t/t5400-send-pack.sh | 2 +- t/t7502-status.sh | 2 +- t/t7600-merge.sh | 4 ++-- t/t9400-git-cvsserver-server.sh | 26 +++++++++++++------------- 9 files changed, 42 insertions(+), 43 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index c2bedd622c..4c3280a76e 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -78,8 +78,8 @@ mark_action_done () { sed -e 1q < "$TODO" >> "$DONE" sed -e 1d < "$TODO" >> "$TODO".new mv -f "$TODO".new "$TODO" - count=$(($(grep -ve '^$' -e '^#' < "$DONE" | wc -l))) - total=$(($count+$(grep -ve '^$' -e '^#' < "$TODO" | wc -l))) + count=$(grep -c '^[^#]' < "$DONE") + total=$(($count+$(grep -c '^[^#]' < "$TODO"))) if test "$last_count" != "$count" then last_count=$count @@ -110,7 +110,7 @@ die_abort () { } has_action () { - grep -vqe '^$' -e '^#' "$1" + grep '^[^#]' "$1" >/dev/null } pick_one () { diff --git a/git-submodule.sh b/git-submodule.sh index 7171cb60ab..ceb22952aa 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -230,7 +230,7 @@ cmd_init() shift done - git ls-files --stage -- "$@" | grep -e '^160000 ' | + git ls-files --stage -- "$@" | grep '^160000 ' | while read mode sha1 stage path do # Skip already registered paths @@ -284,7 +284,7 @@ cmd_update() shift done - git ls-files --stage -- "$@" | grep -e '^160000 ' | + git ls-files --stage -- "$@" | grep '^160000 ' | while read mode sha1 stage path do name=$(module_name "$path") || exit @@ -367,7 +367,7 @@ cmd_status() shift done - git ls-files --stage -- "$@" | grep -e '^160000 ' | + git ls-files --stage -- "$@" | grep '^160000 ' | while read mode sha1 stage path do name=$(module_name "$path") || exit diff --git a/t/t0030-stripspace.sh b/t/t0030-stripspace.sh index 818c8621f2..3ecdd6626a 100755 --- a/t/t0030-stripspace.sh +++ b/t/t0030-stripspace.sh @@ -245,12 +245,12 @@ test_expect_success \ test_expect_success \ 'text plus spaces without newline at end should not show spaces' ' - ! (printf "$ttt$sss" | git stripspace | grep -q " ") && - ! (printf "$ttt$ttt$sss" | git stripspace | grep -q " ") && - ! (printf "$ttt$ttt$ttt$sss" | git stripspace | grep -q " ") && - ! (printf "$ttt$sss$sss" | git stripspace | grep -q " ") && - ! (printf "$ttt$ttt$sss$sss" | git stripspace | grep -q " ") && - ! (printf "$ttt$sss$sss$sss" | git stripspace | grep -q " ") + ! (printf "$ttt$sss" | git stripspace | grep " " >/dev/null) && + ! (printf "$ttt$ttt$sss" | git stripspace | grep " " >/dev/null) && + ! (printf "$ttt$ttt$ttt$sss" | git stripspace | grep " " >/dev/null) && + ! (printf "$ttt$sss$sss" | git stripspace | grep " " >/dev/null) && + ! (printf "$ttt$ttt$sss$sss" | git stripspace | grep " " >/dev/null) && + ! (printf "$ttt$sss$sss$sss" | git stripspace | grep " " >/dev/null) ' test_expect_success \ @@ -282,12 +282,12 @@ test_expect_success \ test_expect_success \ 'text plus spaces at end should not show spaces' ' - ! (echo "$ttt$sss" | git stripspace | grep -q " ") && - ! (echo "$ttt$ttt$sss" | git stripspace | grep -q " ") && - ! (echo "$ttt$ttt$ttt$sss" | git stripspace | grep -q " ") && - ! (echo "$ttt$sss$sss" | git stripspace | grep -q " ") && - ! (echo "$ttt$ttt$sss$sss" | git stripspace | grep -q " ") && - ! (echo "$ttt$sss$sss$sss" | git stripspace | grep -q " ") + ! (echo "$ttt$sss" | git stripspace | grep " " >/dev/null) && + ! (echo "$ttt$ttt$sss" | git stripspace | grep " " >/dev/null) && + ! (echo "$ttt$ttt$ttt$sss" | git stripspace | grep " " >/dev/null) && + ! (echo "$ttt$sss$sss" | git stripspace | grep " " >/dev/null) && + ! (echo "$ttt$ttt$sss$sss" | git stripspace | grep " " >/dev/null) && + ! (echo "$ttt$sss$sss$sss" | git stripspace | grep " " >/dev/null) ' test_expect_success \ @@ -341,11 +341,11 @@ test_expect_success \ test_expect_success \ 'spaces without newline at end should not show spaces' ' - ! (printf "" | git stripspace | grep -q " ") && - ! (printf "$sss" | git stripspace | grep -q " ") && - ! (printf "$sss$sss" | git stripspace | grep -q " ") && - ! (printf "$sss$sss$sss" | git stripspace | grep -q " ") && - ! (printf "$sss$sss$sss$sss" | git stripspace | grep -q " ") + ! (printf "" | git stripspace | grep " " >/dev/null) && + ! (printf "$sss" | git stripspace | grep " " >/dev/null) && + ! (printf "$sss$sss" | git stripspace | grep " " >/dev/null) && + ! (printf "$sss$sss$sss" | git stripspace | grep " " >/dev/null) && + ! (printf "$sss$sss$sss$sss" | git stripspace | grep " " >/dev/null) ' test_expect_success \ diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 049aa37538..f09823106f 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -149,8 +149,7 @@ test_expect_success 'stop on conflicting pick' ' diff -u expect .git/.dotest-merge/patch && diff -u expect2 file1 && test 4 = $(grep -v "^#" < .git/.dotest-merge/done | wc -l) && - test 0 = $(grep -ve "^#" -e "^$" < .git/.dotest-merge/git-rebase-todo | - wc -l) + test 0 = $(grep -c "^[^#]" < .git/.dotest-merge/git-rebase-todo) ' test_expect_success 'abort' ' diff --git a/t/t3800-mktag.sh b/t/t3800-mktag.sh index f2803206f1..278075823b 100755 --- a/t/t3800-mktag.sh +++ b/t/t3800-mktag.sh @@ -15,7 +15,7 @@ check_verify_failure () { expect="$2" test_expect_success "$1" ' ( ! git-mktag message ) && - grep -q "$expect" message + grep "$expect" message ' } diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh index 2d0c07fd6a..2b6b6e3f71 100755 --- a/t/t5400-send-pack.sh +++ b/t/t5400-send-pack.sh @@ -120,7 +120,7 @@ test_expect_success \ cd .. && git-clone parent child && cd child && git-push --all && cd ../parent && - git-branch -a >branches && ! grep -q origin/master branches + git-branch -a >branches && ! grep origin/master branches ' rewound_push_setup() { diff --git a/t/t7502-status.sh b/t/t7502-status.sh index e00607490b..70b802ba3d 100755 --- a/t/t7502-status.sh +++ b/t/t7502-status.sh @@ -33,7 +33,7 @@ test_expect_success 'setup' ' test_expect_success 'status (1)' ' - grep -e "use \"git rm --cached \.\.\.\" to unstage" output + grep "use \"git rm --cached \.\.\.\" to unstage" output ' diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh index 5d166280cb..590505bea6 100755 --- a/t/t7600-merge.sh +++ b/t/t7600-merge.sh @@ -371,7 +371,7 @@ test_expect_success 'override config option -n' ' git merge --summary c2 >diffstat.txt && verify_merge file result.1-5 msg.1-5 && verify_parents $c1 $c2 && - if ! grep -e "^ file | *2 +-$" diffstat.txt + if ! grep "^ file | *2 +-$" diffstat.txt then echo "[OOPS] diffstat was not generated" fi @@ -386,7 +386,7 @@ test_expect_success 'override config option --summary' ' git merge -n c2 >diffstat.txt && verify_merge file result.1-5 msg.1-5 && verify_parents $c1 $c2 && - if grep -e "^ file | *2 +-$" diffstat.txt + if grep "^ file | *2 +-$" diffstat.txt then echo "[OOPS] diffstat was generated" false diff --git a/t/t9400-git-cvsserver-server.sh b/t/t9400-git-cvsserver-server.sh index 0a20971ebb..e82b365fad 100755 --- a/t/t9400-git-cvsserver-server.sh +++ b/t/t9400-git-cvsserver-server.sh @@ -94,7 +94,7 @@ EOF test_expect_success 'pserver authentication' \ 'cat request-anonymous | git-cvsserver pserver >log 2>&1 && - tail -n1 log | grep -q "^I LOVE YOU$"' + tail -n1 log | grep "^I LOVE YOU$"' test_expect_success 'pserver authentication failure (non-anonymous user)' \ 'if cat request-git | git-cvsserver pserver >log 2>&1 @@ -103,11 +103,11 @@ test_expect_success 'pserver authentication failure (non-anonymous user)' \ else true fi && - tail -n1 log | grep -q "^I HATE YOU$"' + tail -n1 log | grep "^I HATE YOU$"' test_expect_success 'pserver authentication (login)' \ 'cat login-anonymous | git-cvsserver pserver >log 2>&1 && - tail -n1 log | grep -q "^I LOVE YOU$"' + tail -n1 log | grep "^I LOVE YOU$"' test_expect_success 'pserver authentication failure (login/non-anonymous user)' \ 'if cat login-git | git-cvsserver pserver >log 2>&1 @@ -116,7 +116,7 @@ test_expect_success 'pserver authentication failure (login/non-anonymous user)' else true fi && - tail -n1 log | grep -q "^I HATE YOU$"' + tail -n1 log | grep "^I HATE YOU$"' # misuse pserver authentication for testing of req_Root @@ -146,15 +146,15 @@ test_expect_success 'req_Root failure (relative pathname)' \ else true fi && - tail log | grep -q "^error 1 Root must be an absolute pathname$"' + tail log | grep "^error 1 Root must be an absolute pathname$"' test_expect_success 'req_Root failure (conflicting roots)' \ 'cat request-conflict | git-cvsserver pserver >log 2>&1 && - tail log | grep -q "^error 1 Conflicting roots specified$"' + tail log | grep "^error 1 Conflicting roots specified$"' test_expect_success 'req_Root (strict paths)' \ 'cat request-anonymous | git-cvsserver --strict-paths pserver $SERVERDIR >log 2>&1 && - tail -n1 log | grep -q "^I LOVE YOU$"' + tail -n1 log | grep "^I LOVE YOU$"' test_expect_success 'req_Root failure (strict-paths)' ' ! cat request-anonymous | @@ -163,7 +163,7 @@ test_expect_success 'req_Root failure (strict-paths)' ' test_expect_success 'req_Root (w/o strict-paths)' \ 'cat request-anonymous | git-cvsserver pserver $WORKDIR/ >log 2>&1 && - tail -n1 log | grep -q "^I LOVE YOU$"' + tail -n1 log | grep "^I LOVE YOU$"' test_expect_success 'req_Root failure (w/o strict-paths)' ' ! cat request-anonymous | @@ -181,7 +181,7 @@ EOF test_expect_success 'req_Root (base-path)' \ 'cat request-base | git-cvsserver --strict-paths --base-path $WORKDIR/ pserver $SERVERDIR >log 2>&1 && - tail -n1 log | grep -q "^I LOVE YOU$"' + tail -n1 log | grep "^I LOVE YOU$"' test_expect_success 'req_Root failure (base-path)' ' ! cat request-anonymous | @@ -192,14 +192,14 @@ GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled false || exit 1 test_expect_success 'req_Root (export-all)' \ 'cat request-anonymous | git-cvsserver --export-all pserver $WORKDIR >log 2>&1 && - tail -n1 log | grep -q "^I LOVE YOU$"' + tail -n1 log | grep "^I LOVE YOU$"' test_expect_success 'req_Root failure (export-all w/o whitelist)' \ '! (cat request-anonymous | git-cvsserver --export-all pserver >log 2>&1 || false)' test_expect_success 'req_Root (everything together)' \ 'cat request-base | git-cvsserver --export-all --strict-paths --base-path $WORKDIR/ pserver $SERVERDIR >log 2>&1 && - tail -n1 log | grep -q "^I LOVE YOU$"' + tail -n1 log | grep "^I LOVE YOU$"' GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true || exit 1 @@ -216,7 +216,7 @@ test_expect_success 'gitcvs.enabled = false' \ else true fi && - cat cvs.log | grep -q "GITCVS emulation disabled" && + grep "GITCVS emulation disabled" cvs.log && test ! -d cvswork2' rm -fr cvswork2 @@ -237,7 +237,7 @@ test_expect_success 'gitcvs.ext.enabled = false' \ else true fi && - cat cvs.log | grep -q "GITCVS emulation disabled" && + grep "GITCVS emulation disabled" cvs.log && test ! -d cvswork2' rm -fr cvswork2 -- cgit v1.3-5-g9baa From ba88a1fee476a7895634beb9f33faf7e7b7908af Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Wed, 20 Feb 2008 23:13:15 +0100 Subject: Teach git-submodule.sh about the .git file When git-submodule tries to detect 'active' submodules, it checks for the existence of a directory named '.git'. This isn't good enough now that .git can be a file pointing to the real $GIT_DIR so the tests are changed to reflect this. Signed-off-by: Lars Hjemli Signed-off-by: Junio C Hamano --- git-submodule.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 56ec3536e0..5bff86022c 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -300,7 +300,7 @@ cmd_update() continue fi - if ! test -d "$path"/.git + if ! test -d "$path"/.git -o -f "$path"/.git then module_clone "$path" "$url" || exit subsha1= @@ -542,7 +542,7 @@ cmd_status() do name=$(module_name "$path") || exit url=$(git config submodule."$name".url) - if test -z "$url" || ! test -d "$path"/.git + if test -z "$url" || ! test -d "$path"/.git -o -f "$path"/.git then say "-$sha1 $path" continue; -- cgit v1.3-5-g9baa From a68972c2ad7c3de582abeed03f660e19950ed66f Mon Sep 17 00:00:00 2001 From: Ping Yin Date: Thu, 10 Apr 2008 22:45:29 +0800 Subject: git-submodule: Avoid 'fatal: cannot describe' message When "git submodule status" command tries to show the name of the submodule HEAD revision more descriptively, but the submodule repository lacked a suitable tag to do so, it leaked "fatal: cannot describe" message to the UI. Squelch it by using '--always'. Signed-off-by: Ping Yin Signed-off-by: Junio C Hamano --- git-submodule.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 56ec3536e0..7674346c8d 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -327,7 +327,7 @@ set_name_rev () { cd "$1" && { git describe "$2" 2>/dev/null || git describe --tags "$2" 2>/dev/null || - git describe --contains --tags "$2" + git describe --contains --tags --always "$2" } ) ) test -z "$revname" || revname=" ($revname)" -- cgit v1.3-5-g9baa From d0f64dd44d5f708f77380998b2c16bffe1e94050 Mon Sep 17 00:00:00 2001 From: Ping Yin Date: Sat, 12 Apr 2008 23:05:31 +0800 Subject: git-submodule summary: --for-status option The --for-status option is mainly used by builtin-status/commit. It adds 'Modified submodules:' line at top and '# ' prefix to all following lines. Signed-off-by: Ping Yin Signed-off-by: Junio C Hamano --- git-submodule.sh | 16 ++++++++++++++-- t/t7401-submodule-summary.sh | 13 +++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 7674346c8d..3249042028 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -342,6 +342,7 @@ set_name_rev () { # cmd_summary() { summary_limit=-1 + for_status= # parse $args after "submodule ... summary". while test $# -ne 0 @@ -350,6 +351,9 @@ cmd_summary() { --cached) cached="$1" ;; + --for-status) + for_status="$1" + ;; -n|--summary-limit) if summary_limit=$(($2 + 0)) 2>/dev/null && test "$summary_limit" = "$2" then @@ -397,7 +401,8 @@ cmd_summary() { done ) - test -n "$modules" && + test -z "$modules" && return + git diff-index $cached --raw $head -- $modules | grep -e '^:160000' -e '^:[0-7]* 160000' | cut -c2- | @@ -499,7 +504,14 @@ cmd_summary() { echo fi echo - done + done | + if test -n "$for_status"; then + echo "# Modified submodules:" + echo "#" + sed -e 's|^|# |' -e 's|^# $|#|' + else + cat + fi } # # List all submodules, prefixed with: diff --git a/t/t7401-submodule-summary.sh b/t/t7401-submodule-summary.sh index b9a22190e8..bf12dbdeef 100755 --- a/t/t7401-submodule-summary.sh +++ b/t/t7401-submodule-summary.sh @@ -192,4 +192,17 @@ test_expect_success 'given commit' " EOF " +test_expect_success '--for-status' " + git submodule summary --for-status HEAD^ >actual && + test_cmp actual - < Add foo9 +# +EOF +" + test_done -- cgit v1.3-5-g9baa From f669ac0be901e19a8948c9b04af63d23ebae8003 Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Mon, 14 Apr 2008 22:48:06 -0400 Subject: git-submodule - possibly use branch name to describe a module This changes the search logic for describing a submodule from: - annotated tag - any tag - tag on a subsequent commit - commit id to - annotated tag - any tag - tag on a subsequent commit - local or remote branch - commit id The change is describing with respect to a branch before falling back to the commit id. By itself, git-submodule will maintain submodules as headless checkouts without ever making a local branch. In general, such heads can always be described relative to the remote branch regardless of existence of tags, and so provides a better fallback summary than just the commit id. This requires inserting an extra describe step as --contains is incompatible with --all, but the latter can be used with --always to fall back to a commit ID. Also, --contains implies --tags, so the latter is not needed. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano --- git-submodule.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 7674346c8d..a745e42bf7 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -327,7 +327,8 @@ set_name_rev () { cd "$1" && { git describe "$2" 2>/dev/null || git describe --tags "$2" 2>/dev/null || - git describe --contains --tags --always "$2" + git describe --contains "$2" 2>/dev/null || + git describe --all --always "$2" } ) ) test -z "$revname" || revname=" ($revname)" -- cgit v1.3-5-g9baa From a5099bb4178591d9a16d704c74dba34b92f35861 Mon Sep 17 00:00:00 2001 From: Imran M Yousuf Date: Thu, 15 May 2008 13:42:58 +0600 Subject: Use '-f' option to point to the .gitmodules file 'git config' has a '-f' option that takes the file to parse. Using it rather than the environment variable seems more logical and simplified. Signed-off-by: Imran M Yousuf Signed-off-by: Junio C Hamano --- git-submodule.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 67f7a28cb3..b4b7d28d9d 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -74,8 +74,7 @@ module_name() { # Do we have "submodule..path = $1" defined in .gitmodules file? re=$(printf '%s' "$1" | sed -e 's/[].[^$\\*]/\\&/g') - name=$( GIT_CONFIG=.gitmodules \ - git config --get-regexp '^submodule\..*\.path$' | + name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' | sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' ) test -z "$name" && die "No submodule mapping found in .gitmodules for path '$path'" @@ -198,8 +197,8 @@ cmd_add() git add "$path" || die "Failed to add submodule '$path'" - GIT_CONFIG=.gitmodules git config submodule."$path".path "$path" && - GIT_CONFIG=.gitmodules git config submodule."$path".url "$repo" && + git config -f .gitmodules submodule."$path".path "$path" && + git config -f .gitmodules submodule."$path".url "$repo" && git add .gitmodules || die "Failed to register submodule '$path'" } @@ -240,7 +239,7 @@ cmd_init() url=$(git config submodule."$name".url) test -z "$url" || continue - url=$(GIT_CONFIG=.gitmodules git config submodule."$name".url) + url=$(git config -f .gitmodules submodule."$name".url) test -z "$url" && die "No url found for submodule path '$path' in .gitmodules" -- cgit v1.3-5-g9baa From be4d2c83b68a96285cc05036add4d64d324e52d9 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Fri, 16 May 2008 11:23:03 +0100 Subject: submodule update: add convenience option --init When a submodule is not initialized and you do not want to change the defaults from .gitmodules anyway, you can now say $ git submodule update --init When "update" is called without --init on an uninitialized submodule, a hint to use --init is printed. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- Documentation/git-submodule.txt | 7 ++++++- git-submodule.sh | 7 ++++++- t/t7400-submodule-basic.sh | 13 +++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) (limited to 'git-submodule.sh') diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index 6ffd896fbc..0668f295ee 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -11,7 +11,8 @@ SYNOPSIS [verse] 'git-submodule' [--quiet] add [-b branch] [--] [] 'git-submodule' [--quiet] status [--cached] [--] [...] -'git-submodule' [--quiet] [init|update] [--] [...] +'git-submodule' [--quiet] init [--] [...] +'git-submodule' [--quiet] update [--init] [--] [...] 'git-submodule' [--quiet] summary [--summary-limit ] [commit] [--] [...] @@ -47,6 +48,10 @@ update:: Update the registered submodules, i.e. clone missing submodules and checkout the commit specified in the index of the containing repository. This will make the submodules HEAD be detached. ++ +If the submodule is not yet initialized, and you just want to use the +setting as stored in .gitmodules, you can automatically initialize the +submodule with the --init option. summary:: Show commit summary between the given commit (defaults to HEAD) and diff --git a/git-submodule.sh b/git-submodule.sh index b4b7d28d9d..100737210d 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -5,7 +5,7 @@ # Copyright (c) 2007 Lars Hjemli USAGE="[--quiet] [--cached] \ -[add [-b branch]|status|init|update|summary [-n|--summary-limit ] []] \ +[add [-b branch]|status|init|update [-i|--init]|summary [-n|--summary-limit ] []] \ [--] [...]" OPTIONS_SPEC= . git-sh-setup @@ -271,6 +271,10 @@ cmd_update() -q|--quiet) quiet=1 ;; + -i|--init) + shift + cmd_init "$@" || return + ;; --) shift break @@ -296,6 +300,7 @@ cmd_update() # path have been specified test "$#" != "0" && say "Submodule path '$path' not initialized" + say "Maybe you want to use 'update --init'?" continue fi diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index 2ef85a869d..6c7b902482 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -196,4 +196,17 @@ test_expect_success 'apply submodule diff' ' test -z "$D" ' +test_expect_success 'update --init' ' + + mv init init2 && + git config -f .gitmodules submodule.example.url "$(pwd)/init2" && + git config --remove-section submodule.example + git submodule update init > update.out && + grep "not initialized" update.out && + test ! -d init/.git && + git submodule update --init init && + test -d init/.git + +' + test_done -- cgit v1.3-5-g9baa From fe22e5420ee547bac58481ed1a868f4cd39ad128 Mon Sep 17 00:00:00 2001 From: Chris Ridd Date: Wed, 11 Jun 2008 14:09:19 +0100 Subject: Improve sed portability The behaviour of "sed" on an incomplete line is unspecified by POSIX, and On Solaris it apparently fails to process input that doesn't end in a LF. Consequently constructs like re=$(printf '%s' foo | sed -e 's/bar/BAR/g' $) cause re to be set to the empty string. Such a construct is used in git-submodule.sh. Because the LF at the end of command output are stripped away by the command substitution, it is a safe and sane change to add a LF at the end of the printf format specifier. Signed-off-by: Chris Ridd Signed-off-by: Junio C Hamano --- git-submodule.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 100737210d..4032830907 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -73,7 +73,7 @@ resolve_relative_url () module_name() { # Do we have "submodule..path = $1" defined in .gitmodules file? - re=$(printf '%s' "$1" | sed -e 's/[].[^$\\*]/\\&/g') + re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g') name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' | sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' ) test -z "$name" && -- cgit v1.3-5-g9baa From 8e7e6f39b6895b6623dc0f6053818704899f41a6 Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Sat, 14 Jun 2008 13:09:41 -0400 Subject: git-submodule - Fix errors regarding resolve_relative_url git-submodule was invoking "die" from within resolve-relative-url, but this does not actually cause the script to exit. Fix this by returning the error to the caller and have the caller exit. While we're at it, clean up the quoting on invocation of resolve_relative_url as it was wrong. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano --- git-submodule.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 4032830907..3eb78cc724 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -45,8 +45,8 @@ resolve_relative_url () branch="$(git symbolic-ref HEAD 2>/dev/null)" remote="$(git config branch.${branch#refs/heads/}.remote)" remote="${remote:-origin}" - remoteurl="$(git config remote.$remote.url)" || - die "remote ($remote) does not have a url in .git/config" + remoteurl=$(git config "remote.$remote.url") || + die "remote ($remote) does not have a url defined in .git/config" url="$1" while test -n "$url" do @@ -178,7 +178,8 @@ cmd_add() case "$repo" in ./*|../*) # dereference source url relative to parent's url - realrepo="$(resolve_relative_url $repo)" ;; + realrepo=$(resolve_relative_url "$repo") || exit + ;; *) # Turn the source into an absolute path if # it is local @@ -246,7 +247,7 @@ cmd_init() # Possibly a url relative to parent case "$url" in ./*|../*) - url="$(resolve_relative_url "$url")" + url=$(resolve_relative_url "$url") || exit ;; esac -- cgit v1.3-5-g9baa From e9656473342e050494c8ea8416fdfdcf52fd1c93 Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Mon, 7 Jul 2008 22:36:40 -0400 Subject: git-submodule - Fix bugs in adding an existing repo as a module git-submodule add would trip if path to the submodule included a space, or if its .git was a gitdir: link to a GIT_DIR kept elsewhere. Fix both. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano --- git-submodule.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 3eb78cc724..099a7d7560 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -167,8 +167,7 @@ cmd_add() # perhaps the path exists and is already a git repo, else clone it if test -e "$path" then - if test -d "$path/.git" && - test "$(unset GIT_DIR; cd $path; git rev-parse --git-dir)" = ".git" + if test -d "$path"/.git -o -f "$path"/.git then echo "Adding existing repo at '$path' to the index" else -- cgit v1.3-5-g9baa From ec05df353c594f2afc6509831d3ce145856b0b89 Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Wed, 9 Jul 2008 21:05:40 -0400 Subject: git-submodule - make "submodule add" more strict, and document it This change makes "submodule add" much more strict in the arguments it takes, and is intended to address confusion as recently noted on the git-list. With this change, the required syntax is: $ git submodule add URL path Specifically, this eliminates the form $ git submodule add URL which was confused by more than one person as $ git submodule add path With this patch, the URL locating the submodule's origin repository can be either an absolute URL, or (if it begins with ./ or ../) can express the submodule's repository location relative to the superproject's origin. This patch also eliminates a third form of URL, which was relative to the superproject's top-level directory (not its repository). Any URL that was neither absolute nor matched ./*|../* was assumed to point to a subdirectory of the superproject as the location of the submodule's origin repository. This URL form was confusing and does not seem to correspond to an important use-case. Specifically, no-one has identified the need to clone from a repository already in the superproject's tree, but if this is needed it is easily done using an absolute URL: $(pwd)/relative-path. So, no functionality is lost with this patch. (t6008-rev-list-submodule.sh did rely upon this relative URL, fixed by using $(pwd).) Following this change, there are exactly four variants of submodule-add, as both arguments have two flavors: URL can be absolute, or can begin with ./|../ and thus names the submodule's origin relative to the superproject's origin. Note: With this patch, "submodule add" discerns an absolute URL as matching /*|*:*: e.g., URL begins with /, or it contains a :. This works for all valid URLs, an absolute path in POSIX, as well as an absolute path on Windows). path can either already exist as a valid git repo, or will be cloned from the given URL. The first form here eases creation of a new submodule in an existing superproject as the submodule can be added and tested in-tree before pushing to the public repository. However, the more usual form is the second, where the repo is cloned from the given URL. This specifically addresses the issue of $ git submodule add a/b/c attempting to clone from a repository at "a/b/c" to create a new module in "c". This also simplifies description of "relative URL" as there is now exactly *one* form: a URL relative to the parent's origin repo. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano --- Documentation/git-submodule.txt | 36 ++++++++++++++++++++------- git-submodule.sh | 55 +++++++++++++++-------------------------- t/t6008-rev-list-submodule.sh | 2 +- 3 files changed, 48 insertions(+), 45 deletions(-) (limited to 'git-submodule.sh') diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index 105fc2dcdc..76702a0a5a 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -9,7 +9,7 @@ git-submodule - Initialize, update or inspect submodules SYNOPSIS -------- [verse] -'git submodule' [--quiet] add [-b branch] [--] [] +'git submodule' [--quiet] add [-b branch] [--] 'git submodule' [--quiet] status [--cached] [--] [...] 'git submodule' [--quiet] init [--] [...] 'git submodule' [--quiet] update [--init] [--] [...] @@ -20,14 +20,31 @@ COMMANDS -------- add:: Add the given repository as a submodule at the given path - to the changeset to be committed next. If path is a valid - repository within the project, it is added as is. Otherwise, - repository is cloned at the specified path. path is added to the - changeset and registered in .gitmodules. If no path is - specified, the path is deduced from the repository specification. - If the repository url begins with ./ or ../, it is stored as - given but resolved as a relative path from the main project's - url when cloning. + to the changeset to be committed next to the current + project: the current project is termed termed the "superproject". ++ +This requires two arguments: and . ++ + is the URL of the new submodule's origin repository. +This may be either an absolute URL, or (if it begins with ./ +or ../), the location relative to the superproject's origin +repository. ++ + is the relative location for the cloned submodule to +exist in the superproject. If does not exist, then the +submodule is created by cloning from the named URL. If does +exist and is already a valid git repository, then this is added +to the changeset without cloning. This second form is provided +to ease creating a new submodule from scratch, and presumes +the user will later push the submodule to the given URL. ++ +In either case, the given URL is recorded into .gitmodules for +use by subsequent users cloning the superproject. If the URL is +given relative to the superproject's repository, the presumption +is the superproject and submodule repositories will be kept +together in the same relative location, and only the +superproject's URL need be provided: git-submodule will correctly +locate the submodule using the relative URL in .gitmodules. status:: Show the status of the submodules. This will print the SHA-1 of the @@ -85,6 +102,7 @@ OPTIONS :: Path to submodule(s). When specified this will restrict the command to only operate on the submodules found at the specified paths. + (This argument is required with add). FILES ----- diff --git a/git-submodule.sh b/git-submodule.sh index 099a7d7560..c2ce2fbe8a 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -5,7 +5,7 @@ # Copyright (c) 2007 Lars Hjemli USAGE="[--quiet] [--cached] \ -[add [-b branch]|status|init|update [-i|--init]|summary [-n|--summary-limit ] []] \ +[add [-b branch] ]|[status|init|update [-i|--init]|summary [-n|--summary-limit ] []] \ [--] [...]" OPTIONS_SPEC= . git-sh-setup @@ -27,18 +27,6 @@ say() fi } -# NEEDSWORK: identical function exists in get_repo_base in clone.sh -get_repo_base() { - ( - cd "`/bin/pwd`" && - cd "$1" || cd "$1.git" && - { - cd .git - pwd - } - ) 2>/dev/null -} - # Resolve relative url by appending to parent's url resolve_relative_url () { @@ -115,7 +103,7 @@ module_clone() # # Add a new submodule to the working tree, .gitmodules and the index # -# $@ = repo [path] +# $@ = repo path # # optional branch is stored in global branch variable # @@ -150,16 +138,27 @@ cmd_add() repo=$1 path=$2 - if test -z "$repo"; then + if test -z "$repo" -o -z "$path"; then usage fi - # Guess path from repo if not specified or strip trailing slashes - if test -z "$path"; then - path=$(echo "$repo" | sed -e 's|/*$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g') - else - path=$(echo "$path" | sed -e 's|/*$||') - fi + # assure repo is absolute or relative to parent + case "$repo" in + ./*|../*) + # dereference source url relative to parent's url + realrepo=$(resolve_relative_url "$repo") || exit + ;; + *:*|/*) + # absolute url + realrepo=$repo + ;; + *) + die "repo URL: '$repo' must be absolute or begin with ./|../" + ;; + esac + + # strip trailing slashes from path + path=$(echo "$path" | sed -e 's|/*$||') git ls-files --error-unmatch "$path" > /dev/null 2>&1 && die "'$path' already exists in the index" @@ -174,20 +173,6 @@ cmd_add() die "'$path' already exists and is not a valid git repo" fi else - case "$repo" in - ./*|../*) - # dereference source url relative to parent's url - realrepo=$(resolve_relative_url "$repo") || exit - ;; - *) - # Turn the source into an absolute path if - # it is local - if base=$(get_repo_base "$repo"); then - repo="$base" - fi - realrepo=$repo - ;; - esac module_clone "$path" "$realrepo" || exit (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || diff --git a/t/t6008-rev-list-submodule.sh b/t/t6008-rev-list-submodule.sh index 88e96fb91b..c4af9ca0a7 100755 --- a/t/t6008-rev-list-submodule.sh +++ b/t/t6008-rev-list-submodule.sh @@ -23,7 +23,7 @@ test_expect_success 'setup' ' : > super-file && git add super-file && - git submodule add . sub && + git submodule add "$(pwd)" sub && git symbolic-ref HEAD refs/heads/super && test_tick && git commit -m super-initial && -- cgit v1.3-5-g9baa From c2f939170c65173076bbd752bb3c764536b3b09b Mon Sep 17 00:00:00 2001 From: Mark Levedahl Date: Wed, 9 Jul 2008 21:05:41 -0400 Subject: git-submodule - register submodule URL if adding in place When adding a new submodule in place, meaning the user created the submodule as a git repo in the superproject's tree first, we don't go through "git submodule init" to register the module. Thus, the submodule's origin repository URL is not stored in .git/config, and no subsequent submodule operation will ever do so. In this case, assume the URL the user supplies to "submodule add" is the one that should be registered, and do so. Signed-off-by: Mark Levedahl Signed-off-by: Junio C Hamano --- git-submodule.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index c2ce2fbe8a..9228f56bee 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -172,6 +172,16 @@ cmd_add() else die "'$path' already exists and is not a valid git repo" fi + + case "$repo" in + ./*|../*) + url=$(resolve_relative_url "$repo") || exit + ;; + *) + url="$repo" + ;; + esac + git config submodule."$path".url "$url" else module_clone "$path" "$realrepo" || exit -- cgit v1.3-5-g9baa From d1f63a37caae19314bbd55c9fe3554d2e53537e7 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Mon, 21 Jul 2008 20:15:59 +0200 Subject: git-submodule: move ill placed shift. When running git submodule update -i, the "-i" is shifted before recursing into cmd_init and then again outside of the loop. This causes some /bin/sh to complain about shifting when there are no arguments left (and would discard anything written after -i too). Signed-off-by: Pierre Habouzit Signed-off-by: Junio C Hamano --- git-submodule.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index 9228f56bee..b40f876a2c 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -264,6 +264,7 @@ cmd_update() do case "$1" in -q|--quiet) + shift quiet=1 ;; -i|--init) @@ -281,7 +282,6 @@ cmd_update() break ;; esac - shift done git ls-files --stage -- "$@" | grep '^160000 ' | -- cgit v1.3-5-g9baa