changeset:   72:545a1383b382
branch:      1.0
user:        Jun Omae <jun66j5@gmail.com>
date:        Wed Oct 17 22:59:36 2018 +0900
summary:     Refactor unit tests

diff -r 1b6c6b50f742 -r 545a1383b382 tracext/hg/tests/backend.py
--- a/tracext/hg/tests/backend.py	Wed Sep 19 19:57:36 2018 +0900
+++ b/tracext/hg/tests/backend.py	Wed Oct 17 22:59:36 2018 +0900
@@ -100,6 +100,9 @@
             path = self.repos_path
         self._dbrepoprov.add_repository(reponame, path, 'hg')
 
+    def _get_repository(self, reponame='hgrepos'):
+        return self._repomgr.get_repository(reponame)
+
     _hg_commit = wrap_int_times(mercurial.commands.commit)
     _hg_update = wrap_int_times(mercurial.commands.update)
     _hg_merge = wrap_int_times(mercurial.commands.merge)
@@ -135,9 +138,9 @@
     def test_duplicate_repo(self):
         self._hg_init()
         self._add_repository('hgrepos.1')
-        self.assertIsNotNone(self._repomgr.get_repository('hgrepos.1'))
+        self.assertIsNotNone(self._get_repository('hgrepos.1'))
         self._add_repository('hgrepos.2')
-        self.assertIsNotNone(self._repomgr.get_repository('hgrepos.2'))
+        self.assertIsNotNone(self._get_repository('hgrepos.2'))
 
 
 class HistoryTimeRangeTestCase(BaseTestCase):
@@ -152,7 +155,7 @@
             self._hg_commit(filename, message='%d' % idx, addremove=True,
                             user='Joe', date=dateformat(ts))
         self._add_repository()
-        repos = self._repomgr.get_repository('hgrepos')
+        repos = self._get_repository()
         repos.repo.invalidate()
 
         revs = [repos.youngest_rev]
@@ -177,7 +180,7 @@
     def test_get_node(self):
         self._hg_init()
         self._add_repository()
-        repos = self._repomgr.get_repository('hgrepos')
+        repos = self._get_repository()
         rev = repos.youngest_rev
         self.assertIsNotNone(rev)
         self.assertEqual(40, len(rev))
@@ -205,7 +208,7 @@
     def test_on_empty_repos(self):
         self._hg_init(data=False)
         self._add_repository()
-        repos = self._repomgr.get_repository('hgrepos')
+        repos = self._get_repository()
         repos.repo.invalidate()
         youngest_rev = repos.youngest_rev
         nullrev = '0'*40
@@ -262,14 +265,13 @@
 
     def test_repository_instance(self):
         self._hg_init()
-        self._add_repository('hgrepos')
-        self.assertEqual(MercurialRepository,
-                         type(self._repomgr.get_repository('hgrepos')))
+        self._add_repository()
+        self.assertEqual(MercurialRepository, type(self._get_repository()))
 
     def test_tags(self):
         self._hg_init()
-        self._add_repository('hgrepos')
-        repos = self._repomgr.get_repository('hgrepos')
+        self._add_repository()
+        repos = self._get_repository()
         repos.repo.invalidate()
         self.assertEqual(['default (tip)', 'tip'], self._get_quickjump_names(repos))
         self._hg_tag('v1.0')  # add tag
@@ -281,8 +283,8 @@
 
     def test_branchs(self):
         self._hg_init()
-        self._add_repository('hgrepos')
-        repos = self._repomgr.get_repository('hgrepos')
+        self._add_repository()
+        repos = self._get_repository()
         repos.repo.invalidate()
         self.assertEqual(['default (tip)', 'tip'], self._get_quickjump_names(repos))
         self._hg_branch('alpha')  # add branch
@@ -292,8 +294,8 @@
 
     def test_bookmarks(self):
         self._hg_init()
-        self._add_repository('hgrepos')
-        repos = self._repomgr.get_repository('hgrepos')
+        self._add_repository()
+        repos = self._get_repository()
         repos.repo.invalidate()
         self.assertEqual(['default (tip)', 'tip'], self._get_quickjump_names(repos))
         self._hg_bookmark('alpha')  # add bookmark
@@ -313,8 +315,8 @@
         self._create_commit('Summary', 'alpha.txt')
         self._hg_tag('0.1.0dev')
         self._hg_tag('0.1.0a', rev='3')
-        self._add_repository('hgrepos')
-        repos = self._repomgr.get_repository('hgrepos')
+        self._add_repository()
+        repos = self._get_repository()
         repos.repo.invalidate()
 
         def get_branches(repos, rev):
@@ -344,8 +346,8 @@
         self._hg_merge(rev='beta')
         self._hg_commit(message='Merge branch "beta" to "alpha"')
 
-        self._add_repository('hgrepos')
-        repos = self._repomgr.get_repository('hgrepos')
+        self._add_repository()
+        repos = self._get_repository()
         repos.repo.invalidate()
 
         rev = repos.normalize_rev('0')
@@ -388,8 +390,8 @@
     def test_all_bookmarks(self):
         # regression test for #12177
         self._hg_init()
-        self._add_repository('hgrepos')
-        repos = self._repomgr.get_repository('hgrepos')
+        self._add_repository()
+        repos = self._get_repository()
         self._create_commit('alpha', 'alpha.txt')
         self._hg_bookmark('alpha', inactive=True)
         self._create_commit('beta', 'beta.txt')
@@ -401,7 +403,7 @@
         # regression test for #13047
         self._hg_init()
         self._add_repository()
-        repos = self._repomgr.get_repository('hgrepos')
+        repos = self._get_repository()
         self._create_commit('alpha', 'alpha.txt', content='foo\n' * 10)
         repos.repo.invalidate()
         self.assertEqual([1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
@@ -421,7 +423,7 @@
         # regression test for #12454
         self._hg_init()
         self._add_repository()
-        repos = self._repomgr.get_repository('hgrepos')
+        repos = self._get_repository()
         cset = repos.get_changeset(0)
         mercurial.commands.log(self.hgui, self.hgrepo, template='{date|rfc3339date}', rev=0)
         self.assertEqual(self.hgui.fout.getvalue(), cset.date.isoformat())
@@ -430,7 +432,7 @@
         # regression test for #10515
         self._hg_init(data=False)
         self._add_repository()
-        repos = self._repomgr.get_repository('hgrepos')
+        repos = self._get_repository()
         self._create_commit('lunch', 'lunch/menu.txt')
         self._create_commit('pasta', 'lunch/lasagna/pasta.txt')
         self._hg_update('0')
@@ -448,7 +450,7 @@
         # regression test for #13077
         self._hg_init(data=False)
         self._add_repository()
-        repos = self._repomgr.get_repository('hgrepos')
+        repos = self._get_repository()
         self._create_commit('lunch', 'lunch/menu.txt')
         self._create_commit('pasta', 'lunch/lasagna/pasta.txt')
         self._create_commit('coke', 'lunch/lasagna/drink.txt', content='coke')

changeset:   73:7746c5a35216
branch:      1.0
bookmark:    t13092
tag:         tip
user:        Jun Omae <jun66j5@gmail.com>
date:        Thu Oct 18 21:48:59 2018 +0900
summary:     `MercurialNode.get_history()` and `MercurialNode.get_previous()` return ancestors of the given revision (closes #13092)

diff -r 545a1383b382 -r 7746c5a35216 tracext/hg/backend.py
--- a/tracext/hg/backend.py	Wed Oct 17 22:59:36 2018 +0900
+++ b/tracext/hg/backend.py	Thu Oct 18 21:48:59 2018 +0900
@@ -1164,7 +1164,7 @@
         pats = []
         if self.str_path:
             pats.append('path:' + self.str_path)
-        opts = {'rev': ['%s:0' % self.changectx.hex()]}
+        opts = {'rev': ['reverse(0::%s)' % self.changectx.hex()]}
         if self.isfile and self.repos.version_info < (2, 1, 1):
             opts['follow'] = True
         if arity(cmdutil.walkchangerevs) == 4:
diff -r 545a1383b382 -r 7746c5a35216 tracext/hg/tests/backend.py
--- a/tracext/hg/tests/backend.py	Wed Oct 17 22:59:36 2018 +0900
+++ b/tracext/hg/tests/backend.py	Thu Oct 18 21:48:59 2018 +0900
@@ -41,6 +41,9 @@
 import mercurial.util
 
 
+nullrev = '0' * 40
+
+
 def dateformat(t):
     t = to_datetime(t)  # to local timezone
     return t.strftime('%Y-%m-%d %H:%M:%S')  # common legal variant
@@ -211,7 +214,6 @@
         repos = self._get_repository()
         repos.repo.invalidate()
         youngest_rev = repos.youngest_rev
-        nullrev = '0'*40
         self.assertEqual(nullrev, repos.normalize_rev(youngest_rev))
         self.assertEqual(nullrev, repos.normalize_rev(repos.oldest_rev))
         self.assertEqual(nullrev, repos.normalize_rev(repos.normalize_rev('')))
@@ -223,7 +225,7 @@
 
         node = repos.get_node('/', youngest_rev)
         self.assertEqual([], list(node.get_entries()))
-        self.assertEqual([(u'/', nullrev, 'add')], list(node.get_history()))
+        self.assertEqual([], list(node.get_history()))
         self.assertRaises(NoSuchNode, repos.get_node, '/path', youngest_rev)
 
         req = MockRequest(self.env, path_info='/browser/hgrepos')
@@ -238,8 +240,114 @@
         self.assertTrue(log_mod.match_request(req))
         rv = log_mod.process_request(req)
         self.assertEqual('revisionlog.html', rv[0])
-        self.assertEqual([{'change': 'add', 'depth': 1, 'existing_rev': nullrev,
-                           'path': '/', 'rev': nullrev}], rv[1]['items'])
+        self.assertEqual([], rv[1]['items'])
+
+    def test_history_on_single_branch(self):
+        self._hg_init(data=False)
+        self._add_repository()
+        repos = self._get_repository()
+        self._create_commit('comment', 'file.txt', content='Line 0\n')
+        self._create_commit('comment', 'anohter.txt', content='Anohter\n')
+        self._create_commit('comment', 'file.txt', content='Line 2\n')
+        self._create_commit('comment', 'file.txt', content='Line 3\n')
+        repos.repo.invalidate()
+        revs = [repos.normalize_rev(idx) for idx in xrange(4)]
+        for idx in xrange(len(revs) - 1):
+            self.assertEqual([revs[idx]], repos.parent_revs(revs[idx + 1]))
+        self.assertEqual([nullrev], repos.parent_revs(revs[0]))
+
+        self.assertEqual([('/', revs[3], 'edit'), ('/', revs[2], 'edit'),
+                          ('/', revs[1], 'edit'), ('/', revs[0], 'add')],
+                          list(repos.get_node('/').get_history()))
+
+        self.assertEqual([('file.txt', revs[3], 'edit'),
+                          ('file.txt', revs[2], 'edit'),
+                          ('file.txt', revs[0], 'add')],
+                          list(repos.get_node('file.txt').get_history()))
+
+        self.assertEqual(('/', revs[2], 'edit'),
+                         repos.get_node('/', revs[3]).get_previous())
+        self.assertEqual(('/', revs[1], 'edit'),
+                         repos.get_node('/', revs[2]).get_previous())
+        self.assertEqual(('/', revs[0], 'add'),
+                         repos.get_node('/', revs[1]).get_previous())
+        self.assertEqual(None, repos.get_node('/', revs[0]).get_previous())
+
+        self.assertEqual(('file.txt', revs[2], 'edit'),
+                         repos.get_node('file.txt', revs[3]).get_previous())
+        self.assertEqual(('file.txt', revs[0], 'add'),
+                         repos.get_node('file.txt', revs[2]).get_previous())
+
+    def test_history_on_multi_branches(self):
+        self._hg_init(data=False)
+        self._add_repository()
+        repos = self._get_repository()
+        n_revs = 6
+        self._create_commit('root', '.hgignore', content='')
+        for idx in xrange(n_revs):
+            if idx % 2 == 0:
+                branch = 'alpha'
+                comment = 'Alpha'
+                content = 'Alpha %d' % idx
+            else:
+                branch = 'beta'
+                comment = 'Beta'
+                content = 'Beta %d' % idx
+            if idx in (0, 1):
+                self._hg_update('0')
+                self._hg_branch(branch)
+            else:
+                self._hg_update(branch)
+            self._create_commit(comment, 'file.txt', content=content)
+        repos.repo.invalidate()
+        revs = [repos.normalize_rev(idx) for idx in xrange(n_revs + 1)]
+        alpha_revs = [revs[idx] for idx in (0, 2, 4, 6)]
+        beta_revs = [revs[idx] for idx in (0, 1, 3, 5)]
+
+        # branch alpha
+        self.assertEqual([alpha_revs[2]], repos.parent_revs(alpha_revs[3]))
+        self.assertEqual([alpha_revs[1]], repos.parent_revs(alpha_revs[2]))
+        self.assertEqual([alpha_revs[0]], repos.parent_revs(alpha_revs[1]))
+        self.assertEqual([('/', alpha_revs[3], 'edit'),
+                          ('/', alpha_revs[2], 'edit'),
+                          ('/', alpha_revs[1], 'edit'),
+                          ('/', alpha_revs[0], 'add')],
+                         list(repos.get_node('/', alpha_revs[-1])
+                                   .get_history()))
+        self.assertEqual(('/', alpha_revs[1], 'edit'),
+                         repos.get_node('/', alpha_revs[2]).get_previous())
+        # branch beta
+        self.assertEqual([beta_revs[2]], repos.parent_revs(beta_revs[3]))
+        self.assertEqual([beta_revs[1]], repos.parent_revs(beta_revs[2]))
+        self.assertEqual([beta_revs[0]], repos.parent_revs(beta_revs[1]))
+        self.assertEqual([('/', beta_revs[3], 'edit'),
+                          ('/', beta_revs[2], 'edit'),
+                          ('/', beta_revs[1], 'edit'),
+                          ('/', beta_revs[0], 'add')],
+                         list(repos.get_node('/', beta_revs[-1])
+                                   .get_history()))
+        self.assertEqual(('/', beta_revs[1], 'edit'),
+                         repos.get_node('/', beta_revs[2]).get_previous())
+        # root commit
+        self.assertEqual([nullrev], repos.parent_revs(revs[0]))
+
+        # file.txt on branch alpha
+        actual = list(repos.get_node('file.txt', alpha_revs[-1]).get_history())
+        self.assertEqual([('file.txt', alpha_revs[3], 'edit'),
+                          ('file.txt', alpha_revs[2], 'edit'),
+                          ('file.txt', alpha_revs[1], 'add')], actual)
+        self.assertEqual(
+            ('file.txt', alpha_revs[1], 'add'),
+            repos.get_node('file.txt', alpha_revs[2]).get_previous())
+
+        # file.txt on branch beta
+        actual = list(repos.get_node('file.txt', beta_revs[-1]).get_history())
+        self.assertEqual([('file.txt', beta_revs[3], 'edit'),
+                          ('file.txt', beta_revs[2], 'edit'),
+                          ('file.txt', beta_revs[1], 'add')], actual)
+        self.assertEqual(
+            ('file.txt', beta_revs[1], 'add'),
+            repos.get_node('file.txt', beta_revs[2]).get_previous())
 
 
 class MercurialRepositoryTestCase(BaseTestCase):
@@ -352,7 +460,7 @@
 
         rev = repos.normalize_rev('0')
         parents = repos.parent_revs(rev)
-        self.assertEqual(['0'*40], parents, 'parent_revs: %r' % parents)
+        self.assertEqual([nullrev], parents, 'parent_revs: %r' % parents)
         self.assertEqual([('.hgignore', Node.FILE, Changeset.ADD, '',
                            None)],
                          sorted(repos.get_changeset(rev).get_changes()))

