From d45cc6e2670bbfecb16c608a2bb0e3f358a9ece7 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Sun, 20 May 2007 02:10:13 +0200 Subject: git-applymbox: Remove command I believe noone uses git-applymbox, and noone definitely should, since it is supposed to be completely superseded and everything by its younger cousin git-am. The only known person in the universe to use it was Linus and he declared some time ago that he will try to use git-am instead in his famous dotest script. The trouble is that git-applymbox existence creates confusing UI. I'm a bit like a recycled newbie to the git porcelain and *I* was confused by git-applymbox primitiveness until I've realized a while later that I'm of course using the wrong command. Signed-off-by: Petr Baudis Signed-off-by: Junio C Hamano --- Documentation/cmd-list.perl | 1 - Documentation/git-am.txt | 5 +-- Documentation/git-applymbox.txt | 98 ----------------------------------------- Documentation/hooks.txt | 6 +-- 4 files changed, 5 insertions(+), 105 deletions(-) delete mode 100644 Documentation/git-applymbox.txt (limited to 'Documentation') diff --git a/Documentation/cmd-list.perl b/Documentation/cmd-list.perl index 443802a9a3..0bca3469e7 100755 --- a/Documentation/cmd-list.perl +++ b/Documentation/cmd-list.perl @@ -72,7 +72,6 @@ __DATA__ git-add mainporcelain git-am mainporcelain git-annotate ancillaryinterrogators -git-applymbox ancillaryinterrogators git-applypatch purehelpers git-apply plumbingmanipulators git-archimport foreignscminterface diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt index 25cf84a0c7..049e46f3f3 100644 --- a/Documentation/git-am.txt +++ b/Documentation/git-am.txt @@ -128,8 +128,7 @@ is terminated before the first occurrence of such a line. When initially invoking it, you give it names of the mailboxes to crunch. Upon seeing the first patch that does not apply, it -aborts in the middle, just like 'git-applymbox' does. You can -recover from this in one of two ways: +aborts in the middle,. You can recover from this in one of two ways: . skip the current patch by re-running the command with '--skip' option. @@ -146,7 +145,7 @@ names. SEE ALSO -------- -gitlink:git-applymbox[1], gitlink:git-applypatch[1], gitlink:git-apply[1]. +gitlink:git-applypatch[1], gitlink:git-apply[1]. Author diff --git a/Documentation/git-applymbox.txt b/Documentation/git-applymbox.txt deleted file mode 100644 index ea919ba5d7..0000000000 --- a/Documentation/git-applymbox.txt +++ /dev/null @@ -1,98 +0,0 @@ -git-applymbox(1) -================ - -NAME ----- -git-applymbox - Apply a series of patches in a mailbox - - -SYNOPSIS --------- -'git-applymbox' [-u] [-k] [-q] [-m] ( -c .dotest/ | ) [ ] - -DESCRIPTION ------------ -Splits mail messages in a mailbox into commit log message, -authorship information and patches, and applies them to the -current branch. - - -OPTIONS -------- --q:: - Apply patches interactively. The user will be given - opportunity to edit the log message and the patch before - attempting to apply it. - --k:: - Usually the program 'cleans up' the Subject: header line - to extract the title line for the commit log message, - among which (1) remove 'Re:' or 're:', (2) leading - whitespaces, (3) '[' up to ']', typically '[PATCH]', and - then prepends "[PATCH] ". This flag forbids this - munging, and is most useful when used to read back 'git - format-patch -k' output. - --m:: - Patches are applied with `git-apply` command, and unless - it cleanly applies without fuzz, the processing fails. - With this flag, if a tree that the patch applies cleanly - is found in a repository, the patch is applied to the - tree and then a 3-way merge between the resulting tree - and the current tree. - --u:: - Pass `-u` flag to `git-mailinfo` (see gitlink:git-mailinfo[1]). - The proposed commit log message taken from the e-mail - are re-coded into UTF-8 encoding (configuration variable - `i18n.commitencoding` can be used to specify project's - preferred encoding if it is not UTF-8). This used to be - optional but now it is the default. -+ -Note that the patch is always used as-is without charset -conversion, even with this flag. - --n:: - Pass `-n` flag to `git-mailinfo` (see - gitlink:git-mailinfo[1]). - --c .dotest/:: - When the patch contained in an e-mail does not cleanly - apply, the command exits with an error message. The - patch and extracted message are found in .dotest/, and - you could re-run 'git applymbox' with '-c .dotest/' - flag to restart the process after inspecting and fixing - them. - -:: - The name of the file that contains the e-mail messages - with patches. This file should be in the UNIX mailbox - format. See 'SubmittingPatches' document to learn about - the formatting convention for e-mail submission. - -:: - The name of the file that contains your "Signed-off-by" - line. See 'SubmittingPatches' document to learn what - "Signed-off-by" line means. You can also just say - 'yes', 'true', 'me', or 'please' to use an automatically - generated "Signed-off-by" line based on your committer - identity. - - -SEE ALSO --------- -gitlink:git-am[1], gitlink:git-applypatch[1]. - - -Author ------- -Written by Linus Torvalds - -Documentation --------------- -Documentation by Junio C Hamano and the git-list . - -GIT ---- -Part of the gitlink:git[7] suite - diff --git a/Documentation/hooks.txt b/Documentation/hooks.txt index aabb9750fd..aad17447e8 100644 --- a/Documentation/hooks.txt +++ b/Documentation/hooks.txt @@ -13,7 +13,7 @@ applypatch-msg -------------- This hook is invoked by `git-applypatch` script, which is -typically invoked by `git-applymbox`. It takes a single +typically invoked by `git-am`. It takes a single parameter, the name of the file that holds the proposed commit log message. Exiting with non-zero status causes `git-applypatch` to abort before applying the patch. @@ -30,7 +30,7 @@ pre-applypatch -------------- This hook is invoked by `git-applypatch` script, which is -typically invoked by `git-applymbox`. It takes no parameter, +typically invoked by `git-am`. It takes no parameter, and is invoked after the patch is applied, but before a commit is made. Exiting with non-zero status causes the working tree after application of the patch not committed. @@ -45,7 +45,7 @@ post-applypatch --------------- This hook is invoked by `git-applypatch` script, which is -typically invoked by `git-applymbox`. It takes no parameter, +typically invoked by `git-am`. It takes no parameter, and is invoked after the patch is applied and a commit is made. This hook is meant primarily for notification, and cannot affect -- cgit v1.3-5-g9baa From 59c8e2cb2aee2e4eb75007602b264bc4e7928bc0 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 24 May 2007 19:25:25 -0700 Subject: Remove git-applypatch The previous one removed git-applymbox, which was the sole user of this tool. Signed-off-by: Junio C Hamano --- .gitignore | 1 - Documentation/SubmittingPatches | 4 +- Documentation/cmd-list.perl | 1 - Documentation/git-am.txt | 2 +- Documentation/git-applypatch.txt | 53 ---------- Documentation/git-mailinfo.txt | 2 +- Documentation/hooks.txt | 13 +-- Makefile | 2 +- git-applypatch.sh | 212 --------------------------------------- 9 files changed, 10 insertions(+), 280 deletions(-) delete mode 100644 Documentation/git-applypatch.txt delete mode 100755 git-applypatch.sh (limited to 'Documentation') diff --git a/.gitignore b/.gitignore index 76c0e1b8b9..b4e72f5fea 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ git-add--interactive git-am git-annotate git-apply -git-applypatch git-archimport git-archive git-bisect diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index b94d9a8166..b5f2ecd237 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -239,7 +239,7 @@ One test you could do yourself if your MUA is set up correctly is: $ git fetch http://kernel.org/pub/scm/git/git.git master:test-apply $ git checkout test-apply $ git reset --hard - $ git applymbox a.patch + $ git am a.patch If it does not apply correctly, there can be various reasons. @@ -247,7 +247,7 @@ If it does not apply correctly, there can be various reasons. does not have much to do with your MUA. Please rebase the patch appropriately. -* Your MUA corrupted your patch; applymbox would complain that +* Your MUA corrupted your patch; "am" would complain that the patch does not apply. Look at .dotest/ subdirectory and see what 'patch' file contains and check for the common corruption patterns mentioned above. diff --git a/Documentation/cmd-list.perl b/Documentation/cmd-list.perl index 0bca3469e7..645e4372e5 100755 --- a/Documentation/cmd-list.perl +++ b/Documentation/cmd-list.perl @@ -72,7 +72,6 @@ __DATA__ git-add mainporcelain git-am mainporcelain git-annotate ancillaryinterrogators -git-applypatch purehelpers git-apply plumbingmanipulators git-archimport foreignscminterface git-archive mainporcelain diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt index 049e46f3f3..7658fbdaef 100644 --- a/Documentation/git-am.txt +++ b/Documentation/git-am.txt @@ -145,7 +145,7 @@ names. SEE ALSO -------- -gitlink:git-applypatch[1], gitlink:git-apply[1]. +gitlink:git-apply[1]. Author diff --git a/Documentation/git-applypatch.txt b/Documentation/git-applypatch.txt deleted file mode 100644 index 451434a757..0000000000 --- a/Documentation/git-applypatch.txt +++ /dev/null @@ -1,53 +0,0 @@ -git-applypatch(1) -================= - -NAME ----- -git-applypatch - Apply one patch extracted from an e-mail - - -SYNOPSIS --------- -'git-applypatch' [] - -DESCRIPTION ------------ -This is usually not what an end user wants to run directly. See -gitlink:git-am[1] instead. - -Takes three files , , and prepared from an -e-mail message by 'git-mailinfo', and creates a commit. It is -usually not necessary to use this command directly. - -This command can run `applypatch-msg`, `pre-applypatch`, and -`post-applypatch` hooks. See link:hooks.html[hooks] for more -information. - - -OPTIONS -------- -:: - Commit log message (sans the first line, which comes - from e-mail Subject stored in ). - -:: - The patch to apply. - -:: - Author and subject information extracted from e-mail, - used on "author" line and as the first line of the - commit log message. - - -Author ------- -Written by Linus Torvalds - -Documentation --------------- -Documentation by Junio C Hamano and the git-list . - -GIT ---- -Part of the gitlink:git[7] suite - diff --git a/Documentation/git-mailinfo.txt b/Documentation/git-mailinfo.txt index 8eadcebfcf..16956951dd 100644 --- a/Documentation/git-mailinfo.txt +++ b/Documentation/git-mailinfo.txt @@ -16,7 +16,7 @@ DESCRIPTION Reading a single e-mail message from the standard input, and writes the commit log message in file, and the patches in file. The author name, e-mail and e-mail subject are -written out to the standard output to be used by git-applypatch +written out to the standard output to be used by git-am to create a commit. It is usually not necessary to use this command directly. See gitlink:git-am[1] instead. diff --git a/Documentation/hooks.txt b/Documentation/hooks.txt index aad17447e8..6836477ca8 100644 --- a/Documentation/hooks.txt +++ b/Documentation/hooks.txt @@ -12,11 +12,10 @@ This document describes the currently defined hooks. applypatch-msg -------------- -This hook is invoked by `git-applypatch` script, which is -typically invoked by `git-am`. It takes a single +This hook is invoked by `git-am` script. It takes a single parameter, the name of the file that holds the proposed commit log message. Exiting with non-zero status causes -`git-applypatch` to abort before applying the patch. +`git-am` to abort before applying the patch. The hook is allowed to edit the message file in place, and can be used to normalize the message into some project standard @@ -29,8 +28,7 @@ The default 'applypatch-msg' hook, when enabled, runs the pre-applypatch -------------- -This hook is invoked by `git-applypatch` script, which is -typically invoked by `git-am`. It takes no parameter, +This hook is invoked by `git-am`. It takes no parameter, and is invoked after the patch is applied, but before a commit is made. Exiting with non-zero status causes the working tree after application of the patch not committed. @@ -44,12 +42,11 @@ The default 'pre-applypatch' hook, when enabled, runs the post-applypatch --------------- -This hook is invoked by `git-applypatch` script, which is -typically invoked by `git-am`. It takes no parameter, +This hook is invoked by `git-am`. It takes no parameter, and is invoked after the patch is applied and a commit is made. This hook is meant primarily for notification, and cannot affect -the outcome of `git-applypatch`. +the outcome of `git-am`. pre-commit ---------- diff --git a/Makefile b/Makefile index 870179b087..4e63a695f1 100644 --- a/Makefile +++ b/Makefile @@ -206,7 +206,7 @@ SCRIPT_SH = \ git-repack.sh git-request-pull.sh git-reset.sh \ git-sh-setup.sh \ git-tag.sh git-verify-tag.sh \ - git-applypatch.sh git-am.sh \ + git-am.sh \ git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \ git-merge-resolve.sh git-merge-ours.sh \ git-lost-found.sh git-quiltimport.sh diff --git a/git-applypatch.sh b/git-applypatch.sh deleted file mode 100755 index 8df2aee4c2..0000000000 --- a/git-applypatch.sh +++ /dev/null @@ -1,212 +0,0 @@ -#!/bin/sh -## -## applypatch takes four file arguments, and uses those to -## apply the unpacked patch (surprise surprise) that they -## represent to the current tree. -## -## The arguments are: -## $1 - file with commit message -## $2 - file with the actual patch -## $3 - "info" file with Author, email and subject -## $4 - optional file containing signoff to add -## - -USAGE=' []' -. git-sh-setup - -case "$#" in 3|4) ;; *) usage ;; esac - -final=.dotest/final-commit -## -## If this file exists, we ask before applying -## -query_apply=.dotest/.query_apply - -## We do not munge the first line of the commit message too much -## if this file exists. -keep_subject=.dotest/.keep_subject - -## We do not attempt the 3-way merge fallback unless this file exists. -fall_back_3way=.dotest/.3way - -MSGFILE=$1 -PATCHFILE=$2 -INFO=$3 -SIGNOFF=$4 -EDIT=${VISUAL:-${EDITOR:-vi}} - -export GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$INFO")" -export GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$INFO")" -export GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$INFO")" -export SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$INFO")" - -if test '' != "$SIGNOFF" -then - if test -f "$SIGNOFF" - then - SIGNOFF=`cat "$SIGNOFF"` || exit - elif case "$SIGNOFF" in yes | true | me | please) : ;; *) false ;; esac - then - SIGNOFF=`git-var GIT_COMMITTER_IDENT | sed -e ' - s/>.*/>/ - s/^/Signed-off-by: /' - ` - else - SIGNOFF= - fi - if test '' != "$SIGNOFF" - then - LAST_SIGNED_OFF_BY=` - sed -ne '/^Signed-off-by: /p' "$MSGFILE" | - tail -n 1 - ` - test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || { - test '' = "$LAST_SIGNED_OFF_BY" && echo - echo "$SIGNOFF" - } >>"$MSGFILE" - fi -fi - -patch_header= -test -f "$keep_subject" || patch_header='[PATCH] ' - -{ - echo "$patch_header$SUBJECT" - if test -s "$MSGFILE" - then - echo - cat "$MSGFILE" - fi -} >"$final" - -interactive=yes -test -f "$query_apply" || interactive=no - -while [ "$interactive" = yes ]; do - echo "Commit Body is:" - echo "--------------------------" - cat "$final" - echo "--------------------------" - printf "Apply? [y]es/[n]o/[e]dit/[a]ccept all " - read reply - case "$reply" in - y|Y) interactive=no;; - n|N) exit 2;; # special value to tell dotest to keep going - e|E) "$EDIT" "$final";; - a|A) rm -f "$query_apply" - interactive=no ;; - esac -done - -if test -x "$GIT_DIR"/hooks/applypatch-msg -then - "$GIT_DIR"/hooks/applypatch-msg "$final" || exit -fi - -echo -echo Applying "'$SUBJECT'" -echo - -git-apply --index "$PATCHFILE" || { - - # git-apply exits with status 1 when the patch does not apply, - # but it die()s with other failures, most notably upon corrupt - # patch. In the latter case, there is no point to try applying - # it to another tree and do 3-way merge. - test $? = 1 || exit 1 - - test -f "$fall_back_3way" || exit 1 - - # Here if we know which revision the patch applies to, - # we create a temporary working tree and index, apply the - # patch, and attempt 3-way merge with the resulting tree. - - O_OBJECT=`cd "$GIT_OBJECT_DIRECTORY" && pwd` - rm -fr .patch-merge-* - - if git-apply -z --index-info "$PATCHFILE" \ - >.patch-merge-index-info 2>/dev/null && - GIT_INDEX_FILE=.patch-merge-tmp-index \ - git-update-index -z --index-info <.patch-merge-index-info && - GIT_INDEX_FILE=.patch-merge-tmp-index \ - git-write-tree >.patch-merge-tmp-base && - ( - mkdir .patch-merge-tmp-dir && - cd .patch-merge-tmp-dir && - GIT_INDEX_FILE="../.patch-merge-tmp-index" \ - GIT_OBJECT_DIRECTORY="$O_OBJECT" \ - git-apply $binary --index - ) <"$PATCHFILE" - then - echo Using index info to reconstruct a base tree... - mv .patch-merge-tmp-base .patch-merge-base - mv .patch-merge-tmp-index .patch-merge-index - else - ( - N=10 - - # Otherwise, try nearby trees that can be used to apply the - # patch. - git-rev-list --max-count=$N HEAD - - # or hoping the patch is against known tags... - git-ls-remote --tags . - ) | - while read base junk - do - # Try it if we have it as a tree. - git-cat-file tree "$base" >/dev/null 2>&1 || continue - - rm -fr .patch-merge-tmp-* && - mkdir .patch-merge-tmp-dir || break - ( - cd .patch-merge-tmp-dir && - GIT_INDEX_FILE=../.patch-merge-tmp-index && - GIT_OBJECT_DIRECTORY="$O_OBJECT" && - export GIT_INDEX_FILE GIT_OBJECT_DIRECTORY && - git-read-tree "$base" && - git-apply --index && - mv ../.patch-merge-tmp-index ../.patch-merge-index && - echo "$base" >../.patch-merge-base - ) <"$PATCHFILE" 2>/dev/null && break - done - fi - - test -f .patch-merge-index && - his_tree=$(GIT_INDEX_FILE=.patch-merge-index git-write-tree) && - orig_tree=$(cat .patch-merge-base) && - rm -fr .patch-merge-* || exit 1 - - echo Falling back to patching base and 3-way merge using $orig_tree... - - # This is not so wrong. Depending on which base we picked, - # orig_tree may be wildly different from ours, but his_tree - # has the same set of wildly different changes in parts the - # patch did not touch, so resolve ends up canceling them, - # saying that we reverted all those changes. - - if git-merge-resolve $orig_tree -- HEAD $his_tree - then - echo Done. - else - echo Failed to merge in the changes. - exit 1 - fi -} - -if test -x "$GIT_DIR"/hooks/pre-applypatch -then - "$GIT_DIR"/hooks/pre-applypatch || exit -fi - -tree=$(git-write-tree) || exit 1 -echo Wrote tree $tree -parent=$(git-rev-parse --verify HEAD) && -commit=$(git-commit-tree $tree -p $parent <"$final") || exit 1 -echo Committed: $commit -git-update-ref -m "applypatch: $SUBJECT" HEAD $commit $parent || exit - -if test -x "$GIT_DIR"/hooks/post-applypatch -then - "$GIT_DIR"/hooks/post-applypatch -fi -- cgit v1.3-5-g9baa From 70c7ac22de681a83621bda03e676348170c8d8a2 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 26 May 2007 15:56:40 +0200 Subject: Add git-submodule command This command can be used to initialize, update and inspect submodules. It uses a .gitmodules file, readable by git-config, in the top level directory of the 'superproject' to specify a mapping between submodule paths and repository url. Example .gitmodules layout: [module "git"] url = git://git.kernel.org/pub/scm/git/git.git With this entry in .gitmodules (and a commit reference in the index entry for the path "git"), the command 'git submodule init' will clone the repository at kernel.org into the directory "git". Known issues ============ There is currently no way to override the url found in the .gitmodules file, except by manually creating the subproject repository. The place to fix this in the script has a rather long comment about a possible plan. Funny paths will be quoted in the output from git-ls-files, but git-submodule does not attempt to unquote (or even detect the presence of) such paths. Signed-off-by: Lars Hjemli Signed-off-by: Junio C Hamano --- .gitignore | 1 + Documentation/cmd-list.perl | 1 + Documentation/git-submodule.txt | 65 ++++++++++++++ Makefile | 2 +- git-submodule.sh | 194 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 262 insertions(+), 1 deletion(-) create mode 100644 Documentation/git-submodule.txt create mode 100755 git-submodule.sh (limited to 'Documentation') diff --git a/.gitignore b/.gitignore index 4dc0c395fa..8fc4923792 100644 --- a/.gitignore +++ b/.gitignore @@ -126,6 +126,7 @@ git-ssh-push git-ssh-upload git-status git-stripspace +git-submodule git-svn git-svnimport git-symbolic-ref diff --git a/Documentation/cmd-list.perl b/Documentation/cmd-list.perl index 443802a9a3..51dc6b4105 100755 --- a/Documentation/cmd-list.perl +++ b/Documentation/cmd-list.perl @@ -180,6 +180,7 @@ git-ssh-fetch synchingrepositories git-ssh-upload synchingrepositories git-status mainporcelain git-stripspace purehelpers +git-submodule mainporcelain git-svn foreignscminterface git-svnimport foreignscminterface git-symbolic-ref plumbingmanipulators diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt new file mode 100644 index 0000000000..cb0424f77b --- /dev/null +++ b/Documentation/git-submodule.txt @@ -0,0 +1,65 @@ +git-submodule(1) +================ + +NAME +---- +git-submodule - Initialize, update or inspect submodules + + +SYNOPSIS +-------- +'git-submodule' [--quiet] [--cached] [status|init|update] [--] [...] + + +COMMANDS +-------- +status:: + Show the status of the submodules. This will print the SHA-1 of the + currently checked out commit for each submodule, along with the + submodule path and the output of gitlink:git-describe[1] for the + SHA-1. Each SHA-1 will be prefixed with `-` if the submodule is not + initialized and `+` if the currently checked out submodule commit + does not match the SHA-1 found in the index of the containing + repository. This command is the default command for git-submodule. + +init:: + Initialize the submodules, i.e. clone the git repositories specified + in the .gitmodules file and checkout the submodule commits specified + in the index of the containing repository. This will make the + submodules HEAD be detached. + +update:: + Update the initialized submodules, i.e. checkout the submodule commits + specified in the index of the containing repository. This will make + the submodules HEAD be detached. + + +OPTIONS +------- +-q, --quiet:: + Only print error messages. + +--cached:: + Display the SHA-1 stored in the index, not the SHA-1 of the currently + checked out submodule commit. This option is only valid for the + status command. + +:: + Path to submodule(s). When specified this will restrict the command + to only operate on the submodules found at the specified paths. + +FILES +----- +When cloning submodules, a .gitmodules file in the top-level directory +of the containing repository is used to find the url of each submodule. +This file should be formatted in the same way as $GIR_DIR/config. The key +to each submodule url is "module.$path.url". + + +AUTHOR +------ +Written by Lars Hjemli + +GIT +--- +Part of the gitlink:git[7] suite diff --git a/Makefile b/Makefile index 29243c6e8b..5cf2169ef0 100644 --- a/Makefile +++ b/Makefile @@ -209,7 +209,7 @@ SCRIPT_SH = \ git-applymbox.sh git-applypatch.sh git-am.sh \ git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \ git-merge-resolve.sh git-merge-ours.sh \ - git-lost-found.sh git-quiltimport.sh + git-lost-found.sh git-quiltimport.sh git-submodule.sh SCRIPT_PERL = \ git-add--interactive.perl \ diff --git a/git-submodule.sh b/git-submodule.sh new file mode 100755 index 0000000000..6ed5a6ced2 --- /dev/null +++ b/git-submodule.sh @@ -0,0 +1,194 @@ +#!/bin/sh +# +# git-submodules.sh: init, update or list git submodules +# +# Copyright (c) 2007 Lars Hjemli + +USAGE='[--quiet] [--cached] [status|init|update] [--] [...]' +. git-sh-setup +require_work_tree + +init= +update= +status= +quiet= +cached= + +# +# print stuff on stdout unless -q was specified +# +say() +{ + if test -z "$quiet" + then + echo "$@" + fi +} + +# +# Run clone + checkout on missing submodules +# +# $@ = requested paths (default to all) +# +modules_init() +{ + git ls-files --stage -- "$@" | grep -e '^160000 ' | + while read mode sha1 stage path + do + # Skip submodule paths that already contain a .git directory. + # This will also trigger if $path is a symlink to a git + # repository + test -d "$path"/.git && continue + + # If there already is a directory at the submodule path, + # expect it to be empty (since that is the default checkout + # action) and try to remove it. + # Note: if $path is a symlink to a directory the test will + # succeed but the rmdir will fail. We might want to fix this. + if test -d "$path" + then + rmdir "$path" 2>/dev/null || + die "Directory '$path' exist, but is neither empty nor a git repository" + fi + + test -e "$path" && + die "A file already exist at path '$path'" + + url=$(GIT_CONFIG=.gitmodules git-config module."$path".url) + test -z "$url" && + die "No url found for submodule '$path' in .gitmodules" + + # MAYBE FIXME: this would be the place to check GIT_CONFIG + # for a preferred url for this submodule, possibly like this: + # + # modname=$(GIT_CONFIG=.gitmodules git-config module."$path".name) + # alturl=$(git-config module."$modname".url) + # + # This would let the versioned .gitmodules file use the submodule + # path as key, while the unversioned GIT_CONFIG would use the + # logical modulename (if present) as key. But this would need + # another fallback mechanism if the module wasn't named. + + git-clone -n "$url" "$path" || + die "Clone of submodule '$path' failed" + + (unset GIT_DIR && cd "$path" && git-checkout -q "$sha1") || + die "Checkout of submodule '$path' failed" + + say "Submodule '$path' initialized" + done +} + +# +# Checkout correct revision of each initialized submodule +# +# $@ = requested paths (default to all) +# +modules_update() +{ + git ls-files --stage -- "$@" | grep -e '^160000 ' | + while read mode sha1 stage path + do + if ! test -d "$path"/.git + then + # Only mention uninitialized submodules when its + # path have been specified + test "$#" != "0" && + say "Submodule '$path' not initialized" + continue; + fi + subsha1=$(unset GIT_DIR && cd "$path" && + git-rev-parse --verify HEAD) || + die "Unable to find current revision of submodule '$path'" + + if test "$subsha1" != "$sha1" + then + (unset GIT_DIR && cd "$path" && git-fetch && + git-checkout -q "$sha1") || + die "Unable to checkout '$sha1' in submodule '$path'" + + say "Submodule '$path': checked out '$sha1'" + fi + done +} + +# +# List all registered 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) +# +modules_list() +{ + git ls-files --stage -- "$@" | grep -e '^160000 ' | + while read mode sha1 stage path + do + if ! test -d "$path"/.git + then + say "-$sha1 $path" + continue; + fi + revname=$(unset GIT_DIR && cd "$path" && git-describe $sha1) + if git diff-files --quiet -- "$path" + then + say " $sha1 $path ($revname)" + else + if test -z "$cached" + then + sha1=$(unset GIT_DIR && cd "$path" && git-rev-parse --verify HEAD) + revname=$(unset GIT_DIR && cd "$path" && git-describe $sha1) + fi + say "+$sha1 $path ($revname)" + fi + done +} + +while case "$#" in 0) break ;; esac +do + case "$1" in + init) + init=1 + ;; + update) + update=1 + ;; + status) + status=1 + ;; + -q|--quiet) + quiet=1 + ;; + --cached) + cached=1 + ;; + --) + break + ;; + -*) + usage + ;; + *) + break + ;; + esac + shift +done + +case "$init,$update,$status,$cached" in +1,,,) + modules_init "$@" + ;; +,1,,) + modules_update "$@" + ;; +,,*,*) + modules_list "$@" + ;; +*) + usage + ;; +esac -- cgit v1.3-5-g9baa