| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 1 | #!/usr/bin/env bash |
| 2 | # |
| 3 | # Wrapper for git to handle more subdirs at the same time |
| 4 | # |
| Norbert Thiebaud | 8feb6c0 | 2010-11-22 03:11:56 -0600 | [diff] [blame] | 5 | |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 6 | if [ -n "$g_debug" ] ; then |
| 7 | set -x |
| 8 | fi |
| 9 | |
| Norbert Thiebaud | 060219a | 2012-11-08 16:25:37 -0600 | [diff] [blame] | 10 | SUBMODULES_ALL="dictionaries helpcontent2 translations" |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 11 | |
| 12 | pushd $(dirname $0) > /dev/null |
| Norbert Thiebaud | ae4e327 | 2012-12-11 07:49:24 -0600 | [diff] [blame] | 13 | if [ -f config_host.mk ] ; then |
| Luboš Luňák | c8c056f | 2012-12-11 15:39:49 +0100 | [diff] [blame] | 14 | # we are in the BUILDDIR |
| Luboš Luňák | d449869 | 2012-12-11 16:39:02 +0100 | [diff] [blame] | 15 | SRC_ROOT=$(cat config_host.mk | grep SRC_ROOT | sed -e "s/.*=//") |
| Norbert Thiebaud | ae4e327 | 2012-12-11 07:49:24 -0600 | [diff] [blame] | 16 | else |
| 17 | SRC_ROOT=$(pwd) |
| 18 | fi |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 19 | popd > /dev/null |
| 20 | |
| Norbert Thiebaud | ae4e327 | 2012-12-11 07:49:24 -0600 | [diff] [blame] | 21 | COREDIR="$SRC_ROOT" |
| 22 | |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 23 | usage() |
| 24 | { |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 25 | git |
| 26 | echo |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 27 | echo "Usage: g [options] [git (checkout|clone|fetch|grep|pull|push|reset) [git options/args..]]" |
| 28 | echo "" |
| Peter Foley | 41b5c80 | 2012-10-16 20:43:21 -0400 | [diff] [blame] | 29 | echo " -z restore the git hooks and do other sanity checks" |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 30 | } |
| 31 | |
| 32 | refresh_submodule_hooks() |
| 33 | { |
| 34 | local repo=$1 |
| 35 | local hook |
| 36 | local hook_name |
| 37 | |
| 38 | if [ -d ${repo?}/.git ] ; then |
| 39 | # use core's hook by default |
| 40 | for hook_name in $(ls -1 ${COREDIR?}/.git-hooks) ; do |
| 41 | hook="${repo?}/.git/hooks/${hook_name?}" |
| 42 | if [ ! -e "${hook?}" -o -L "${hook?}" ] ; then |
| 43 | rm -f "${hook?}" |
| 44 | ln -sf "${COREDIR?}/.git-hooks/${hook_name?}" "${hook?}" |
| 45 | fi |
| 46 | done |
| 47 | # override if need be by the submodules' own hooks |
| 48 | for hook_name in $(ls -1 ${COREDIR?}/${repo?}/.git-hooks 2>/dev/null) ; do |
| 49 | hook="${repo?}/.git/hooks/${hook_name?}" |
| 50 | if [ ! -e "${hook?}" -o -L "${hook?}" ] ; then |
| 51 | rm -f "${hook?}" |
| 52 | ln -sf "${COREDIR?}/${repo?}/.git-hooks/${hook_name?}" "${hook?}" |
| 53 | fi |
| 54 | done |
| Norbert Thiebaud | 0cac67b | 2012-12-21 04:33:20 -0600 | [diff] [blame] | 55 | elif [ -d .git/modules/${repo}/hooks ] ; then |
| 56 | for hook_name in $(ls -1 ${COREDIR?}/.git-hooks) ; do |
| 57 | hook=".git/modules/${repo?}/hooks/${hook_name?}" |
| 58 | if [ ! -e "${hook?}" -o -L "${hook?}" ] ; then |
| 59 | rm -f "${hook?}" |
| 60 | ln -sf "${COREDIR?}/.git-hooks/${hook_name?}" "${hook?}" |
| 61 | fi |
| 62 | done |
| 63 | # override if need be by the submodules' own hooks |
| 64 | for hook_name in $(ls -1 ${COREDIR?}/${repo?}/.git-hooks 2>/dev/null) ; do |
| 65 | hook=".git/modules/${repo?}/hooks/${hook_name?}" |
| 66 | if [ ! -e "${hook?}" -o -L "${hook?}" ] ; then |
| 67 | rm -f "${hook?}" |
| 68 | ln -sf "${COREDIR?}/${repo?}/.git-hooks/${hook_name?}" "${hook?}" |
| 69 | fi |
| 70 | done |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 71 | fi |
| Norbert Thiebaud | 0cac67b | 2012-12-21 04:33:20 -0600 | [diff] [blame] | 72 | |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 73 | } |
| 74 | |
| 75 | refresh_all_hooks() |
| 76 | { |
| 77 | local repo |
| 78 | local hook_name |
| 79 | local hook |
| 80 | |
| 81 | pushd ${COREDIR?} > /dev/null |
| 82 | for hook_name in $(ls -1 ${COREDIR?}/.git-hooks) ; do |
| 83 | hook=".git/hooks/${hook_name?}" |
| 84 | if [ ! -e "${hook?}" -o -L "${hook?}" ] ; then |
| 85 | rm -f "${hook?}" |
| 86 | ln -sf "${COREDIR?}/.git-hooks/${hook_name?}" "${hook?}" |
| 87 | fi |
| 88 | done |
| 89 | |
| 90 | for repo in ${SUBMODULES_ALL?} ; do |
| 91 | refresh_submodule_hooks $repo |
| 92 | done |
| 93 | popd > /dev/null |
| 94 | |
| 95 | } |
| 96 | |
| 97 | set_push_url() |
| 98 | { |
| 99 | local repo |
| 100 | |
| 101 | repo="$1" |
| 102 | if [ -n "$repo" ] ; then |
| 103 | pushd "${COREDIR?}/${repo?}" > /dev/null |
| 104 | else |
| 105 | pushd "${COREDIR?}" > /dev/null |
| 106 | repo="core" |
| 107 | fi |
| 108 | echo "setting up push url for ${repo?}" |
| 109 | if [ "${repo?}" = "helpcontent2" ] ; then |
| 110 | git config remote.origin.pushurl "ssh://${PUSH_USER}gerrit.libreoffice.org:29418/help" |
| 111 | else |
| 112 | git config remote.origin.pushurl "ssh://${PUSH_USER}gerrit.libreoffice.org:29418/${repo?}" |
| 113 | fi |
| 114 | popd > /dev/null |
| 115 | } |
| 116 | |
| 117 | set_push_urls() |
| 118 | { |
| 119 | PUSH_USER="$1" |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 120 | set_push_url |
| 121 | for repo in ${SUBMODULES_ACTIVE?} ; do |
| 122 | set_push_url "${repo?}" |
| 123 | done |
| 124 | } |
| 125 | |
| 126 | get_active_submodules() |
| 127 | { |
| 128 | SUBMODULES_ACTIVE="" |
| 129 | local repo |
| 130 | |
| 131 | for repo in ${SUBMODULES_ALL?} ; do |
| 132 | if [ -d ${repo?}/.git ] ; then |
| 133 | SUBMODULES_ACTIVE="${repo?} ${SUBMODULES_ACTIVE?}" |
| 134 | fi |
| 135 | done |
| 136 | } |
| 137 | |
| 138 | get_configured_submodules() |
| 139 | { |
| 140 | SUBMODULES_CONFIGURED="" |
| Luboš Luňák | d449869 | 2012-12-11 16:39:02 +0100 | [diff] [blame] | 141 | if [ -f config_host.mk ] ; then |
| 142 | SUBMODULES_CONFIGURED=$(cat config_host.mk | grep GIT_NEEDED_SUBMODULES | sed -e "s/.*=//") |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 143 | else |
| 144 | # if we need the configured submoduel before the configuration is done. we assumed you want them all |
| 145 | SUBMODULES_CONFIGURED=${SUBMODULES_ALL?} |
| 146 | fi |
| 147 | } |
| 148 | |
| Miklos Vajna | 803137f | 2013-02-09 19:09:32 +0100 | [diff] [blame] | 149 | get_git_reference() |
| 150 | { |
| 151 | REFERENCED_GIT="" |
| 152 | if [ -f config_host.mk ]; then |
| 153 | REFERENCED_GIT=$(cat config_host.mk | grep GIT_REFERENCE_SRC | sed -e "s/.*=//") |
| 154 | fi |
| 155 | } |
| 156 | |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 157 | do_shortcut_update() |
| 158 | { |
| 159 | local module |
| 160 | local repo |
| 161 | |
| 162 | for module in $SUBMODULES_CONFIGURED ; do |
| 163 | if [ ! -d ${module?}/.git ] ; then |
| 164 | case "${module?}" in |
| Miklos Vajna | 2a8cabe | 2012-10-18 09:27:45 +0200 | [diff] [blame] | 165 | helpcontent2) |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 166 | if [ -d clone/help/.git ] ; then |
| 167 | repo="clone/help/.git" |
| 168 | fi |
| 169 | ;; |
| 170 | *) |
| 171 | if [ -d clone/${module?}/.git ] ; then |
| 172 | repo="clone/${module?}/.git" |
| 173 | fi |
| 174 | ;; |
| 175 | esac |
| 176 | if [ -n "$repo" ] ; then |
| 177 | cp -r "${repo?}" "${module?}/." |
| 178 | fi |
| Norbert Thiebaud | c58b4fc | 2012-10-02 13:29:01 -0500 | [diff] [blame] | 179 | fi |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 180 | done |
| 181 | } |
| 182 | |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 183 | do_git_cmd() |
| 184 | { |
| 185 | echo "cmd:$@" |
| 186 | git "$@" |
| 187 | git submodule foreach git "$@" $KEEP_GOING |
| 188 | } |
| 189 | |
| 190 | do_checkout() |
| 191 | { |
| 192 | local cmd |
| 193 | local create_branch="0" |
| 194 | local branch |
| Norbert Thiebaud | 2c5cdc4 | 2012-10-02 10:32:45 -0500 | [diff] [blame] | 195 | local module |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 196 | |
| 197 | git checkout "$@" || return $? |
| 198 | for cmd in "$@" ; do |
| 199 | if [ "$cmd" = "-f" ]; then |
| 200 | return 0 |
| 201 | elif [ "$cmd" = "-b" ] ; then |
| 202 | create_branch=1 |
| 203 | elif [ "$create_branch" = "1" ] ; then |
| 204 | branch="$arg" |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 205 | create_branch=0 |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 206 | fi |
| 207 | done |
| 208 | if [ -f .gitmodules ] ; then |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 209 | git submodule update |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 210 | if [ -n "$branch" ] ; then |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 211 | git submodules foreach git checkout -b ${branch} HEAD || return $? |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 212 | fi |
| 213 | else |
| 214 | # now that is the nasty case we moved prior to submodules |
| Norbert Thiebaud | 2c5cdc4 | 2012-10-02 10:32:45 -0500 | [diff] [blame] | 215 | # delete the submodules left over if any |
| 216 | for module in $SUBMODULES_ALL ; do |
| 217 | echo "clean-up submodule $module" |
| 218 | rm -fr ${module} |
| 219 | done |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 220 | # make sure we have the needed repo in clone |
| 221 | ./g clone && ./g -f checkout "$@" || return $? |
| 222 | fi |
| 223 | return $? |
| 224 | } |
| 225 | |
| 226 | do_reset() |
| 227 | { |
| 228 | git reset "$@" || return $? |
| 229 | if [ -f .gitmodules ] ; then |
| 230 | git submodule update || return $? |
| 231 | else |
| 232 | # now that is the nasty case we moved prior to submodules |
| Norbert Thiebaud | 2c5cdc4 | 2012-10-02 10:32:45 -0500 | [diff] [blame] | 233 | # delete the submodules left over if any |
| 234 | for module in $SUBMODULES_ALL ; do |
| 235 | echo "clean-up submodule $module" |
| 236 | rm -fr ${module} |
| 237 | done |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 238 | # make sure we have the needed repo in clone |
| 239 | ./g clone && ./g -f reset "$@" |
| 240 | fi |
| 241 | return $?; |
| 242 | } |
| 243 | |
| 244 | do_init_modules() |
| 245 | { |
| 246 | local module |
| 247 | local configured |
| 248 | |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 249 | do_shortcut_update |
| 250 | |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 251 | for module in $SUBMODULES_CONFIGURED ; do |
| 252 | configured=$(git config --local --get submodule.${module}.url) |
| 253 | if [ -z "$configured" ] ; then |
| 254 | git submodule init $module || return $? |
| 255 | fi |
| 256 | done |
| Miklos Vajna | 73b50b7 | 2013-02-26 16:17:51 +0100 | [diff] [blame] | 257 | for module in $SUBMODULES_CONFIGURED ; do |
| 258 | if [ -n "$REFERENCED_GIT" ] ; then |
| Miklos Vajna | 803137f | 2013-02-09 19:09:32 +0100 | [diff] [blame] | 259 | git submodule update --reference $REFERENCED_GIT/.git/modules/$module $module || return $? |
| Miklos Vajna | 73b50b7 | 2013-02-26 16:17:51 +0100 | [diff] [blame] | 260 | else |
| 261 | git submodule update $module || return $? |
| 262 | fi |
| 263 | done |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 264 | return 0 |
| 265 | } |
| 266 | |
| 267 | |
| 268 | # no params, no action |
| 269 | if [ "$#" -eq "0" ] ; then |
| 270 | usage |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 271 | fi |
| 272 | |
| Miklos Vajna | 889934e | 2011-09-05 20:45:43 +0200 | [diff] [blame] | 273 | if [ ! "`type -p git`" ]; then |
| 274 | echo "Cannot find the git binary! Is git installed and is in PATH?" |
| 275 | exit 1 |
| 276 | fi |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 277 | |
| Norbert Thiebaud | 71e5200 | 2011-08-27 23:41:18 -0500 | [diff] [blame] | 278 | |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 279 | get_active_submodules |
| 280 | get_configured_submodules |
| Miklos Vajna | 803137f | 2013-02-09 19:09:32 +0100 | [diff] [blame] | 281 | get_git_reference |
| Bjoern Michaelsen | 79e9a64 | 2012-07-10 12:57:01 +0200 | [diff] [blame] | 282 | |
| Jan Holesovsky | 40dd1bc | 2010-11-25 00:13:14 +0100 | [diff] [blame] | 283 | |
| Norbert Thiebaud | 71e5200 | 2011-08-27 23:41:18 -0500 | [diff] [blame] | 284 | |
| Norbert Thiebaud | 71e5200 | 2011-08-27 23:41:18 -0500 | [diff] [blame] | 285 | |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 286 | # extra params for some commands, like log |
| 287 | EXTRA= |
| 288 | COMMAND="$1" |
| 289 | PAGER= |
| 290 | RELATIVIZE=1 |
| 291 | PUSH_ALL= |
| Michael Meeks | 4d2803d | 2011-10-25 13:20:58 +0100 | [diff] [blame] | 292 | PUSH_USER= |
| 293 | PUSH_NOTES= |
| 294 | LAST_WORKING= |
| 295 | SET_LAST_WORKING= |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 296 | ALLOW_EMPTY= |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 297 | KEEP_GOING= |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 298 | REPORT_REPOS=1 |
| Stephan Bergmann | 79e65ee | 2011-11-29 16:38:46 +0100 | [diff] [blame] | 299 | REPORT_COMMANDS=0 |
| Norbert Thiebaud | 67dd44fb | 2011-05-01 03:26:45 -0500 | [diff] [blame] | 300 | REPORT_COMPACT=0 |
| Norbert Thiebaud | 71e5200 | 2011-08-27 23:41:18 -0500 | [diff] [blame] | 301 | DO_HOOK_REFRESH=false |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 302 | |
| 303 | while [ "${COMMAND:0:1}" = "-" ] ; do |
| 304 | case "$COMMAND" in |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 305 | -f )KEEP_GOING="||:" |
| Michael Stahl | 175f17b | 2011-11-03 21:56:21 +0100 | [diff] [blame] | 306 | ;; |
| 307 | -z) |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 308 | refresh_all_hooks |
| 309 | exit 0; |
| Michael Stahl | 175f17b | 2011-11-03 21:56:21 +0100 | [diff] [blame] | 310 | ;; |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 311 | --set-push-urls) |
| 312 | shift |
| 313 | PUSH_USER="$1" |
| 314 | if [ -n "${PUSH_USER}" ] ; then |
| 315 | PUSH_USER="${PUSH_USER}@" |
| 316 | fi |
| Jan Holesovsky | e1b59fc | 2012-11-23 20:58:27 +0100 | [diff] [blame] | 317 | set_push_urls "$PUSH_USER" |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 318 | exit 0; |
| 319 | ;; |
| 320 | -*) |
| 321 | echo "option: $COMMAND not supported" 1>&2 |
| 322 | exit 1 |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 323 | esac |
| 324 | shift |
| 325 | COMMAND="$1" |
| 326 | done |
| 327 | |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 328 | shift |
| 329 | |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 330 | case "$COMMAND" in |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 331 | branch) |
| 332 | do_git_cmd ${COMMAND} "$@" |
| 333 | ;; |
| 334 | checkout) |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 335 | do_checkout "$@" |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 336 | ;; |
| 337 | clone) |
| Miklos Vajna | 803137f | 2013-02-09 19:09:32 +0100 | [diff] [blame] | 338 | do_init_modules && refresh_all_hooks |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 339 | ;; |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 340 | fetch) |
| 341 | (git fetch "$@" && git submodule foreach git fetch "$@" ) && git submodule update |
| 342 | |
| 343 | ;; |
| 344 | grep) |
| 345 | KEEP_GOING="||:" |
| 346 | do_git_cmd ${COMMAND} "$@" |
| 347 | ;; |
| 348 | pull) |
| 349 | git pull "$@" && git submodule update && refresh_all_hooks |
| 350 | ;; |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 351 | push) |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 352 | git submodule foreach git push "$@" |
| 353 | if [ "$?" = "0" ] ; then |
| 354 | git push "$@" |
| 355 | fi |
| 356 | ;; |
| 357 | reset) |
| 358 | do_reset |
| 359 | ;; |
| Norbert Thiebaud | a31714f | 2012-10-02 12:59:44 -0500 | [diff] [blame] | 360 | tag) |
| 361 | do_git_cmd ${COMMAND} "$@" |
| 362 | ;; |
| Peter Foley | 41b5c80 | 2012-10-16 20:43:21 -0400 | [diff] [blame] | 363 | "") |
| 364 | ;; |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 365 | *) |
| Peter Foley | 41b5c80 | 2012-10-16 20:43:21 -0400 | [diff] [blame] | 366 | echo "./g does not support command: $COMMAND" 1>&2 |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 367 | exit 1; |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 368 | ;; |
| 369 | esac |
| 370 | |
| Norbert Thiebaud | 9152c42 | 2012-10-01 23:48:10 -0500 | [diff] [blame] | 371 | exit $? |
| Norbert Thiebaud | 71e5200 | 2011-08-27 23:41:18 -0500 | [diff] [blame] | 372 | |
| Jan Holesovsky | a694de1 | 2010-11-16 15:00:48 +0100 | [diff] [blame] | 373 | # vi:set shiftwidth=4 expandtab: |