{"thread":{"id":"1219","subject":"[PATCH] stgit: allow spaces in filenames","startedAt":"2005-07-13T08:38:11Z","lastAt":"2005-07-14T07:22:35Z","messageCount":11,"participants":["Bryan Larsen","Catalin Marinas","Matthias Urlichs","Linus Torvalds","Jerry Seutter","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"6072","messageId":"20050713083805.18461.87079.sendpatchset@bryan-larsens-ibook-g4.local","threadId":"1219","inReplyTo":null,"subject":"[PATCH] stgit: allow spaces in filenames","fromName":"Bryan Larsen","fromEmail":"bryanlarsen@yahoo.com","sentAt":"2005-07-13T08:38:11Z","receivedAt":"2005-07-13T08:38:11Z","isPatch":true,"sender":{"key":"bryan@larsen.st","avatar":"https://avatars.githubusercontent.com/u/32073?v=4"},"body":"The current version of stgit does not allow whitespace in filenames.  This patch fixes that.  It also speeds up operations on large filesets considerably.\n\nSigned-off-by: Bryan Larsen <bryan.larsen@gmail.com>\n---\n\n stgit/git.py  |  158 +++++++++++++++++++++++++++++++--------------------------\n stgit/main.py |    8 +--\n 2 files changed, 90 insertions(+), 76 deletions(-)\n\ndiff --git a/stgit/git.py b/stgit/git.py\n--- a/stgit/git.py\n+++ b/stgit/git.py\n@@ -101,6 +101,24 @@ def __output(cmd):\n         raise GitException, '%s failed' % cmd\n     return string\n \n+# __run: runs cmd using spawnvp.\n+#\n+#  The shell is avoided so it won't mess up our arguments.\n+# If args is very large, the command is run multiple times;\n+# args is split xargs style:  cmd is passed on each invocation.\n+# Unlike xargs, returns immediately if any non-zero return code \n+# is received.\n+#\n+def __run(cmd, args=None):\n+    args_l=cmd.split()\n+    if args is None:\n+\targs = []\n+    for i in range(0, len(args)+1, 1000):\n+\tr=os.spawnvp(os.P_WAIT, args_l[0], args_l + args[i:min(i+1000, len(args))])\n+\tif r:\n+\t    return r\n+    return 0\n+\n def __check_base_dir():\n     return os.path.isdir(base_dir)\n \n@@ -114,14 +132,16 @@ def __tree_status(files = [], tree_id = \n     # unknown files\n     if unknown:\n         exclude_file = os.path.join(base_dir, 'exclude')\n-        extra_exclude = ''\n+        extra_exclude = []\n         if os.path.exists(exclude_file):\n-            extra_exclude += ' --exclude-from=%s' % exclude_file\n-        fout = os.popen('git-ls-files --others'\n-                        ' --exclude=\"*.[ao]\" --exclude=\".*\"'\n-                        ' --exclude=TAGS --exclude=tags --exclude=\"*~\"'\n-                        ' --exclude=\"#*\"' + extra_exclude, 'r')\n+            extra_exclude.append('--exclude-from=%s' % exclude_file)\n+        fin, fout = os.popen2(['git-ls-files', '--others',\n+                        '--exclude=*.[ao]', '--exclude=.*'\n+                        '--exclude=TAGS', '--exclude=tags', '--exclude=*~',\n+                        '--exclude=#*'] + extra_exclude)\n         cache_files += [('?', line.strip()) for line in fout]\n+\tfin.close()\n+\tfout.close()\n \n     # conflicted files\n     conflicts = get_conflicts()\n@@ -130,13 +150,12 @@ def __tree_status(files = [], tree_id = \n     cache_files += [('C', filename) for filename in conflicts]\n \n     # the rest\n-    files_str = reduce(lambda x, y: x + ' ' + y, files, '')\n-    fout = os.popen('git-diff-cache -r %s %s' % (tree_id, files_str), 'r')\n+    fin, fout = os.popen2(['git-diff-cache', '-r', tree_id] + files)\n     for line in fout:\n-        fs = tuple(line.split()[4:])\n+        fs = tuple(line.rstrip().split(' ',4)[-1].split('\\t',1))\n         if fs[1] not in conflicts:\n             cache_files.append(fs)\n-    if fout.close():\n+    if fout.close() or fin.close():\n         raise GitException, 'git-diff-cache failed'\n \n     return cache_files\n@@ -185,10 +204,9 @@ def add(names):\n         else:\n             raise GitException, '%s is not a file or directory' % i\n \n-    for f in files:\n-        print 'Adding file %s' % f\n-        if os.system('git-update-cache --add -- %s' % f) != 0:\n-            raise GitException, 'Unable to add %s' % f\n+    if files:\n+\tif __run('git-update-cache --add --', files):\n+            raise GitException, 'Unable to add file'\n \n def rm(files, force = False):\n     \"\"\"Remove a file from the repository\n@@ -198,26 +216,32 @@ def rm(files, force = False):\n     else:\n         git_opt = '--remove'\n \n-    for f in files:\n-        if force:\n-            print 'Removing file %s' % f\n-            if os.system('git-update-cache --force-remove -- %s' % f) != 0:\n-                raise GitException, 'Unable to remove %s' % f\n-        elif os.path.exists(f):\n-            raise GitException, '%s exists. Remove it first' %f\n-        else:\n-            print 'Removing file %s' % f\n-            if os.system('git-update-cache --remove -- %s' % f) != 0:\n-                raise GitException, 'Unable to remove %s' % f\n+    if not force:\n+\tfor f in files:\n+\t    if os.path.exists(f):\n+\t\traise GitException, '%s exists. Remove it first' %f\n+\tif files:\n+\t    __run('git-update-cache --remove --', files)\n+    else:\n+\tif files:\n+\t    __run('git-update-cache --force-remove --', files)\n \n def update_cache(files):\n     \"\"\"Update the cache information for the given files\n     \"\"\"\n+    files_here = []\n+    files_gone = []\n+\n     for f in files:\n         if os.path.exists(f):\n-            os.system('git-update-cache -- %s' % f)\n+\t    files_here.append(f)\n         else:\n-            os.system('git-update-cache --remove -- %s' % f)\n+\t    files_gone.append(f)\n+\n+    if files_here:\n+\t__run('git-update-cache --', files_here)\n+    if files_gone:\n+\t__run('git-update-cache --remove --', files_gone)\n \n def commit(message, files = [], parents = [], allowempty = False,\n            author_name = None, author_email = None, author_date = None,\n@@ -248,16 +272,26 @@ def commit(message, files = [], parents \n \n     # update the cache\n     if not first:\n+\tadd_files=[]\n+\trm_files=[]\n+\tm_files=[]\n         for f in cache_files:\n             if f[0] == 'N':\n-                git_flag = '--add'\n+\t\tadd_files.append(f[1])\n             elif f[0] == 'D':\n-                git_flag = '--force-remove'\n+\t\trm_files.append(f[1])\n             else:\n-                git_flag = '--'\n+                m_files.append(f[1])\n \n-            if os.system('git-update-cache %s %s' % (git_flag, f[1])) != 0:\n-                raise GitException, 'Failed git-update-cache -- %s' % f[1]\n+\tif add_files:\n+\t    if __run('git-update-cache --add --', add_files):\n+\t\traise GitException, 'Failed git-update-cache --add'\n+\tif rm_files:\n+\t    if __run('git-update-cache --force-remove --', rm_files):\n+\t\traise GitException, 'Failed git-update-cache --rm'\n+\tif m_files:\n+\t    if __run('git-update-cache --', m_files):\n+\t\traise GitException, 'Failed git-update-cache'\n \n     # write the index to repository\n     tree_id = __output('git-write-tree')\n@@ -292,7 +326,7 @@ def merge(base, head1, head2):\n     \"\"\"Perform a 3-way merge between base, head1 and head2 into the\n     local tree\n     \"\"\"\n-    if os.system('git-read-tree -u -m %s %s %s' % (base, head1, head2)) != 0:\n+    if __run('git-read-tree -u -m', [base, head1, head2]) != 0:\n         raise GitException, 'git-read-tree failed (local changes maybe?)'\n \n     # this can fail if there are conflicts\n@@ -330,51 +364,31 @@ def status(files = [], modified = False,\n         else:\n             print '%s' % fs[1]\n \n-def diff(files = [], rev1 = 'HEAD', rev2 = None, output = None,\n-         append = False):\n+def diff(files = [], rev1 = 'HEAD', rev2 = None, out_fd = sys.stdout):\n     \"\"\"Show the diff between rev1 and rev2\n     \"\"\"\n-    files_str = reduce(lambda x, y: x + ' ' + y, files, '')\n-\n-    extra_args = ''\n-    if output:\n-        if append:\n-            extra_args += ' >> %s' % output\n-        else:\n-            extra_args += ' > %s' % output\n-\n     os.system('git-update-cache --refresh > /dev/null')\n \n     if rev2:\n-        if os.system('git-diff-tree -p %s %s %s %s'\n-                     % (rev1, rev2, files_str, extra_args)) != 0:\n-            raise GitException, 'git-diff-tree failed'\n+\tnf, in_fd = os.popen2(['git-diff-tree', '-p', rev1, rev2]+files)\n     else:\n-        if os.system('git-diff-cache -p %s %s %s'\n-                     % (rev1, files_str, extra_args)) != 0:\n-            raise GitException, 'git-diff-cache failed'\n+\tnf, in_fd = os.popen2(['git-diff-cache', '-p', rev1]+files)\n+    \n+    out_fd.write(in_fd.read())\n+    if in_fd.close() or nf.close():\n+\traise GitException, 'git.diff failed'\n \n def diffstat(files = [], rev1 = 'HEAD', rev2 = None):\n     \"\"\"Return the diffstat between rev1 and rev2\n     \"\"\"\n-    files_str = reduce(lambda x, y: x + ' ' + y, files, '')\n \n     os.system('git-update-cache --refresh > /dev/null')\n-    ds_cmd = '| git-apply --stat'\n-\n-    if rev2:\n-        f = os.popen('git-diff-tree -p %s %s %s %s'\n-                     % (rev1, rev2, files_str, ds_cmd), 'r')\n-        str = f.read().rstrip()\n-        if f.close():\n-            raise GitException, 'git-diff-tree failed'\n-    else:\n-        f = os.popen('git-diff-cache -p %s %s %s'\n-                     % (rev1, files_str, ds_cmd), 'r')\n-        str = f.read().rstrip()\n-        if f.close():\n-            raise GitException, 'git-diff-cache failed'\n-\n+    ds_in, ds_out = os.popen2('git-apply --stat')\n+    diff(files, rev1, rev2, ds_in)\n+    ds_in.close()\n+    str = ds_out.read().rstrip()\n+    if ds_out.close():\n+\traise GitException, 'git.diffstat failed'\n     return str\n \n def files(rev1, rev2):\n@@ -386,7 +400,7 @@ def files(rev1, rev2):\n     f = os.popen('git-diff-tree -r %s %s' % (rev1, rev2),\n                  'r')\n     for line in f:\n-        str += '%s %s\\n' % tuple(line.split()[4:])\n+        str += '%s %s\\n' % tuple(line.rstrip().split(' ',4)[-1].split('\\t',1))\n     if f.close():\n         raise GitException, 'git-diff-tree failed'\n \n@@ -395,23 +409,23 @@ def files(rev1, rev2):\n def checkout(files = [], force = False):\n     \"\"\"Check out the given or all files\n     \"\"\"\n-    git_flags = ''\n+    git_flags = 'git-checkout-cache -q -u'\n     if force:\n         git_flags += ' -f'\n     if len(files) == 0:\n         git_flags += ' -a'\n     else:\n-        git_flags += reduce(lambda x, y: x + ' ' + y, files, ' --')\n+\tgit_flags += ' --'\n \n-    if os.system('git-checkout-cache -q -u%s' % git_flags) != 0:\n-        raise GitException, 'Failed git-checkout-cache -q -u%s' % git_flags\n+    if __run(git_flags, files) != 0:\n+        raise GitException, 'Failed git-checkout-cache'\n \n def switch(tree_id):\n     \"\"\"Switch the tree to the given id\n     \"\"\"\n     to_delete = filter(lambda x: x[0] == 'N', __tree_status(tree_id = tree_id))\n \n-    if os.system('git-read-tree -m %s' % tree_id) != 0:\n+    if __run('git-read-tree -m', [tree_id]) != 0:\n         raise GitException, 'Failed git-read-tree -m %s' % tree_id\n \n     checkout(force = True)\ndiff --git a/stgit/main.py b/stgit/main.py\n--- a/stgit/main.py\n+++ b/stgit/main.py\n@@ -720,13 +720,13 @@ def export(parser, options, args):\n                   'supported in the patch template'\n         f = open(pfile, 'w+')\n         f.write(descr)\n-        f.close()\n \n         # write the diff\n-        git.diff(rev1 = __git_id('%s/bottom' % p),\n+\tgit.diff(rev1 = __git_id('%s/bottom' % p),\n                  rev2 = __git_id('%s/top' % p),\n-                 output = pfile, append = True)\n-        patch_no += 1\n+                 out_fd = f)\n+\tf.close()\n+\tpatch_no += 1\n \n     series.close()\n \n"},{"id":"6073","messageId":"20050713083816.18461.32180.sendpatchset@bryan-larsens-ibook-g4.local","threadId":"1219","inReplyTo":"20050713083805.18461.87079.sendpatchset@bryan-larsens-ibook-g4.local","subject":"[PATCH] stgit: new --message does not work","fromName":"Bryan Larsen","fromEmail":"bryanlarsen@yahoo.com","sentAt":"2005-07-13T08:38:21Z","receivedAt":"2005-07-13T08:38:21Z","isPatch":true,"sender":{"key":"bryan@larsen.st","avatar":"https://avatars.githubusercontent.com/u/32073?v=4"},"body":"Stacked GIT: Using the --message option with the new command fails.  Fix it.\n\nSigned-off-by: Bryan Larsen <bryan.larsen@gmail.com>\n---\n\n stgit/stack.py |    2 ++\n 1 files changed, 2 insertions(+), 0 deletions(-)\n\ndiff --git a/stgit/stack.py b/stgit/stack.py\n--- a/stgit/stack.py\n+++ b/stgit/stack.py\n@@ -384,6 +384,8 @@ class Series:\n             descr = edit_file(None, \\\n                               'Please enter the description for patch \"%s\" ' \\\n                               'above.' % name)\n+\telse:\n+\t    descr = message\n \n         head = git.get_head()\n \n"},{"id":"6074","messageId":"tnxll4bdn7b.fsf@arm.com","threadId":"1219","inReplyTo":"20050713083805.18461.87079.sendpatchset@bryan-larsens-ibook-g4.local","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Catalin Marinas","fromEmail":"catalin.marinas@gmail.com","sentAt":"2005-07-13T10:17:44Z","receivedAt":"2005-07-13T10:17:44Z","isPatch":true,"sender":{"key":"catalin.marinas@gmail.com","avatar":null},"body":"Bryan Larsen <bryanlarsen@yahoo.com> wrote:\n> The current version of stgit does not allow whitespace in filenames.\n> This patch fixes that.  It also speeds up operations on large\n> filesets considerably.\n\nThanks, I will apply it but I have a few comments below:\n\n> +# __run: runs cmd using spawnvp.\n> +#\n> +#  The shell is avoided so it won't mess up our arguments.\n> +# If args is very large, the command is run multiple times;\n> +# args is split xargs style:  cmd is passed on each invocation.\n> +# Unlike xargs, returns immediately if any non-zero return code \n> +# is received.\n> +#\n> +def __run(cmd, args=None):\n\nI would prefer to add this as Python function documentation, i.e. with\n\"\"\"...\"\"\" in the function body.\n\nAn additional thing, can you please convert all the tabs to spaces?\nThat's a better convention for a language like Python where you\ndelimit blocks by indentation.\n\n> @@ -114,14 +132,16 @@ def __tree_status(files = [], tree_id = \n>      # unknown files\n>      if unknown:\n>          exclude_file = os.path.join(base_dir, 'exclude')\n> -        extra_exclude = ''\n> +        extra_exclude = []\n>          if os.path.exists(exclude_file):\n> -            extra_exclude += ' --exclude-from=%s' % exclude_file\n> -        fout = os.popen('git-ls-files --others'\n> -                        ' --exclude=\"*.[ao]\" --exclude=\".*\"'\n> -                        ' --exclude=TAGS --exclude=tags --exclude=\"*~\"'\n> -                        ' --exclude=\"#*\"' + extra_exclude, 'r')\n> +            extra_exclude.append('--exclude-from=%s' % exclude_file)\n> +        fin, fout = os.popen2(['git-ls-files', '--others',\n> +                        '--exclude=*.[ao]', '--exclude=.*'\n> +                        '--exclude=TAGS', '--exclude=tags', '--exclude=*~',\n> +                        '--exclude=#*'] + extra_exclude)\n>          cache_files += [('?', line.strip()) for line in fout]\n> +\tfin.close()\n> +\tfout.close()\n\nWhat's the reason for having 'fin' as well? It doesn't seem to be used\n(this is found in other parts of the patch as well).\n\nSomething wrong happened to my git-ftp-push script. It looks like it\ncopied 'master' to stgit.git/ and not to stgit.git/refs/heads/. I\ncan't fix it until tonight. Before then, you could actually use wget\nto pull the whole repository and just copy 'master' to\n'refs/heads/master'. In the latest tree I created separate files for\neach command.\n\nI'm not sure whether the GIT guys are happy for us to use this mailing\nlist for StGIT. If the StGIT traffic increases, I will try to create a\nseparate mailing list (maybe using a site like sf.net).\n\n-- \nCatalin\n"},{"id":"6077","messageId":"pan.2005.07.13.16.54.18.709929@smurf.noris.de","threadId":"1219","inReplyTo":"20050713083805.18461.87079.sendpatchset@bryan-larsens-ibook-g4.local","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Matthias Urlichs","fromEmail":"smurf@smurf.noris.de","sentAt":"2005-07-13T16:54:18Z","receivedAt":"2005-07-13T16:54:18Z","isPatch":true,"sender":{"key":"matthias@urlichs.de","avatar":"https://gravatar.com/avatar/2708905af227313eba6f2b2ae0f7d0259b5ac5d71baef58fe5a13c699ce0bbf0?d=mp&s=160"},"body":"Hi, Bryan Larsen wrote:\n\n> +\tr=os.spawnvp(os.P_WAIT, args_l[0], args_l + args[i:min(i+1000, len(args))])\n\nThe max length for argv is 32k IIRC, so 1000 is 28-byte file names.\nThat's probably not enough. I't suggest using chunks of 100.\n\n-- \nMatthias Urlichs   |   {M:U} IT Design @ m-u-it.de   |  smurf@smurf.noris.de\nDisclaimer: The quote was selected randomly. Really. | http://smurf.noris.de\n - -\nDon't you feel more like you do now than you did when you came in?\n"},{"id":"6080","messageId":"42D55AC9.4000506@gmail.com","threadId":"1219","inReplyTo":"tnxll4bdn7b.fsf@arm.com","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Bryan Larsen","fromEmail":"bryan.larsen@gmail.com","sentAt":"2005-07-13T18:17:45Z","receivedAt":"2005-07-13T18:17:45Z","isPatch":true,"sender":{"key":"bryan@larsen.st","avatar":"https://avatars.githubusercontent.com/u/32073?v=4"},"body":"Catalin Marinas wrote:\n> An additional thing, can you please convert all the tabs to spaces?\n> That's a better convention for a language like Python where you\n> delimit blocks by indentation.\n\nI would have hoped that emacs py-mode would \"do the right thing\". \nAnybody know how to make it do what Catalin wants?\n\n> \n> \n>>+        fin, fout = os.popen2(['git-ls-files', '--others',\n> \n> \n> What's the reason for having 'fin' as well? It doesn't seem to be used\n> (this is found in other parts of the patch as well).\n\npopen does not support bypassing the shell by using vectors of \narguments.  Only popen2 and friends have this capability.\n\nUnfortunate, yes.\n\n> \n> I'm not sure whether the GIT guys are happy for us to use this mailing\n> list for StGIT. If the StGIT traffic increases, I will try to create a\n> separate mailing list (maybe using a site like sf.net).\n> \n\nI'd very much like to stay on the same list.  By the same logic, cogito \nshould have it's own list as well...\n\nBryan\n"},{"id":"6082","messageId":"Pine.LNX.4.58.0507131250060.17536@g5.osdl.org","threadId":"1219","inReplyTo":"pan.2005.07.13.16.54.18.709929@smurf.noris.de","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Linus Torvalds","fromEmail":"torvalds@osdl.org","sentAt":"2005-07-13T19:51:16Z","receivedAt":"2005-07-13T19:51:16Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Wed, 13 Jul 2005, Matthias Urlichs wrote:\n>\n> Hi, Bryan Larsen wrote:\n> \n> > +\tr=os.spawnvp(os.P_WAIT, args_l[0], args_l + args[i:min(i+1000, len(args))])\n> \n> The max length for argv is 32k IIRC, so 1000 is 28-byte file names.\n\nI think 32k may be the posix-mandated minimum. Linux does 128kB, so 1000 \nshould likely be ok for most projects.\n\nThat said, xargs should do things like that right.\n\n\t\tLinus\n"},{"id":"6097","messageId":"42D58324.6080303@pason.com","threadId":"1219","inReplyTo":"42D55AC9.4000506@gmail.com","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Jerry Seutter","fromEmail":"jerry.seutter@pason.com","sentAt":"2005-07-13T21:09:56Z","receivedAt":"2005-07-13T21:09:56Z","isPatch":true,"sender":{"key":"jerry.seutter@pason.com","avatar":null},"body":"Bryan Larsen wrote:\n> Catalin Marinas wrote:\n> \n>> An additional thing, can you please convert all the tabs to spaces?\n>> That's a better convention for a language like Python where you\n>> delimit blocks by indentation.\n> \n> \n> I would have hoped that emacs py-mode would \"do the right thing\". \n> Anybody know how to make it do what Catalin wants?\n\nYeah, the default emacs mode seems to be to Do The Wrong Thing.  I have \nthis in my .emacs, YMMV.\n\n(setq-default indent-tabs-mode nil)     ; Don't insert tab characters.\n(setq-default tab-width 4)              ; If there are tabs, display\n                                         ; as 4 spaces.\n\nYou can set the tab-width to something much larger to make existing tabs \nobvious.\n\nJerry\n"},{"id":"6099","messageId":"1121290004.6876.11.camel@localhost.localdomain","threadId":"1219","inReplyTo":"42D55AC9.4000506@gmail.com","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Catalin Marinas","fromEmail":"catalin.marinas@gmail.com","sentAt":"2005-07-13T21:26:44Z","receivedAt":"2005-07-13T21:26:44Z","isPatch":true,"sender":{"key":"catalin.marinas@gmail.com","avatar":null},"body":"On Wed, 2005-07-13 at 14:17 -0400, Bryan Larsen wrote:\n> Catalin Marinas wrote:\n> I would have hoped that emacs py-mode would \"do the right thing\". \n> Anybody know how to make it do what Catalin wants?\n\nIt looks like the python-mode in my emacs does the right thing. You\ncould add something like below in your .emacs file:\n\n(add-hook 'python-mode-hook\n          #'(lambda ()\n              (setq indent-tabs-mode nil)))\n\nOtherwise, select the whole buffer and do a \"M-x untabify\".\n\n> > What's the reason for having 'fin' as well? It doesn't seem to be used\n> > (this is found in other parts of the patch as well).\n> \n> popen does not support bypassing the shell by using vectors of \n> arguments.  Only popen2 and friends have this capability.\n\nBut the manual says that it is not possible to get the exit code of the\nchild process with popen2 (at least not in python 2.3). You would need\nto use the Popen3 and Popen4 classes in the popen2 module.\n\nDoes it make that big difference if the commands are invoked via the\nshell? I haven't run any tests.\n\n> > I'm not sure whether the GIT guys are happy for us to use this mailing\n> > list for StGIT. If the StGIT traffic increases, I will try to create a\n> > separate mailing list (maybe using a site like sf.net).\n> > \n> \n> I'd very much like to stay on the same list.  By the same logic, cogito \n> should have it's own list as well...\n\nI'd like this too and it's probably OK with a low traffic (we'll see if\nwe receive complaints :-) ).\n\nCatalin\n"},{"id":"6141","messageId":"7vpstms5pc.fsf@assigned-by-dhcp.cox.net","threadId":"1219","inReplyTo":"1121290004.6876.11.camel@localhost.localdomain","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2005-07-13T22:26:39Z","receivedAt":"2005-07-13T22:26:39Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Catalin Marinas <catalin.marinas@gmail.com> writes:\n\n>> I'd very much like to stay on the same list.  By the same logic, cogito \n>> should have it's own list as well...\n>\n> I'd like this too and it's probably OK with a low traffic (we'll see if\n> we receive complaints :-) ).\n\nI'd like to keep Porcelain discussions on this list for two\nreasons:\n\n (1) Porcelain implementations need their own bookkeeping\n     information somewhere, and possibly in .git/ directory.\n     I'd want to see them agree on what's stored where for what\n     purpose and stay compatible when that makes sense.  The\n     place to brew that concensus is here.\n\n (2) The core GIT people want to learn what Porcelain needs\n     from the core.  I am personally interested in StGIT so\n     subscribing to that list is fine for me, but it is\n     convenient to have everything in one place, especially with\n     this relatively low traffic.\n"},{"id":"6115","messageId":"1121324523.6873.1.camel@localhost.localdomain","threadId":"1219","inReplyTo":"7vpstms5pc.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Catalin Marinas","fromEmail":"catalin.marinas@gmail.com","sentAt":"2005-07-14T07:02:02Z","receivedAt":"2005-07-14T07:02:02Z","isPatch":true,"sender":{"key":"catalin.marinas@gmail.com","avatar":null},"body":"On Wed, 2005-07-13 at 15:26 -0700, Junio C Hamano wrote:\n> Catalin Marinas <catalin.marinas@gmail.com> writes:\n> \n> >> I'd very much like to stay on the same list.  By the same logic, cogito \n> >> should have it's own list as well...\n> >\n> > I'd like this too and it's probably OK with a low traffic (we'll see if\n> > we receive complaints :-) ).\n> \n> I'd like to keep Porcelain discussions on this list for two\n> reasons:\n\nThat's great then. I will keep the StGIT discussions on this list.\n\n--\nCatalin\n"},{"id":"6120","messageId":"42D612BB.5040400@gmail.com","threadId":"1219","inReplyTo":"1121290004.6876.11.camel@localhost.localdomain","subject":"Re: [PATCH] stgit: allow spaces in filenames","fromName":"Bryan Larsen","fromEmail":"bryan.larsen@gmail.com","sentAt":"2005-07-14T07:22:35Z","receivedAt":"2005-07-14T07:22:35Z","isPatch":true,"sender":{"key":"bryan@larsen.st","avatar":"https://avatars.githubusercontent.com/u/32073?v=4"},"body":"\n> Does it make that big difference if the commands are invoked via the\n> shell? I haven't run any tests.\n> \n\nIt wasn't for the time difference that I bypassed the shell, it was to \nsupport spaces and other strange characters  in parameters.  It's easy \nto use spawnvp than it is to escape the parameters properly.\n\nBryan\n"}]}