2007-05-26 17:56:40 +04:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
2012-06-25 14:56:59 +04:00
|
|
|
# git-submodule.sh: add, init, update or list git submodules
|
2007-05-26 17:56:40 +04:00
|
|
|
#
|
|
|
|
# Copyright (c) 2007 Lars Hjemli
|
|
|
|
|
2009-08-19 05:45:19 +04:00
|
|
|
dashless=$(basename "$0" | sed -e 's/-/ /')
|
2012-11-22 01:25:42 +04:00
|
|
|
USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
|
2009-08-19 05:45:24 +04:00
|
|
|
or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
|
2009-08-19 05:45:19 +04:00
|
|
|
or: $dashless [--quiet] init [--] [<path>...]
|
2013-03-05 01:20:24 +04:00
|
|
|
or: $dashless [--quiet] deinit [-f|--force] [--] <path>...
|
2014-03-01 02:41:11 +04:00
|
|
|
or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--reference <repository>] [--recursive] [--] [<path>...]
|
2009-08-28 03:59:25 +04:00
|
|
|
or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
|
2009-08-19 05:45:22 +04:00
|
|
|
or: $dashless [--quiet] foreach [--recursive] <command>
|
2012-10-26 23:44:42 +04:00
|
|
|
or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
|
2007-11-06 12:50:02 +03:00
|
|
|
OPTIONS_SPEC=
|
2013-06-16 18:18:18 +04:00
|
|
|
SUBDIRECTORY_OK=Yes
|
2007-05-26 17:56:40 +04:00
|
|
|
. git-sh-setup
|
2011-05-21 22:43:58 +04:00
|
|
|
. git-sh-i18n
|
2008-08-24 22:46:10 +04:00
|
|
|
. git-parse-remote
|
2007-05-26 17:56:40 +04:00
|
|
|
require_work_tree
|
2013-06-16 18:18:18 +04:00
|
|
|
wt_prefix=$(git rev-parse --show-prefix)
|
|
|
|
cd_to_toplevel
|
2007-05-26 17:56:40 +04:00
|
|
|
|
2015-09-16 20:13:12 +03:00
|
|
|
# Restrict ourselves to a vanilla subset of protocols; the URLs
|
|
|
|
# we get are under control of a remote repository, and we do not
|
|
|
|
# want them kicking off arbitrary git-remote-* programs.
|
|
|
|
#
|
|
|
|
# If the user has already specified a set of allowed protocols,
|
|
|
|
# we assume they know what they're doing and use that instead.
|
|
|
|
: ${GIT_ALLOW_PROTOCOL=file:git:http:https:ssh}
|
|
|
|
export GIT_ALLOW_PROTOCOL
|
|
|
|
|
2008-01-15 13:48:45 +03:00
|
|
|
command=
|
2007-06-25 01:06:07 +04:00
|
|
|
branch=
|
2010-07-17 19:11:43 +04:00
|
|
|
force=
|
2009-05-04 23:30:01 +04:00
|
|
|
reference=
|
2007-05-26 17:56:40 +04:00
|
|
|
cached=
|
2010-04-26 13:50:39 +04:00
|
|
|
recursive=
|
|
|
|
init=
|
2009-08-13 23:32:50 +04:00
|
|
|
files=
|
submodule update: add --remote for submodule's upstream changes
The current `update` command incorporates the superproject's gitlinked
SHA-1 ($sha1) into the submodule HEAD ($subsha1). Depending on the
options you use, it may checkout $sha1, rebase the $subsha1 onto
$sha1, or merge $sha1 into $subsha1. This helps you keep up with
changes in the upstream superproject.
However, it's also useful to stay up to date with changes in the
upstream subproject. Previous workflows for incorporating such
changes include the ungainly:
$ git submodule foreach 'git checkout $(git config --file $toplevel/.gitmodules submodule.$name.branch) && git pull'
With this patch, all of the useful functionality for incorporating
superproject changes can be reused to incorporate upstream subproject
updates. When you specify --remote, the target $sha1 is replaced with
a $sha1 of the submodule's origin/master tracking branch. If you want
to merge a different tracking branch, you can configure the
`submodule.<name>.branch` option in `.gitmodules`. You can override
the `.gitmodules` configuration setting for a particular superproject
by configuring the option in that superproject's default configuration
(using the usual configuration hierarchy, e.g. `.git/config`,
`~/.gitconfig`, etc.).
Previous use of submodule.<name>.branch
=======================================
Because we're adding a new configuration option, it's a good idea to
check if anyone else is already using the option. The foreach-pull
example above was described by Ævar in
commit f030c96d8643fa0a1a9b2bd9c2f36a77721fb61f
Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date: Fri May 21 16:10:10 2010 +0000
git-submodule foreach: Add $toplevel variable
Gerrit uses the same interpretation for the setting, but because
Gerrit has direct access to the subproject repositories, it updates
the superproject repositories automatically when a subproject changes.
Gerrit also accepts the special value '.', which it expands into the
superproject's branch name.
Although the --remote functionality is using `submodule.<name>.branch`
slightly differently, the effect is the same. The foreach-pull
example uses the option to record the name of the local branch to
checkout before pulls. The tracking branch to be pulled is recorded
in `.git/modules/<name>/config`, which was initialized by the module
clone during `submodule add` or `submodule init`. Because the branch
name stored in `submodule.<name>.branch` was likely the same as the
branch name used during the initial `submodule add`, the same branch
will be pulled in each workflow.
Implementation details
======================
In order to ensure a current tracking branch state, `update --remote`
fetches the submodule's remote repository before calculating the
SHA-1. However, I didn't change the logic guarding the existing fetch:
if test -z "$nofetch"
then
# Run fetch only if $sha1 isn't present or it
# is not reachable from a ref.
(clear_local_git_env; cd "$path" &&
( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
test -z "$rev") || git-fetch)) ||
die "$(eval_gettext "Unable to fetch in submodule path '\$path'")"
fi
There will not be a double-fetch, because the new $sha1 determined
after the `--remote` triggered fetch should always exist in the
repository. If it doesn't, it's because some racy process removed it
from the submodule's repository and we *should* be re-fetching.
Signed-off-by: W. Trevor King <wking@tremily.us>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-12-19 20:03:32 +04:00
|
|
|
remote=
|
2009-02-06 01:18:32 +03:00
|
|
|
nofetch=
|
Rename submodule.<name>.rebase to submodule.<name>.update
The addition of "submodule.<name>.rebase" demonstrates the usefulness of
alternatives to the default behaviour of "git submodule update". However,
by naming the config variable "submodule.<name>.rebase", and making it a
boolean choice, we are artificially constraining future git versions that
may want to add _more_ alternatives than just "rebase".
Therefore, while "submodule.<name>.rebase" is not yet in a stable git
release, future-proof it, by changing it from
submodule.<name>.rebase = true/false
to
submodule.<name>.update = rebase/checkout
where "checkout" specifies the default behaviour of "git submodule update"
(checking out the new commit to a detached HEAD), and "rebase" specifies
the --rebase behaviour (where the current local branch in the submodule is
rebase onto the new commit). Thus .update == checkout is equivalent to
.rebase == false, and .update == rebase is equivalent to .rebase == true.
Finally, leaving .update unset is equivalent to leaving .rebase unset.
In future git versions, other alternatives to "git submodule update"
behaviour can be included by adding them to the list of allowable values
for the submodule.<name>.update variable.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-03 10:27:06 +04:00
|
|
|
update=
|
2009-08-19 05:45:22 +04:00
|
|
|
prefix=
|
2012-09-30 03:05:58 +04:00
|
|
|
custom_name=
|
2013-07-03 01:42:56 +04:00
|
|
|
depth=
|
2007-05-26 17:56:40 +04:00
|
|
|
|
2012-06-06 15:57:29 +04:00
|
|
|
# The function takes at most 2 arguments. The first argument is the
|
|
|
|
# URL that navigates to the submodule origin repo. When relative, this URL
|
|
|
|
# is relative to the superproject origin URL repo. The second up_path
|
|
|
|
# argument, if specified, is the relative path that navigates
|
|
|
|
# from the submodule working tree to the superproject working tree.
|
|
|
|
#
|
|
|
|
# The output of the function is the origin URL of the submodule.
|
|
|
|
#
|
|
|
|
# The output will either be an absolute URL or filesystem path (if the
|
|
|
|
# superproject origin URL is an absolute URL or filesystem path,
|
|
|
|
# respectively) or a relative file system path (if the superproject
|
|
|
|
# origin URL is a relative file system path).
|
|
|
|
#
|
|
|
|
# When the output is a relative file system path, the path is either
|
|
|
|
# relative to the submodule working tree, if up_path is specified, or to
|
|
|
|
# the superproject working tree otherwise.
|
2007-09-24 06:19:42 +04:00
|
|
|
resolve_relative_url ()
|
|
|
|
{
|
2008-08-24 22:46:10 +04:00
|
|
|
remote=$(get_default_remote)
|
2008-06-14 21:09:41 +04:00
|
|
|
remoteurl=$(git config "remote.$remote.url") ||
|
2011-06-06 23:58:04 +04:00
|
|
|
remoteurl=$(pwd) # the repository is its own authoritative upstream
|
2007-09-24 06:19:42 +04:00
|
|
|
url="$1"
|
git-submodule.sh - Remove trailing / from URL if found
git clone does not complain if a trailing '/' is included in the origin
URL, but doing so causes resolution of a submodule's URL relative to the
superproject to fail. Trailing /'s are likely when cloning locally using
tab-completion, so the slash may appear in either superproject or
submodule URL. So, ignore the trailing slash if it already exists in
the superproject's URL, and don't record one for the submodule (which
could itself have submodules...).
The problem I'm trying to fix is that a number of folks have
superprojects checked out where the recorded origin URL has a trailing
/, and a submodule has its origin in a directory sitting right next to
the superproject on the server. Thus, we have:
superproject url = server:/public/super
submodoule url = server:/public/sub1
However, in the checked out superproject's .git/config
[remote "origin"]
url = server:/public/super/
and for similar reasons, the submodule has its URL recorded in .gitmodules as
[submodule "sub"]
path = submodule1
url = ../sub1/
resolve_relative_url gets the submodule's recorded url as $1, which
the caller retrieved from .gitmodules, and retrieves the superprojects
origin from .git/config. So in this case resolve_relative_url has
that:
url = ../sub1/
remoteurl = server:/public/super/
So, without any patch, resolve_relative_url computes the submodule's URL as:
server:/public/super/sub1/
rather than
server:/public/sub1
In summary, it is essential that resolve_relative_url strip the
trailing / from the superproject's url before starting, and
beneficial if it assures that the result does not contain
a trailing / as the submodule may itself also be a superproject.
Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-08-22 03:54:01 +04:00
|
|
|
remoteurl=${remoteurl%/}
|
2011-01-10 13:37:26 +03:00
|
|
|
sep=/
|
2012-06-06 15:57:29 +04:00
|
|
|
up_path="$2"
|
|
|
|
|
|
|
|
case "$remoteurl" in
|
|
|
|
*:*|/*)
|
|
|
|
is_relative=
|
|
|
|
;;
|
2012-06-06 15:57:30 +04:00
|
|
|
./*|../*)
|
|
|
|
is_relative=t
|
|
|
|
;;
|
2012-06-06 15:57:29 +04:00
|
|
|
*)
|
|
|
|
is_relative=t
|
2012-06-06 15:57:30 +04:00
|
|
|
remoteurl="./$remoteurl"
|
2012-06-06 15:57:29 +04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2007-09-24 06:19:42 +04:00
|
|
|
while test -n "$url"
|
|
|
|
do
|
|
|
|
case "$url" in
|
|
|
|
../*)
|
|
|
|
url="${url#../}"
|
2011-01-10 13:37:26 +03:00
|
|
|
case "$remoteurl" in
|
|
|
|
*/*)
|
|
|
|
remoteurl="${remoteurl%/*}"
|
|
|
|
;;
|
|
|
|
*:*)
|
|
|
|
remoteurl="${remoteurl%:*}"
|
|
|
|
sep=:
|
|
|
|
;;
|
|
|
|
*)
|
2012-06-06 15:57:30 +04:00
|
|
|
if test -z "$is_relative" || test "." = "$remoteurl"
|
|
|
|
then
|
|
|
|
die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"
|
|
|
|
else
|
|
|
|
remoteurl=.
|
|
|
|
fi
|
2011-01-10 13:37:26 +03:00
|
|
|
;;
|
|
|
|
esac
|
2007-09-24 06:19:42 +04:00
|
|
|
;;
|
|
|
|
./*)
|
|
|
|
url="${url#./}"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break;;
|
|
|
|
esac
|
|
|
|
done
|
2012-06-06 15:57:30 +04:00
|
|
|
remoteurl="$remoteurl$sep${url%/}"
|
|
|
|
echo "${is_relative:+${up_path}}${remoteurl#./}"
|
2007-09-24 06:19:42 +04:00
|
|
|
}
|
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
# Resolve a path to be relative to another path. This is intended for
|
|
|
|
# converting submodule paths when git-submodule is run in a subdirectory
|
|
|
|
# and only handles paths where the directory separator is '/'.
|
|
|
|
#
|
|
|
|
# The output is the first argument as a path relative to the second argument,
|
|
|
|
# which defaults to $wt_prefix if it is omitted.
|
|
|
|
relative_path ()
|
|
|
|
{
|
|
|
|
local target curdir result
|
|
|
|
target=$1
|
|
|
|
curdir=${2-$wt_prefix}
|
|
|
|
curdir=${curdir%/}
|
|
|
|
result=
|
|
|
|
|
|
|
|
while test -n "$curdir"
|
|
|
|
do
|
|
|
|
case "$target" in
|
|
|
|
"$curdir/"*)
|
|
|
|
target=${target#"$curdir"/}
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
result="${result}../"
|
|
|
|
if test "$curdir" = "${curdir%/*}"
|
|
|
|
then
|
|
|
|
curdir=
|
|
|
|
else
|
|
|
|
curdir="${curdir%/*}"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "$result$target"
|
|
|
|
}
|
|
|
|
|
2012-08-15 00:35:27 +04:00
|
|
|
die_if_unmatched ()
|
|
|
|
{
|
|
|
|
if test "$1" = "#unmatched"
|
|
|
|
then
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2012-12-11 22:58:15 +04:00
|
|
|
#
|
|
|
|
# Print a submodule configuration setting
|
|
|
|
#
|
|
|
|
# $1 = submodule name
|
|
|
|
# $2 = option name
|
|
|
|
# $3 = default value
|
|
|
|
#
|
|
|
|
# Checks in the usual git-config places first (for overrides),
|
|
|
|
# otherwise it falls back on .gitmodules. This allows you to
|
|
|
|
# distribute project-wide defaults in .gitmodules, while still
|
|
|
|
# customizing individual repositories if necessary. If the option is
|
|
|
|
# not in .gitmodules either, print a default value.
|
|
|
|
#
|
|
|
|
get_submodule_config () {
|
|
|
|
name="$1"
|
|
|
|
option="$2"
|
|
|
|
default="$3"
|
|
|
|
value=$(git config submodule."$name"."$option")
|
|
|
|
if test -z "$value"
|
|
|
|
then
|
|
|
|
value=$(git config -f .gitmodules submodule."$name"."$option")
|
|
|
|
fi
|
|
|
|
printf '%s' "${value:-$default}"
|
|
|
|
}
|
|
|
|
|
2013-04-01 17:06:27 +04:00
|
|
|
isnumber()
|
|
|
|
{
|
|
|
|
n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1"
|
|
|
|
}
|
|
|
|
|
2016-03-01 01:58:35 +03:00
|
|
|
# Sanitize the local git environment for use within a submodule. We
|
|
|
|
# can't simply use clear_local_git_env since we want to preserve some
|
|
|
|
# of the settings from GIT_CONFIG_PARAMETERS.
|
|
|
|
sanitize_submodule_env()
|
|
|
|
{
|
|
|
|
sanitized_config=$(git submodule--helper sanitize-config)
|
|
|
|
clear_local_git_env
|
|
|
|
GIT_CONFIG_PARAMETERS=$sanitized_config
|
2016-04-28 16:37:44 +03:00
|
|
|
export GIT_CONFIG_PARAMETERS
|
2016-03-01 01:58:35 +03:00
|
|
|
}
|
|
|
|
|
2007-06-25 01:06:07 +04:00
|
|
|
#
|
|
|
|
# Add a new submodule to the working tree, .gitmodules and the index
|
|
|
|
#
|
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 <mlevedahl@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-10 05:05:40 +04:00
|
|
|
# $@ = repo path
|
2007-06-25 01:06:07 +04:00
|
|
|
#
|
|
|
|
# optional branch is stored in global branch variable
|
|
|
|
#
|
2008-01-15 13:35:49 +03:00
|
|
|
cmd_add()
|
2007-06-25 01:06:07 +04:00
|
|
|
{
|
2008-01-15 13:48:45 +03:00
|
|
|
# parse $args after "submodule ... add".
|
2013-06-16 18:18:18 +04:00
|
|
|
reference_path=
|
2008-01-15 13:48:45 +03:00
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
-b | --branch)
|
|
|
|
case "$2" in '') usage ;; esac
|
|
|
|
branch=$2
|
|
|
|
shift
|
|
|
|
;;
|
2010-07-17 19:11:43 +04:00
|
|
|
-f | --force)
|
|
|
|
force=$1
|
|
|
|
;;
|
2008-01-15 13:48:45 +03:00
|
|
|
-q|--quiet)
|
2009-06-17 02:33:00 +04:00
|
|
|
GIT_QUIET=1
|
2008-01-15 13:48:45 +03:00
|
|
|
;;
|
2009-05-04 23:30:01 +04:00
|
|
|
--reference)
|
|
|
|
case "$2" in '') usage ;; esac
|
2013-06-16 18:18:18 +04:00
|
|
|
reference_path=$2
|
2009-05-04 23:30:01 +04:00
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--reference=*)
|
2013-06-16 18:18:18 +04:00
|
|
|
reference_path="${1#--reference=}"
|
2009-05-04 23:30:01 +04:00
|
|
|
;;
|
2012-09-30 03:05:58 +04:00
|
|
|
--name)
|
|
|
|
case "$2" in '') usage ;; esac
|
|
|
|
custom_name=$2
|
|
|
|
shift
|
|
|
|
;;
|
2013-07-03 01:42:56 +04:00
|
|
|
--depth)
|
|
|
|
case "$2" in '') usage ;; esac
|
|
|
|
depth="--depth=$2"
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--depth=*)
|
|
|
|
depth=$1
|
|
|
|
;;
|
2008-01-15 13:48:45 +03:00
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
if test -n "$reference_path"
|
|
|
|
then
|
|
|
|
is_absolute_path "$reference_path" ||
|
|
|
|
reference_path="$wt_prefix$reference_path"
|
|
|
|
|
|
|
|
reference="--reference=$reference_path"
|
|
|
|
fi
|
|
|
|
|
2007-06-25 01:06:07 +04:00
|
|
|
repo=$1
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
sm_path=$2
|
2007-06-25 01:06:07 +04:00
|
|
|
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
if test -z "$sm_path"; then
|
2014-06-10 19:33:39 +04:00
|
|
|
sm_path=$(printf '%s\n' "$repo" |
|
2009-09-22 19:10:12 +04:00
|
|
|
sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
|
|
|
|
fi
|
|
|
|
|
2014-06-10 16:28:33 +04:00
|
|
|
if test -z "$repo" || test -z "$sm_path"; then
|
2007-06-25 01:06:07 +04:00
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
is_absolute_path "$sm_path" || sm_path="$wt_prefix$sm_path"
|
|
|
|
|
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 <mlevedahl@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-10 05:05:40 +04:00
|
|
|
# assure repo is absolute or relative to parent
|
|
|
|
case "$repo" in
|
|
|
|
./*|../*)
|
2013-06-16 18:18:18 +04:00
|
|
|
test -z "$wt_prefix" ||
|
|
|
|
die "$(gettext "Relative path can only be used from the toplevel of the working tree")"
|
|
|
|
|
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 <mlevedahl@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-10 05:05:40 +04:00
|
|
|
# dereference source url relative to parent's url
|
|
|
|
realrepo=$(resolve_relative_url "$repo") || exit
|
|
|
|
;;
|
|
|
|
*:*|/*)
|
|
|
|
# absolute url
|
|
|
|
realrepo=$repo
|
|
|
|
;;
|
|
|
|
*)
|
2011-05-21 22:44:01 +04:00
|
|
|
die "$(eval_gettext "repo URL: '\$repo' must be absolute or begin with ./|../")"
|
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 <mlevedahl@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-07-10 05:05:40 +04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2009-03-03 18:08:21 +03:00
|
|
|
# normalize path:
|
|
|
|
# multiple //; leading ./; /./; /../; trailing /
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
sm_path=$(printf '%s/\n' "$sm_path" |
|
2009-03-03 18:08:21 +03:00
|
|
|
sed -e '
|
|
|
|
s|//*|/|g
|
|
|
|
s|^\(\./\)*||
|
2015-01-30 18:14:03 +03:00
|
|
|
s|/\(\./\)*|/|g
|
2009-03-03 18:08:21 +03:00
|
|
|
:start
|
|
|
|
s|\([^/]*\)/\.\./||
|
|
|
|
tstart
|
|
|
|
s|/*$||
|
|
|
|
')
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
|
|
|
|
die "$(eval_gettext "'\$sm_path' already exists in the index")"
|
2007-06-25 01:06:07 +04:00
|
|
|
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
if test -z "$force" && ! git add --dry-run --ignore-missing "$sm_path" > /dev/null 2>&1
|
2010-07-17 19:11:43 +04:00
|
|
|
then
|
2011-08-07 15:58:17 +04:00
|
|
|
eval_gettextln "The following path is ignored by one of your .gitignore files:
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
\$sm_path
|
2011-08-07 15:58:17 +04:00
|
|
|
Use -f if you really want to add it." >&2
|
2010-07-17 19:11:43 +04:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2012-09-30 03:05:58 +04:00
|
|
|
if test -n "$custom_name"
|
|
|
|
then
|
|
|
|
sm_name="$custom_name"
|
|
|
|
else
|
|
|
|
sm_name="$sm_path"
|
|
|
|
fi
|
|
|
|
|
2008-03-05 04:15:02 +03:00
|
|
|
# perhaps the path exists and is already a git repo, else clone it
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
if test -e "$sm_path"
|
2008-03-05 04:15:02 +03:00
|
|
|
then
|
2014-06-10 16:28:33 +04:00
|
|
|
if test -d "$sm_path"/.git || test -f "$sm_path"/.git
|
2008-03-05 04:15:02 +03:00
|
|
|
then
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
eval_gettextln "Adding existing repo at '\$sm_path' to the index"
|
2008-03-05 04:15:02 +03:00
|
|
|
else
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
die "$(eval_gettext "'\$sm_path' already exists and is not a valid git repo")"
|
2008-03-05 04:15:02 +03:00
|
|
|
fi
|
2008-07-10 05:05:41 +04:00
|
|
|
|
2008-03-05 04:15:02 +03:00
|
|
|
else
|
2012-10-01 01:01:29 +04:00
|
|
|
if test -d ".git/modules/$sm_name"
|
|
|
|
then
|
|
|
|
if test -z "$force"
|
|
|
|
then
|
|
|
|
echo >&2 "$(eval_gettext "A git directory for '\$sm_name' is found locally with remote(s):")"
|
|
|
|
GIT_DIR=".git/modules/$sm_name" GIT_WORK_TREE=. git remote -v | grep '(fetch)' | sed -e s,^," ", -e s,' (fetch)',, >&2
|
|
|
|
echo >&2 "$(eval_gettext "If you want to reuse this local git directory instead of cloning again from")"
|
|
|
|
echo >&2 " $realrepo"
|
|
|
|
echo >&2 "$(eval_gettext "use the '--force' option. If the local git directory is not the correct repo")"
|
|
|
|
die "$(eval_gettext "or you are unsure what this means choose another name with the '--name' option.")"
|
|
|
|
else
|
|
|
|
echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")"
|
|
|
|
fi
|
|
|
|
fi
|
2016-03-01 01:58:30 +03:00
|
|
|
git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" ${reference:+"$reference"} ${depth:+"$depth"} || exit
|
2014-04-03 01:15:36 +04:00
|
|
|
(
|
2016-03-01 01:58:35 +03:00
|
|
|
sanitize_submodule_env
|
2014-04-03 01:15:36 +04:00
|
|
|
cd "$sm_path" &&
|
|
|
|
# ash fails to wordsplit ${branch:+-b "$branch"...}
|
|
|
|
case "$branch" in
|
|
|
|
'') git checkout -f -q ;;
|
|
|
|
?*) git checkout -f -q -B "$branch" "origin/$branch" ;;
|
|
|
|
esac
|
|
|
|
) || die "$(eval_gettext "Unable to checkout submodule '\$sm_path'")"
|
2008-03-05 04:15:02 +03:00
|
|
|
fi
|
2012-09-30 03:05:58 +04:00
|
|
|
git config submodule."$sm_name".url "$realrepo"
|
2008-03-05 04:15:02 +03:00
|
|
|
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
git add $force "$sm_path" ||
|
|
|
|
die "$(eval_gettext "Failed to add submodule '\$sm_path'")"
|
2007-06-25 01:06:07 +04:00
|
|
|
|
2012-09-30 03:05:58 +04:00
|
|
|
git config -f .gitmodules submodule."$sm_name".path "$sm_path" &&
|
|
|
|
git config -f .gitmodules submodule."$sm_name".url "$repo" &&
|
2012-12-19 20:03:33 +04:00
|
|
|
if test -n "$branch"
|
|
|
|
then
|
|
|
|
git config -f .gitmodules submodule."$sm_name".branch "$branch"
|
|
|
|
fi &&
|
2010-07-05 21:33:03 +04:00
|
|
|
git add --force .gitmodules ||
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
die "$(eval_gettext "Failed to register submodule '\$sm_path'")"
|
2007-06-25 01:06:07 +04:00
|
|
|
}
|
|
|
|
|
2008-08-11 03:10:04 +04:00
|
|
|
#
|
|
|
|
# Execute an arbitrary command sequence in each checked out
|
|
|
|
# submodule
|
|
|
|
#
|
|
|
|
# $@ = command to execute
|
|
|
|
#
|
|
|
|
cmd_foreach()
|
|
|
|
{
|
2009-08-19 05:45:19 +04:00
|
|
|
# parse $args after "submodule ... foreach".
|
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
-q|--quiet)
|
|
|
|
GIT_QUIET=1
|
|
|
|
;;
|
2009-08-19 05:45:22 +04:00
|
|
|
--recursive)
|
|
|
|
recursive=1
|
|
|
|
;;
|
2009-08-19 05:45:19 +04:00
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
2010-05-21 20:10:10 +04:00
|
|
|
toplevel=$(pwd)
|
|
|
|
|
2011-06-30 04:34:58 +04:00
|
|
|
# dup stdin so that it can be restored when running the external
|
|
|
|
# command in the subshell (and a recursive call to this function)
|
|
|
|
exec 3<&0
|
|
|
|
|
2015-09-03 00:42:24 +03:00
|
|
|
git submodule--helper list --prefix "$wt_prefix"|
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
while read mode sha1 stage sm_path
|
2008-08-11 03:10:04 +04:00
|
|
|
do
|
2012-08-15 00:35:27 +04:00
|
|
|
die_if_unmatched "$mode"
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
if test -e "$sm_path"/.git
|
2008-08-11 03:10:04 +04:00
|
|
|
then
|
2013-06-16 18:18:18 +04:00
|
|
|
displaypath=$(relative_path "$sm_path")
|
|
|
|
say "$(eval_gettext "Entering '\$prefix\$displaypath'")"
|
2015-09-03 00:42:25 +03:00
|
|
|
name=$(git submodule--helper name "$sm_path")
|
2009-08-19 05:45:22 +04:00
|
|
|
(
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
prefix="$prefix$sm_path/"
|
2016-03-01 01:58:35 +03:00
|
|
|
sanitize_submodule_env
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
cd "$sm_path" &&
|
2013-06-16 18:18:18 +04:00
|
|
|
sm_path=$(relative_path "$sm_path") &&
|
|
|
|
# we make $path available to scripts ...
|
|
|
|
path=$sm_path &&
|
2013-09-27 14:23:55 +04:00
|
|
|
if test $# -eq 1
|
|
|
|
then
|
|
|
|
eval "$1"
|
|
|
|
else
|
|
|
|
"$@"
|
|
|
|
fi &&
|
2009-08-19 05:45:22 +04:00
|
|
|
if test -n "$recursive"
|
|
|
|
then
|
|
|
|
cmd_foreach "--recursive" "$@"
|
|
|
|
fi
|
2011-06-30 04:34:58 +04:00
|
|
|
) <&3 3<&- ||
|
2013-06-16 18:18:18 +04:00
|
|
|
die "$(eval_gettext "Stopping at '\$prefix\$displaypath'; script returned non-zero status.")"
|
2008-08-11 03:10:04 +04:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2007-05-26 17:56:40 +04:00
|
|
|
#
|
2007-06-06 13:13:02 +04:00
|
|
|
# Register submodules in .git/config
|
2007-05-26 17:56:40 +04:00
|
|
|
#
|
|
|
|
# $@ = requested paths (default to all)
|
|
|
|
#
|
2008-01-15 13:35:49 +03:00
|
|
|
cmd_init()
|
2007-05-26 17:56:40 +04:00
|
|
|
{
|
2008-01-15 13:48:45 +03:00
|
|
|
# parse $args after "submodule ... init".
|
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
-q|--quiet)
|
2009-06-17 02:33:00 +04:00
|
|
|
GIT_QUIET=1
|
2008-01-15 13:48:45 +03:00
|
|
|
;;
|
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
2015-09-03 00:42:24 +03:00
|
|
|
git submodule--helper list --prefix "$wt_prefix" "$@" |
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
while read mode sha1 stage sm_path
|
2007-05-26 17:56:40 +04:00
|
|
|
do
|
2012-08-15 00:35:27 +04:00
|
|
|
die_if_unmatched "$mode"
|
2015-09-03 00:42:25 +03:00
|
|
|
name=$(git submodule--helper name "$sm_path") || exit
|
2012-05-28 23:46:58 +04:00
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
displaypath=$(relative_path "$sm_path")
|
|
|
|
|
2012-05-28 23:46:58 +04:00
|
|
|
# Copy url setting when it is not set yet
|
2011-06-26 03:26:02 +04:00
|
|
|
if test -z "$(git config "submodule.$name.url")"
|
|
|
|
then
|
|
|
|
url=$(git config -f .gitmodules submodule."$name".url)
|
|
|
|
test -z "$url" &&
|
2013-06-16 18:18:18 +04:00
|
|
|
die "$(eval_gettext "No url found for submodule path '\$displaypath' in .gitmodules")"
|
2011-06-26 03:26:02 +04:00
|
|
|
|
|
|
|
# Possibly a url relative to parent
|
|
|
|
case "$url" in
|
|
|
|
./*|../*)
|
|
|
|
url=$(resolve_relative_url "$url") || exit
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
git config submodule."$name".url "$url" ||
|
2013-06-16 18:18:18 +04:00
|
|
|
die "$(eval_gettext "Failed to register url for submodule path '\$displaypath'")"
|
2012-05-28 23:46:58 +04:00
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$displaypath'")"
|
2011-06-26 03:26:02 +04:00
|
|
|
fi
|
2007-05-26 17:56:40 +04:00
|
|
|
|
2011-06-26 03:26:02 +04:00
|
|
|
# Copy "update" setting when it is not set yet
|
2013-12-03 01:31:55 +04:00
|
|
|
if upd="$(git config -f .gitmodules submodule."$name".update)" &&
|
|
|
|
test -n "$upd" &&
|
|
|
|
test -z "$(git config submodule."$name".update)"
|
|
|
|
then
|
|
|
|
case "$upd" in
|
2014-01-05 06:50:48 +04:00
|
|
|
checkout | rebase | merge | none)
|
2013-12-03 01:31:55 +04:00
|
|
|
;; # known modes of updating
|
|
|
|
*)
|
|
|
|
echo >&2 "warning: unknown update mode '$upd' suggested for submodule '$name'"
|
|
|
|
upd=none
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
git config submodule."$name".update "$upd" ||
|
|
|
|
die "$(eval_gettext "Failed to register update mode for submodule path '\$displaypath'")"
|
|
|
|
fi
|
2007-05-26 17:56:40 +04:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2013-03-05 01:20:24 +04:00
|
|
|
#
|
|
|
|
# Unregister submodules from .git/config and remove their work tree
|
|
|
|
#
|
|
|
|
# $@ = requested paths (use '.' to deinit all submodules)
|
|
|
|
#
|
|
|
|
cmd_deinit()
|
|
|
|
{
|
|
|
|
# parse $args after "submodule ... deinit".
|
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
-f|--force)
|
|
|
|
force=$1
|
|
|
|
;;
|
|
|
|
-q|--quiet)
|
|
|
|
GIT_QUIET=1
|
|
|
|
;;
|
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
|
|
|
if test $# = 0
|
|
|
|
then
|
|
|
|
die "$(eval_gettext "Use '.' if you really want to deinitialize all submodules")"
|
|
|
|
fi
|
|
|
|
|
2015-09-03 00:42:24 +03:00
|
|
|
git submodule--helper list --prefix "$wt_prefix" "$@" |
|
2013-03-05 01:20:24 +04:00
|
|
|
while read mode sha1 stage sm_path
|
|
|
|
do
|
|
|
|
die_if_unmatched "$mode"
|
2015-09-03 00:42:25 +03:00
|
|
|
name=$(git submodule--helper name "$sm_path") || exit
|
2013-03-05 01:20:24 +04:00
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
displaypath=$(relative_path "$sm_path")
|
|
|
|
|
2013-03-05 01:20:24 +04:00
|
|
|
# Remove the submodule work tree (unless the user already did it)
|
|
|
|
if test -d "$sm_path"
|
|
|
|
then
|
|
|
|
# Protect submodules containing a .git directory
|
|
|
|
if test -d "$sm_path/.git"
|
|
|
|
then
|
2013-06-16 18:18:18 +04:00
|
|
|
echo >&2 "$(eval_gettext "Submodule work tree '\$displaypath' contains a .git directory")"
|
2013-03-05 01:20:24 +04:00
|
|
|
die "$(eval_gettext "(use 'rm -rf' if you really want to remove it including all of its history)")"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if test -z "$force"
|
|
|
|
then
|
2013-04-01 23:02:00 +04:00
|
|
|
git rm -qn "$sm_path" ||
|
2013-06-16 18:18:18 +04:00
|
|
|
die "$(eval_gettext "Submodule work tree '\$displaypath' contains local modifications; use '-f' to discard them")"
|
2013-03-05 01:20:24 +04:00
|
|
|
fi
|
2013-04-01 23:02:00 +04:00
|
|
|
rm -rf "$sm_path" &&
|
2013-06-16 18:18:18 +04:00
|
|
|
say "$(eval_gettext "Cleared directory '\$displaypath'")" ||
|
|
|
|
say "$(eval_gettext "Could not remove submodule work tree '\$displaypath'")"
|
2013-03-05 01:20:24 +04:00
|
|
|
fi
|
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
mkdir "$sm_path" || say "$(eval_gettext "Could not create empty submodule directory '\$displaypath'")"
|
2013-03-05 01:20:24 +04:00
|
|
|
|
|
|
|
# Remove the .git/config entries (unless the user already did it)
|
|
|
|
if test -n "$(git config --get-regexp submodule."$name\.")"
|
|
|
|
then
|
|
|
|
# Remove the whole section so we have a clean state when
|
|
|
|
# the user later decides to init this submodule again
|
|
|
|
url=$(git config submodule."$name".url)
|
|
|
|
git config --remove-section submodule."$name" 2>/dev/null &&
|
2013-06-16 18:18:18 +04:00
|
|
|
say "$(eval_gettext "Submodule '\$name' (\$url) unregistered for path '\$displaypath'")"
|
2013-03-05 01:20:24 +04:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2007-05-26 17:56:40 +04:00
|
|
|
#
|
2007-06-06 13:13:02 +04:00
|
|
|
# Update each submodule path to correct revision, using clone and checkout as needed
|
2007-05-26 17:56:40 +04:00
|
|
|
#
|
|
|
|
# $@ = requested paths (default to all)
|
|
|
|
#
|
2008-01-15 13:35:49 +03:00
|
|
|
cmd_update()
|
2007-05-26 17:56:40 +04:00
|
|
|
{
|
2008-01-15 13:48:45 +03:00
|
|
|
# parse $args after "submodule ... update".
|
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
-q|--quiet)
|
2009-06-17 02:33:00 +04:00
|
|
|
GIT_QUIET=1
|
2008-01-15 13:48:45 +03:00
|
|
|
;;
|
2008-05-16 14:23:03 +04:00
|
|
|
-i|--init)
|
2009-05-04 23:30:01 +04:00
|
|
|
init=1
|
2008-05-16 14:23:03 +04:00
|
|
|
;;
|
submodule update: add --remote for submodule's upstream changes
The current `update` command incorporates the superproject's gitlinked
SHA-1 ($sha1) into the submodule HEAD ($subsha1). Depending on the
options you use, it may checkout $sha1, rebase the $subsha1 onto
$sha1, or merge $sha1 into $subsha1. This helps you keep up with
changes in the upstream superproject.
However, it's also useful to stay up to date with changes in the
upstream subproject. Previous workflows for incorporating such
changes include the ungainly:
$ git submodule foreach 'git checkout $(git config --file $toplevel/.gitmodules submodule.$name.branch) && git pull'
With this patch, all of the useful functionality for incorporating
superproject changes can be reused to incorporate upstream subproject
updates. When you specify --remote, the target $sha1 is replaced with
a $sha1 of the submodule's origin/master tracking branch. If you want
to merge a different tracking branch, you can configure the
`submodule.<name>.branch` option in `.gitmodules`. You can override
the `.gitmodules` configuration setting for a particular superproject
by configuring the option in that superproject's default configuration
(using the usual configuration hierarchy, e.g. `.git/config`,
`~/.gitconfig`, etc.).
Previous use of submodule.<name>.branch
=======================================
Because we're adding a new configuration option, it's a good idea to
check if anyone else is already using the option. The foreach-pull
example above was described by Ævar in
commit f030c96d8643fa0a1a9b2bd9c2f36a77721fb61f
Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date: Fri May 21 16:10:10 2010 +0000
git-submodule foreach: Add $toplevel variable
Gerrit uses the same interpretation for the setting, but because
Gerrit has direct access to the subproject repositories, it updates
the superproject repositories automatically when a subproject changes.
Gerrit also accepts the special value '.', which it expands into the
superproject's branch name.
Although the --remote functionality is using `submodule.<name>.branch`
slightly differently, the effect is the same. The foreach-pull
example uses the option to record the name of the local branch to
checkout before pulls. The tracking branch to be pulled is recorded
in `.git/modules/<name>/config`, which was initialized by the module
clone during `submodule add` or `submodule init`. Because the branch
name stored in `submodule.<name>.branch` was likely the same as the
branch name used during the initial `submodule add`, the same branch
will be pulled in each workflow.
Implementation details
======================
In order to ensure a current tracking branch state, `update --remote`
fetches the submodule's remote repository before calculating the
SHA-1. However, I didn't change the logic guarding the existing fetch:
if test -z "$nofetch"
then
# Run fetch only if $sha1 isn't present or it
# is not reachable from a ref.
(clear_local_git_env; cd "$path" &&
( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
test -z "$rev") || git-fetch)) ||
die "$(eval_gettext "Unable to fetch in submodule path '\$path'")"
fi
There will not be a double-fetch, because the new $sha1 determined
after the `--remote` triggered fetch should always exist in the
repository. If it doesn't, it's because some racy process removed it
from the submodule's repository and we *should* be re-fetching.
Signed-off-by: W. Trevor King <wking@tremily.us>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-12-19 20:03:32 +04:00
|
|
|
--remote)
|
|
|
|
remote=1
|
|
|
|
;;
|
2009-02-06 01:18:32 +03:00
|
|
|
-N|--no-fetch)
|
|
|
|
nofetch=1
|
|
|
|
;;
|
2011-04-01 13:42:03 +04:00
|
|
|
-f|--force)
|
|
|
|
force=$1
|
|
|
|
;;
|
2009-04-24 03:06:38 +04:00
|
|
|
-r|--rebase)
|
Rename submodule.<name>.rebase to submodule.<name>.update
The addition of "submodule.<name>.rebase" demonstrates the usefulness of
alternatives to the default behaviour of "git submodule update". However,
by naming the config variable "submodule.<name>.rebase", and making it a
boolean choice, we are artificially constraining future git versions that
may want to add _more_ alternatives than just "rebase".
Therefore, while "submodule.<name>.rebase" is not yet in a stable git
release, future-proof it, by changing it from
submodule.<name>.rebase = true/false
to
submodule.<name>.update = rebase/checkout
where "checkout" specifies the default behaviour of "git submodule update"
(checking out the new commit to a detached HEAD), and "rebase" specifies
the --rebase behaviour (where the current local branch in the submodule is
rebase onto the new commit). Thus .update == checkout is equivalent to
.rebase == false, and .update == rebase is equivalent to .rebase == true.
Finally, leaving .update unset is equivalent to leaving .rebase unset.
In future git versions, other alternatives to "git submodule update"
behaviour can be included by adding them to the list of allowable values
for the submodule.<name>.update variable.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-03 10:27:06 +04:00
|
|
|
update="rebase"
|
2009-04-24 03:06:38 +04:00
|
|
|
;;
|
2009-05-04 23:30:01 +04:00
|
|
|
--reference)
|
|
|
|
case "$2" in '') usage ;; esac
|
|
|
|
reference="--reference=$2"
|
2010-11-03 09:26:25 +03:00
|
|
|
shift
|
2009-05-04 23:30:01 +04:00
|
|
|
;;
|
|
|
|
--reference=*)
|
|
|
|
reference="$1"
|
|
|
|
;;
|
2009-06-03 02:59:12 +04:00
|
|
|
-m|--merge)
|
|
|
|
update="merge"
|
|
|
|
;;
|
2009-08-19 05:45:23 +04:00
|
|
|
--recursive)
|
|
|
|
recursive=1
|
|
|
|
;;
|
2011-10-11 02:56:16 +04:00
|
|
|
--checkout)
|
|
|
|
update="checkout"
|
|
|
|
;;
|
2013-07-03 01:42:56 +04:00
|
|
|
--depth)
|
|
|
|
case "$2" in '') usage ;; esac
|
|
|
|
depth="--depth=$2"
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--depth=*)
|
|
|
|
depth=$1
|
|
|
|
;;
|
2008-01-15 13:48:45 +03:00
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
2010-11-03 09:26:25 +03:00
|
|
|
shift
|
2008-01-15 13:48:45 +03:00
|
|
|
done
|
|
|
|
|
2009-05-04 23:30:01 +04:00
|
|
|
if test -n "$init"
|
|
|
|
then
|
|
|
|
cmd_init "--" "$@" || return
|
|
|
|
fi
|
|
|
|
|
2011-02-17 19:18:45 +03:00
|
|
|
cloned_modules=
|
2015-09-03 00:42:24 +03:00
|
|
|
git submodule--helper list --prefix "$wt_prefix" "$@" | {
|
2011-06-13 21:15:26 +04:00
|
|
|
err=
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
while read mode sha1 stage sm_path
|
2007-05-26 17:56:40 +04:00
|
|
|
do
|
2012-08-15 00:35:27 +04:00
|
|
|
die_if_unmatched "$mode"
|
submodule: process conflicting submodules only once
During a merge module_list returns conflicting submodules several times
(stage 1,2,3) which caused the submodules to be used multiple times in
git submodule init, sync, update and status command.
There are 5 callers of module_list; they all read (mode, sha1, stage,
path) tuple, and most of them care only about path. As a first level
approximation, it should be Ok (in the sense that it does not make things
worse than it currently is) to filter the duplicate paths from module_list
output, but some callers should change their behaviour when the merge in
the superproject still has conflicts.
Notice the higher-stage entries, and emit only one record from
module_list, but while doing so, mark the entry with "U" (not [0-3]) in
the $stage field and null out the SHA-1 part, as the object name for the
lowest stage does not give any useful information to the caller, and this
way any caller that uses the object name would hopefully barf. Then
update the codepaths for each subcommands this way:
- "update" should not touch the submodule repository, because we do not
know what commit should be checked out yet.
- "status" reports the conflicting submodules as 'U000...000' and does
not recurse into them (we might later want to make it recurse).
- The command called by "foreach" may want to do whatever it wants to do
by noticing the merged status in the superproject itself, so feed the
path to it from module_list as before, but only once per submodule.
- "init" and "sync" are unlikely things to do while the superproject is
still not merged, but as long as a submodule is there in $path, there
is no point skipping it. It might however want to take the merged
status of .gitmodules into account, but that is outside of the scope of
this topic.
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Thanks-to: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Nicolas Morey-Chaisemartin <nicolas@morey-chaisemartin.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-30 09:20:02 +04:00
|
|
|
if test "$stage" = U
|
|
|
|
then
|
2013-03-02 23:44:59 +04:00
|
|
|
echo >&2 "Skipping unmerged submodule $prefix$sm_path"
|
submodule: process conflicting submodules only once
During a merge module_list returns conflicting submodules several times
(stage 1,2,3) which caused the submodules to be used multiple times in
git submodule init, sync, update and status command.
There are 5 callers of module_list; they all read (mode, sha1, stage,
path) tuple, and most of them care only about path. As a first level
approximation, it should be Ok (in the sense that it does not make things
worse than it currently is) to filter the duplicate paths from module_list
output, but some callers should change their behaviour when the merge in
the superproject still has conflicts.
Notice the higher-stage entries, and emit only one record from
module_list, but while doing so, mark the entry with "U" (not [0-3]) in
the $stage field and null out the SHA-1 part, as the object name for the
lowest stage does not give any useful information to the caller, and this
way any caller that uses the object name would hopefully barf. Then
update the codepaths for each subcommands this way:
- "update" should not touch the submodule repository, because we do not
know what commit should be checked out yet.
- "status" reports the conflicting submodules as 'U000...000' and does
not recurse into them (we might later want to make it recurse).
- The command called by "foreach" may want to do whatever it wants to do
by noticing the merged status in the superproject itself, so feed the
path to it from module_list as before, but only once per submodule.
- "init" and "sync" are unlikely things to do while the superproject is
still not merged, but as long as a submodule is there in $path, there
is no point skipping it. It might however want to take the merged
status of .gitmodules into account, but that is outside of the scope of
this topic.
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Thanks-to: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Nicolas Morey-Chaisemartin <nicolas@morey-chaisemartin.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-30 09:20:02 +04:00
|
|
|
continue
|
|
|
|
fi
|
2015-09-03 00:42:25 +03:00
|
|
|
name=$(git submodule--helper name "$sm_path") || exit
|
2007-07-03 09:52:14 +04:00
|
|
|
url=$(git config submodule."$name".url)
|
2014-04-03 01:15:36 +04:00
|
|
|
branch=$(get_submodule_config "$name" branch master)
|
2011-10-11 02:56:16 +04:00
|
|
|
if ! test -z "$update"
|
|
|
|
then
|
|
|
|
update_module=$update
|
|
|
|
else
|
|
|
|
update_module=$(git config submodule."$name".update)
|
2014-01-16 08:10:22 +04:00
|
|
|
if test -z "$update_module"
|
|
|
|
then
|
|
|
|
update_module="checkout"
|
|
|
|
fi
|
2011-10-11 02:56:16 +04:00
|
|
|
fi
|
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
displaypath=$(relative_path "$prefix$sm_path")
|
|
|
|
|
2014-04-03 01:15:36 +04:00
|
|
|
if test "$update_module" = "none"
|
|
|
|
then
|
2013-06-16 18:18:18 +04:00
|
|
|
echo "Skipping submodule '$displaypath'"
|
2011-10-11 02:56:16 +04:00
|
|
|
continue
|
2014-04-03 01:15:36 +04:00
|
|
|
fi
|
2011-10-11 02:56:16 +04:00
|
|
|
|
2007-06-06 13:13:02 +04:00
|
|
|
if test -z "$url"
|
2007-05-26 17:56:40 +04:00
|
|
|
then
|
|
|
|
# Only mention uninitialized submodules when its
|
|
|
|
# path have been specified
|
|
|
|
test "$#" != "0" &&
|
2013-06-16 18:18:18 +04:00
|
|
|
say "$(eval_gettext "Submodule path '\$displaypath' not initialized
|
2011-05-21 22:44:08 +04:00
|
|
|
Maybe you want to use 'update --init'?")"
|
2007-06-06 13:13:02 +04:00
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
2014-06-10 16:28:33 +04:00
|
|
|
if ! test -d "$sm_path"/.git && ! test -f "$sm_path"/.git
|
2007-06-06 13:13:02 +04:00
|
|
|
then
|
2016-03-01 01:58:30 +03:00
|
|
|
git submodule--helper clone ${GIT_QUIET:+--quiet} --prefix "$prefix" --path "$sm_path" --name "$name" --url "$url" ${reference:+"$reference"} ${depth:+"$depth"} || exit
|
2011-02-17 19:18:45 +03:00
|
|
|
cloned_modules="$cloned_modules;$name"
|
2007-06-11 23:12:22 +04:00
|
|
|
subsha1=
|
|
|
|
else
|
2016-03-01 01:58:35 +03:00
|
|
|
subsha1=$(sanitize_submodule_env; cd "$sm_path" &&
|
2007-07-03 09:52:14 +04:00
|
|
|
git rev-parse --verify HEAD) ||
|
2013-06-16 18:18:18 +04:00
|
|
|
die "$(eval_gettext "Unable to find current revision in submodule path '\$displaypath'")"
|
2007-05-26 17:56:40 +04:00
|
|
|
fi
|
2007-06-06 13:13:02 +04:00
|
|
|
|
submodule update: add --remote for submodule's upstream changes
The current `update` command incorporates the superproject's gitlinked
SHA-1 ($sha1) into the submodule HEAD ($subsha1). Depending on the
options you use, it may checkout $sha1, rebase the $subsha1 onto
$sha1, or merge $sha1 into $subsha1. This helps you keep up with
changes in the upstream superproject.
However, it's also useful to stay up to date with changes in the
upstream subproject. Previous workflows for incorporating such
changes include the ungainly:
$ git submodule foreach 'git checkout $(git config --file $toplevel/.gitmodules submodule.$name.branch) && git pull'
With this patch, all of the useful functionality for incorporating
superproject changes can be reused to incorporate upstream subproject
updates. When you specify --remote, the target $sha1 is replaced with
a $sha1 of the submodule's origin/master tracking branch. If you want
to merge a different tracking branch, you can configure the
`submodule.<name>.branch` option in `.gitmodules`. You can override
the `.gitmodules` configuration setting for a particular superproject
by configuring the option in that superproject's default configuration
(using the usual configuration hierarchy, e.g. `.git/config`,
`~/.gitconfig`, etc.).
Previous use of submodule.<name>.branch
=======================================
Because we're adding a new configuration option, it's a good idea to
check if anyone else is already using the option. The foreach-pull
example above was described by Ævar in
commit f030c96d8643fa0a1a9b2bd9c2f36a77721fb61f
Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date: Fri May 21 16:10:10 2010 +0000
git-submodule foreach: Add $toplevel variable
Gerrit uses the same interpretation for the setting, but because
Gerrit has direct access to the subproject repositories, it updates
the superproject repositories automatically when a subproject changes.
Gerrit also accepts the special value '.', which it expands into the
superproject's branch name.
Although the --remote functionality is using `submodule.<name>.branch`
slightly differently, the effect is the same. The foreach-pull
example uses the option to record the name of the local branch to
checkout before pulls. The tracking branch to be pulled is recorded
in `.git/modules/<name>/config`, which was initialized by the module
clone during `submodule add` or `submodule init`. Because the branch
name stored in `submodule.<name>.branch` was likely the same as the
branch name used during the initial `submodule add`, the same branch
will be pulled in each workflow.
Implementation details
======================
In order to ensure a current tracking branch state, `update --remote`
fetches the submodule's remote repository before calculating the
SHA-1. However, I didn't change the logic guarding the existing fetch:
if test -z "$nofetch"
then
# Run fetch only if $sha1 isn't present or it
# is not reachable from a ref.
(clear_local_git_env; cd "$path" &&
( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
test -z "$rev") || git-fetch)) ||
die "$(eval_gettext "Unable to fetch in submodule path '\$path'")"
fi
There will not be a double-fetch, because the new $sha1 determined
after the `--remote` triggered fetch should always exist in the
repository. If it doesn't, it's because some racy process removed it
from the submodule's repository and we *should* be re-fetching.
Signed-off-by: W. Trevor King <wking@tremily.us>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-12-19 20:03:32 +04:00
|
|
|
if test -n "$remote"
|
|
|
|
then
|
|
|
|
if test -z "$nofetch"
|
|
|
|
then
|
|
|
|
# Fetch remote before determining tracking $sha1
|
2016-03-01 01:58:35 +03:00
|
|
|
(sanitize_submodule_env; cd "$sm_path" && git-fetch) ||
|
submodule update: add --remote for submodule's upstream changes
The current `update` command incorporates the superproject's gitlinked
SHA-1 ($sha1) into the submodule HEAD ($subsha1). Depending on the
options you use, it may checkout $sha1, rebase the $subsha1 onto
$sha1, or merge $sha1 into $subsha1. This helps you keep up with
changes in the upstream superproject.
However, it's also useful to stay up to date with changes in the
upstream subproject. Previous workflows for incorporating such
changes include the ungainly:
$ git submodule foreach 'git checkout $(git config --file $toplevel/.gitmodules submodule.$name.branch) && git pull'
With this patch, all of the useful functionality for incorporating
superproject changes can be reused to incorporate upstream subproject
updates. When you specify --remote, the target $sha1 is replaced with
a $sha1 of the submodule's origin/master tracking branch. If you want
to merge a different tracking branch, you can configure the
`submodule.<name>.branch` option in `.gitmodules`. You can override
the `.gitmodules` configuration setting for a particular superproject
by configuring the option in that superproject's default configuration
(using the usual configuration hierarchy, e.g. `.git/config`,
`~/.gitconfig`, etc.).
Previous use of submodule.<name>.branch
=======================================
Because we're adding a new configuration option, it's a good idea to
check if anyone else is already using the option. The foreach-pull
example above was described by Ævar in
commit f030c96d8643fa0a1a9b2bd9c2f36a77721fb61f
Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date: Fri May 21 16:10:10 2010 +0000
git-submodule foreach: Add $toplevel variable
Gerrit uses the same interpretation for the setting, but because
Gerrit has direct access to the subproject repositories, it updates
the superproject repositories automatically when a subproject changes.
Gerrit also accepts the special value '.', which it expands into the
superproject's branch name.
Although the --remote functionality is using `submodule.<name>.branch`
slightly differently, the effect is the same. The foreach-pull
example uses the option to record the name of the local branch to
checkout before pulls. The tracking branch to be pulled is recorded
in `.git/modules/<name>/config`, which was initialized by the module
clone during `submodule add` or `submodule init`. Because the branch
name stored in `submodule.<name>.branch` was likely the same as the
branch name used during the initial `submodule add`, the same branch
will be pulled in each workflow.
Implementation details
======================
In order to ensure a current tracking branch state, `update --remote`
fetches the submodule's remote repository before calculating the
SHA-1. However, I didn't change the logic guarding the existing fetch:
if test -z "$nofetch"
then
# Run fetch only if $sha1 isn't present or it
# is not reachable from a ref.
(clear_local_git_env; cd "$path" &&
( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
test -z "$rev") || git-fetch)) ||
die "$(eval_gettext "Unable to fetch in submodule path '\$path'")"
fi
There will not be a double-fetch, because the new $sha1 determined
after the `--remote` triggered fetch should always exist in the
repository. If it doesn't, it's because some racy process removed it
from the submodule's repository and we *should* be re-fetching.
Signed-off-by: W. Trevor King <wking@tremily.us>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-12-19 20:03:32 +04:00
|
|
|
die "$(eval_gettext "Unable to fetch in submodule path '\$sm_path'")"
|
|
|
|
fi
|
2016-03-01 01:58:35 +03:00
|
|
|
remote_name=$(sanitize_submodule_env; cd "$sm_path" && get_default_remote)
|
|
|
|
sha1=$(sanitize_submodule_env; cd "$sm_path" &&
|
submodule update: add --remote for submodule's upstream changes
The current `update` command incorporates the superproject's gitlinked
SHA-1 ($sha1) into the submodule HEAD ($subsha1). Depending on the
options you use, it may checkout $sha1, rebase the $subsha1 onto
$sha1, or merge $sha1 into $subsha1. This helps you keep up with
changes in the upstream superproject.
However, it's also useful to stay up to date with changes in the
upstream subproject. Previous workflows for incorporating such
changes include the ungainly:
$ git submodule foreach 'git checkout $(git config --file $toplevel/.gitmodules submodule.$name.branch) && git pull'
With this patch, all of the useful functionality for incorporating
superproject changes can be reused to incorporate upstream subproject
updates. When you specify --remote, the target $sha1 is replaced with
a $sha1 of the submodule's origin/master tracking branch. If you want
to merge a different tracking branch, you can configure the
`submodule.<name>.branch` option in `.gitmodules`. You can override
the `.gitmodules` configuration setting for a particular superproject
by configuring the option in that superproject's default configuration
(using the usual configuration hierarchy, e.g. `.git/config`,
`~/.gitconfig`, etc.).
Previous use of submodule.<name>.branch
=======================================
Because we're adding a new configuration option, it's a good idea to
check if anyone else is already using the option. The foreach-pull
example above was described by Ævar in
commit f030c96d8643fa0a1a9b2bd9c2f36a77721fb61f
Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date: Fri May 21 16:10:10 2010 +0000
git-submodule foreach: Add $toplevel variable
Gerrit uses the same interpretation for the setting, but because
Gerrit has direct access to the subproject repositories, it updates
the superproject repositories automatically when a subproject changes.
Gerrit also accepts the special value '.', which it expands into the
superproject's branch name.
Although the --remote functionality is using `submodule.<name>.branch`
slightly differently, the effect is the same. The foreach-pull
example uses the option to record the name of the local branch to
checkout before pulls. The tracking branch to be pulled is recorded
in `.git/modules/<name>/config`, which was initialized by the module
clone during `submodule add` or `submodule init`. Because the branch
name stored in `submodule.<name>.branch` was likely the same as the
branch name used during the initial `submodule add`, the same branch
will be pulled in each workflow.
Implementation details
======================
In order to ensure a current tracking branch state, `update --remote`
fetches the submodule's remote repository before calculating the
SHA-1. However, I didn't change the logic guarding the existing fetch:
if test -z "$nofetch"
then
# Run fetch only if $sha1 isn't present or it
# is not reachable from a ref.
(clear_local_git_env; cd "$path" &&
( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
test -z "$rev") || git-fetch)) ||
die "$(eval_gettext "Unable to fetch in submodule path '\$path'")"
fi
There will not be a double-fetch, because the new $sha1 determined
after the `--remote` triggered fetch should always exist in the
repository. If it doesn't, it's because some racy process removed it
from the submodule's repository and we *should* be re-fetching.
Signed-off-by: W. Trevor King <wking@tremily.us>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-12-19 20:03:32 +04:00
|
|
|
git rev-parse --verify "${remote_name}/${branch}") ||
|
|
|
|
die "$(eval_gettext "Unable to find current ${remote_name}/${branch} revision in submodule path '\$sm_path'")"
|
|
|
|
fi
|
|
|
|
|
2014-06-10 16:28:33 +04:00
|
|
|
if test "$subsha1" != "$sha1" || test -n "$force"
|
2007-05-26 17:56:40 +04:00
|
|
|
then
|
2011-04-01 13:42:03 +04:00
|
|
|
subforce=$force
|
|
|
|
# If we don't already have a -f flag and the submodule has never been checked out
|
2014-06-10 16:28:33 +04:00
|
|
|
if test -z "$subsha1" && test -z "$force"
|
2008-09-26 19:33:23 +04:00
|
|
|
then
|
2011-04-01 13:42:03 +04:00
|
|
|
subforce="-f"
|
2008-09-26 19:33:23 +04:00
|
|
|
fi
|
2009-02-06 01:18:32 +03:00
|
|
|
|
|
|
|
if test -z "$nofetch"
|
|
|
|
then
|
2011-03-07 01:13:36 +03:00
|
|
|
# Run fetch only if $sha1 isn't present or it
|
|
|
|
# is not reachable from a ref.
|
2016-03-01 01:58:35 +03:00
|
|
|
(sanitize_submodule_env; cd "$sm_path" &&
|
2011-05-27 00:52:04 +04:00
|
|
|
( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&
|
2011-03-07 01:13:36 +03:00
|
|
|
test -z "$rev") || git-fetch)) ||
|
2013-06-16 18:18:18 +04:00
|
|
|
die "$(eval_gettext "Unable to fetch in submodule path '\$displaypath'")"
|
2009-02-06 01:18:32 +03:00
|
|
|
fi
|
|
|
|
|
2011-02-17 19:18:45 +03:00
|
|
|
# Is this something we just cloned?
|
|
|
|
case ";$cloned_modules;" in
|
|
|
|
*";$name;"*)
|
|
|
|
# then there is no local change to integrate
|
2014-04-03 01:15:36 +04:00
|
|
|
update_module=checkout ;;
|
2011-02-17 19:18:45 +03:00
|
|
|
esac
|
|
|
|
|
2011-06-13 23:17:52 +04:00
|
|
|
must_die_on_failure=
|
Rename submodule.<name>.rebase to submodule.<name>.update
The addition of "submodule.<name>.rebase" demonstrates the usefulness of
alternatives to the default behaviour of "git submodule update". However,
by naming the config variable "submodule.<name>.rebase", and making it a
boolean choice, we are artificially constraining future git versions that
may want to add _more_ alternatives than just "rebase".
Therefore, while "submodule.<name>.rebase" is not yet in a stable git
release, future-proof it, by changing it from
submodule.<name>.rebase = true/false
to
submodule.<name>.update = rebase/checkout
where "checkout" specifies the default behaviour of "git submodule update"
(checking out the new commit to a detached HEAD), and "rebase" specifies
the --rebase behaviour (where the current local branch in the submodule is
rebase onto the new commit). Thus .update == checkout is equivalent to
.rebase == false, and .update == rebase is equivalent to .rebase == true.
Finally, leaving .update unset is equivalent to leaving .rebase unset.
In future git versions, other alternatives to "git submodule update"
behaviour can be included by adding them to the list of allowable values
for the submodule.<name>.update variable.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-03 10:27:06 +04:00
|
|
|
case "$update_module" in
|
2014-01-16 08:10:22 +04:00
|
|
|
checkout)
|
|
|
|
command="git checkout $subforce -q"
|
|
|
|
die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$displaypath'")"
|
|
|
|
say_msg="$(eval_gettext "Submodule path '\$displaypath': checked out '\$sha1'")"
|
|
|
|
;;
|
Rename submodule.<name>.rebase to submodule.<name>.update
The addition of "submodule.<name>.rebase" demonstrates the usefulness of
alternatives to the default behaviour of "git submodule update". However,
by naming the config variable "submodule.<name>.rebase", and making it a
boolean choice, we are artificially constraining future git versions that
may want to add _more_ alternatives than just "rebase".
Therefore, while "submodule.<name>.rebase" is not yet in a stable git
release, future-proof it, by changing it from
submodule.<name>.rebase = true/false
to
submodule.<name>.update = rebase/checkout
where "checkout" specifies the default behaviour of "git submodule update"
(checking out the new commit to a detached HEAD), and "rebase" specifies
the --rebase behaviour (where the current local branch in the submodule is
rebase onto the new commit). Thus .update == checkout is equivalent to
.rebase == false, and .update == rebase is equivalent to .rebase == true.
Finally, leaving .update unset is equivalent to leaving .rebase unset.
In future git versions, other alternatives to "git submodule update"
behaviour can be included by adding them to the list of allowable values
for the submodule.<name>.update variable.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-03 10:27:06 +04:00
|
|
|
rebase)
|
|
|
|
command="git rebase"
|
2013-06-16 18:18:18 +04:00
|
|
|
die_msg="$(eval_gettext "Unable to rebase '\$sha1' in submodule path '\$displaypath'")"
|
|
|
|
say_msg="$(eval_gettext "Submodule path '\$displaypath': rebased into '\$sha1'")"
|
2011-06-13 23:17:52 +04:00
|
|
|
must_die_on_failure=yes
|
Rename submodule.<name>.rebase to submodule.<name>.update
The addition of "submodule.<name>.rebase" demonstrates the usefulness of
alternatives to the default behaviour of "git submodule update". However,
by naming the config variable "submodule.<name>.rebase", and making it a
boolean choice, we are artificially constraining future git versions that
may want to add _more_ alternatives than just "rebase".
Therefore, while "submodule.<name>.rebase" is not yet in a stable git
release, future-proof it, by changing it from
submodule.<name>.rebase = true/false
to
submodule.<name>.update = rebase/checkout
where "checkout" specifies the default behaviour of "git submodule update"
(checking out the new commit to a detached HEAD), and "rebase" specifies
the --rebase behaviour (where the current local branch in the submodule is
rebase onto the new commit). Thus .update == checkout is equivalent to
.rebase == false, and .update == rebase is equivalent to .rebase == true.
Finally, leaving .update unset is equivalent to leaving .rebase unset.
In future git versions, other alternatives to "git submodule update"
behaviour can be included by adding them to the list of allowable values
for the submodule.<name>.update variable.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-03 10:27:06 +04:00
|
|
|
;;
|
2009-06-03 02:59:12 +04:00
|
|
|
merge)
|
|
|
|
command="git merge"
|
2013-06-16 18:18:18 +04:00
|
|
|
die_msg="$(eval_gettext "Unable to merge '\$sha1' in submodule path '\$displaypath'")"
|
|
|
|
say_msg="$(eval_gettext "Submodule path '\$displaypath': merged in '\$sha1'")"
|
2011-06-13 23:17:52 +04:00
|
|
|
must_die_on_failure=yes
|
2009-06-03 02:59:12 +04:00
|
|
|
;;
|
2013-07-03 13:02:02 +04:00
|
|
|
!*)
|
|
|
|
command="${update_module#!}"
|
2015-08-27 07:26:19 +03:00
|
|
|
die_msg="$(eval_gettext "Execution of '\$command \$sha1' failed in submodule path '\$prefix\$sm_path'")"
|
2013-07-03 13:02:02 +04:00
|
|
|
say_msg="$(eval_gettext "Submodule path '\$prefix\$sm_path': '\$command \$sha1'")"
|
|
|
|
must_die_on_failure=yes
|
|
|
|
;;
|
Rename submodule.<name>.rebase to submodule.<name>.update
The addition of "submodule.<name>.rebase" demonstrates the usefulness of
alternatives to the default behaviour of "git submodule update". However,
by naming the config variable "submodule.<name>.rebase", and making it a
boolean choice, we are artificially constraining future git versions that
may want to add _more_ alternatives than just "rebase".
Therefore, while "submodule.<name>.rebase" is not yet in a stable git
release, future-proof it, by changing it from
submodule.<name>.rebase = true/false
to
submodule.<name>.update = rebase/checkout
where "checkout" specifies the default behaviour of "git submodule update"
(checking out the new commit to a detached HEAD), and "rebase" specifies
the --rebase behaviour (where the current local branch in the submodule is
rebase onto the new commit). Thus .update == checkout is equivalent to
.rebase == false, and .update == rebase is equivalent to .rebase == true.
Finally, leaving .update unset is equivalent to leaving .rebase unset.
In future git versions, other alternatives to "git submodule update"
behaviour can be included by adding them to the list of allowable values
for the submodule.<name>.update variable.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-03 10:27:06 +04:00
|
|
|
*)
|
2014-01-16 08:10:22 +04:00
|
|
|
die "$(eval_gettext "Invalid update mode '$update_module' for submodule '$name'")"
|
Rename submodule.<name>.rebase to submodule.<name>.update
The addition of "submodule.<name>.rebase" demonstrates the usefulness of
alternatives to the default behaviour of "git submodule update". However,
by naming the config variable "submodule.<name>.rebase", and making it a
boolean choice, we are artificially constraining future git versions that
may want to add _more_ alternatives than just "rebase".
Therefore, while "submodule.<name>.rebase" is not yet in a stable git
release, future-proof it, by changing it from
submodule.<name>.rebase = true/false
to
submodule.<name>.update = rebase/checkout
where "checkout" specifies the default behaviour of "git submodule update"
(checking out the new commit to a detached HEAD), and "rebase" specifies
the --rebase behaviour (where the current local branch in the submodule is
rebase onto the new commit). Thus .update == checkout is equivalent to
.rebase == false, and .update == rebase is equivalent to .rebase == true.
Finally, leaving .update unset is equivalent to leaving .rebase unset.
In future git versions, other alternatives to "git submodule update"
behaviour can be included by adding them to the list of allowable values
for the submodule.<name>.update variable.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-06-03 10:27:06 +04:00
|
|
|
esac
|
2007-05-26 17:56:40 +04:00
|
|
|
|
2016-03-01 01:58:35 +03:00
|
|
|
if (sanitize_submodule_env; cd "$sm_path" && $command "$sha1")
|
2011-06-13 21:15:26 +04:00
|
|
|
then
|
2011-07-14 01:31:35 +04:00
|
|
|
say "$say_msg"
|
2011-06-13 23:17:52 +04:00
|
|
|
elif test -n "$must_die_on_failure"
|
|
|
|
then
|
2011-07-14 01:31:35 +04:00
|
|
|
die_with_status 2 "$die_msg"
|
2011-06-13 21:15:26 +04:00
|
|
|
else
|
2011-07-14 01:31:35 +04:00
|
|
|
err="${err};$die_msg"
|
2011-06-13 23:17:52 +04:00
|
|
|
continue
|
2011-06-13 21:15:26 +04:00
|
|
|
fi
|
2007-05-26 17:56:40 +04:00
|
|
|
fi
|
2009-08-19 05:45:23 +04:00
|
|
|
|
|
|
|
if test -n "$recursive"
|
|
|
|
then
|
2013-03-02 23:44:59 +04:00
|
|
|
(
|
|
|
|
prefix="$prefix$sm_path/"
|
2016-03-01 01:58:35 +03:00
|
|
|
sanitize_submodule_env
|
2013-03-02 23:44:59 +04:00
|
|
|
cd "$sm_path" &&
|
2013-11-12 00:55:52 +04:00
|
|
|
eval cmd_update
|
2013-03-02 23:44:59 +04:00
|
|
|
)
|
2011-06-13 21:15:26 +04:00
|
|
|
res=$?
|
|
|
|
if test $res -gt 0
|
|
|
|
then
|
2013-06-16 18:18:18 +04:00
|
|
|
die_msg="$(eval_gettext "Failed to recurse into submodule path '\$displaypath'")"
|
2011-06-13 21:15:26 +04:00
|
|
|
if test $res -eq 1
|
|
|
|
then
|
2011-07-14 01:31:35 +04:00
|
|
|
err="${err};$die_msg"
|
2011-06-13 21:15:26 +04:00
|
|
|
continue
|
|
|
|
else
|
2011-07-14 01:31:35 +04:00
|
|
|
die_with_status $res "$die_msg"
|
2011-06-13 21:15:26 +04:00
|
|
|
fi
|
|
|
|
fi
|
2009-08-19 05:45:23 +04:00
|
|
|
fi
|
2007-05-26 17:56:40 +04:00
|
|
|
done
|
2011-06-13 21:15:26 +04:00
|
|
|
|
|
|
|
if test -n "$err"
|
|
|
|
then
|
|
|
|
OIFS=$IFS
|
|
|
|
IFS=';'
|
|
|
|
for e in $err
|
|
|
|
do
|
|
|
|
if test -n "$e"
|
|
|
|
then
|
|
|
|
echo >&2 "$e"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
IFS=$OIFS
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
2007-05-26 17:56:40 +04:00
|
|
|
}
|
|
|
|
|
2007-06-27 03:40:58 +04:00
|
|
|
set_name_rev () {
|
|
|
|
revname=$( (
|
2016-03-01 01:58:35 +03:00
|
|
|
sanitize_submodule_env
|
2007-06-27 03:40:58 +04:00
|
|
|
cd "$1" && {
|
2007-07-03 09:52:14 +04:00
|
|
|
git describe "$2" 2>/dev/null ||
|
|
|
|
git describe --tags "$2" 2>/dev/null ||
|
2008-04-15 06:48:06 +04:00
|
|
|
git describe --contains "$2" 2>/dev/null ||
|
|
|
|
git describe --all --always "$2"
|
2007-06-27 03:40:58 +04:00
|
|
|
}
|
|
|
|
) )
|
|
|
|
test -z "$revname" || revname=" ($revname)"
|
|
|
|
}
|
2008-03-11 16:52:15 +03:00
|
|
|
#
|
|
|
|
# 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() {
|
2008-03-11 16:52:17 +03:00
|
|
|
summary_limit=-1
|
2008-04-12 19:05:31 +04:00
|
|
|
for_status=
|
2009-08-13 23:32:50 +04:00
|
|
|
diff_cmd=diff-index
|
2008-03-11 16:52:17 +03:00
|
|
|
|
2008-03-11 16:52:15 +03:00
|
|
|
# parse $args after "submodule ... summary".
|
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
--cached)
|
|
|
|
cached="$1"
|
|
|
|
;;
|
2009-08-13 23:32:50 +04:00
|
|
|
--files)
|
|
|
|
files="$1"
|
|
|
|
;;
|
2008-04-12 19:05:31 +04:00
|
|
|
--for-status)
|
|
|
|
for_status="$1"
|
|
|
|
;;
|
2008-03-11 16:52:17 +03:00
|
|
|
-n|--summary-limit)
|
2013-04-01 17:06:27 +04:00
|
|
|
summary_limit="$2"
|
|
|
|
isnumber "$summary_limit" || usage
|
2008-03-11 16:52:17 +03:00
|
|
|
shift
|
|
|
|
;;
|
2013-04-01 17:06:27 +04:00
|
|
|
--summary-limit=*)
|
|
|
|
summary_limit="${1#--summary-limit=}"
|
|
|
|
isnumber "$summary_limit" || usage
|
|
|
|
;;
|
2008-03-11 16:52:15 +03:00
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
2007-06-27 03:40:58 +04:00
|
|
|
|
2008-03-11 16:52:17 +03:00
|
|
|
test $summary_limit = 0 && return
|
|
|
|
|
2010-02-16 13:21:14 +03:00
|
|
|
if rev=$(git rev-parse -q --verify --default HEAD ${1+"$1"})
|
2008-03-11 16:52:15 +03:00
|
|
|
then
|
|
|
|
head=$rev
|
2010-03-04 01:19:09 +03:00
|
|
|
test $# = 0 || shift
|
2014-06-10 16:28:33 +04:00
|
|
|
elif test -z "$1" || test "$1" = "HEAD"
|
2010-02-16 13:21:14 +03:00
|
|
|
then
|
2010-03-04 01:19:10 +03:00
|
|
|
# before the first commit: compare with an empty tree
|
|
|
|
head=$(git hash-object -w -t tree --stdin </dev/null)
|
2010-03-09 17:55:32 +03:00
|
|
|
test -z "$1" || shift
|
2008-03-11 16:52:15 +03:00
|
|
|
else
|
2010-02-16 13:21:14 +03:00
|
|
|
head="HEAD"
|
2008-03-11 16:52:15 +03:00
|
|
|
fi
|
|
|
|
|
2009-08-13 23:32:50 +04:00
|
|
|
if [ -n "$files" ]
|
|
|
|
then
|
|
|
|
test -n "$cached" &&
|
2012-07-25 18:53:09 +04:00
|
|
|
die "$(gettext "The --cached option cannot be used with the --files option")"
|
2009-08-13 23:32:50 +04:00
|
|
|
diff_cmd=diff-files
|
|
|
|
head=
|
|
|
|
fi
|
|
|
|
|
2008-03-11 16:52:15 +03:00
|
|
|
cd_to_toplevel
|
2013-06-16 18:18:18 +04:00
|
|
|
eval "set $(git rev-parse --sq --prefix "$wt_prefix" -- "$@")"
|
2008-03-11 16:52:15 +03:00
|
|
|
# Get modified modules cared by user
|
2010-06-25 18:56:02 +04:00
|
|
|
modules=$(git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- "$@" |
|
2009-11-24 02:56:32 +03:00
|
|
|
sane_egrep '^:([0-7]* )?160000' |
|
2013-08-17 21:25:42 +04:00
|
|
|
while read mod_src mod_dst sha1_src sha1_dst status sm_path
|
2008-03-11 16:52:15 +03:00
|
|
|
do
|
|
|
|
# Always show modules deleted or type-changed (blob<->module)
|
2014-06-10 16:28:33 +04:00
|
|
|
if test "$status" = D || test "$status" = T
|
|
|
|
then
|
2014-06-10 19:33:39 +04:00
|
|
|
printf '%s\n' "$sm_path"
|
2014-06-10 16:28:33 +04:00
|
|
|
continue
|
|
|
|
fi
|
2013-09-02 00:06:49 +04:00
|
|
|
# Respect the ignore setting for --for-status.
|
|
|
|
if test -n "$for_status"
|
|
|
|
then
|
2015-09-03 00:42:25 +03:00
|
|
|
name=$(git submodule--helper name "$sm_path")
|
2013-09-02 00:06:49 +04:00
|
|
|
ignore_config=$(get_submodule_config "$name" ignore none)
|
2014-06-10 16:28:33 +04:00
|
|
|
test $status != A && test $ignore_config = all && continue
|
2013-09-02 00:06:49 +04:00
|
|
|
fi
|
2008-03-11 16:52:15 +03:00
|
|
|
# Also show added or modified modules which are checked out
|
2013-08-17 21:25:42 +04:00
|
|
|
GIT_DIR="$sm_path/.git" git-rev-parse --git-dir >/dev/null 2>&1 &&
|
2014-06-10 19:33:39 +04:00
|
|
|
printf '%s\n' "$sm_path"
|
2008-03-11 16:52:15 +03:00
|
|
|
done
|
|
|
|
)
|
2008-03-11 16:52:16 +03:00
|
|
|
|
2008-04-12 19:05:31 +04:00
|
|
|
test -z "$modules" && return
|
|
|
|
|
2010-06-25 18:56:02 +04:00
|
|
|
git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- $modules |
|
2009-11-24 02:56:32 +03:00
|
|
|
sane_egrep '^:([0-7]* )?160000' |
|
2008-03-11 16:52:16 +03:00
|
|
|
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
|
2011-08-07 15:58:17 +04:00
|
|
|
eval_gettextln "unexpected mode \$mod_dst" >&2
|
2008-03-11 16:52:16 +03:00
|
|
|
continue ;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
missing_src=
|
|
|
|
missing_dst=
|
|
|
|
|
|
|
|
test $mod_src = 160000 &&
|
2008-12-03 16:26:52 +03:00
|
|
|
! GIT_DIR="$name/.git" git-rev-parse -q --verify $sha1_src^0 >/dev/null &&
|
2008-03-11 16:52:16 +03:00
|
|
|
missing_src=t
|
|
|
|
|
|
|
|
test $mod_dst = 160000 &&
|
2008-12-03 16:26:52 +03:00
|
|
|
! GIT_DIR="$name/.git" git-rev-parse -q --verify $sha1_dst^0 >/dev/null &&
|
2008-03-11 16:52:16 +03:00
|
|
|
missing_dst=t
|
2007-06-27 03:40:58 +04:00
|
|
|
|
2013-06-16 18:18:18 +04:00
|
|
|
display_name=$(relative_path "$name")
|
|
|
|
|
2008-03-11 16:52:16 +03:00
|
|
|
total_commits=
|
|
|
|
case "$missing_src,$missing_dst" in
|
|
|
|
t,)
|
2013-06-16 18:18:18 +04:00
|
|
|
errmsg="$(eval_gettext " Warn: \$display_name doesn't contain commit \$sha1_src")"
|
2008-03-11 16:52:16 +03:00
|
|
|
;;
|
|
|
|
,t)
|
2013-06-16 18:18:18 +04:00
|
|
|
errmsg="$(eval_gettext " Warn: \$display_name doesn't contain commit \$sha1_dst")"
|
2008-03-11 16:52:16 +03:00
|
|
|
;;
|
|
|
|
t,t)
|
2013-06-16 18:18:18 +04:00
|
|
|
errmsg="$(eval_gettext " Warn: \$display_name doesn't contain commits \$sha1_src and \$sha1_dst")"
|
2008-03-11 16:52:16 +03:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
errmsg=
|
|
|
|
total_commits=$(
|
2014-06-10 16:28:33 +04:00
|
|
|
if test $mod_src = 160000 && test $mod_dst = 160000
|
2008-03-11 16:52:16 +03:00
|
|
|
then
|
|
|
|
range="$sha1_src...$sha1_dst"
|
|
|
|
elif test $mod_src = 160000
|
|
|
|
then
|
|
|
|
range=$sha1_src
|
|
|
|
else
|
|
|
|
range=$sha1_dst
|
|
|
|
fi
|
|
|
|
GIT_DIR="$name/.git" \
|
2010-04-08 23:42:37 +04:00
|
|
|
git rev-list --first-parent $range -- | wc -l
|
2008-03-11 16:52:16 +03:00
|
|
|
)
|
2008-03-12 11:30:01 +03:00
|
|
|
total_commits=" ($(($total_commits + 0)))"
|
2008-03-11 16:52:16 +03:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
sha1_abbr_src=$(echo $sha1_src | cut -c1-7)
|
|
|
|
sha1_abbr_dst=$(echo $sha1_dst | cut -c1-7)
|
|
|
|
if test $status = T
|
|
|
|
then
|
2011-05-21 22:44:09 +04:00
|
|
|
blob="$(gettext "blob")"
|
|
|
|
submodule="$(gettext "submodule")"
|
2008-03-11 16:52:16 +03:00
|
|
|
if test $mod_dst = 160000
|
|
|
|
then
|
2013-06-16 18:18:18 +04:00
|
|
|
echo "* $display_name $sha1_abbr_src($blob)->$sha1_abbr_dst($submodule)$total_commits:"
|
2008-03-11 16:52:16 +03:00
|
|
|
else
|
2013-06-16 18:18:18 +04:00
|
|
|
echo "* $display_name $sha1_abbr_src($submodule)->$sha1_abbr_dst($blob)$total_commits:"
|
2008-03-11 16:52:16 +03:00
|
|
|
fi
|
|
|
|
else
|
2013-06-16 18:18:18 +04:00
|
|
|
echo "* $display_name $sha1_abbr_src...$sha1_abbr_dst$total_commits:"
|
2008-03-11 16:52:16 +03:00
|
|
|
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
|
2014-06-10 16:28:33 +04:00
|
|
|
if test $mod_src = 160000 && test $mod_dst = 160000
|
2008-03-11 16:52:16 +03:00
|
|
|
then
|
2008-03-11 16:52:17 +03:00
|
|
|
limit=
|
|
|
|
test $summary_limit -gt 0 && limit="-$summary_limit"
|
2008-03-11 16:52:16 +03:00
|
|
|
GIT_DIR="$name/.git" \
|
2008-03-11 16:52:17 +03:00
|
|
|
git log $limit --pretty='format: %m %s' \
|
2008-03-11 16:52:16 +03:00
|
|
|
--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
|
2013-09-06 21:43:06 +04:00
|
|
|
done
|
2008-03-11 16:52:15 +03:00
|
|
|
}
|
2007-05-26 17:56:40 +04:00
|
|
|
#
|
2007-06-11 23:12:24 +04:00
|
|
|
# List all submodules, prefixed with:
|
2007-05-26 17:56:40 +04:00
|
|
|
# - submodule not initialized
|
|
|
|
# + different revision checked out
|
|
|
|
#
|
|
|
|
# If --cached was specified the revision in the index will be printed
|
|
|
|
# instead of the currently checked out revision.
|
|
|
|
#
|
|
|
|
# $@ = requested paths (default to all)
|
|
|
|
#
|
2008-01-15 13:35:49 +03:00
|
|
|
cmd_status()
|
2007-05-26 17:56:40 +04:00
|
|
|
{
|
2008-01-15 13:48:45 +03:00
|
|
|
# parse $args after "submodule ... status".
|
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
-q|--quiet)
|
2009-06-17 02:33:00 +04:00
|
|
|
GIT_QUIET=1
|
2008-01-15 13:48:45 +03:00
|
|
|
;;
|
|
|
|
--cached)
|
|
|
|
cached=1
|
|
|
|
;;
|
2009-08-19 05:45:24 +04:00
|
|
|
--recursive)
|
|
|
|
recursive=1
|
|
|
|
;;
|
2008-01-15 13:48:45 +03:00
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
2015-09-03 00:42:24 +03:00
|
|
|
git submodule--helper list --prefix "$wt_prefix" "$@" |
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
while read mode sha1 stage sm_path
|
2007-05-26 17:56:40 +04:00
|
|
|
do
|
2012-08-15 00:35:27 +04:00
|
|
|
die_if_unmatched "$mode"
|
2015-09-03 00:42:25 +03:00
|
|
|
name=$(git submodule--helper name "$sm_path") || exit
|
2007-07-03 09:52:14 +04:00
|
|
|
url=$(git config submodule."$name".url)
|
2013-06-16 18:18:18 +04:00
|
|
|
displaypath=$(relative_path "$prefix$sm_path")
|
submodule: process conflicting submodules only once
During a merge module_list returns conflicting submodules several times
(stage 1,2,3) which caused the submodules to be used multiple times in
git submodule init, sync, update and status command.
There are 5 callers of module_list; they all read (mode, sha1, stage,
path) tuple, and most of them care only about path. As a first level
approximation, it should be Ok (in the sense that it does not make things
worse than it currently is) to filter the duplicate paths from module_list
output, but some callers should change their behaviour when the merge in
the superproject still has conflicts.
Notice the higher-stage entries, and emit only one record from
module_list, but while doing so, mark the entry with "U" (not [0-3]) in
the $stage field and null out the SHA-1 part, as the object name for the
lowest stage does not give any useful information to the caller, and this
way any caller that uses the object name would hopefully barf. Then
update the codepaths for each subcommands this way:
- "update" should not touch the submodule repository, because we do not
know what commit should be checked out yet.
- "status" reports the conflicting submodules as 'U000...000' and does
not recurse into them (we might later want to make it recurse).
- The command called by "foreach" may want to do whatever it wants to do
by noticing the merged status in the superproject itself, so feed the
path to it from module_list as before, but only once per submodule.
- "init" and "sync" are unlikely things to do while the superproject is
still not merged, but as long as a submodule is there in $path, there
is no point skipping it. It might however want to take the merged
status of .gitmodules into account, but that is outside of the scope of
this topic.
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Thanks-to: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Nicolas Morey-Chaisemartin <nicolas@morey-chaisemartin.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-30 09:20:02 +04:00
|
|
|
if test "$stage" = U
|
|
|
|
then
|
|
|
|
say "U$sha1 $displaypath"
|
|
|
|
continue
|
|
|
|
fi
|
2014-06-10 16:28:33 +04:00
|
|
|
if test -z "$url" ||
|
|
|
|
{
|
|
|
|
! test -d "$sm_path"/.git &&
|
|
|
|
! test -f "$sm_path"/.git
|
|
|
|
}
|
2007-05-26 17:56:40 +04:00
|
|
|
then
|
2009-08-19 05:45:24 +04:00
|
|
|
say "-$sha1 $displaypath"
|
2007-05-26 17:56:40 +04:00
|
|
|
continue;
|
|
|
|
fi
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
if git diff-files --ignore-submodules=dirty --quiet -- "$sm_path"
|
2007-05-26 17:56:40 +04:00
|
|
|
then
|
2013-06-17 13:55:36 +04:00
|
|
|
set_name_rev "$sm_path" "$sha1"
|
2009-08-19 05:45:24 +04:00
|
|
|
say " $sha1 $displaypath$revname"
|
2007-05-26 17:56:40 +04:00
|
|
|
else
|
|
|
|
if test -z "$cached"
|
|
|
|
then
|
2016-03-01 01:58:35 +03:00
|
|
|
sha1=$(sanitize_submodule_env; cd "$sm_path" && git rev-parse --verify HEAD)
|
2007-05-26 17:56:40 +04:00
|
|
|
fi
|
2013-06-17 13:55:36 +04:00
|
|
|
set_name_rev "$sm_path" "$sha1"
|
2009-08-19 05:45:24 +04:00
|
|
|
say "+$sha1 $displaypath$revname"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if test -n "$recursive"
|
|
|
|
then
|
|
|
|
(
|
|
|
|
prefix="$displaypath/"
|
2016-03-01 01:58:35 +03:00
|
|
|
sanitize_submodule_env
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
cd "$sm_path" &&
|
2012-10-29 01:37:16 +04:00
|
|
|
eval cmd_status
|
2009-08-19 05:45:24 +04:00
|
|
|
) ||
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
die "$(eval_gettext "Failed to recurse into submodule path '\$sm_path'")"
|
2007-05-26 17:56:40 +04:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
2008-08-24 23:43:37 +04:00
|
|
|
#
|
|
|
|
# Sync remote urls for submodules
|
|
|
|
# This makes the value for remote.$remote.url match the value
|
|
|
|
# specified in .gitmodules.
|
|
|
|
#
|
|
|
|
cmd_sync()
|
|
|
|
{
|
|
|
|
while test $# -ne 0
|
|
|
|
do
|
|
|
|
case "$1" in
|
|
|
|
-q|--quiet)
|
2009-06-17 02:33:00 +04:00
|
|
|
GIT_QUIET=1
|
2008-08-24 23:43:37 +04:00
|
|
|
shift
|
|
|
|
;;
|
2012-10-26 23:44:42 +04:00
|
|
|
--recursive)
|
|
|
|
recursive=1
|
|
|
|
shift
|
|
|
|
;;
|
2008-08-24 23:43:37 +04:00
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
cd_to_toplevel
|
2015-09-03 00:42:24 +03:00
|
|
|
git submodule--helper list --prefix "$wt_prefix" "$@" |
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
while read mode sha1 stage sm_path
|
2008-08-24 23:43:37 +04:00
|
|
|
do
|
2012-08-15 00:35:27 +04:00
|
|
|
die_if_unmatched "$mode"
|
2015-09-03 00:42:25 +03:00
|
|
|
name=$(git submodule--helper name "$sm_path")
|
2008-08-24 23:43:37 +04:00
|
|
|
url=$(git config -f .gitmodules --get submodule."$name".url)
|
2008-09-22 20:08:31 +04:00
|
|
|
|
|
|
|
# Possibly a url relative to parent
|
|
|
|
case "$url" in
|
|
|
|
./*|../*)
|
2012-06-06 15:57:29 +04:00
|
|
|
# rewrite foo/bar as ../.. to find path from
|
|
|
|
# submodule work tree to superproject work tree
|
2014-06-10 19:33:39 +04:00
|
|
|
up_path="$(printf '%s\n' "$sm_path" | sed "s/[^/][^/]*/../g")" &&
|
2012-06-06 15:57:29 +04:00
|
|
|
# guarantee a trailing /
|
|
|
|
up_path=${up_path%/}/ &&
|
|
|
|
# path from submodule work tree to submodule origin repo
|
|
|
|
sub_origin_url=$(resolve_relative_url "$url" "$up_path") &&
|
|
|
|
# path from superproject work tree to submodule origin repo
|
|
|
|
super_config_url=$(resolve_relative_url "$url") || exit
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
sub_origin_url="$url"
|
|
|
|
super_config_url="$url"
|
2008-09-22 20:08:31 +04:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2011-06-26 00:41:25 +04:00
|
|
|
if git config "submodule.$name.url" >/dev/null 2>/dev/null
|
2008-08-24 23:43:37 +04:00
|
|
|
then
|
2013-06-16 18:18:18 +04:00
|
|
|
displaypath=$(relative_path "$prefix$sm_path")
|
|
|
|
say "$(eval_gettext "Synchronizing submodule url for '\$displaypath'")"
|
2012-06-06 15:57:29 +04:00
|
|
|
git config submodule."$name".url "$super_config_url"
|
2011-06-26 00:41:25 +04:00
|
|
|
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
if test -e "$sm_path"/.git
|
2011-06-26 00:41:25 +04:00
|
|
|
then
|
|
|
|
(
|
2016-03-01 01:58:35 +03:00
|
|
|
sanitize_submodule_env
|
git-submodule.sh: Don't use $path variable in eval_gettext string
The eval_gettext (and eval_gettextln) i18n shell functions call
git-sh-i18n--envsubst to process the variable references in the
string parameter. Unfortunately, environment variables are case
insensitive on windows, which leads to failure on cygwin when
eval_gettext exports $path.
Commit df599e9 (Windows: teach getenv to do a case-sensitive search,
06-06-2011) attempts to solve this problem on MinGW by overriding
the system getenv() function to allow git-sh-i18n--envsubst to read
$path rather than $PATH from the environment. However, this commit
does not address cygwin at all and, furthermore, does not fix all
problems on MinGW.
In particular, when executing test #38 in t7400-submodule-basic.sh,
an 'git-sh-i18n-envsubst.exe - Unable To Locate Component' dialog
pops up saying that the application "failed to start because
libiconv2.dll was not found." After studying the voluminous trace
output from the process monitor, it is clear that the system is
attempting to use $path, rather than $PATH, to search for the DLL
file. (Note that, after dismissing the dialog, the test passes
anyway!)
As an alternative, we finesse the problem by renaming the $path
variable to $sm_path (submodule path). This fixes the problem on
MinGW along with all test failures on cygwin (t7400.{7,32,34},
t7406.3 and t7407.{2,6}). We note that the foreach subcommand
provides $path to user scripts (ie it is part of the API), so we
can't simply rename it to $sm_path.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Acked-by: Jens Lehmann <Jens.Lehmann@web.de>
Tested-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-17 22:00:58 +04:00
|
|
|
cd "$sm_path"
|
2011-06-26 00:41:25 +04:00
|
|
|
remote=$(get_default_remote)
|
2012-06-06 15:57:29 +04:00
|
|
|
git config remote."$remote".url "$sub_origin_url"
|
2012-10-26 23:44:42 +04:00
|
|
|
|
|
|
|
if test -n "$recursive"
|
|
|
|
then
|
|
|
|
prefix="$prefix$sm_path/"
|
|
|
|
eval cmd_sync
|
|
|
|
fi
|
2011-06-26 00:41:25 +04:00
|
|
|
)
|
|
|
|
fi
|
2008-08-24 23:43:37 +04:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
2007-05-26 17:56:40 +04:00
|
|
|
|
2008-01-15 13:48:45 +03:00
|
|
|
# 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"
|
2007-05-26 17:56:40 +04:00
|
|
|
do
|
|
|
|
case "$1" in
|
2013-03-05 01:20:24 +04:00
|
|
|
add | foreach | init | deinit | update | status | summary | sync)
|
2008-01-15 13:48:45 +03:00
|
|
|
command=$1
|
2007-05-26 17:56:40 +04:00
|
|
|
;;
|
|
|
|
-q|--quiet)
|
2009-06-17 02:33:00 +04:00
|
|
|
GIT_QUIET=1
|
2007-05-26 17:56:40 +04:00
|
|
|
;;
|
2007-06-25 01:06:07 +04:00
|
|
|
-b|--branch)
|
|
|
|
case "$2" in
|
|
|
|
'')
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
branch="$2"; shift
|
|
|
|
;;
|
2007-05-26 17:56:40 +04:00
|
|
|
--cached)
|
2008-03-11 16:52:15 +03:00
|
|
|
cached="$1"
|
2007-05-26 17:56:40 +04:00
|
|
|
;;
|
|
|
|
--)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
usage
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
2008-01-15 13:48:45 +03:00
|
|
|
# No command word defaults to "status"
|
2012-09-22 15:27:59 +04:00
|
|
|
if test -z "$command"
|
|
|
|
then
|
|
|
|
if test $# = 0
|
|
|
|
then
|
|
|
|
command=status
|
|
|
|
else
|
|
|
|
usage
|
|
|
|
fi
|
|
|
|
fi
|
2008-01-15 13:48:45 +03:00
|
|
|
|
|
|
|
# "-b branch" is accepted only by "add"
|
|
|
|
if test -n "$branch" && test "$command" != add
|
|
|
|
then
|
2007-06-25 01:06:07 +04:00
|
|
|
usage
|
2008-01-15 13:48:45 +03:00
|
|
|
fi
|
|
|
|
|
2008-03-11 16:52:15 +03:00
|
|
|
# "--cached" is accepted only by "status" and "summary"
|
2014-06-10 16:28:33 +04:00
|
|
|
if test -n "$cached" && test "$command" != status && test "$command" != summary
|
2008-01-15 13:48:45 +03:00
|
|
|
then
|
2007-05-26 17:56:40 +04:00
|
|
|
usage
|
2008-01-15 13:48:45 +03:00
|
|
|
fi
|
|
|
|
|
|
|
|
"cmd_$command" "$@"
|