You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/04/04 00:20:00 UTC

[1/6] git commit: [#5120] ticket:307 beautiful urls only for branch browser

Updated Branches:
  refs/heads/master f81ebb34c -> 4c3419a57


[#5120] ticket:307 beautiful urls only for branch browser


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/c8234212
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/c8234212
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/c8234212

Branch: refs/heads/master
Commit: c82342121105e8fd5c6a793a22a9b31caba5e83c
Parents: 55aba26
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Mon Apr 1 16:58:11 2013 +0400
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 3 22:16:57 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/repository.py                |   12 ++++++++++--
 ForgeGit/forgegit/controllers.py                 |    2 +-
 ForgeGit/forgegit/tests/model/test_repository.py |    9 +++++----
 ForgeSVN/forgesvn/controllers.py                 |    2 +-
 ForgeSVN/forgesvn/model/svn.py                   |   10 +++++++++-
 ForgeSVN/forgesvn/tests/model/test_repository.py |    4 ++--
 6 files changed, 28 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c8234212/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 36781d6..f33d446 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -158,8 +158,7 @@ class RepositoryImplementation(object):
         tags = [t.name for t in self._repo.repo_tags if t.object_id == commit._id]
         return branches, tags
 
-    def url_for_commit(self, commit):
-        'return an URL, given either a commit or object id'
+    def url_for_symbolic(self, commit):
         if isinstance(commit, basestring):
             object_id = commit
         else:
@@ -185,6 +184,15 @@ class RepositoryImplementation(object):
 
         return '%sci/%s/' % (self._repo.url(), object_id)
 
+    def url_for_commit(self, commit):
+        'return an URL, given either a commit or object id'
+        if isinstance(commit, basestring):
+            object_id = commit
+        else:
+            object_id = commit._id
+
+        return '%sci/%s/' % (self._repo.url(), object_id)
+
     def _setup_paths(self, create_repo_dir=True):
         '''
         Ensure that the base directory in which the repo lives exists.

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c8234212/ForgeGit/forgegit/controllers.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/controllers.py b/ForgeGit/forgegit/controllers.py
index dfc3478..4a8fab7 100644
--- a/ForgeGit/forgegit/controllers.py
+++ b/ForgeGit/forgegit/controllers.py
@@ -12,5 +12,5 @@ class BranchBrowser(repository.BranchBrowser):
         latest = c.app.repo.latest(branch=self._branch)
         if not latest:
             return dict(allow_fork=False, log=[])
-        redirect(latest.url() + 'tree/')
+        redirect(c.app.repo._impl.url_for_symbolic(latest._id) + 'tree/')
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c8234212/ForgeGit/forgegit/tests/model/test_repository.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/tests/model/test_repository.py b/ForgeGit/forgegit/tests/model/test_repository.py
index 26c952f..5e771dc 100644
--- a/ForgeGit/forgegit/tests/model/test_repository.py
+++ b/ForgeGit/forgegit/tests/model/test_repository.py
@@ -59,7 +59,7 @@ class TestNewGit(unittest.TestCase):
         assert self.rev.symbolic_ids == (['master', 'zz'], [])
         assert self.rev.url() == (
             '/p/test/src-git/ci/'
-            'master/')
+            '1e146e67985dcd71c74de79613719bef7bddca4a/')
         all_cis = self.repo.log(self.rev._id, 0, 1000)
         assert len(all_cis) == 4
         assert_equal(self.repo.log(self.rev._id, 1,1000), all_cis[1:])
@@ -74,7 +74,7 @@ class TestNewGit(unittest.TestCase):
         assert self.rev.tree.path() == '/'
         assert self.rev.tree.url() == (
             '/p/test/src-git/ci/'
-            'master/'
+            '1e146e67985dcd71c74de79613719bef7bddca4a/'
             'tree/')
         self.rev.tree.by_name['README']
         assert self.rev.tree.is_blob('README') == True
@@ -91,7 +91,7 @@ class TestNewGit(unittest.TestCase):
             assert ci.shorthand_id() == '[1e146e]', ci.shorthand_id()
             assert ci.url() == (
                 '/p/test/src-git/ci/'
-                'master/')
+                '1e146e67985dcd71c74de79613719bef7bddca4a/')
 
 class TestGitRepo(unittest.TestCase, RepoImplTestBase):
 
@@ -315,7 +315,8 @@ class TestGitCommit(unittest.TestCase):
         ThreadLocalORMSession.close_all()
 
     def test_url(self):
-        assert self.rev.url().endswith('master/'), self.rev.url()
+        assert self.rev.url().endswith('ca4a/')
+        assert self.repo._impl.url_for_symbolic(self.rev._id).endswith('master/'), self.repo._impl.url_for_symbolic(self.rev._id)
 
     def test_committer_url(self):
         assert self.rev.committer_url is None

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c8234212/ForgeSVN/forgesvn/controllers.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/controllers.py b/ForgeSVN/forgesvn/controllers.py
index 59748ec..0a87b40 100644
--- a/ForgeSVN/forgesvn/controllers.py
+++ b/ForgeSVN/forgesvn/controllers.py
@@ -16,7 +16,7 @@ class BranchBrowser(repository.BranchBrowser):
         latest = c.app.repo.latest(branch=self._branch)
         if not latest or (latest._id.split(':')[1] == '1' and h.has_access(c.app, 'write')()):
             return dict(allow_fork=False, log=[])
-        redirect(latest.url() + 'tree/')
+        redirect(c.app.repo._impl.url_for_symbolic(latest._id) + 'tree/')
 
     @expose()
     def _lookup(self, rev, *remainder):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c8234212/ForgeSVN/forgesvn/model/svn.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index 30fb655..2e18b2c 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -162,7 +162,7 @@ class SVNImplementation(M.RepositoryImplementation):
     def shorthand_for_commit(self, oid):
         return '[r%d]' % self._revno(oid)
 
-    def url_for_commit(self, commit):
+    def url_for_symbolic(self, commit):
         if isinstance(commit, basestring):
             object_id = commit
         else:
@@ -172,6 +172,14 @@ class SVNImplementation(M.RepositoryImplementation):
         return '%s%d/' % (
             self._repo.url(), self._revno(object_id))
 
+    def url_for_commit(self, commit):
+        if isinstance(commit, basestring):
+            object_id = commit
+        else:
+            object_id = commit._id
+        return '%s%d/' % (
+            self._repo.url(), self._revno(object_id))
+
     def init(self, default_dirs=True, skip_special_files=False):
         fullname = self._setup_paths()
         log.info('svn init %s', fullname)

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/c8234212/ForgeSVN/forgesvn/tests/model/test_repository.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/tests/model/test_repository.py b/ForgeSVN/forgesvn/tests/model/test_repository.py
index 077c50a..1613cf9 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -63,7 +63,7 @@ class TestNewRepo(unittest.TestCase):
         assert self.rev.shorthand_id() == '[r5]'
         assert self.rev.symbolic_ids == ([], [])
         assert self.rev.url() == (
-            '/p/test/src/HEAD/')
+            '/p/test/src/5/')
         all_cis = self.repo.log(self.rev._id, 0, 1000)
         assert len(all_cis) == 5
         assert self.repo.log(self.rev._id, 1,1000) == all_cis[1:]
@@ -76,7 +76,7 @@ class TestNewRepo(unittest.TestCase):
             'README', 'This is readme\nAnother Line\n')
         assert self.rev.tree.path() == '/'
         assert self.rev.tree.url() == (
-            '/p/test/src/HEAD/tree/')
+            '/p/test/src/5/tree/')
         self.rev.tree.by_name['README']
         assert self.rev.tree.is_blob('README') == True
         assert self.rev.tree['a']['b']['c'].ls() == []


[4/6] git commit: [#5120] ticket:297 Use prettier branch and tags urls in sidebar menu

Posted by jo...@apache.org.
[#5120] ticket:297 Use prettier branch and tags urls in sidebar menu


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/464e9da0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/464e9da0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/464e9da0

Branch: refs/heads/master
Commit: 464e9da05f7cf4e4cd8d3a43cb3d514cfbd76b7c
Parents: a07f13a
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Mar 20 10:44:17 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 3 22:16:57 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/repository.py |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/464e9da0/Allura/allura/lib/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/repository.py b/Allura/allura/lib/repository.py
index 7fbb0bb..d092377 100644
--- a/Allura/allura/lib/repository.py
+++ b/Allura/allura/lib/repository.py
@@ -122,7 +122,7 @@ class RepositoryApp(Application):
             links.append(SitemapEntry('Branches'))
             for b in self.repo.branches:
                 links.append(SitemapEntry(
-                        b.name, url(c.app.url, dict(branch='ref/' + b.name)),
+                        b.name, url('%sci/%s/tree/' % (c.app.url, b.name)),
                         small=b.count))
         if self.repo.repo_tags:
             links.append(SitemapEntry('Tags'))
@@ -130,7 +130,7 @@ class RepositoryApp(Application):
             for i, b in enumerate(self.repo.repo_tags):
                 if i < max_tags:
                     links.append(SitemapEntry(
-                            b.name, url(c.app.url, dict(branch='ref/' + b.name)),
+                            b.name, url('%sci/%s/tree/' % (c.app.url, b.name)),
                             small=b.count))
                 elif i == max_tags:
                     links.append(


[3/6] git commit: [#5120] ticket:297 Change default urls for the repo

Posted by jo...@apache.org.
[#5120] ticket:297 Change default urls for the repo


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/a07f13a2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/a07f13a2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/a07f13a2

Branch: refs/heads/master
Commit: a07f13a27bc1cdb6e09fcbda0be81ae8a9ab774d
Parents: f81ebb3
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Wed Mar 20 01:24:08 2013 +0400
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 3 22:16:57 2013 +0000

----------------------------------------------------------------------
 Allura/allura/model/repository.py                |   19 +++++++++++++++++
 ForgeGit/forgegit/tests/model/test_repository.py |    8 +++---
 ForgeSVN/forgesvn/model/svn.py                   |    2 +
 ForgeSVN/forgesvn/tests/model/test_repository.py |    5 ++-
 4 files changed, 28 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/a07f13a2/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 9019375..0c4dcbf 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -163,6 +163,25 @@ class RepositoryImplementation(object):
             object_id = commit
         else:
             object_id = commit._id
+
+        if self._repo.commit(object_id).symbolic_ids:
+            rev = None
+            branches, tags = self._repo.commit(object_id).symbolic_ids
+            for branch in branches:
+                last_commit = self._repo.latest(branch)
+                if last_commit and (object_id == last_commit._id):
+                    rev = branch
+                    break
+
+            for tag in tags:
+                last_commit = self._repo.latest(tag)
+                if last_commit and (object_id == last_commit._id):
+                    rev = tag
+                    break
+
+            if rev:
+                object_id = rev
+
         return '%sci/%s/' % (self._repo.url(), object_id)
 
     def _setup_paths(self, create_repo_dir=True):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/a07f13a2/ForgeGit/forgegit/tests/model/test_repository.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/tests/model/test_repository.py b/ForgeGit/forgegit/tests/model/test_repository.py
index bce1a4f..26c952f 100644
--- a/ForgeGit/forgegit/tests/model/test_repository.py
+++ b/ForgeGit/forgegit/tests/model/test_repository.py
@@ -59,7 +59,7 @@ class TestNewGit(unittest.TestCase):
         assert self.rev.symbolic_ids == (['master', 'zz'], [])
         assert self.rev.url() == (
             '/p/test/src-git/ci/'
-            '1e146e67985dcd71c74de79613719bef7bddca4a/')
+            'master/')
         all_cis = self.repo.log(self.rev._id, 0, 1000)
         assert len(all_cis) == 4
         assert_equal(self.repo.log(self.rev._id, 1,1000), all_cis[1:])
@@ -74,7 +74,7 @@ class TestNewGit(unittest.TestCase):
         assert self.rev.tree.path() == '/'
         assert self.rev.tree.url() == (
             '/p/test/src-git/ci/'
-            '1e146e67985dcd71c74de79613719bef7bddca4a/'
+            'master/'
             'tree/')
         self.rev.tree.by_name['README']
         assert self.rev.tree.is_blob('README') == True
@@ -91,7 +91,7 @@ class TestNewGit(unittest.TestCase):
             assert ci.shorthand_id() == '[1e146e]', ci.shorthand_id()
             assert ci.url() == (
                 '/p/test/src-git/ci/'
-                '1e146e67985dcd71c74de79613719bef7bddca4a/')
+                'master/')
 
 class TestGitRepo(unittest.TestCase, RepoImplTestBase):
 
@@ -315,7 +315,7 @@ class TestGitCommit(unittest.TestCase):
         ThreadLocalORMSession.close_all()
 
     def test_url(self):
-        assert self.rev.url().endswith('ca4a/')
+        assert self.rev.url().endswith('master/'), self.rev.url()
 
     def test_committer_url(self):
         assert self.rev.committer_url is None

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/a07f13a2/ForgeSVN/forgesvn/model/svn.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index 4d09534..30fb655 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -167,6 +167,8 @@ class SVNImplementation(M.RepositoryImplementation):
             object_id = commit
         else:
             object_id = commit._id
+        if self._repo.latest()._id == object_id:
+            return '%sHEAD/' % self._repo.url()
         return '%s%d/' % (
             self._repo.url(), self._revno(object_id))
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/a07f13a2/ForgeSVN/forgesvn/tests/model/test_repository.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/tests/model/test_repository.py b/ForgeSVN/forgesvn/tests/model/test_repository.py
index 89964a7..077c50a 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -63,7 +63,7 @@ class TestNewRepo(unittest.TestCase):
         assert self.rev.shorthand_id() == '[r5]'
         assert self.rev.symbolic_ids == ([], [])
         assert self.rev.url() == (
-            '/p/test/src/5/')
+            '/p/test/src/HEAD/')
         all_cis = self.repo.log(self.rev._id, 0, 1000)
         assert len(all_cis) == 5
         assert self.repo.log(self.rev._id, 1,1000) == all_cis[1:]
@@ -76,7 +76,7 @@ class TestNewRepo(unittest.TestCase):
             'README', 'This is readme\nAnother Line\n')
         assert self.rev.tree.path() == '/'
         assert self.rev.tree.url() == (
-            '/p/test/src/5/tree/')
+            '/p/test/src/HEAD/tree/')
         self.rev.tree.by_name['README']
         assert self.rev.tree.is_blob('README') == True
         assert self.rev.tree['a']['b']['c'].ls() == []
@@ -420,6 +420,7 @@ class _TestWithRepo(_Test):
         self.repo._impl.log = lambda *a,**kw:(['foo'], [])
         self.repo._impl._repo = self.repo
         self.repo._impl.all_commit_ids = lambda *a,**kw: []
+        self.repo._impl.commit().symbolic_ids = None
         ThreadLocalORMSession.flush_all()
         # ThreadLocalORMSession.close_all()
 


[6/6] git commit: [#5120] Bumped ForgeHg version

Posted by jo...@apache.org.
[#5120] Bumped ForgeHg version

Signed-off-by: Cory Johns <cj...@slashdotmedia.com>


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/4c3419a5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/4c3419a5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/4c3419a5

Branch: refs/heads/master
Commit: 4c3419a578fed28a225c0372aa8f6cf2bf2da02d
Parents: c823421
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Wed Apr 3 22:19:41 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 3 22:19:41 2013 +0000

----------------------------------------------------------------------
 requirements-sf.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4c3419a5/requirements-sf.txt
----------------------------------------------------------------------
diff --git a/requirements-sf.txt b/requirements-sf.txt
index f6dc6f4..628e1e8 100644
--- a/requirements-sf.txt
+++ b/requirements-sf.txt
@@ -4,7 +4,7 @@ akismet==0.2.0
 amqplib==0.6.1
 kombu==1.0.4
 coverage==3.5a1-20110413
-ForgeHg==0.1.5
+ForgeHg==0.1.6
 ForgePastebin==0.2.6
 mechanize==0.2.4
 MySQL-python==1.2.3c1


[2/6] git commit: [#5120] ticket:297 Fix failing tests due to new branch urls

Posted by jo...@apache.org.
[#5120] ticket:297 Fix failing tests due to new branch urls


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/55aba264
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/55aba264
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/55aba264

Branch: refs/heads/master
Commit: 55aba2645856468d37dc0d5d88864276a32be2bb
Parents: 84e439c
Author: Igor Bondarenko <je...@gmail.com>
Authored: Thu Mar 21 10:59:07 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 3 22:16:57 2013 +0000

----------------------------------------------------------------------
 .../forgegit/tests/functional/test_controllers.py  |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/55aba264/ForgeGit/forgegit/tests/functional/test_controllers.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/tests/functional/test_controllers.py b/ForgeGit/forgegit/tests/functional/test_controllers.py
index 5be4d01..2245b5b 100644
--- a/ForgeGit/forgegit/tests/functional/test_controllers.py
+++ b/ForgeGit/forgegit/tests/functional/test_controllers.py
@@ -127,7 +127,10 @@ class TestRootController(_TestCase):
         resp = r.follow()
         for tag in resp.html.findAll('a'):
             if tag['href'].startswith('/p/test/src-git/ci/'):
-                return tag['href']
+                href = tag['href']
+                if href.endswith('tree/'):
+                    href = href[:-5]
+                return href
         return None
 
     def test_commit(self):


[5/6] git commit: [#5120] ticket:297 Quote branch name in urls

Posted by jo...@apache.org.
[#5120] ticket:297 Quote branch name in urls


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/84e439c3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/84e439c3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/84e439c3

Branch: refs/heads/master
Commit: 84e439c37942807c425d578cf684f7e5be0c2afb
Parents: 464e9da
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Mar 20 11:51:34 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Wed Apr 3 22:16:57 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/repository.py   |    4 ++--
 Allura/allura/model/repository.py |    3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/84e439c3/Allura/allura/lib/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/repository.py b/Allura/allura/lib/repository.py
index d092377..79a6b33 100644
--- a/Allura/allura/lib/repository.py
+++ b/Allura/allura/lib/repository.py
@@ -122,7 +122,7 @@ class RepositoryApp(Application):
             links.append(SitemapEntry('Branches'))
             for b in self.repo.branches:
                 links.append(SitemapEntry(
-                        b.name, url('%sci/%s/tree/' % (c.app.url, b.name)),
+                        b.name, url('%sci/%s/tree/' % (c.app.url, quote(b.name, safe=''))),
                         small=b.count))
         if self.repo.repo_tags:
             links.append(SitemapEntry('Tags'))
@@ -130,7 +130,7 @@ class RepositoryApp(Application):
             for i, b in enumerate(self.repo.repo_tags):
                 if i < max_tags:
                     links.append(SitemapEntry(
-                            b.name, url('%sci/%s/tree/' % (c.app.url, b.name)),
+                            b.name, url('%sci/%s/tree/' % (c.app.url, quote(b.name, safe=''))),
                             small=b.count))
                 elif i == max_tags:
                     links.append(

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/84e439c3/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 0c4dcbf..36781d6 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -12,6 +12,7 @@ from datetime import datetime
 from collections import defaultdict
 from itertools import izip
 from urlparse import urljoin
+from urllib import quote
 
 import tg
 from paste.deploy.converters import asbool
@@ -180,7 +181,7 @@ class RepositoryImplementation(object):
                     break
 
             if rev:
-                object_id = rev
+                object_id = quote(rev, safe='')
 
         return '%sci/%s/' % (self._repo.url(), object_id)