{"thread":{"id":"12410","subject":"[PATCH RFC] git-submodule: multi-level module support","startedAt":"2008-03-01T16:23:54Z","lastAt":"2008-03-01T16:23:54Z","messageCount":1,"participants":["Ping Yin"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"70539","messageId":"1204388634-757-1-git-send-email-pkufranky@gmail.com","threadId":"12410","inReplyTo":null,"subject":"[PATCH RFC] git-submodule: multi-level module support","fromName":"Ping Yin","fromEmail":"pkufranky@gmail.com","sentAt":"2008-03-01T16:23:54Z","receivedAt":"2008-03-01T16:23:54Z","isPatch":true,"sender":{"key":"pkufranky@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5346?v=4"},"body":"This patch allows multi-level modules in .gitmodules as linus\nand Sven Verdoolaege etc. have suggested in mails\n\"Let .git/config specify the url for submodules\"\n(http://article.gmane.org/gmane.comp.version-control.git/48939).\n\nExample multi-level .gitmodules\n-----------------------------------------------\n[submodule 'a']\n\turl = aurl\n[submodule 'b']\n\turl = aurl\n[submodule 'c']\n\turl = aurl\n[submodule \"all\"]\n\tsubmodule = all1\n\tsubmodule = all2\n[submodule \"all1\"]\n\tsubmodule = a\n\tsubmodule = b\n[submodule \"all2\"]\n\tsubmodule = c\n-----------------------------------------------\n\nAn option '-m|--module-name' is introduced to designate submodule\nby logical module names instead of module paths. So follwoing\ncommands pairs (1,2), (3,4) will be equivalent.\n\n--------------------------------------\n$ git submodule a b c           (1)\n$ git submodule -m all          (2)\n$ git submodule init a b        (3)\n$ git submodule -m init all1    (4)\n--------------------------------------\n\nSigned-off-by: Ping Yin <pkufranky@gmail.com>\n---\n git-submodule.sh |   54 +++++++++++++++++++++++++++++++++++++++++++++++++++---\n 1 files changed, 51 insertions(+), 3 deletions(-)\n\ndiff --git a/git-submodule.sh b/git-submodule.sh\nindex a6aaf40..4359e53 100755\n--- a/git-submodule.sh\n+++ b/git-submodule.sh\n@@ -13,6 +13,7 @@ command=\n branch=\n quiet=\n cached=\n+use_module_name=\n \n #\n # print stuff on stdout unless -q was specified\n@@ -81,6 +82,44 @@ module_name()\n }\n \n #\n+# Map submodule names to path(s)\n+# $@ = module names\n+#\n+module_name2path() {\n+\twhile test $# != 0\n+\tdo\n+\t\tlocal name=$1\n+\t\tshift\n+\t\tlocal paths=$( GIT_CONFIG=.gitmodules \\\n+\t\t\tgit config --get-all submodule.$name.submodule |\n+\t\t\twhile read name\n+\t\t\tdo\n+\t\t\t\tmodule_name2path $name\n+\t\t\tdone\n+\t\t\tgit config --get-all submodule.$name.path\n+\t\t)\n+\t\tif test -z \"$paths\"\n+\t\tthen\n+\t\t\tgit config --get-all submodule.$name.url >/dev/null &&\n+\t\t\techo $name\n+\t\telse\n+\t\t\techo \"$paths\"\n+\t\tfi\n+\tdone\n+}\n+\n+module_path() {\n+\tif test -n \"$use_module_name\"\n+\tthen\n+\t\tpaths=$(module_name2path \"$@\")\n+\t\ttest -z \"$paths\" && die \"no path for modules: $@\"\n+\telse\n+\t\tpaths=$@\n+\tfi\n+\techo $paths\n+}\n+\n+#\n # Clone a submodule\n #\n # Prior to calling, cmd_update checks that a possibly existing\n@@ -220,7 +259,9 @@ cmd_init()\n \t\tshift\n \tdone\n \n-\tgit ls-files --stage -- \"$@\" | grep -e '^160000 ' |\n+\tmpaths=$(module_path \"$@\") || exit\n+\n+\tgit ls-files --stage -- $mpaths | grep -e '^160000 ' |\n \twhile read mode sha1 stage path\n \tdo\n \t\t# Skip already registered paths\n@@ -274,7 +315,9 @@ cmd_update()\n \t\tshift\n \tdone\n \n-\tgit ls-files --stage -- \"$@\" | grep -e '^160000 ' |\n+\tmpaths=$(module_path \"$@\") || exit\n+\n+\tgit ls-files --stage -- $mpaths | grep -e '^160000 ' |\n \twhile read mode sha1 stage path\n \tdo\n \t\tname=$(module_name \"$path\") || exit\n@@ -357,7 +400,9 @@ cmd_status()\n \t\tshift\n \tdone\n \n-\tgit ls-files --stage -- \"$@\" | grep -e '^160000 ' |\n+\tmpaths=$(module_path \"$@\") || exit\n+\n+\tgit ls-files --stage -- $mpaths | grep -e '^160000 ' |\n \twhile read mode sha1 stage path\n \tdo\n \t\tname=$(module_name \"$path\") || exit\n@@ -408,6 +453,9 @@ do\n \t--cached)\n \t\tcached=1\n \t\t;;\n+\t-m|--module-name)\n+\t\tuse_module_name=1\n+\t\t;;\n \t--)\n \t\tbreak\n \t\t;;\n-- \n1.5.4.3.347.g5314c\n\n"}]}