view tests/test_pull.py @ 1028:c4b25a903ad3

layouts: consistently return None for default branch This makes the single and standard layouts consistent in what they return for the default branch. Previously, single had returned 'default' now they both return None. In addition, this fixes a now-exposed bug in stupid's convert_revision logic. Specifically, when a file is replaced by another file within the same branch, we treated that as replacing the entire branch. this bug was previously hidden because meta.split_branch_path and meta.localname were inconsistent in what they returned for the single layout. meta.split-branch_path is used to maintain the set of known branches, where meta.localname is used to determine the branch for the path being replaced. This resulted in erroneously hitting the condition that skipped paths outside branches we know about when considering replace operations from svn.
author David Schleimer <dschleimer@fb.com>
date Wed, 05 Jun 2013 11:00:06 -0700
parents c4ee11a5d04c
children d741f536f23a
line wrap: on
line source

import test_util

import os.path
import subprocess
from mercurial import node
from mercurial import ui
from mercurial import util as hgutil
from mercurial import commands
from hgsubversion import verify

class TestPull(test_util.TestBase):
    def setUp(self):
        super(TestPull, self).setUp()

    def _loadupdate(self, fixture_name, *args, **kwargs):
        kwargs = kwargs.copy()
        kwargs.update(stupid=False, noupdate=False)
        repo, repo_path = self.load_and_fetch(fixture_name, *args, **kwargs)
        return repo, repo_path

    def test_nochanges(self):
        self._loadupdate('single_rev.svndump')
        state = self.repo.parents()
        commands.pull(self.repo.ui, self.repo)
        self.assertEqual(state, self.repo.parents())

    def test_onerevision_noupdate(self):
        repo, repo_path = self._loadupdate('single_rev.svndump')
        state = repo.parents()
        self.add_svn_rev(repo_path, {'trunk/alpha': 'Changed'})
        commands.pull(self.repo.ui, repo)
        self.assertEqual(state, repo.parents())
        self.assertTrue('tip' not in repo[None].tags())

    def test_onerevision_doupdate(self):
        repo, repo_path = self._loadupdate('single_rev.svndump')
        state = repo.parents()
        self.add_svn_rev(repo_path, {'trunk/alpha': 'Changed'})
        commands.pull(self.repo.ui, repo, update=True)
        self.failIfEqual(state, repo.parents())
        self.assertTrue('tip' in repo[None].tags())

    def test_onerevision_divergent(self):
        repo, repo_path = self._loadupdate('single_rev.svndump')
        self.commitchanges((('alpha', 'alpha', 'Changed another way'),))
        state = repo.parents()
        self.add_svn_rev(repo_path, {'trunk/alpha': 'Changed one way'})
        try:
            commands.pull(self.repo.ui, repo, update=True)
        except hgutil.Abort:
            # hg < 1.9 raised when crossing branches
            pass
        self.assertEqual(state, repo.parents())
        self.assertTrue('tip' not in repo[None].tags())
        self.assertEqual(len(repo.heads()), 2)

    def test_tag_repull_doesnt_happen(self):
        repo = self._loadupdate('branchtagcollision.svndump')[0]
        oldheads = map(node.hex, repo.heads())
        commands.pull(repo.ui, repo)
        self.assertEqual(oldheads, map(node.hex, repo.heads()))

    def test_skip_basic(self):
        repo, repo_path = self._loadupdate('single_rev.svndump')
        self.add_svn_rev(repo_path, {'trunk/alpha': 'Changed'})
        self.add_svn_rev(repo_path, {'trunk/beta': 'More changed'})
        self.add_svn_rev(repo_path, {'trunk/gamma': 'Even more changeder'})
        repo.ui.setconfig('hgsubversion', 'unsafeskip', '3 4')
        commands.pull(repo.ui, repo)
        tip = repo['tip'].rev()
        self.assertEqual(tip, 1)
        self.assertEquals(verify.verify(repo.ui, repo, rev=tip), 1)

    def test_skip_delete_restore(self):
        repo, repo_path = self._loadupdate('delete_restore_trunk.svndump',
                                           rev=2)
        repo.ui.setconfig('hgsubversion', 'unsafeskip', '3 4')
        commands.pull(repo.ui, repo)
        tip = repo['tip'].rev()
        self.assertEqual(tip, 1)
        self.assertEquals(verify.verify(repo.ui, repo, rev=tip), 0)

def suite():
    import unittest, sys
    return unittest.findTestCases(sys.modules[__name__])