[#8296] fix handling of branch urls with / and ~ in them
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index c2b3ea8..0d08086 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -599,9 +599,9 @@
 
     @expose()
     def _lookup(self, ref, *remainder):
-        EOR = quote(c.app.END_OF_REF_ESCAPE)
+        EOR = c.app.END_OF_REF_ESCAPE
         if EOR in remainder:
-            i = remainder.index(quote(c.app.END_OF_REF_ESCAPE))
+            i = remainder.index(EOR)
             ref = '/'.join((ref,) + remainder[:i])
             remainder = remainder[i + 1:]
         return self.BranchBrowserClass(ref), remainder
@@ -611,9 +611,9 @@
 
     @expose()
     def _lookup(self, ci, *remainder):
-        EOR = quote(c.app.END_OF_REF_ESCAPE)
+        EOR = c.app.END_OF_REF_ESCAPE
         if EOR in remainder:
-            i = remainder.index(quote(c.app.END_OF_REF_ESCAPE))
+            i = remainder.index(EOR)
             ci = '/'.join((ci,) + remainder[:i])
             remainder = remainder[i + 1:]
         return CommitBrowser(ci), remainder
diff --git a/ForgeGit/forgegit/tests/data/test_branch.git/objects/09/a2406097f0287c7b1789bb08368758cde3243a b/ForgeGit/forgegit/tests/data/test_branch.git/objects/09/a2406097f0287c7b1789bb08368758cde3243a
new file mode 100644
index 0000000..e076d7e
--- /dev/null
+++ b/ForgeGit/forgegit/tests/data/test_branch.git/objects/09/a2406097f0287c7b1789bb08368758cde3243a
@@ -0,0 +1,5 @@
+xÎM
+1@a×=E. $Óñ"i›2.¦•Z=¿"x—ßâÁË}Ûn»9DÀ`
+è5iY,E+gãÙç„F‡ä9DG$êÎCÚ_4V
+3EfC¤CŽ®Š¦šÐ—Œ‹Á¨)~ε¸òKà2z+ÙŽåãsúùÐdž€¬Î{
+öhUþNNù3W½CÜòªÞTÖG—
\ No newline at end of file
diff --git a/ForgeGit/forgegit/tests/data/test_branch.git/objects/40/b807313e20151959fac47a7cb0438b7a89611e b/ForgeGit/forgegit/tests/data/test_branch.git/objects/40/b807313e20151959fac47a7cb0438b7a89611e
new file mode 100644
index 0000000..d61a3ea
--- /dev/null
+++ b/ForgeGit/forgegit/tests/data/test_branch.git/objects/40/b807313e20151959fac47a7cb0438b7a89611e
Binary files differ
diff --git a/ForgeGit/forgegit/tests/data/test_branch.git/objects/4e/7eadee735363b039e34ba79dfdb0fb8ea5a53a b/ForgeGit/forgegit/tests/data/test_branch.git/objects/4e/7eadee735363b039e34ba79dfdb0fb8ea5a53a
new file mode 100644
index 0000000..eea0ea9
--- /dev/null
+++ b/ForgeGit/forgegit/tests/data/test_branch.git/objects/4e/7eadee735363b039e34ba79dfdb0fb8ea5a53a
Binary files differ
diff --git a/ForgeGit/forgegit/tests/data/test_branch.git/refs/heads/xyz/123 b/ForgeGit/forgegit/tests/data/test_branch.git/refs/heads/xyz/123
new file mode 100644
index 0000000..7101ea2
--- /dev/null
+++ b/ForgeGit/forgegit/tests/data/test_branch.git/refs/heads/xyz/123
@@ -0,0 +1 @@
+09a2406097f0287c7b1789bb08368758cde3243a
diff --git a/ForgeGit/forgegit/tests/data/test_branch.git/refs/tags/releases/v1.1.1 b/ForgeGit/forgegit/tests/data/test_branch.git/refs/tags/releases/v1.1.1
new file mode 100644
index 0000000..7101ea2
--- /dev/null
+++ b/ForgeGit/forgegit/tests/data/test_branch.git/refs/tags/releases/v1.1.1
@@ -0,0 +1 @@
+09a2406097f0287c7b1789bb08368758cde3243a
diff --git a/ForgeGit/forgegit/tests/functional/test_controllers.py b/ForgeGit/forgegit/tests/functional/test_controllers.py
index 46ebf2f..ffd0971 100644
--- a/ForgeGit/forgegit/tests/functional/test_controllers.py
+++ b/ForgeGit/forgegit/tests/functional/test_controllers.py
@@ -954,6 +954,35 @@
         assert 'README</a>' in r
         assert_equal(c.app.repo.get_default_branch('master'), 'test')
 
+    def test_branch_with_slashes(self):
+        branches_page = self.app.get('/src-git/ref/master/branches/')
+
+        r = branches_page.click('xyz/123', index=0)  # link in sidebar
+        assert r.request.url.endswith('src-git/ci/xyz/123/~/tree/'), r.request.url
+        r.mustcontain('on a branch')  # commit for this branch
+
+        r = branches_page.click('xyz/123', index=1)  # link in body
+        assert r.request.url.endswith('src-git/ci/xyz/123/~/tree/'), r.request.url
+        r.mustcontain('on a branch')  # commit for this branch
+
+    def test_ref_url_with_slashes(self):
+        r = self.app.get('/src-git/ref/xyz/123/~/')
+        assert r.location.endswith('src-git/ci/xyz/123/~/tree/')
+
+        r = self.app.get('/src-git/ref/xyz/123/~/log/')
+        assert r.location.endswith('src-git/ci/09a2406097f0287c7b1789bb08368758cde3243a/log/')
+
+    def test_tag_with_slashes(self):
+        tags_page = self.app.get('/src-git/ref/master/tags/')
+
+        r = tags_page.click('releases/v1.1.1', index=0)  # link in sidebar
+        assert r.request.url.endswith('src-git/ci/releases/v1.1.1/~/tree/'), r.request.url
+        r.mustcontain('on a branch')  # commit for this tag
+
+        r = tags_page.click('releases/v1.1.1', index=1)  # link in body
+        assert r.request.url.endswith('src-git/ci/releases/v1.1.1/~/tree/'), r.request.url
+        r.mustcontain('on a branch')  # commit for this tag
+
 
 class TestIncludeMacro(_TestCase):
     def setUp(self):