{"thread":{"id":"3336","subject":"bug: stgit doesn't handle branch names with / in them","startedAt":"2006-02-14T17:35:09Z","lastAt":"2006-04-18T11:07:09Z","messageCount":11,"participants":["Karl Hasselström","Sam Vilain","Catalin Marinas","Yann Dirson"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"16119","messageId":"20060214173509.GA8666@diana.vm.bytemark.co.uk","threadId":"3336","inReplyTo":null,"subject":"bug: stgit doesn't handle branch names with / in them","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2006-02-14T17:35:09Z","receivedAt":"2006-02-14T17:35:09Z","isPatch":false,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"\"stg branch -l\" only shows branches directly under refs/heads, and\ncompletely ignores branches in subdirectories. But it does print the\nname of the subdirectories . . .\n\n\"stg branch\" prints only the part of the branch name following the\nfinal slash.\n\n    $ git-branch\n      kha/abc123\n      kha/dab\n    * kha/patches\n      kha/powerup\n      kha/dare\n      kha/dare-build\n      kha/boo123\n      kha/lisp106\n      local/test0\n      local/test3\n      local/test4\n      SVN-import\n      test5\n\n    $ stg branch -l\n    Available branches:\n            SVN-import  |\n            kha         |\n            local       |\n            test5       |\n\n    $ stg branch\n    patches\n\nNo patch (yet), sorry.\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"},{"id":"16293","messageId":"20060217014117.12525.21330.stgit@backpacker.hemma.treskal.com","threadId":"3336","inReplyTo":"20060214173509.GA8666@diana.vm.bytemark.co.uk","subject":"[PATCH] Handle branch names with slashes","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2006-02-17T01:41:17Z","receivedAt":"2006-02-17T01:41:17Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"Let StGIT grok branch names with slashes in them. It used to fall flat\non its face when confronted with them.\n\nI think I've covered all, or at least most cases, but there are\nprobably some bugs left if you look hard enough.\n\nSigned-off-by: Karl Hasselström <kha@treskal.com>\n\n---\n\n stgit/commands/branch.py |    6 +++-\n stgit/git.py             |   12 +++++--\n stgit/stack.py           |   42 ++++++++++---------------\n stgit/utils.py           |   77 ++++++++++++++++++++++++++++++++++++++++------\n 4 files changed, 97 insertions(+), 40 deletions(-)\n\ndiff --git a/stgit/commands/branch.py b/stgit/commands/branch.py\nindex ef44349..d3e8a3c 100644\n--- a/stgit/commands/branch.py\n+++ b/stgit/commands/branch.py\n@@ -173,7 +173,11 @@ def func(parser, options, args):\n         if len(args) != 0:\n             parser.error('incorrect number of arguments')\n \n-        branches = os.listdir(os.path.join(git.get_base_dir(), 'refs', 'heads'))\n+        branches = []\n+        basepath = os.path.join(git.get_base_dir(), 'refs', 'heads')\n+        for path, dirs, files in os.walk(basepath):\n+            branches += [remove_leading_dir(basepath, os.path.join(path, f))\n+                         for f in files]\n         branches.sort()\n         max_len = max([len(i) for i in branches])\n \ndiff --git a/stgit/git.py b/stgit/git.py\nindex 582e803..724b6fd 100644\n--- a/stgit/git.py\n+++ b/stgit/git.py\n@@ -232,7 +232,8 @@ def get_head():\n def get_head_file():\n     \"\"\"Returns the name of the file pointed to by the HEAD link\n     \"\"\"\n-    return os.path.basename(_output_one_line('git-symbolic-ref HEAD'))\n+    return remove_leading_dir(os.path.join('refs', 'heads'),\n+                              _output_one_line('git-symbolic-ref HEAD'))\n \n def set_head_file(ref):\n     \"\"\"Resets HEAD to point to a new ref\n@@ -325,7 +326,9 @@ def delete_branch(name):\n     branch_head = os.path.join('refs', 'heads', name)\n     if not branch_exists(branch_head):\n         raise GitException, 'Branch \"%s\" does not exist' % name\n-    os.remove(os.path.join(get_base_dir(), branch_head))\n+    base = get_base_dir()\n+    rm_file_and_dirs(os.path.join(base, branch_head),\n+                     os.path.join(base, 'refs', 'heads'))\n \n def rename_branch(from_name, to_name):\n     \"\"\"Rename a git branch\n@@ -339,8 +342,9 @@ def rename_branch(from_name, to_name):\n \n     if get_head_file() == from_name:\n         set_head_file(to_head)\n-    os.rename(os.path.join(get_base_dir(), from_head), \\\n-              os.path.join(get_base_dir(), to_head))\n+    base = os.path.join(get_base_dir())\n+    rename_dirs(os.path.join(base, from_head), os.path.join(base, to_head),\n+                os.path.join(base, 'refs', 'heads'))\n \n def add(names):\n     \"\"\"Add the files or recursively add the directory contents\ndiff --git a/stgit/stack.py b/stgit/stack.py\nindex 556c40e..68a2936 100644\n--- a/stgit/stack.py\n+++ b/stgit/stack.py\n@@ -406,7 +406,7 @@ class Series:\n         \"\"\"\n         if len(self.get_applied()) == 0:\n             head = git.get_head()\n-            write_string(self.__base_file, head)\n+            write_string(self.__base_file, head, mkdir = True)\n \n     def __end_stack_check(self):\n         \"\"\"Remove .git/refs/heads/base if the stack is empty.\n@@ -499,9 +499,11 @@ class Series:\n         git.rename_branch(self.__name, to_name)\n \n         if os.path.isdir(self.__series_dir):\n-            os.rename(self.__series_dir, to_stack.__series_dir)\n+            rename_dirs(self.__series_dir, to_stack.__series_dir,\n+                        os.path.join(self.__base_dir, 'patches'))\n         if os.path.exists(self.__base_file):\n-            os.rename(self.__base_file, to_stack.__base_file)\n+            rename_dirs(self.__base_file, to_stack.__base_file,\n+                        os.path.join(self.__base_dir, 'refs', 'bases'))\n \n         self.__init__(to_name)\n \n@@ -543,29 +545,19 @@ class Series:\n             for p in patches:\n                 Patch(p, self.__patch_dir, self.__refs_dir).delete()\n \n-            if os.path.exists(self.__applied_file):\n-                os.remove(self.__applied_file)\n-            if os.path.exists(self.__unapplied_file):\n-                os.remove(self.__unapplied_file)\n-            if os.path.exists(self.__current_file):\n-                os.remove(self.__current_file)\n-            if os.path.exists(self.__descr_file):\n-                os.remove(self.__descr_file)\n-            if not os.listdir(self.__patch_dir):\n-                os.rmdir(self.__patch_dir)\n-            else:\n-                print 'Patch directory %s is not empty.' % self.__name\n-            if not os.listdir(self.__series_dir):\n-                os.rmdir(self.__series_dir)\n-            else:\n-                print 'Series directory %s is not empty.' % self.__name\n-            if not os.listdir(self.__refs_dir):\n-                os.rmdir(self.__refs_dir)\n-            else:\n-                print 'Refs directory %s is not empty.' % self.__refs_dir\n+            for f in [self.__applied_file, self.__unapplied_file,\n+                      self.__current_file, self.__descr_file]:\n+                rm_if_exists(f)\n+\n+            for (d, n) in [(self.__patch_dir, 'Patch'),\n+                           (self.__series_dir, 'Series'),\n+                           (self.__refs_dir, 'Refs')]:\n+                if os.path.isdir(d) and os.listdir(d):\n+                    print '%s directory %s is not empty.' % (n, self.__name)\n+                rmdir_while_empty(d, self.__base_dir)\n \n-        if os.path.exists(self.__base_file):\n-            os.remove(self.__base_file)\n+        rm_if_exists(self.__base_file)\n+        rmdir_while_empty(os.path.dirname(self.__base_file), self.__base_dir)\n \n     def refresh_patch(self, files = None, message = None, edit = False,\n                       show_patch = False,\ndiff --git a/stgit/utils.py b/stgit/utils.py\nindex 5749b3b..33c62be 100644\n--- a/stgit/utils.py\n+++ b/stgit/utils.py\n@@ -18,6 +18,18 @@ along with this program; if not, write t\n Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n \"\"\"\n \n+import os.path\n+\n+def mkdir_file(filename, mode, mkdir):\n+    \"\"\"Opens filename with the given mode, creating the directory it's\n+    in if it doesn't already exist and mkdir is true\n+    \"\"\"\n+    if mkdir:\n+        d = os.path.dirname(filename)\n+        if not os.path.isdir(d):\n+            os.makedirs(d)\n+    return file(filename, mode)\n+\n def read_string(filename, multiline = False):\n     \"\"\"Reads the first line from a file\n     \"\"\"\n@@ -29,42 +41,87 @@ def read_string(filename, multiline = Fa\n     f.close()\n     return result\n \n-def write_string(filename, line, multiline = False):\n+def write_string(filename, line, multiline = False, mkdir = False):\n     \"\"\"Writes 'line' to file and truncates it\n     \"\"\"\n-    f = file(filename, 'w+')\n+    f = mkdir_file(filename, 'w+', mkdir)\n     if multiline:\n         f.write(line)\n     else:\n         print >> f, line\n     f.close()\n \n-def append_strings(filename, lines):\n+def append_strings(filename, lines, mkdir = False):\n     \"\"\"Appends 'lines' sequence to file\n     \"\"\"\n-    f = file(filename, 'a+')\n+    f = mkdir_file(filename, 'a+', mkdir)\n     for line in lines:\n         print >> f, line\n     f.close()\n \n-def append_string(filename, line):\n+def append_string(filename, line, mkdir = False):\n     \"\"\"Appends 'line' to file\n     \"\"\"\n-    f = file(filename, 'a+')\n+    f = mkdir_file(filename, 'a+', mkdir)\n     print >> f, line\n     f.close()\n \n-def insert_string(filename, line):\n+def insert_string(filename, line, mkdir = False):\n     \"\"\"Inserts 'line' at the beginning of the file\n     \"\"\"\n-    f = file(filename, 'r+')\n+    f = mkdir_file(filename, 'r+', mkdir)\n     lines = f.readlines()\n     f.seek(0); f.truncate()\n     print >> f, line\n     f.writelines(lines)\n     f.close()\n \n-def create_empty_file(name):\n+def create_empty_file(name, mkdir = False):\n     \"\"\"Creates an empty file\n     \"\"\"\n-    file(name, 'w+').close()\n+    mkdir_file(name, 'w+', mkdir).close()\n+\n+def remove_leading_dir(leading, path):\n+    \"\"\"Remove leading directories from a pathname\n+    \"\"\"\n+    if not path.startswith(leading):\n+        raise Exception('\"%s\" does not begin with \"%s\"' % (path, leading))\n+    path = path[len(leading):]\n+    if len(path) > 0 and path[0] in [os.path.sep, os.path.altsep]:\n+        path = path[1:]\n+    return path\n+\n+def rmdir_while_empty(path, stop):\n+    \"\"\"Delete dirs until we reach a directory that isn't empty, or\n+    until we reach the path stop\n+    \"\"\"\n+    while path.startswith(stop) and len(path) > len(stop):\n+        parent = os.path.dirname(path)\n+        try:\n+            os.rmdir(path)\n+        except OSError:\n+            return # directory not empty\n+        path = parent\n+\n+def rm_file_and_dirs(path, stop):\n+    \"\"\"Delete the file, and keep deleting dirs until we reach a\n+    directory that isn't empty, or until we reach the path stop\n+    \"\"\"\n+    os.remove(path)\n+    rmdir_while_empty(os.path.dirname(path), stop)\n+\n+def rm_if_exists(f):\n+    \"\"\"Delete file if it exists\n+    \"\"\"\n+    if os.path.exists(f):\n+        os.remove(f)\n+\n+def rename_dirs(from_path, to_path, stop):\n+    \"\"\"Rename file or directory, creating new directories at to_path\n+    as necessary, and removing leftover empty directories at from_path\n+    until we reach stop\n+    \"\"\"\n+    if not os.path.isdir(os.path.dirname(to_path)):\n+        os.makedirs(os.path.dirname(to_path))\n+    os.rename(from_path, to_path)\n+    rmdir_while_empty(os.path.dirname(from_path), stop)\n"},{"id":"16298","messageId":"43F53C76.6080902@vilain.net","threadId":"3336","inReplyTo":"20060217014117.12525.21330.stgit@backpacker.hemma.treskal.com","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Sam Vilain","fromEmail":"sam@vilain.net","sentAt":"2006-02-17T03:01:10Z","receivedAt":"2006-02-17T03:01:10Z","isPatch":true,"sender":{"key":"sam@vilain.net","avatar":"https://gravatar.com/avatar/8fc840ca854dbf6f7065b4335e3b934951c1dca3b11db688e95e471901f8f4a8?d=mp&s=160"},"body":"Karl Hasselström wrote:\n> Let StGIT grok branch names with slashes in them. It used to fall flat\n> on its face when confronted with them.\n> \n> I think I've covered all, or at least most cases, but there are\n> probably some bugs left if you look hard enough.\n\nDoes `stgit -r patchname/bottom` still work?\n\nSam.\n"},{"id":"16299","messageId":"20060217042108.GB28114@diana.vm.bytemark.co.uk","threadId":"3336","inReplyTo":"43F53C76.6080902@vilain.net","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2006-02-17T04:21:08Z","receivedAt":"2006-02-17T04:21:08Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2006-02-17 16:01:10 +1300, Sam Vilain wrote:\n\n> Karl Hasselström wrote:\n>\n> > Let StGIT grok branch names with slashes in them. It used to fall\n> > flat on its face when confronted with them.\n> >\n> > I think I've covered all, or at least most cases, but there are\n> > probably some bugs left if you look hard enough.\n>\n> Does `stgit -r patchname/bottom` still work?\n\nYes (if you mean 'stg diff -r ... ' :-). It's just branches that can\nhave slashes in their names, not patches.\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"},{"id":"16306","messageId":"tnxbqx6z592.fsf@arm.com","threadId":"3336","inReplyTo":"20060217014117.12525.21330.stgit@backpacker.hemma.treskal.com","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Catalin Marinas","fromEmail":"catalin.marinas@arm.com","sentAt":"2006-02-17T09:47:21Z","receivedAt":"2006-02-17T09:47:21Z","isPatch":true,"sender":{"key":"catalin.marinas@arm.com","avatar":null},"body":"Karl Hasselström <kha@treskal.com> wrote:\n> Let StGIT grok branch names with slashes in them. It used to fall flat\n> on its face when confronted with them.\n\nThanks for the patches you sent. I'll have a look at them tomorrow.\n\nAs a side note, for future patches, could you please use my\ncatalin.marinas@gmail.com address instead of the company one? I\nmaintain StGIT outside the working hours and it's much easier to grab\nthem from my personal address.\n\nThanks,\n\n-- \nCatalin\n"},{"id":"16307","messageId":"20060217095323.GA1188@diana.vm.bytemark.co.uk","threadId":"3336","inReplyTo":"tnxbqx6z592.fsf@arm.com","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2006-02-17T09:53:23Z","receivedAt":"2006-02-17T09:53:23Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2006-02-17 09:47:21 +0000, Catalin Marinas wrote:\n\n> Karl Hasselström <kha@treskal.com> wrote:\n>\n> > Let StGIT grok branch names with slashes in them. It used to fall\n> > flat on its face when confronted with them.\n>\n> Thanks for the patches you sent. I'll have a look at them tomorrow.\n>\n> As a side note, for future patches, could you please use my\n> catalin.marinas@gmail.com address instead of the company one? I\n> maintain StGIT outside the working hours and it's much easier to\n> grab them from my personal address.\n\nAh, I hadn't realized you were using more than one address. Will do.\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"},{"id":"16806","messageId":"20060227121108.GA22398@diana.vm.bytemark.co.uk","threadId":"3336","inReplyTo":"20060217042108.GB28114@diana.vm.bytemark.co.uk","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2006-02-27T12:11:08Z","receivedAt":"2006-02-27T12:11:08Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2006-02-17 05:21:08 +0100, Karl Hasselström wrote:\n\n> On 2006-02-17 16:01:10 +1300, Sam Vilain wrote:\n>\n> > Karl Hasselström wrote:\n> >\n> > > Let StGIT grok branch names with slashes in them. It used to\n> > > fall flat on its face when confronted with them.\n> > >\n> > > I think I've covered all, or at least most cases, but there are\n> > > probably some bugs left if you look hard enough.\n> >\n> > Does `stgit -r patchname/bottom` still work?\n>\n> Yes (if you mean 'stg diff -r ... ' :-). It's just branches that can\n> have slashes in their names, not patches.\n\nThere was a bug here after all: I just tried \"stg pick\nmulti@kha/patches\" (to pick a patch named \"multi\" from the branch\n\"kha/patches\"), and StGIT tried to pick the patch from branch \"kha\".\n\nLooking closer, I realized that the complete patch specification\nsyntax is \"patchname@branchname/bottom\", not\n\"patchname/bottom@branchname\" as I had assumed. This is obviously hard\nto reconcile with branch names containing /.\n\nThoughts?\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"},{"id":"16807","messageId":"1141043391.3438.66.camel@pc1117","threadId":"3336","inReplyTo":"20060227121108.GA22398@diana.vm.bytemark.co.uk","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Catalin Marinas","fromEmail":"catalin.marinas@arm.com","sentAt":"2006-02-27T12:29:51Z","receivedAt":"2006-02-27T12:29:51Z","isPatch":true,"sender":{"key":"catalin.marinas@arm.com","avatar":null},"body":"On Mon, 2006-02-27 at 13:11 +0100, Karl Hasselström wrote:\n> There was a bug here after all: I just tried \"stg pick\n> multi@kha/patches\" (to pick a patch named \"multi\" from the branch\n> \"kha/patches\"), and StGIT tried to pick the patch from branch \"kha\".\n\nI haven't applied your patch yet (too busy to properly review it).\n\n> Looking closer, I realized that the complete patch specification\n> syntax is \"patchname@branchname/bottom\", not\n> \"patchname/bottom@branchname\" as I had assumed. This is obviously hard\n> to reconcile with branch names containing /.\n\nI don't have any strong opinion on either. Maybe we should use the\nlatter if it makes things easier for supporting branch names with /'s.\n\n-- \nCatalin\n"},{"id":"16812","messageId":"20060227130917.GA22933@diana.vm.bytemark.co.uk","threadId":"3336","inReplyTo":"1141043391.3438.66.camel@pc1117","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2006-02-27T13:09:17Z","receivedAt":"2006-02-27T13:09:17Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2006-02-27 12:29:51 +0000, Catalin Marinas wrote:\n\n> On Mon, 2006-02-27 at 13:11 +0100, Karl Hasselström wrote:\n>\n> > There was a bug here after all: I just tried \"stg pick\n> > multi@kha/patches\" (to pick a patch named \"multi\" from the branch\n> > \"kha/patches\"), and StGIT tried to pick the patch from branch\n> > \"kha\".\n>\n> I haven't applied your patch yet (too busy to properly review it).\n\nAnd as I just demonstrated, it certainly needed reviewing! (Actually,\nI believe I said that back when I posted the patch, too.)\n\n> > Looking closer, I realized that the complete patch specification\n> > syntax is \"patchname@branchname/bottom\", not\n> > \"patchname/bottom@branchname\" as I had assumed. This is obviously\n> > hard to reconcile with branch names containing /.\n>\n> I don't have any strong opinion on either. Maybe we should use the\n> latter if it makes things easier for supporting branch names with\n> /'s.\n\nThe problem is that the current from is better (bottom is a modifier\nto patch@branch, not just patch). And using the other form will break\nwhen someone decides that patches with slashes in their names are a\ngood idea (not a joke).\n\nPerhaps change /bottom to #bottom (making the complete form\npatchname@branchname#bottom), and for backward compatibility accept\npatchname@branchname/bottom as well when no branch called\n\"branchname/bottom\" exists.\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"},{"id":"18587","messageId":"20060412191655.GD27397@nowhere.earth","threadId":"3336","inReplyTo":"tnxbqx6z592.fsf@arm.com","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Yann Dirson","fromEmail":"ydirson@altern.org","sentAt":"2006-04-12T19:16:55Z","receivedAt":"2006-04-12T19:16:55Z","isPatch":true,"sender":{"key":"ydirson@altern.org","avatar":"https://avatars.githubusercontent.com/u/1190950?v=4"},"body":"On Fri, Feb 17, 2006 at 09:47:21AM +0000, Catalin Marinas wrote:\n> Karl Hasselström <kha@treskal.com> wrote:\n> > Let StGIT grok branch names with slashes in them. It used to fall flat\n> > on its face when confronted with them.\n> \n> Thanks for the patches you sent. I'll have a look at them tomorrow.\n\nIs this still being worked on ?\n-- \nYann Dirson    <ydirson@altern.org> |\nDebian-related: <dirson@debian.org> |   Support Debian GNU/Linux:\n                                    |  Freedom, Power, Stability, Gratis\n     http://ydirson.free.fr/        | Check <http://www.debian.org/>\n"},{"id":"18801","messageId":"20060418110709.GA25558@diana.vm.bytemark.co.uk","threadId":"3336","inReplyTo":"20060412191655.GD27397@nowhere.earth","subject":"Re: [PATCH] Handle branch names with slashes","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2006-04-18T11:07:09Z","receivedAt":"2006-04-18T11:07:09Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"On 2006-04-12 21:16:55 +0200, Yann Dirson wrote:\n\n> Is this still being worked on?\n\nI haven't worked any more on the slashes-in-branch-names patch, but I\nhave been using it myself, and it works for me. Getting that fancy new\ntest suite to excercise it would be a really good next step . . .\n\n-- \nKarl Hasselström, kha@treskal.com\n      www.treskal.com/kalle\n"}]}