|  | #!/bin/sh | 
|  | # | 
|  | # git-submodule.sh: add, init, update or list git submodules | 
|  | # | 
|  | # Copyright (c) 2007 Lars Hjemli | 
|  |  | 
|  | dashless=$(basename "$0" | sed -e 's/-/ /') | 
|  | USAGE="[--quiet] [--cached] | 
|  | or: $dashless [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>] | 
|  | or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...] | 
|  | or: $dashless [--quiet] init [--] [<path>...] | 
|  | or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...) | 
|  | or: $dashless [--quiet] update [--init [--filter=<filter-spec>]] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] [--] [<path>...] | 
|  | or: $dashless [--quiet] set-branch (--default|--branch <branch>) [--] <path> | 
|  | or: $dashless [--quiet] set-url [--] <path> <newurl> | 
|  | or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...] | 
|  | or: $dashless [--quiet] foreach [--recursive] <command> | 
|  | or: $dashless [--quiet] sync [--recursive] [--] [<path>...] | 
|  | or: $dashless [--quiet] absorbgitdirs [--] [<path>...]" | 
|  | OPTIONS_SPEC= | 
|  | SUBDIRECTORY_OK=Yes | 
|  | . git-sh-setup | 
|  | require_work_tree | 
|  | wt_prefix=$(git rev-parse --show-prefix) | 
|  | cd_to_toplevel | 
|  |  | 
|  | # Tell the rest of git that any URLs we get don't come | 
|  | # directly from the user, so it can apply policy as appropriate. | 
|  | GIT_PROTOCOL_FROM_USER=0 | 
|  | export GIT_PROTOCOL_FROM_USER | 
|  |  | 
|  | command= | 
|  | quiet= | 
|  | branch= | 
|  | force= | 
|  | reference= | 
|  | cached= | 
|  | recursive= | 
|  | init= | 
|  | require_init= | 
|  | files= | 
|  | remote= | 
|  | nofetch= | 
|  | rebase= | 
|  | merge= | 
|  | checkout= | 
|  | custom_name= | 
|  | depth= | 
|  | progress= | 
|  | dissociate= | 
|  | single_branch= | 
|  | jobs= | 
|  | recommend_shallow= | 
|  | filter= | 
|  |  | 
|  | isnumber() | 
|  | { | 
|  | n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1" | 
|  | } | 
|  |  | 
|  | # | 
|  | # Add a new submodule to the working tree, .gitmodules and the index | 
|  | # | 
|  | # $@ = repo path | 
|  | # | 
|  | # optional branch is stored in global branch variable | 
|  | # | 
|  | cmd_add() | 
|  | { | 
|  | # parse $args after "submodule ... add". | 
|  | reference_path= | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | -b | --branch) | 
|  | case "$2" in '') usage ;; esac | 
|  | branch=$2 | 
|  | shift | 
|  | ;; | 
|  | -f | --force) | 
|  | force=$1 | 
|  | ;; | 
|  | -q|--quiet) | 
|  | quiet=1 | 
|  | ;; | 
|  | --progress) | 
|  | progress=1 | 
|  | ;; | 
|  | --reference) | 
|  | case "$2" in '') usage ;; esac | 
|  | reference_path=$2 | 
|  | shift | 
|  | ;; | 
|  | --reference=*) | 
|  | reference_path="${1#--reference=}" | 
|  | ;; | 
|  | --dissociate) | 
|  | dissociate=1 | 
|  | ;; | 
|  | --name) | 
|  | case "$2" in '') usage ;; esac | 
|  | custom_name=$2 | 
|  | shift | 
|  | ;; | 
|  | --depth) | 
|  | case "$2" in '') usage ;; esac | 
|  | depth="--depth=$2" | 
|  | shift | 
|  | ;; | 
|  | --depth=*) | 
|  | depth=$1 | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | if test -z "$1" | 
|  | then | 
|  | usage | 
|  | fi | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper add ${quiet:+--quiet} ${force:+--force} ${progress:+"--progress"} ${branch:+--branch "$branch"} ${reference_path:+--reference "$reference_path"} ${dissociate:+--dissociate} ${custom_name:+--name "$custom_name"} ${depth:+"$depth"} -- "$@" | 
|  | } | 
|  |  | 
|  | # | 
|  | # Execute an arbitrary command sequence in each checked out | 
|  | # submodule | 
|  | # | 
|  | # $@ = command to execute | 
|  | # | 
|  | cmd_foreach() | 
|  | { | 
|  | # parse $args after "submodule ... foreach". | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | -q|--quiet) | 
|  | quiet=1 | 
|  | ;; | 
|  | --recursive) | 
|  | recursive=1 | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper foreach ${quiet:+--quiet} ${recursive:+--recursive} -- "$@" | 
|  | } | 
|  |  | 
|  | # | 
|  | # Register submodules in .git/config | 
|  | # | 
|  | # $@ = requested paths (default to all) | 
|  | # | 
|  | cmd_init() | 
|  | { | 
|  | # parse $args after "submodule ... init". | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | -q|--quiet) | 
|  | quiet=1 | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper init ${quiet:+--quiet} -- "$@" | 
|  | } | 
|  |  | 
|  | # | 
|  | # Unregister submodules from .git/config and remove their work tree | 
|  | # | 
|  | cmd_deinit() | 
|  | { | 
|  | # parse $args after "submodule ... deinit". | 
|  | deinit_all= | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | -f|--force) | 
|  | force=$1 | 
|  | ;; | 
|  | -q|--quiet) | 
|  | quiet=1 | 
|  | ;; | 
|  | --all) | 
|  | deinit_all=t | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit ${quiet:+--quiet} ${force:+--force} ${deinit_all:+--all} -- "$@" | 
|  | } | 
|  |  | 
|  | # | 
|  | # Update each submodule path to correct revision, using clone and checkout as needed | 
|  | # | 
|  | # $@ = requested paths (default to all) | 
|  | # | 
|  | cmd_update() | 
|  | { | 
|  | # parse $args after "submodule ... update". | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | -q|--quiet) | 
|  | quiet=1 | 
|  | ;; | 
|  | -v|--verbose) | 
|  | quiet=0 | 
|  | ;; | 
|  | --progress) | 
|  | progress=1 | 
|  | ;; | 
|  | -i|--init) | 
|  | init=1 | 
|  | ;; | 
|  | --require-init) | 
|  | require_init=1 | 
|  | ;; | 
|  | --remote) | 
|  | remote=1 | 
|  | ;; | 
|  | -N|--no-fetch) | 
|  | nofetch=1 | 
|  | ;; | 
|  | -f|--force) | 
|  | force=$1 | 
|  | ;; | 
|  | -r|--rebase) | 
|  | rebase=1 | 
|  | ;; | 
|  | --reference) | 
|  | case "$2" in '') usage ;; esac | 
|  | reference="--reference=$2" | 
|  | shift | 
|  | ;; | 
|  | --reference=*) | 
|  | reference="$1" | 
|  | ;; | 
|  | --dissociate) | 
|  | dissociate=1 | 
|  | ;; | 
|  | -m|--merge) | 
|  | merge=1 | 
|  | ;; | 
|  | --recursive) | 
|  | recursive=1 | 
|  | ;; | 
|  | --checkout) | 
|  | checkout=1 | 
|  | ;; | 
|  | --recommend-shallow) | 
|  | recommend_shallow="--recommend-shallow" | 
|  | ;; | 
|  | --no-recommend-shallow) | 
|  | recommend_shallow="--no-recommend-shallow" | 
|  | ;; | 
|  | --depth) | 
|  | case "$2" in '') usage ;; esac | 
|  | depth="--depth=$2" | 
|  | shift | 
|  | ;; | 
|  | --depth=*) | 
|  | depth=$1 | 
|  | ;; | 
|  | -j|--jobs) | 
|  | case "$2" in '') usage ;; esac | 
|  | jobs="--jobs=$2" | 
|  | shift | 
|  | ;; | 
|  | --jobs=*) | 
|  | jobs=$1 | 
|  | ;; | 
|  | --single-branch) | 
|  | single_branch="--single-branch" | 
|  | ;; | 
|  | --no-single-branch) | 
|  | single_branch="--no-single-branch" | 
|  | ;; | 
|  | --filter) | 
|  | case "$2" in '') usage ;; esac | 
|  | filter="--filter=$2" | 
|  | shift | 
|  | ;; | 
|  | --filter=*) | 
|  | filter="$1" | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper update \ | 
|  | ${quiet:+--quiet} \ | 
|  | ${force:+--force} \ | 
|  | ${progress:+"--progress"} \ | 
|  | ${remote:+--remote} \ | 
|  | ${recursive:+--recursive} \ | 
|  | ${init:+--init} \ | 
|  | ${nofetch:+--no-fetch} \ | 
|  | ${rebase:+--rebase} \ | 
|  | ${merge:+--merge} \ | 
|  | ${checkout:+--checkout} \ | 
|  | ${reference:+"$reference"} \ | 
|  | ${dissociate:+"--dissociate"} \ | 
|  | ${depth:+"$depth"} \ | 
|  | ${require_init:+--require-init} \ | 
|  | ${dissociate:+"--dissociate"} \ | 
|  | $single_branch \ | 
|  | $recommend_shallow \ | 
|  | $jobs \ | 
|  | $filter \ | 
|  | -- \ | 
|  | "$@" | 
|  | } | 
|  |  | 
|  | # | 
|  | # Configures a submodule's default branch | 
|  | # | 
|  | # $@ = requested path | 
|  | # | 
|  | cmd_set_branch() { | 
|  | default= | 
|  | branch= | 
|  |  | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | -q|--quiet) | 
|  | # we don't do anything with this but we need to accept it | 
|  | ;; | 
|  | -d|--default) | 
|  | default=1 | 
|  | ;; | 
|  | -b|--branch) | 
|  | case "$2" in '') usage ;; esac | 
|  | branch=$2 | 
|  | shift | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper set-branch ${quiet:+--quiet} ${branch:+--branch "$branch"} ${default:+--default} -- "$@" | 
|  | } | 
|  |  | 
|  | # | 
|  | # Configures a submodule's remote url | 
|  | # | 
|  | # $@ = requested path, requested url | 
|  | # | 
|  | cmd_set_url() { | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | -q|--quiet) | 
|  | quiet=1 | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper set-url ${quiet:+--quiet} -- "$@" | 
|  | } | 
|  |  | 
|  | # | 
|  | # 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() { | 
|  | summary_limit=-1 | 
|  | for_status= | 
|  | diff_cmd=diff-index | 
|  |  | 
|  | # parse $args after "submodule ... summary". | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | --cached) | 
|  | cached=1 | 
|  | ;; | 
|  | --files) | 
|  | files="$1" | 
|  | ;; | 
|  | --for-status) | 
|  | for_status="$1" | 
|  | ;; | 
|  | -n|--summary-limit) | 
|  | summary_limit="$2" | 
|  | isnumber "$summary_limit" || usage | 
|  | shift | 
|  | ;; | 
|  | --summary-limit=*) | 
|  | summary_limit="${1#--summary-limit=}" | 
|  | isnumber "$summary_limit" || usage | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper summary ${files:+--files} ${cached:+--cached} ${for_status:+--for-status} ${summary_limit:+-n $summary_limit} -- "$@" | 
|  | } | 
|  | # | 
|  | # List all submodules, prefixed with: | 
|  | #  - 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) | 
|  | # | 
|  | cmd_status() | 
|  | { | 
|  | # parse $args after "submodule ... status". | 
|  | while test $# -ne 0 | 
|  | do | 
|  | case "$1" in | 
|  | -q|--quiet) | 
|  | quiet=1 | 
|  | ;; | 
|  | --cached) | 
|  | cached=1 | 
|  | ;; | 
|  | --recursive) | 
|  | recursive=1 | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper status ${quiet:+--quiet} ${cached:+--cached} ${recursive:+--recursive} -- "$@" | 
|  | } | 
|  | # | 
|  | # 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) | 
|  | quiet=1 | 
|  | shift | 
|  | ;; | 
|  | --recursive) | 
|  | recursive=1 | 
|  | shift | 
|  | ;; | 
|  | --) | 
|  | shift | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | done | 
|  |  | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper sync ${quiet:+--quiet} ${recursive:+--recursive} -- "$@" | 
|  | } | 
|  |  | 
|  | cmd_absorbgitdirs() | 
|  | { | 
|  | git ${wt_prefix:+-C "$wt_prefix"} submodule--helper absorbgitdirs "$@" | 
|  | } | 
|  |  | 
|  | # This loop parses the command line arguments to find the | 
|  | # subcommand name to dispatch.  Parsing of the subcommand specific | 
|  | # options are primarily done by the subcommand implementations. | 
|  | # Subcommand specific options such as --branch and --cached are | 
|  | # parsed here as well, for backward compatibility. | 
|  |  | 
|  | while test $# != 0 && test -z "$command" | 
|  | do | 
|  | case "$1" in | 
|  | add | foreach | init | deinit | update | set-branch | set-url | status | summary | sync | absorbgitdirs) | 
|  | command=$1 | 
|  | ;; | 
|  | -q|--quiet) | 
|  | quiet=1 | 
|  | ;; | 
|  | --cached) | 
|  | cached=1 | 
|  | ;; | 
|  | --) | 
|  | break | 
|  | ;; | 
|  | -*) | 
|  | usage | 
|  | ;; | 
|  | *) | 
|  | break | 
|  | ;; | 
|  | esac | 
|  | shift | 
|  | done | 
|  |  | 
|  | # No command word defaults to "status" | 
|  | if test -z "$command" | 
|  | then | 
|  | if test $# = 0 | 
|  | then | 
|  | command=status | 
|  | else | 
|  | usage | 
|  | fi | 
|  | fi | 
|  |  | 
|  | # "--cached" is accepted only by "status" and "summary" | 
|  | if test -n "$cached" && test "$command" != status && test "$command" != summary | 
|  | then | 
|  | usage | 
|  | fi | 
|  |  | 
|  | "cmd_$(echo $command | sed -e s/-/_/g)" "$@" |