]> git.ipfire.org Git - thirdparty/git.git/blame - git-submodule.sh
dir: libify and export helper functions from clone.c
[thirdparty/git.git] / git-submodule.sh
CommitLineData
70c7ac22
LH
1#!/bin/sh
2#
4c8a9db6 3# git-submodule.sh: add, init, update or list git submodules
70c7ac22
LH
4#
5# Copyright (c) 2007 Lars Hjemli
6
1d5bec8b 7dashless=$(basename "$0" | sed -e 's/-/ /')
68cabbfd
DL
8USAGE="[--quiet] [--cached]
9 or: $dashless [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
64b19ffe 10 or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
1d5bec8b 11 or: $dashless [--quiet] init [--] [<path>...]
f6a52799 12 or: $dashless [--quiet] deinit [-f|--force] (--all| [--] <path>...)
132f600b 13 or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--[no-]single-branch] [--] [<path>...]
b57e8119 14 or: $dashless [--quiet] set-branch (--default|--branch <branch>) [--] <path>
26b06100 15 or: $dashless [--quiet] set-url [--] <path> <newurl>
adc54235 16 or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
15fc56a8 17 or: $dashless [--quiet] foreach [--recursive] <command>
c32eaa8a
SB
18 or: $dashless [--quiet] sync [--recursive] [--] [<path>...]
19 or: $dashless [--quiet] absorbgitdirs [--] [<path>...]"
8f321a39 20OPTIONS_SPEC=
091a6eb0 21SUBDIRECTORY_OK=Yes
70c7ac22
LH
22. git-sh-setup
23require_work_tree
091a6eb0
JK
24wt_prefix=$(git rev-parse --show-prefix)
25cd_to_toplevel
70c7ac22 26
f1762d77
BW
27# Tell the rest of git that any URLs we get don't come
28# directly from the user, so it can apply policy as appropriate.
29GIT_PROTOCOL_FROM_USER=0
30export GIT_PROTOCOL_FROM_USER
33cfccbb 31
5c08dbbd 32command=
ecda0723 33branch=
d27b876b 34force=
d92a3959 35reference=
70c7ac22 36cached=
48bb3033
GP
37recursive=
38init=
0060fd15 39require_init=
1c244f6e 40files=
06b1abb5 41remote=
31ca3ac3 42nofetch=
32948425 43update=
15fc56a8 44prefix=
73b0898d 45custom_name=
275cd184 46depth=
72c5f883 47progress=
a0ef2934 48dissociate=
132f600b 49single_branch=
65d100c4
LX
50jobs=
51recommend_shallow=
70c7ac22 52
be9d0a3a
HV
53die_if_unmatched ()
54{
55 if test "$1" = "#unmatched"
56 then
c4c02bf1 57 exit ${2:-1}
be9d0a3a
HV
58 fi
59}
60
862ae6cd
RS
61isnumber()
62{
63 n=$(($1 + 0)) 2>/dev/null && test "$n" = "$1"
64}
65
dda63468 66# Given a full hex object ID, is this the zero OID?
67is_zero_oid () {
68 echo "$1" | sane_egrep '^0+$' >/dev/null 2>&1
69}
70
14111fc4
JK
71# Sanitize the local git environment for use within a submodule. We
72# can't simply use clear_local_git_env since we want to preserve some
73# of the settings from GIT_CONFIG_PARAMETERS.
74sanitize_submodule_env()
75{
89044baa 76 save_config=$GIT_CONFIG_PARAMETERS
14111fc4 77 clear_local_git_env
89044baa 78 GIT_CONFIG_PARAMETERS=$save_config
860cba61 79 export GIT_CONFIG_PARAMETERS
14111fc4
JK
80}
81
ecda0723
SV
82#
83# Add a new submodule to the working tree, .gitmodules and the index
84#
ec05df35 85# $@ = repo path
ecda0723
SV
86#
87# optional branch is stored in global branch variable
88#
23a485e3 89cmd_add()
ecda0723 90{
5c08dbbd 91 # parse $args after "submodule ... add".
091a6eb0 92 reference_path=
5c08dbbd
JH
93 while test $# -ne 0
94 do
95 case "$1" in
96 -b | --branch)
97 case "$2" in '') usage ;; esac
98 branch=$2
99 shift
100 ;;
d27b876b
JL
101 -f | --force)
102 force=$1
103 ;;
5c08dbbd 104 -q|--quiet)
2e6a30ef 105 GIT_QUIET=1
5c08dbbd 106 ;;
6d33e1c2
CF
107 --progress)
108 progress=1
109 ;;
d92a3959
MT
110 --reference)
111 case "$2" in '') usage ;; esac
091a6eb0 112 reference_path=$2
d92a3959
MT
113 shift
114 ;;
115 --reference=*)
091a6eb0 116 reference_path="${1#--reference=}"
d92a3959 117 ;;
a0ef2934
CF
118 --dissociate)
119 dissociate=1
120 ;;
73b0898d
JL
121 --name)
122 case "$2" in '') usage ;; esac
123 custom_name=$2
124 shift
125 ;;
275cd184
FG
126 --depth)
127 case "$2" in '') usage ;; esac
128 depth="--depth=$2"
129 shift
130 ;;
131 --depth=*)
132 depth=$1
133 ;;
5c08dbbd
JH
134 --)
135 shift
136 break
137 ;;
138 -*)
139 usage
140 ;;
141 *)
142 break
143 ;;
144 esac
145 shift
146 done
147
76e9bdc4
AO
148 if ! git submodule--helper config --check-writeable >/dev/null 2>&1
149 then
0008d122 150 die "fatal: $(eval_gettext "please make sure that the .gitmodules file is in the working tree")"
76e9bdc4
AO
151 fi
152
091a6eb0
JK
153 if test -n "$reference_path"
154 then
155 is_absolute_path "$reference_path" ||
156 reference_path="$wt_prefix$reference_path"
157
158 reference="--reference=$reference_path"
159 fi
160
ecda0723 161 repo=$1
64394e3a 162 sm_path=$2
ecda0723 163
64394e3a 164 if test -z "$sm_path"; then
6a066230 165 sm_path=$(printf '%s\n' "$repo" |
1414e578
JL
166 sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
167 fi
168
496eeeb1 169 if test -z "$repo" || test -z "$sm_path"; then
ecda0723
SV
170 usage
171 fi
172
091a6eb0
JK
173 is_absolute_path "$sm_path" || sm_path="$wt_prefix$sm_path"
174
ec05df35
ML
175 # assure repo is absolute or relative to parent
176 case "$repo" in
177 ./*|../*)
091a6eb0 178 test -z "$wt_prefix" ||
0008d122 179 die "fatal: $(gettext "Relative path can only be used from the toplevel of the working tree")"
091a6eb0 180
ec05df35 181 # dereference source url relative to parent's url
63e95beb 182 realrepo=$(git submodule--helper resolve-relative-url "$repo") || exit
ec05df35
ML
183 ;;
184 *:*|/*)
185 # absolute url
186 realrepo=$repo
187 ;;
188 *)
0008d122 189 die "fatal: $(eval_gettext "repo URL: '\$repo' must be absolute or begin with ./|../")"
ec05df35
ML
190 ;;
191 esac
192
db75ada5
MG
193 # normalize path:
194 # multiple //; leading ./; /./; /../; trailing /
64394e3a 195 sm_path=$(printf '%s/\n' "$sm_path" |
db75ada5
MG
196 sed -e '
197 s|//*|/|g
198 s|^\(\./\)*||
8196e728 199 s|/\(\./\)*|/|g
db75ada5
MG
200 :start
201 s|\([^/]*\)/\.\./||
202 tstart
203 s|/*$||
204 ')
619acfc7
SB
205 if test -z "$force"
206 then
207 git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
0008d122 208 die "fatal: $(eval_gettext "'\$sm_path' already exists in the index")"
619acfc7
SB
209 else
210 git ls-files -s "$sm_path" | sane_grep -v "^160000" > /dev/null 2>&1 &&
0008d122 211 die "fatal: $(eval_gettext "'\$sm_path' already exists in the index and is not a submodule")"
619acfc7 212 fi
ecda0723 213
e1381118
KM
214 if test -d "$sm_path" &&
215 test -z $(git -C "$sm_path" rev-parse --show-cdup 2>/dev/null)
216 then
217 git -C "$sm_path" rev-parse --verify -q HEAD >/dev/null ||
0008d122 218 die "fatal: $(eval_gettext "'\$sm_path' does not have a commit checked out")"
e1381118
KM
219 fi
220
c8163854 221 if test -z "$force"
d27b876b 222 then
c8163854
KM
223 dryerr=$(git add --dry-run --ignore-missing --no-warn-embedded-repo "$sm_path" 2>&1 >/dev/null)
224 res=$?
225 if test $res -ne 0
226 then
227 echo >&2 "$dryerr"
228 exit $res
229 fi
d27b876b
JL
230 fi
231
73b0898d
JL
232 if test -n "$custom_name"
233 then
234 sm_name="$custom_name"
235 else
236 sm_name="$sm_path"
237 fi
238
0383bbb9
JK
239 if ! git submodule--helper check-name "$sm_name"
240 then
0008d122 241 die "fatal: $(eval_gettext "'$sm_name' is not a valid submodule name")"
0383bbb9
JK
242 fi
243
8c8195e9 244 git submodule--helper add-clone ${GIT_QUIET:+--quiet} ${force:+"--force"} ${progress:+"--progress"} ${branch:+--branch "$branch"} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" ${reference:+"$reference"} ${dissociate:+"--dissociate"} ${depth:+"$depth"} || exit
a452128a 245 git submodule--helper add-config ${force:+--force} ${branch:+--branch "$branch"} --url "$repo" --resolved-url "$realrepo" --path "$sm_path" --name "$sm_name"
ecda0723
SV
246}
247
19a31f9c
ML
248#
249# Execute an arbitrary command sequence in each checked out
250# submodule
251#
252# $@ = command to execute
253#
254cmd_foreach()
255{
1d5bec8b
JH
256 # parse $args after "submodule ... foreach".
257 while test $# -ne 0
258 do
259 case "$1" in
260 -q|--quiet)
261 GIT_QUIET=1
262 ;;
15fc56a8
JH
263 --recursive)
264 recursive=1
265 ;;
1d5bec8b
JH
266 -*)
267 usage
268 ;;
269 *)
270 break
271 ;;
272 esac
273 shift
274 done
275
1cf823d8 276 git ${wt_prefix:+-C "$wt_prefix"} submodule--helper foreach ${GIT_QUIET:+--quiet} ${recursive:+--recursive} -- "$@"
19a31f9c
ML
277}
278
70c7ac22 279#
211b7f19 280# Register submodules in .git/config
70c7ac22
LH
281#
282# $@ = requested paths (default to all)
283#
23a485e3 284cmd_init()
70c7ac22 285{
5c08dbbd
JH
286 # parse $args after "submodule ... init".
287 while test $# -ne 0
288 do
289 case "$1" in
290 -q|--quiet)
2e6a30ef 291 GIT_QUIET=1
5c08dbbd
JH
292 ;;
293 --)
294 shift
295 break
296 ;;
297 -*)
298 usage
299 ;;
300 *)
301 break
302 ;;
303 esac
304 shift
305 done
306
a282f5a9 307 git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper init ${GIT_QUIET:+--quiet} -- "$@"
70c7ac22
LH
308}
309
cf419828
JL
310#
311# Unregister submodules from .git/config and remove their work tree
312#
cf419828
JL
313cmd_deinit()
314{
315 # parse $args after "submodule ... deinit".
f6a52799 316 deinit_all=
cf419828
JL
317 while test $# -ne 0
318 do
319 case "$1" in
320 -f|--force)
321 force=$1
322 ;;
323 -q|--quiet)
324 GIT_QUIET=1
325 ;;
f6a52799
SB
326 --all)
327 deinit_all=t
328 ;;
cf419828
JL
329 --)
330 shift
331 break
332 ;;
333 -*)
334 usage
335 ;;
336 *)
337 break
338 ;;
339 esac
340 shift
341 done
342
1cf823d8 343 git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit ${GIT_QUIET:+--quiet} ${force:+--force} ${deinit_all:+--all} -- "$@"
cf419828
JL
344}
345
fb43e31f 346is_tip_reachable () (
01e1d544 347 sanitize_submodule_env &&
fb43e31f
SB
348 cd "$1" &&
349 rev=$(git rev-list -n 1 "$2" --not --all 2>/dev/null) &&
350 test -z "$rev"
351)
352
66d36b94
JK
353# usage: fetch_in_submodule <module_path> [<depth>] [<sha1>]
354# Because arguments are positional, use an empty string to omit <depth>
355# but include <sha1>.
fb43e31f 356fetch_in_submodule () (
01e1d544 357 sanitize_submodule_env &&
fb43e31f 358 cd "$1" &&
1c151807
ÆAB
359 if test $# -eq 3
360 then
62af4bdd 361 echo "$3" | git fetch ${GIT_QUIET:+--quiet} --stdin ${2:+"$2"}
1c151807 362 else
62af4bdd 363 git fetch ${GIT_QUIET:+--quiet} ${2:+"$2"}
1c151807 364 fi
fb43e31f
SB
365)
366
70c7ac22 367#
211b7f19 368# Update each submodule path to correct revision, using clone and checkout as needed
70c7ac22
LH
369#
370# $@ = requested paths (default to all)
371#
23a485e3 372cmd_update()
70c7ac22 373{
5c08dbbd
JH
374 # parse $args after "submodule ... update".
375 while test $# -ne 0
376 do
377 case "$1" in
378 -q|--quiet)
2e6a30ef 379 GIT_QUIET=1
5c08dbbd 380 ;;
e84c3cf3 381 -v)
3ad0401e 382 unset GIT_QUIET
e84c3cf3 383 ;;
72c5f883 384 --progress)
c7199e3a 385 progress=1
72c5f883 386 ;;
be4d2c83 387 -i|--init)
d92a3959 388 init=1
be4d2c83 389 ;;
0060fd15
JS
390 --require-init)
391 init=1
392 require_init=1
393 ;;
06b1abb5
TK
394 --remote)
395 remote=1
396 ;;
31ca3ac3 397 -N|--no-fetch)
31ca3ac3
FF
398 nofetch=1
399 ;;
9db31bdf
NMC
400 -f|--force)
401 force=$1
402 ;;
ca2cedba 403 -r|--rebase)
32948425 404 update="rebase"
ca2cedba 405 ;;
d92a3959
MT
406 --reference)
407 case "$2" in '') usage ;; esac
408 reference="--reference=$2"
98dbe63d 409 shift
d92a3959
MT
410 ;;
411 --reference=*)
412 reference="$1"
d92a3959 413 ;;
a0ef2934
CF
414 --dissociate)
415 dissociate=1
416 ;;
42b49178 417 -m|--merge)
42b49178
JH
418 update="merge"
419 ;;
b13fd5c1 420 --recursive)
b13fd5c1
JH
421 recursive=1
422 ;;
efc5fb6a
JH
423 --checkout)
424 update="checkout"
425 ;;
abed000a
SB
426 --recommend-shallow)
427 recommend_shallow="--recommend-shallow"
428 ;;
429 --no-recommend-shallow)
430 recommend_shallow="--no-recommend-shallow"
431 ;;
275cd184
FG
432 --depth)
433 case "$2" in '') usage ;; esac
434 depth="--depth=$2"
435 shift
436 ;;
437 --depth=*)
438 depth=$1
439 ;;
2335b870
SB
440 -j|--jobs)
441 case "$2" in '') usage ;; esac
442 jobs="--jobs=$2"
443 shift
444 ;;
445 --jobs=*)
446 jobs=$1
447 ;;
132f600b
ES
448 --single-branch)
449 single_branch="--single-branch"
450 ;;
451 --no-single-branch)
452 single_branch="--no-single-branch"
453 ;;
5c08dbbd
JH
454 --)
455 shift
456 break
457 ;;
458 -*)
459 usage
460 ;;
461 *)
462 break
463 ;;
464 esac
98dbe63d 465 shift
5c08dbbd
JH
466 done
467
d92a3959
MT
468 if test -n "$init"
469 then
470 cmd_init "--" "$@" || return
471 fi
472
48308681
SB
473 {
474 git submodule--helper update-clone ${GIT_QUIET:+--quiet} \
c7199e3a 475 ${progress:+"--progress"} \
48308681
SB
476 ${wt_prefix:+--prefix "$wt_prefix"} \
477 ${prefix:+--recursive-prefix "$prefix"} \
478 ${update:+--update "$update"} \
5f50f33e 479 ${reference:+"$reference"} \
a0ef2934 480 ${dissociate:+"--dissociate"} \
48308681 481 ${depth:+--depth "$depth"} \
0060fd15 482 ${require_init:+--require-init} \
132f600b 483 $single_branch \
c7199e3a
CF
484 $recommend_shallow \
485 $jobs \
a282f5a9 486 -- \
c4c02bf1 487 "$@" || echo "#unmatched" $?
48308681 488 } | {
15ffb7cd 489 err=
9eca701f 490 while read -r quickabort sha1 just_cloned sm_path
70c7ac22 491 do
9eca701f 492 die_if_unmatched "$quickabort" "$sha1"
48308681 493
5d124f41 494 git submodule--helper ensure-core-worktree "$sm_path" || exit 1
74d4731d 495
ee69b2a9 496 update_module=$(git submodule--helper update-module-mode $just_cloned "$sm_path" $update)
efc5fb6a 497
44431df0 498 displaypath=$(git submodule--helper relative-path "$prefix$sm_path" "$wt_prefix")
091a6eb0 499
48308681 500 if test $just_cloned -eq 1
d851ffb9 501 then
bf2d8246
LH
502 subsha1=
503 else
14111fc4 504 subsha1=$(sanitize_submodule_env; cd "$sm_path" &&
5be60078 505 git rev-parse --verify HEAD) ||
0008d122 506 die "fatal: $(eval_gettext "Unable to find current revision in submodule path '\$displaypath'")"
70c7ac22 507 fi
211b7f19 508
06b1abb5
TK
509 if test -n "$remote"
510 then
92bbe7cc 511 branch=$(git submodule--helper remote-branch "$sm_path")
06b1abb5
TK
512 if test -z "$nofetch"
513 then
514 # Fetch remote before determining tracking $sha1
6cbf454a 515 fetch_in_submodule "$sm_path" $depth ||
0008d122 516 die "fatal: $(eval_gettext "Unable to fetch in submodule path '\$sm_path'")"
06b1abb5 517 fi
e63f7b0a 518 remote_name=$(sanitize_submodule_env; cd "$sm_path" && git submodule--helper print-default-remote)
14111fc4 519 sha1=$(sanitize_submodule_env; cd "$sm_path" &&
06b1abb5 520 git rev-parse --verify "${remote_name}/${branch}") ||
0008d122 521 die "fatal: $(eval_gettext "Unable to find current \${remote_name}/\${branch} revision in submodule path '\$sm_path'")"
06b1abb5
TK
522 fi
523
496eeeb1 524 if test "$subsha1" != "$sha1" || test -n "$force"
70c7ac22 525 then
9db31bdf
NMC
526 subforce=$force
527 # If we don't already have a -f flag and the submodule has never been checked out
496eeeb1 528 if test -z "$subsha1" && test -z "$force"
b9b378a0 529 then
9db31bdf 530 subforce="-f"
b9b378a0 531 fi
31ca3ac3
FF
532
533 if test -z "$nofetch"
534 then
e5f522d6
JL
535 # Run fetch only if $sha1 isn't present or it
536 # is not reachable from a ref.
fb43e31f 537 is_tip_reachable "$sm_path" "$sha1" ||
6cbf454a 538 fetch_in_submodule "$sm_path" $depth ||
bd5e567d 539 say "$(eval_gettext "Unable to fetch in submodule path '\$displaypath'; trying to directly fetch \$sha1:")"
fb43e31f
SB
540
541 # Now we tried the usual fetch, but $sha1 may
542 # not be reachable from any of the refs
543 is_tip_reachable "$sm_path" "$sha1" ||
66d36b94 544 fetch_in_submodule "$sm_path" "$depth" "$sha1" ||
0008d122 545 die "fatal: $(eval_gettext "Fetched in submodule path '\$displaypath', but it did not contain \$sha1. Direct fetching of that commit failed.")"
31ca3ac3
FF
546 fi
547
877449c1 548 must_die_on_failure=
32948425 549 case "$update_module" in
a2aed08b
TK
550 checkout)
551 command="git checkout $subforce -q"
0008d122 552 die_msg="fatal: $(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$displaypath'")"
a2aed08b
TK
553 say_msg="$(eval_gettext "Submodule path '\$displaypath': checked out '\$sha1'")"
554 ;;
32948425 555 rebase)
3ad0401e 556 command="git rebase ${GIT_QUIET:+--quiet}"
0008d122 557 die_msg="fatal: $(eval_gettext "Unable to rebase '\$sha1' in submodule path '\$displaypath'")"
091a6eb0 558 say_msg="$(eval_gettext "Submodule path '\$displaypath': rebased into '\$sha1'")"
877449c1 559 must_die_on_failure=yes
32948425 560 ;;
42b49178 561 merge)
3ad0401e 562 command="git merge ${GIT_QUIET:+--quiet}"
0008d122 563 die_msg="fatal: $(eval_gettext "Unable to merge '\$sha1' in submodule path '\$displaypath'")"
091a6eb0 564 say_msg="$(eval_gettext "Submodule path '\$displaypath': merged in '\$sha1'")"
877449c1 565 must_die_on_failure=yes
42b49178 566 ;;
6cb5728c
CP
567 !*)
568 command="${update_module#!}"
0008d122 569 die_msg="fatal: $(eval_gettext "Execution of '\$command \$sha1' failed in submodule path '\$displaypath'")"
b08238ac 570 say_msg="$(eval_gettext "Submodule path '\$displaypath': '\$command \$sha1'")"
6cb5728c
CP
571 must_die_on_failure=yes
572 ;;
32948425 573 *)
0008d122 574 die "fatal: $(eval_gettext "Invalid update mode '$update_module' for submodule path '$path'")"
32948425 575 esac
70c7ac22 576
14111fc4 577 if (sanitize_submodule_env; cd "$sm_path" && $command "$sha1")
15ffb7cd 578 then
ff968f03 579 say "$say_msg"
877449c1
JH
580 elif test -n "$must_die_on_failure"
581 then
ff968f03 582 die_with_status 2 "$die_msg"
15ffb7cd 583 else
ff968f03 584 err="${err};$die_msg"
877449c1 585 continue
15ffb7cd 586 fi
70c7ac22 587 fi
b13fd5c1
JH
588
589 if test -n "$recursive"
590 then
75bf5e60 591 (
44431df0 592 prefix=$(git submodule--helper relative-path "$prefix$sm_path/" "$wt_prefix")
3604242f 593 wt_prefix=
14111fc4 594 sanitize_submodule_env
75bf5e60 595 cd "$sm_path" &&
36141282 596 eval cmd_update
75bf5e60 597 )
15ffb7cd
FG
598 res=$?
599 if test $res -gt 0
600 then
0008d122 601 die_msg="fatal: $(eval_gettext "Failed to recurse into submodule path '\$displaypath'")"
bb9d91b4 602 if test $res -ne 2
15ffb7cd 603 then
ff968f03 604 err="${err};$die_msg"
15ffb7cd
FG
605 continue
606 else
ff968f03 607 die_with_status $res "$die_msg"
15ffb7cd
FG
608 fi
609 fi
b13fd5c1 610 fi
70c7ac22 611 done
15ffb7cd
FG
612
613 if test -n "$err"
614 then
615 OIFS=$IFS
616 IFS=';'
617 for e in $err
618 do
619 if test -n "$e"
620 then
621 echo >&2 "$e"
622 fi
623 done
624 IFS=$OIFS
625 exit 1
626 fi
627 }
70c7ac22
LH
628}
629
b57e8119
DL
630#
631# Configures a submodule's default branch
632#
633# $@ = requested path
634#
635cmd_set_branch() {
2964d6e5 636 default=
b57e8119
DL
637 branch=
638
639 while test $# -ne 0
640 do
641 case "$1" in
642 -q|--quiet)
643 # we don't do anything with this but we need to accept it
644 ;;
645 -d|--default)
2964d6e5 646 default=1
b57e8119
DL
647 ;;
648 -b|--branch)
649 case "$2" in '') usage ;; esac
650 branch=$2
651 shift
652 ;;
653 --)
654 shift
655 break
656 ;;
657 -*)
658 usage
659 ;;
660 *)
661 break
662 ;;
663 esac
664 shift
665 done
666
1cf823d8 667 git ${wt_prefix:+-C "$wt_prefix"} submodule--helper set-branch ${GIT_QUIET:+--quiet} ${branch:+--branch "$branch"} ${default:+--default} -- "$@"
b57e8119
DL
668}
669
26b06100
DL
670#
671# Configures a submodule's remote url
672#
673# $@ = requested path, requested url
674#
675cmd_set_url() {
676 while test $# -ne 0
677 do
678 case "$1" in
679 -q|--quiet)
680 GIT_QUIET=1
681 ;;
682 --)
683 shift
684 break
685 ;;
686 -*)
687 usage
688 ;;
689 *)
690 break
691 ;;
692 esac
693 shift
694 done
695
1cf823d8 696 git ${wt_prefix:+-C "$wt_prefix"} submodule--helper set-url ${GIT_QUIET:+--quiet} -- "$@"
26b06100
DL
697}
698
28f9af5d
PY
699#
700# Show commit summary for submodules in index or working tree
701#
702# If '--cached' is given, show summary between index and given commit,
703# or between working tree and given commit
704#
705# $@ = [commit (default 'HEAD'),] requested paths (default all)
706#
707cmd_summary() {
f2dc06a3 708 summary_limit=-1
d0f64dd4 709 for_status=
1c244f6e 710 diff_cmd=diff-index
f2dc06a3 711
28f9af5d
PY
712 # parse $args after "submodule ... summary".
713 while test $# -ne 0
714 do
715 case "$1" in
716 --cached)
717 cached="$1"
718 ;;
1c244f6e
JL
719 --files)
720 files="$1"
721 ;;
d0f64dd4
PY
722 --for-status)
723 for_status="$1"
724 ;;
f2dc06a3 725 -n|--summary-limit)
862ae6cd
RS
726 summary_limit="$2"
727 isnumber "$summary_limit" || usage
f2dc06a3
PY
728 shift
729 ;;
862ae6cd
RS
730 --summary-limit=*)
731 summary_limit="${1#--summary-limit=}"
732 isnumber "$summary_limit" || usage
733 ;;
28f9af5d
PY
734 --)
735 shift
736 break
737 ;;
738 -*)
739 usage
740 ;;
741 *)
742 break
743 ;;
744 esac
745 shift
746 done
bffe71f4 747
1cf823d8 748 git ${wt_prefix:+-C "$wt_prefix"} submodule--helper summary ${files:+--files} ${cached:+--cached} ${for_status:+--for-status} ${summary_limit:+-n $summary_limit} -- "$@"
28f9af5d 749}
70c7ac22 750#
941987a5 751# List all submodules, prefixed with:
70c7ac22
LH
752# - submodule not initialized
753# + different revision checked out
754#
755# If --cached was specified the revision in the index will be printed
756# instead of the currently checked out revision.
757#
758# $@ = requested paths (default to all)
759#
23a485e3 760cmd_status()
70c7ac22 761{
5c08dbbd
JH
762 # parse $args after "submodule ... status".
763 while test $# -ne 0
764 do
765 case "$1" in
766 -q|--quiet)
2e6a30ef 767 GIT_QUIET=1
5c08dbbd
JH
768 ;;
769 --cached)
770 cached=1
771 ;;
64b19ffe
JH
772 --recursive)
773 recursive=1
774 ;;
5c08dbbd
JH
775 --)
776 shift
777 break
778 ;;
779 -*)
780 usage
781 ;;
782 *)
783 break
784 ;;
785 esac
786 shift
787 done
788
1cf823d8 789 git ${wt_prefix:+-C "$wt_prefix"} submodule--helper status ${GIT_QUIET:+--quiet} ${cached:+--cached} ${recursive:+--recursive} -- "$@"
70c7ac22 790}
2327f61e
DA
791#
792# Sync remote urls for submodules
793# This makes the value for remote.$remote.url match the value
794# specified in .gitmodules.
795#
796cmd_sync()
797{
798 while test $# -ne 0
799 do
800 case "$1" in
801 -q|--quiet)
2e6a30ef 802 GIT_QUIET=1
2327f61e
DA
803 shift
804 ;;
82f49f29
PH
805 --recursive)
806 recursive=1
807 shift
808 ;;
2327f61e
DA
809 --)
810 shift
811 break
812 ;;
813 -*)
814 usage
815 ;;
816 *)
817 break
818 ;;
819 esac
820 done
e7849a96 821
1cf823d8 822 git ${wt_prefix:+-C "$wt_prefix"} submodule--helper sync ${GIT_QUIET:+--quiet} ${recursive:+--recursive} -- "$@"
2327f61e 823}
70c7ac22 824
f6f85861
SB
825cmd_absorbgitdirs()
826{
827 git submodule--helper absorb-git-dirs --prefix "$wt_prefix" "$@"
828}
829
5c08dbbd
JH
830# This loop parses the command line arguments to find the
831# subcommand name to dispatch. Parsing of the subcommand specific
832# options are primarily done by the subcommand implementations.
833# Subcommand specific options such as --branch and --cached are
834# parsed here as well, for backward compatibility.
835
836while test $# != 0 && test -z "$command"
70c7ac22
LH
837do
838 case "$1" in
26b06100 839 add | foreach | init | deinit | update | set-branch | set-url | status | summary | sync | absorbgitdirs)
5c08dbbd 840 command=$1
70c7ac22
LH
841 ;;
842 -q|--quiet)
2e6a30ef 843 GIT_QUIET=1
70c7ac22 844 ;;
ecda0723
SV
845 -b|--branch)
846 case "$2" in
847 '')
848 usage
849 ;;
850 esac
851 branch="$2"; shift
852 ;;
70c7ac22 853 --cached)
28f9af5d 854 cached="$1"
70c7ac22
LH
855 ;;
856 --)
857 break
858 ;;
859 -*)
860 usage
861 ;;
862 *)
863 break
864 ;;
865 esac
866 shift
867done
868
5c08dbbd 869# No command word defaults to "status"
af9c9f97
RR
870if test -z "$command"
871then
872 if test $# = 0
873 then
874 command=status
875 else
876 usage
877 fi
878fi
5c08dbbd 879
b57e8119
DL
880# "-b branch" is accepted only by "add" and "set-branch"
881if test -n "$branch" && (test "$command" != add || test "$command" != set-branch)
5c08dbbd 882then
ecda0723 883 usage
5c08dbbd
JH
884fi
885
28f9af5d 886# "--cached" is accepted only by "status" and "summary"
496eeeb1 887if test -n "$cached" && test "$command" != status && test "$command" != summary
5c08dbbd 888then
70c7ac22 889 usage
5c08dbbd
JH
890fi
891
b57e8119 892"cmd_$(echo $command | sed -e s/-/_/g)" "$@"