{"thread":{"id":"29869","subject":"Multiple --reference arguments to submodule add/update","startedAt":"2012-03-07T13:59:43Z","lastAt":"2012-03-07T17:57:48Z","messageCount":2,"participants":["Tim Landscheidt","Junio C Hamano"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"186313","messageId":"m3hay0ldf4.fsf@passepartout.tim-landscheidt.de","threadId":"29869","inReplyTo":null,"subject":"Multiple --reference arguments to submodule add/update","fromName":"Tim Landscheidt","fromEmail":"tim@tim-landscheidt.de","sentAt":"2012-03-07T13:59:43Z","receivedAt":"2012-03-07T13:59:43Z","isPatch":false,"sender":{"key":"tim@tim-landscheidt.de","avatar":null},"body":"Hi,\n\nwith git 1.7.9.3.362.g71319:\n\n| git submodule update --reference A --reference B --init\n\nwill only consider repository B.  This is due to git-submodule.sh's:\n\n| [module_clone()]\n|                 if test -n \"$reference\"\n|                 then\n|                         git-clone $quiet \"$reference\" -n \"$url\" \"$path\" --separate-git-dir \"$gitdir\"\n|                 else\n|                         git-clone $quiet -n \"$url\" \"$path\" --separate-git-dir \"$gitdir\"\n|                 fi ||\n\n| [cmd_add()]\n|                 --reference)\n|                         case \"$2\" in '') usage ;; esac\n|                         reference=\"--reference=$2\"\n|                         shift\n|                         ;;\n|                 --reference=*)\n|                         reference=\"$1\"\n|                         shift\n|                         ;;\n\n| [cmd_update()]\n|                 --reference)\n|                         case \"$2\" in '') usage ;; esac\n|                         reference=\"--reference=$2\"\n|                         orig_flags=\"$orig_flags $(git rev-parse --sq-quote \"$1\")\"\n|                         shift\n|                         ;;\n|                 --reference=*)\n|                         reference=\"$1\"\n|                         ;;\n\nIt's trivial to fix this for trivial repository specifiers.\nBut for specifiers with white space, quote or shell meta\ncharacters, my mind boggles :-).\n\n  Has anyone a nice patch for this?\n\nTim\n"},{"id":"186324","messageId":"7vboo8nvj7.fsf@alter.siamese.dyndns.org","threadId":"29869","inReplyTo":"m3hay0ldf4.fsf@passepartout.tim-landscheidt.de","subject":"Re: Multiple --reference arguments to submodule add/update","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2012-03-07T17:57:48Z","receivedAt":"2012-03-07T17:57:48Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Tim Landscheidt <tim@tim-landscheidt.de> writes:\n\n> It's trivial to fix this for trivial repository specifiers.\n> But for specifiers with white space, quote or shell meta\n> characters, my mind boggles :-).\n\nSomething like this. As always, totally untested.\n\n git-submodule.sh |   30 ++++++++++++++++--------------\n 1 file changed, 16 insertions(+), 14 deletions(-)\n\ndiff --git a/git-submodule.sh b/git-submodule.sh\nindex 9bb2e13..f9991cb 100755\n--- a/git-submodule.sh\n+++ b/git-submodule.sh\n@@ -30,6 +30,10 @@ nofetch=\n update=\n prefix=\n \n+sq () {\n+    git rev-parse --sq-quote \"$@\"\n+}\n+\n # Resolve relative url by appending to parent's url\n resolve_relative_url ()\n {\n@@ -121,7 +125,7 @@ module_clone()\n {\n \tpath=$1\n \turl=$2\n-\treference=\"$3\"\n+\treferences=$3\n \tquiet=\n \tif test -n \"$GIT_QUIET\"\n \tthen\n@@ -163,13 +167,11 @@ module_clone()\n \t\techo \"gitdir: $rel_gitdir\" >\"$path/.git\"\n \t\trm -f \"$gitdir/index\"\n \telse\n-\t\tmkdir -p \"$gitdir_base\"\n-\t\tif test -n \"$reference\"\n-\t\tthen\n-\t\t\tgit-clone $quiet \"$reference\" -n \"$url\" \"$path\" --separate-git-dir \"$gitdir\"\n-\t\telse\n-\t\t\tgit-clone $quiet -n \"$url\" \"$path\" --separate-git-dir \"$gitdir\"\n-\t\tfi ||\n+\t\tmkdir -p \"$gitdir_base\" &&\n+\t\tcmd='git clone $quiet '\"$references\" &&\n+\t\tcmd=\"$cmd \"' -n \"$url\" \"$path\" --separate-git-dir \"$gitdir\"' &&\n+\t\t# echo \"$cmd\" && # if you want to debug this\n+\t\teval \"$cmd\" ||\n \t\tdie \"$(eval_gettext \"Clone of '\\$url' into submodule path '\\$path' failed\")\"\n \tfi\n }\n@@ -200,11 +202,11 @@ cmd_add()\n \t\t\t;;\n \t\t--reference)\n \t\t\tcase \"$2\" in '') usage ;; esac\n-\t\t\treference=\"--reference=$2\"\n+\t\t\treference=\"$reference --reference=$(sq \"$2\") \"\n \t\t\tshift\n \t\t\t;;\n \t\t--reference=*)\n-\t\t\treference=\"$1\"\n+\t\t\treference=\"$reference$(sq \"$1\") \"\n \t\t\tshift\n \t\t\t;;\n \t\t--)\n@@ -450,12 +452,12 @@ cmd_update()\n \t\t\t;;\n \t\t--reference)\n \t\t\tcase \"$2\" in '') usage ;; esac\n-\t\t\treference=\"--reference=$2\"\n-\t\t\torig_flags=\"$orig_flags $(git rev-parse --sq-quote \"$1\")\"\n+\t\t\treference=\"$reference --reference=$(sq \"$2\") \"\n+\t\t\torig_flags=\"$orig_flags $(sq \"$1\")\"\n \t\t\tshift\n \t\t\t;;\n \t\t--reference=*)\n-\t\t\treference=\"$1\"\n+\t\t\treference=\"$reference$(sq \"$1\") \"\n \t\t\t;;\n \t\t-m|--merge)\n \t\t\tupdate=\"merge\"\n@@ -523,7 +525,7 @@ Maybe you want to use 'update --init'?\")\"\n \n \t\tif ! test -d \"$path\"/.git -o -f \"$path\"/.git\n \t\tthen\n-\t\t\tmodule_clone \"$path\" \"$url\" \"$reference\"|| exit\n+\t\t\tmodule_clone \"$path\" \"$url\" \"$reference\" || exit\n \t\t\tcloned_modules=\"$cloned_modules;$name\"\n \t\t\tsubsha1=\n \t\telse\n"}]}