comparison tests/test_single_dir_push.py @ 1047:3092b3c109a8

tests: split single directory tests that push & clone in two modules
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Thu, 08 Aug 2013 09:22:10 +0200
parents
children 2d7398fffd0d
comparison
equal deleted inserted replaced
1046:36fe4b316a6b 1047:3092b3c109a8
1 import test_util
2
3 import errno
4 import shutil
5 import unittest
6
7 from mercurial import commands
8 from mercurial import context
9 from mercurial import hg
10 from mercurial import node
11 from mercurial import ui
12
13 class TestSingleDirPush(test_util.TestBase):
14 def test_push_single_dir(self):
15 # Tests simple pushing from default branch to a single dir repo
16 repo, repo_path = self.load_and_fetch('branch_from_tag.svndump',
17 stupid=False,
18 layout='single',
19 subdir='')
20 def file_callback(repo, memctx, path):
21 if path == 'adding_file':
22 return context.memfilectx(path=path,
23 data='foo',
24 islink=False,
25 isexec=False,
26 copied=False)
27 elif path == 'adding_binary':
28 return context.memfilectx(path=path,
29 data='\0binary',
30 islink=False,
31 isexec=False,
32 copied=False)
33 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
34 ctx = context.memctx(repo,
35 (repo['tip'].node(), node.nullid),
36 'automated test',
37 ['adding_file', 'adding_binary'],
38 file_callback,
39 'an_author',
40 '2009-10-19 18:49:30 -0500',
41 {'branch': 'default', })
42 repo.commitctx(ctx)
43 hg.update(repo, repo['tip'].node())
44 self.pushrevisions()
45 self.assertTrue('adding_file' in test_util.svnls(repo_path, ''))
46 self.assertEqual('application/octet-stream',
47 test_util.svnpropget(repo_path, 'adding_binary',
48 'svn:mime-type'))
49 # Now add another commit and test mime-type being reset
50 changes = [('adding_binary', 'adding_binary', 'no longer binary')]
51 self.commitchanges(changes)
52 self.pushrevisions()
53 self.assertEqual('', test_util.svnpropget(repo_path, 'adding_binary',
54 'svn:mime-type'))
55
56 def test_push_single_dir_at_subdir(self):
57 repo = self._load_fixture_and_fetch('branch_from_tag.svndump',
58 stupid=False,
59 layout='single',
60 subdir='trunk')
61 def filectxfn(repo, memctx, path):
62 return context.memfilectx(path=path,
63 data='contents of %s' % path,
64 islink=False,
65 isexec=False,
66 copied=False)
67 ctx = context.memctx(repo,
68 (repo['tip'].node(), node.nullid),
69 'automated test',
70 ['bogus'],
71 filectxfn,
72 'an_author',
73 '2009-10-19 18:49:30 -0500',
74 {'branch': 'localhacking', })
75 n = repo.commitctx(ctx)
76 self.assertEqual(self.repo['tip']['bogus'].data(),
77 'contents of bogus')
78 before = repo['tip'].hex()
79 hg.update(repo, self.repo['tip'].hex())
80 self.pushrevisions()
81 self.assertNotEqual(before, self.repo['tip'].hex())
82 self.assertEqual(self.repo['tip']['bogus'].data(),
83 'contents of bogus')
84
85 def test_push_single_dir_one_incoming_and_two_outgoing(self):
86 # Tests simple pushing from default branch to a single dir repo
87 # Pushes two outgoing over one incoming svn rev
88 # (used to cause an "unknown revision")
89 # This can happen if someone committed to svn since our last pull (race).
90 repo, repo_path = self.load_and_fetch('branch_from_tag.svndump',
91 stupid=False,
92 layout='single',
93 subdir='trunk')
94 self.add_svn_rev(repo_path, {'trunk/alpha': 'Changed'})
95 def file_callback(repo, memctx, path):
96 return context.memfilectx(path=path,
97 data='data of %s' % path,
98 islink=False,
99 isexec=False,
100 copied=False)
101 for fn in ['one', 'two']:
102 ctx = context.memctx(repo,
103 (repo['tip'].node(), node.nullid),
104 'automated test',
105 [fn],
106 file_callback,
107 'an_author',
108 '2009-10-19 18:49:30 -0500',
109 {'branch': 'default', })
110 repo.commitctx(ctx)
111 hg.update(repo, repo['tip'].node())
112 self.pushrevisions(expected_extra_back=1)
113 self.assertTrue('trunk/one' in test_util.svnls(repo_path, ''))
114 self.assertTrue('trunk/two' in test_util.svnls(repo_path, ''))
115
116 def test_push_single_dir_branch(self):
117 # Tests local branches pushing to a single dir repo. Creates a fork at
118 # tip. The default branch adds a file called default, while branch foo
119 # adds a file called foo, then tries to push the foo branch and default
120 # branch in that order.
121 repo, repo_path = self.load_and_fetch('branch_from_tag.svndump',
122 stupid=False,
123 layout='single',
124 subdir='')
125 def file_callback(data):
126 def cb(repo, memctx, path):
127 if path == data:
128 return context.memfilectx(path=path,
129 data=data,
130 islink=False,
131 isexec=False,
132 copied=False)
133 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
134 return cb
135
136 def commit_to_branch(name, parent):
137 repo.commitctx(context.memctx(repo,
138 (parent, node.nullid),
139 'automated test (%s)' % name,
140 [name],
141 file_callback(name),
142 'an_author',
143 '2009-10-19 18:49:30 -0500',
144 {'branch': name, }))
145
146 parent = repo['tip'].node()
147 commit_to_branch('default', parent)
148 commit_to_branch('foo', parent)
149 hg.update(repo, repo['foo'].node())
150 self.pushrevisions()
151 repo = self.repo # repo is outdated after the rebase happens, refresh
152 self.assertTrue('foo' in test_util.svnls(repo_path, ''))
153 self.assertEqual(repo.branchtags().keys(), ['default'])
154 # Have to cross to another branch head, so hg.update doesn't work
155 commands.update(ui.ui(),
156 self.repo,
157 self.repo.branchheads('default')[1],
158 clean=True)
159 self.pushrevisions()
160 self.assertTrue('default' in test_util.svnls(repo_path, ''))
161 self.assertEquals(len(self.repo.branchheads('default')), 1)
162
163 @test_util.requiresoption('branch')
164 def test_push_single_dir_renamed_branch(self, stupid=False):
165 # Tests pulling and pushing with a renamed branch
166 # Based on test_push_single_dir
167 repo_path = self.load_svndump('branch_from_tag.svndump')
168 cmd = ['clone', '--layout=single', '--branch=flaf']
169 if stupid:
170 cmd.append('--stupid')
171 cmd += [test_util.fileurl(repo_path), self.wc_path]
172 test_util.dispatch(cmd)
173
174 def file_callback(repo, memctx, path):
175 if path == 'adding_file':
176 return context.memfilectx(path=path,
177 data='foo',
178 islink=False,
179 isexec=False,
180 copied=False)
181 raise IOError(errno.EINVAL, 'Invalid operation: ' + path)
182 ctx = context.memctx(self.repo,
183 (self.repo['tip'].node(), node.nullid),
184 'automated test',
185 ['adding_file'],
186 file_callback,
187 'an_author',
188 '2009-10-19 18:49:30 -0500',
189 {'branch': 'default', })
190 self.repo.commitctx(ctx)
191 hg.update(self.repo, self.repo['tip'].node())
192 self.pushrevisions()
193 self.assertTrue('adding_file' in test_util.svnls(repo_path, ''))
194
195 self.assertEquals(set(['flaf']),
196 set(self.repo[i].branch() for i in self.repo))
197
198 @test_util.requiresoption('branch')
199 def test_push_single_dir_renamed_branch_stupid(self):
200 self.test_push_single_dir_renamed_branch(True)