Bunch of file id improvements.
[jelmer/subvertpy.git] / tests / test_fileids.py
1 # Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17 from bzrlib.bzrdir import BzrDir
18 from bzrlib.errors import NoSuchRevision
19 from bzrlib.inventory import Inventory
20 from bzrlib.repository import Repository
21 from bzrlib.trace import mutter
22 from bzrlib.tests import TestSkipped, TestCase
23
24 import format
25 from fileids import SimpleFileIdMap
26 from tests import TestCaseWithSubversionRepository, RENAMES
27
28 class TestComplexFileids(TestCaseWithSubversionRepository):
29     # branchtagcopy.dump
30     # changeaftercp.dump
31     # combinedbranch.dump
32     # executable.dump
33     # ignore.dump
34     # inheritance.dump
35     # movebranch.dump
36     # movefileorder.dump
37     # recreatebranch.dump
38     def test_simplemove(self):
39         repos_url = self.make_client('d', 'dc')
40         self.build_tree({'dc/foo': "data", "dc/blie": "bloe"})
41         self.client_add("dc/foo")
42         self.client_commit("dc", "My Message")
43         self.client_copy("dc/foo", "dc/bar")
44         self.client_delete("dc/foo")
45         self.build_tree({'dc/bar': "data2"})
46         self.client_commit("dc", "Second Message")
47
48         repository = Repository.open("svn+"+repos_url)
49
50         inv1 = repository.get_inventory("svn-v1:1@%s-" % repository.uuid)
51         inv2 = repository.get_inventory("svn-v1:2@%s-" % repository.uuid)
52         mutter('inv1: %r' % inv1.entries())
53         mutter('inv2: %r' % inv2.entries())
54         if RENAMES:
55             self.assertEqual(inv1.path2id("foo"), inv2.path2id("bar"))
56         self.assertNotEqual(None, inv1.path2id("foo"))
57         self.assertIs(None, inv2.path2id("foo"))
58         self.assertNotEqual(None, inv2.path2id("bar"))
59         self.assertNotEqual(inv1.path2id("foo"), inv2.path2id("blie"))
60         self.assertNotEqual(inv2.path2id("bar"), inv2.path2id("blie"))
61
62     def test_simplecopy(self):
63         repos_url = self.make_client('d', 'dc')
64         self.build_tree({'dc/foo': "data", "dc/blie": "bloe"})
65         self.client_add("dc/foo")
66         self.client_add("dc/blie")
67         self.client_commit("dc", "My Message")
68         self.client_copy("dc/foo", "dc/bar")
69         self.build_tree({'dc/bar': "data2"})
70         self.client_commit("dc", "Second Message")
71
72         bzrdir = BzrDir.open("svn+%s" % repos_url)
73         repository = bzrdir.open_repository()
74
75         inv1 = repository.get_inventory("svn-v1:1@%s-" % repository.uuid)
76         inv2 = repository.get_inventory("svn-v1:2@%s-" % repository.uuid)
77         self.assertNotEqual(inv1.path2id("foo"), inv2.path2id("bar"))
78         self.assertNotEqual(inv1.path2id("foo"), inv2.path2id("blie"))
79         self.assertIs(None, inv1.path2id("bar"))
80         self.assertNotEqual(None, inv1.path2id("blie"))
81
82     def test_simpledelete(self):
83         repos_url = self.make_client('d', 'dc')
84         self.build_tree({'dc/foo': "data"})
85         self.client_add("dc/foo")
86         self.client_commit("dc", "My Message")
87         self.client_delete("dc/foo")
88         self.client_commit("dc", "Second Message")
89
90         bzrdir = BzrDir.open("svn+%s" % repos_url)
91         repository = bzrdir.open_repository()
92
93         inv1 = repository.get_inventory("svn-v1:1@%s-" % repository.uuid)
94         inv2 = repository.get_inventory("svn-v1:2@%s-" % repository.uuid)
95         self.assertNotEqual(None, inv1.path2id("foo"))
96         self.assertIs(None, inv2.path2id("foo"))
97
98     def test_replace(self):
99         repos_url = self.make_client('d', 'dc')
100         self.build_tree({'dc/foo': "data"})
101         self.client_add("dc/foo")
102         self.client_commit("dc", "My Message")
103         self.client_delete("dc/foo")
104         self.build_tree({'dc/foo': "data"})
105         self.client_add("dc/foo")
106         self.client_commit("dc", "Second Message")
107
108         bzrdir = BzrDir.open("svn+"+repos_url)
109         repository = bzrdir.open_repository()
110
111         inv1 = repository.get_inventory("svn-v1:1@%s-" % repository.uuid)
112         inv2 = repository.get_inventory("svn-v1:2@%s-" % repository.uuid)
113         self.assertNotEqual(inv1.path2id("foo"), inv2.path2id("foo"))
114
115     def test_copy_branch(self):
116         repos_url = self.make_client('d', 'dc')
117         self.build_tree({'dc/trunk/dir/file': "data", 'dc/branches': None})
118         self.client_add("dc/trunk")
119         self.client_add("dc/branches")
120         self.client_commit("dc", "My Message")
121         self.client_copy("dc/trunk", "dc/branches/mybranch")
122         self.client_commit("dc", "Copy branch")
123
124         bzrdir = BzrDir.open("svn+"+repos_url + "/branches/mybranch")
125         repository = bzrdir.open_repository()
126
127         inv1 = repository.get_inventory("svn-v1:1@%s-trunk" % repository.uuid)
128         inv2 = repository.get_inventory("svn-v1:2@%s-branches%%2fmybranch" % 
129                                         repository.uuid)
130         self.assertEqual(inv1.path2id("dir"), inv2.path2id("dir"))
131         self.assertEqual(inv1.path2id("dir/file"), inv2.path2id("dir/file"))
132
133         fileid, revid = repository.path_to_file_id(2, 
134                             "branches/mybranch/dir/file")
135         self.assertEqual(fileid, inv1.path2id("dir/file"))
136         self.assertEqual("svn-v1:1@%s-trunk" % repository.uuid, revid)
137
138 class TestFileMapping(TestCase):
139     def apply_mappings(self, mappings):
140         map = {}
141         for r in mappings:
142             map = SimpleFileIdMap._apply_changes(map, r, mappings[r])
143         return map
144
145     def test_simple(self):
146         map = self.apply_mappings({"svn-v1:1@uuid-": {"foo": ('A', None, None)}})
147         self.assertEqual({'': ('TREE_ROOT', 'svn-v1:1@uuid-'), 
148                                'foo': ('svn-v1:1@uuid--foo', 'svn-v1:1@uuid-')
149                          }, map)
150
151     def test_copy(self):
152         map = self.apply_mappings(
153                 {"svn-v1:1@uuid-": {"foo": ('A', None, None), 
154                                    "foo/blie": ('A', None, None),
155                                    "foo/bla": ('A', None, None)},
156                 "svn-v1:2@uuid-": {"foob": ('A', 'foo', 1), 
157                                    "foob/bla": ('M', None, None)}
158                 })
159         self.assertTrue(map.has_key("foob/bla"))
160         self.assertTrue(map.has_key("foob/blie"))