blob: 021ad6c41cde3f3fc5990e588a7d6aa98ad4dfbc [file] [log] [blame]
Jan Holesovskya694de12010-11-16 15:00:48 +01001#!/usr/bin/env bash
2#
3# Wrapper for git to handle more subdirs at the same time
4#
Norbert Thiebaud8feb6c02010-11-22 03:11:56 -06005
Norbert Thiebaud9152c422012-10-01 23:48:10 -05006if [ -n "$g_debug" ] ; then
7 set -x
8fi
9
Norbert Thiebaud060219a2012-11-08 16:25:37 -060010SUBMODULES_ALL="dictionaries helpcontent2 translations"
Norbert Thiebaud9152c422012-10-01 23:48:10 -050011
12pushd $(dirname $0) > /dev/null
Norbert Thiebaudae4e3272012-12-11 07:49:24 -060013if [ -f config_host.mk ] ; then
Luboš Luňákc8c056f2012-12-11 15:39:49 +010014 # we are in the BUILDDIR
Ilmari Lauhakangas55c5b272017-04-15 18:35:17 +030015 SRC_ROOT=$(< config_host.mk grep -a SRC_ROOT | sed -e "s/.*=//")
Norbert Thiebaudae4e3272012-12-11 07:49:24 -060016else
17 SRC_ROOT=$(pwd)
18fi
Norbert Thiebaud9152c422012-10-01 23:48:10 -050019popd > /dev/null
20
Norbert Thiebaudae4e3272012-12-11 07:49:24 -060021COREDIR="$SRC_ROOT"
22
Norbert Thiebaud9152c422012-10-01 23:48:10 -050023usage()
24{
Jan Holesovskya694de12010-11-16 15:00:48 +010025 git
26 echo
Arnaud VERSINI5448ad52022-01-02 17:33:27 +010027 echo "Usage: g [options] [git (checkout|clone|fetch|gc|grep|pull|push|reset) [git options/args..]]"
Norbert Thiebaud9152c422012-10-01 23:48:10 -050028 echo ""
Peter Foley41b5c802012-10-16 20:43:21 -040029 echo " -z restore the git hooks and do other sanity checks"
Norbert Thiebaud9152c422012-10-01 23:48:10 -050030}
31
32refresh_submodule_hooks()
33{
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020034 local repo=$1
35 local hook
36 local hook_name
Norbert Thiebaud9152c422012-10-01 23:48:10 -050037
Ilmari Lauhakangase5b1c532017-04-27 12:46:47 +030038 if [ -d "${repo?}"/.git ] ; then
Norbert Thiebaud9152c422012-10-01 23:48:10 -050039 # use core's hook by default
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020040 for hook_name in "${COREDIR?}/.git-hooks"/* ; do
Mike Kaganski0e6e10c2021-03-04 11:40:05 +030041 if [ ! -e "${hook_name}" ] ; then
42 continue
43 fi
Ilmari Lauhakangas55c5b272017-04-15 18:35:17 +030044 hook="${repo?}/.git/hooks/${hook_name##*/}"
45 if [ ! -e "${hook?}" ] || [ -L "${hook?}" ] ; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020046 rm -f "${hook?}"
47 ln -sf "${hook_name}" "${hook?}"
Norbert Thiebaud9152c422012-10-01 23:48:10 -050048 fi
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020049 done
Norbert Thiebaud9152c422012-10-01 23:48:10 -050050 # override if need be by the submodules' own hooks
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020051 for hook_name in "${COREDIR?}/${repo?}/.git-hooks"/* ; do
Mike Kaganski0e6e10c2021-03-04 11:40:05 +030052 if [ ! -e "${hook_name}" ] ; then
53 continue
54 fi
Ilmari Lauhakangas55c5b272017-04-15 18:35:17 +030055 hook="${repo?}/.git/hooks/${hook_name##*/}"
56 if [ ! -e "${hook?}" ] || [ -L "${hook?}" ] ; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020057 rm -f "${hook?}"
58 ln -sf "${hook_name}" "${hook?}"
59 fi
60 done
Ilmari Lauhakangase5b1c532017-04-27 12:46:47 +030061 elif [ -d .git/modules/"${repo}"/hooks ] ; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020062 for hook_name in "${COREDIR?}/.git-hooks"/* ; do
Mike Kaganski0e6e10c2021-03-04 11:40:05 +030063 if [ ! -e "${hook_name}" ] ; then
64 continue
65 fi
Ilmari Lauhakangas55c5b272017-04-15 18:35:17 +030066 hook=".git/modules/${repo?}/hooks/${hook_name##*/}"
67 if [ ! -e "${hook?}" ] || [ -L "${hook?}" ] ; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020068 rm -f "${hook?}"
69 ln -sf "${hook_name}" "${hook?}"
Norbert Thiebaud0cac67b2012-12-21 04:33:20 -060070 fi
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020071 done
Norbert Thiebaud0cac67b2012-12-21 04:33:20 -060072 # override if need be by the submodules' own hooks
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020073 for hook_name in "${COREDIR?}/${repo?}/.git-hooks"/* ; do
Mike Kaganski0e6e10c2021-03-04 11:40:05 +030074 if [ ! -e "${hook_name}" ] ; then
75 continue
76 fi
Ilmari Lauhakangas55c5b272017-04-15 18:35:17 +030077 hook=".git/modules/${repo?}/hooks/${hook_name##*/}"
78 if [ ! -e "${hook?}" ] || [ -L "${hook?}" ] ; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020079 rm -f "${hook?}"
80 ln -sf "${hook_name}" "${hook?}"
81 fi
82 done
Norbert Thiebaud9152c422012-10-01 23:48:10 -050083 fi
Norbert Thiebaud0cac67b2012-12-21 04:33:20 -060084
Norbert Thiebaud9152c422012-10-01 23:48:10 -050085}
86
87refresh_all_hooks()
88{
Thorsten Behrens4c475bc2018-07-02 18:11:22 +020089 local repo
90 local hook_name
91 local hook
Norbert Thiebaud9152c422012-10-01 23:48:10 -050092
Stephan Bergmanna3e51e22015-01-14 15:42:00 +010093 pushd "${COREDIR?}" > /dev/null
Ilmari Lauhakangase5b1c532017-04-27 12:46:47 +030094 for hook_name in "${COREDIR?}/.git-hooks"/* ; do
Ilmari Lauhakangas55c5b272017-04-15 18:35:17 +030095 hook=".git/hooks/${hook_name##*/}"
96 if [ ! -e "${hook?}" ] || [ -L "${hook?}" ] ; then
Norbert Thiebaud9152c422012-10-01 23:48:10 -050097 rm -f "${hook?}"
Ilmari Lauhakangas55c5b272017-04-15 18:35:17 +030098 ln -sf "${hook_name}" "${hook?}"
Norbert Thiebaud9152c422012-10-01 23:48:10 -050099 fi
100 done
101
102 for repo in ${SUBMODULES_ALL?} ; do
Ilmari Lauhakangase5b1c532017-04-27 12:46:47 +0300103 refresh_submodule_hooks "$repo"
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500104 done
105 popd > /dev/null
106
107}
108
109set_push_url()
110{
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200111 local repo
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500112
113 repo="$1"
114 if [ -n "$repo" ] ; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200115 pushd "${COREDIR?}/${repo?}" > /dev/null
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500116 else
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200117 pushd "${COREDIR?}" > /dev/null
118 repo="core"
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500119 fi
120 echo "setting up push url for ${repo?}"
121 if [ "${repo?}" = "helpcontent2" ] ; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200122 git config remote.origin.pushurl "ssh://${PUSH_USER}logerrit/help"
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500123 else
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200124 git config remote.origin.pushurl "ssh://${PUSH_USER}logerrit/${repo?}"
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500125 fi
126 popd > /dev/null
127}
128
129set_push_urls()
130{
131 PUSH_USER="$1"
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500132 set_push_url
133 for repo in ${SUBMODULES_ACTIVE?} ; do
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200134 set_push_url "${repo?}"
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500135 done
136}
137
138get_active_submodules()
139{
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200140 SUBMODULES_ACTIVE=""
141 local repo
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500142
143 for repo in ${SUBMODULES_ALL?} ; do
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200144 if [ -d "${repo?}"/.git ] || [ -f "${repo?}"/.git ] ; then
145 SUBMODULES_ACTIVE="${repo?} ${SUBMODULES_ACTIVE?}"
146 fi
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500147 done
148}
149
150get_configured_submodules()
151{
152 SUBMODULES_CONFIGURED=""
Luboš Luňákd4498692012-12-11 16:39:02 +0100153 if [ -f config_host.mk ] ; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200154 SUBMODULES_CONFIGURED=$(< config_host.mk grep -a GIT_NEEDED_SUBMODULES | sed -e "s/.*=//")
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500155 else
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200156 # if we need the configured submodule before the configuration is done. we assumed you want them all
157 SUBMODULES_CONFIGURED=${SUBMODULES_ALL?}
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500158 fi
159}
160
Miklos Vajna803137f2013-02-09 19:09:32 +0100161get_git_reference()
162{
163 REFERENCED_GIT=""
164 if [ -f config_host.mk ]; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200165 REFERENCED_GIT=$(< config_host.mk grep -a GIT_REFERENCE_SRC | sed -e "s/.*=//")
Miklos Vajna803137f2013-02-09 19:09:32 +0100166 fi
Lionel Elie Mamaneaa1a9882013-06-21 13:31:37 +0200167 LINKED_GIT=""
168 if [ -f config_host.mk ]; then
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200169 LINKED_GIT=$(< config_host.mk grep -a GIT_LINK_SRC | sed -e "s/.*=//")
Lionel Elie Mamaneaa1a9882013-06-21 13:31:37 +0200170 fi
Miklos Vajna803137f2013-02-09 19:09:32 +0100171}
172
Norbert Thiebauda31714f2012-10-02 12:59:44 -0500173do_shortcut_update()
174{
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200175 local module
176 local repo
Norbert Thiebauda31714f2012-10-02 12:59:44 -0500177
178 for module in $SUBMODULES_CONFIGURED ; do
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200179 if [ ! -d "${module?}"/.git ] ; then
180 case "${module?}" in
181 helpcontent2)
182 if [ -d clone/help/.git ] ; then
183 repo="clone/help/.git"
184 fi
185 ;;
186 *)
187 if [ -d clone/"${module?}"/.git ] ; then
188 repo="clone/${module?}/.git"
189 fi
190 ;;
191 esac
192 if [ -n "$repo" ] ; then
193 cp -r "${repo?}" "${module?}/."
194 fi
195 fi
Norbert Thiebauda31714f2012-10-02 12:59:44 -0500196 done
197}
198
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500199do_git_cmd()
200{
Ilmari Lauhakangase5b1c532017-04-27 12:46:47 +0300201 echo "cmd:$*"
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500202 git "$@"
203 git submodule foreach git "$@" $KEEP_GOING
204}
205
206do_checkout()
207{
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200208 local cmd
209 local create_branch="0"
210 local branch
211 local module
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500212
213 git checkout "$@" || return $?
214 for cmd in "$@" ; do
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200215 if [ "$cmd" = "-f" ]; then
Thorsten Behrens5fce97a2018-07-02 18:11:47 +0200216 continue
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200217 elif [ "$cmd" = "-b" ] ; then
218 create_branch=1
219 elif [ "$create_branch" = "1" ] ; then
220 branch="$cmd"
221 create_branch=0
222 fi
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500223 done
224 if [ -f .gitmodules ] ; then
Kevin Suo508ccbd2021-06-26 17:42:52 +0800225 git submodule update --progress
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200226 if [ -n "$branch" ] ; then
227 git submodule foreach git checkout -b "${branch}" HEAD || return $?
228 fi
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500229 else
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200230 # now that is the nasty case we moved prior to submodules
231 # delete the submodules left over if any
232 for module in $SUBMODULES_ALL ; do
233 echo "clean-up submodule $module"
234 rm -fr "${module}"
235 done
236 # make sure we have the needed repo in clone
237 ./g clone && ./g -f checkout "$@" || return $?
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500238 fi
239 return $?
240}
241
242do_reset()
243{
244 git reset "$@" || return $?
245 if [ -f .gitmodules ] ; then
Kevin Suo508ccbd2021-06-26 17:42:52 +0800246 git submodule update --progress || return $?
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500247 else
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200248 # now that is the nasty case we moved prior to submodules
249 # delete the submodules left over if any
250 for module in $SUBMODULES_ALL ; do
251 echo "clean-up submodule $module"
252 rm -fr "${module}"
253 done
254 # make sure we have the needed repo in clone
255 ./g clone && ./g -f reset "$@"
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500256 fi
257 return $?;
258}
259
260do_init_modules()
261{
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200262 local module
263 local configured
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500264
Norbert Thiebauda31714f2012-10-02 12:59:44 -0500265 do_shortcut_update
266
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500267 for module in $SUBMODULES_CONFIGURED ; do
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200268 if [ -n "$LINKED_GIT" ] ; then
269 if ! [ -d ".git/modules/${module}" ]; then
270 ./bin/git-new-module-workdir "${LINKED_GIT}/${module}" "${module}"
271 fi
272 fi
273 configured=$(git config --local --get submodule."${module}".url)
274 if [ -z "$configured" ] ; then
275 git submodule init "$module" || return $?
276 fi
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500277 done
Miklos Vajna73b50b72013-02-26 16:17:51 +0100278 for module in $SUBMODULES_CONFIGURED ; do
279 if [ -n "$REFERENCED_GIT" ] ; then
Kevin Suo508ccbd2021-06-26 17:42:52 +0800280 git submodule update --reference "$REFERENCED_GIT/.git/modules/$module" --progress "$module" || return $?
Miklos Vajna73b50b72013-02-26 16:17:51 +0100281 else
Kevin Suo508ccbd2021-06-26 17:42:52 +0800282 git submodule update --progress "$module" || return $?
Miklos Vajna73b50b72013-02-26 16:17:51 +0100283 fi
284 done
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500285 return 0
286}
287
288
289# no params, no action
290if [ "$#" -eq "0" ] ; then
291 usage
Jan Holesovskya694de12010-11-16 15:00:48 +0100292fi
293
Ilmari Lauhakangas55c5b272017-04-15 18:35:17 +0300294if [ ! "$(type -p git)" ]; then
Miklos Vajna889934e2011-09-05 20:45:43 +0200295 echo "Cannot find the git binary! Is git installed and is in PATH?"
296 exit 1
297fi
Jan Holesovskya694de12010-11-16 15:00:48 +0100298
Norbert Thiebaud71e52002011-08-27 23:41:18 -0500299
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500300get_active_submodules
301get_configured_submodules
Miklos Vajna803137f2013-02-09 19:09:32 +0100302get_git_reference
Bjoern Michaelsen79e9a642012-07-10 12:57:01 +0200303
Jan Holesovsky40dd1bc2010-11-25 00:13:14 +0100304
Norbert Thiebaud71e52002011-08-27 23:41:18 -0500305
Norbert Thiebaud71e52002011-08-27 23:41:18 -0500306
Jan Holesovskya694de12010-11-16 15:00:48 +0100307# extra params for some commands, like log
308EXTRA=
309COMMAND="$1"
310PAGER=
311RELATIVIZE=1
312PUSH_ALL=
Michael Meeks4d2803d2011-10-25 13:20:58 +0100313PUSH_USER=
314PUSH_NOTES=
315LAST_WORKING=
316SET_LAST_WORKING=
Jan Holesovskya694de12010-11-16 15:00:48 +0100317ALLOW_EMPTY=
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500318KEEP_GOING=
Jan Holesovskya694de12010-11-16 15:00:48 +0100319REPORT_REPOS=1
Stephan Bergmann79e65ee2011-11-29 16:38:46 +0100320REPORT_COMMANDS=0
Norbert Thiebaud67dd44fb2011-05-01 03:26:45 -0500321REPORT_COMPACT=0
Norbert Thiebaud71e52002011-08-27 23:41:18 -0500322DO_HOOK_REFRESH=false
Jan Holesovskya694de12010-11-16 15:00:48 +0100323
324while [ "${COMMAND:0:1}" = "-" ] ; do
325 case "$COMMAND" in
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500326 -f )KEEP_GOING="||:"
Michael Stahl175f17b2011-11-03 21:56:21 +0100327 ;;
328 -z)
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200329 refresh_all_hooks
330 exit 0;
Michael Stahl175f17b2011-11-03 21:56:21 +0100331 ;;
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200332 --set-push-urls)
333 shift
334 PUSH_USER="$1"
335 if [ -n "${PUSH_USER}" ] ; then
336 PUSH_USER="${PUSH_USER}@"
337 fi
338 set_push_urls "$PUSH_USER"
339 exit 0;
340 ;;
341 -*)
342 echo "option: $COMMAND not supported" 1>&2
343 exit 1
Jan Holesovskya694de12010-11-16 15:00:48 +0100344 esac
345 shift
346 COMMAND="$1"
347done
348
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500349shift
350
Jan Holesovskya694de12010-11-16 15:00:48 +0100351case "$COMMAND" in
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500352 branch)
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200353 do_git_cmd "${COMMAND}" "$@"
354 ;;
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500355 checkout)
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200356 do_checkout "$@"
357 ;;
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500358 clone)
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200359 do_init_modules && refresh_all_hooks
Jan Holesovskya694de12010-11-16 15:00:48 +0100360 ;;
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500361 fetch)
Kevin Suo508ccbd2021-06-26 17:42:52 +0800362 (git fetch "$@" && git submodule foreach git fetch "$@" ) && git submodule update --progress
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500363
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200364 ;;
Arnaud VERSINI5448ad52022-01-02 17:33:27 +0100365 gc)
366 (git gc "$@" && git submodule foreach git gc "$@" )
367 ;;
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500368 grep)
369 KEEP_GOING="||:"
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200370 do_git_cmd "${COMMAND}" "$@"
371 ;;
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500372 pull)
Kevin Suo508ccbd2021-06-26 17:42:52 +0800373 git pull "$@" && git submodule update --progress && refresh_all_hooks
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200374 ;;
Jan Holesovskya694de12010-11-16 15:00:48 +0100375 push)
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200376 git submodule foreach git push "$@"
377 if [ "$?" = "0" ] ; then
378 git push "$@"
379 fi
380 ;;
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500381 reset)
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200382 do_reset
383 ;;
Norbert Thiebauda31714f2012-10-02 12:59:44 -0500384 tag)
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200385 do_git_cmd "${COMMAND}" "$@"
386 ;;
387 "")
388 ;;
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500389 *)
Thorsten Behrens4c475bc2018-07-02 18:11:22 +0200390 echo "./g does not support command: $COMMAND" 1>&2
391 exit 1;
Jan Holesovskya694de12010-11-16 15:00:48 +0100392 ;;
393esac
394
Norbert Thiebaud9152c422012-10-01 23:48:10 -0500395exit $?
Norbert Thiebaud71e52002011-08-27 23:41:18 -0500396
Jan Holesovskya694de12010-11-16 15:00:48 +0100397# vi:set shiftwidth=4 expandtab: