OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Generate fake repositories for testing.""" | 6 """Generate fake repositories for testing.""" |
7 | 7 |
8 import atexit | 8 import atexit |
9 import errno | 9 import errno |
10 import logging | 10 import logging |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 if k not in dict2: | 149 if k not in dict2: |
150 diff[k] = v | 150 diff[k] = v |
151 elif v != dict2[k]: | 151 elif v != dict2[k]: |
152 diff[k] = (v, dict2[k]) | 152 diff[k] = (v, dict2[k]) |
153 for k, v in dict2.iteritems(): | 153 for k, v in dict2.iteritems(): |
154 if k not in dict1: | 154 if k not in dict1: |
155 diff[k] = v | 155 diff[k] = v |
156 return diff | 156 return diff |
157 | 157 |
158 | 158 |
159 def commit_svn(repo): | 159 def commit_svn(repo, usr, pwd): |
160 """Commits the changes and returns the new revision number.""" | 160 """Commits the changes and returns the new revision number.""" |
161 to_add = [] | 161 to_add = [] |
162 to_remove = [] | 162 to_remove = [] |
163 for status, filepath in scm.SVN.CaptureStatus(repo): | 163 for status, filepath in scm.SVN.CaptureStatus(repo): |
164 if status[0] == '?': | 164 if status[0] == '?': |
165 to_add.append(filepath) | 165 to_add.append(filepath) |
166 elif status[0] == '!': | 166 elif status[0] == '!': |
167 to_remove.append(filepath) | 167 to_remove.append(filepath) |
168 if to_add: | 168 if to_add: |
169 check_call(['svn', 'add', '--no-auto-props', '-q'] + to_add, cwd=repo) | 169 check_call(['svn', 'add', '--no-auto-props', '-q'] + to_add, cwd=repo) |
170 if to_remove: | 170 if to_remove: |
171 check_call(['svn', 'remove', '-q'] + to_remove, cwd=repo) | 171 check_call(['svn', 'remove', '-q'] + to_remove, cwd=repo) |
172 proc = Popen(['svn', 'commit', repo, '-m', 'foo', '--non-interactive', | 172 proc = Popen( |
173 '--no-auth-cache', '--username', 'user1', '--password', 'foo'], | 173 ['svn', 'commit', repo, '-m', 'foo', '--non-interactive', |
174 cwd=repo) | 174 '--no-auth-cache', |
| 175 '--username', usr, '--password', pwd], |
| 176 cwd=repo) |
175 out, err = proc.communicate() | 177 out, err = proc.communicate() |
176 match = re.search(r'(\d+)', out) | 178 match = re.search(r'(\d+)', out) |
177 if not match: | 179 if not match: |
178 raise Exception('Commit failed', out, err, proc.returncode) | 180 raise Exception('Commit failed', out, err, proc.returncode) |
179 rev = match.group(1) | 181 rev = match.group(1) |
180 st = Popen(['svn', 'status'], cwd=repo).communicate()[0] | 182 st = Popen(['svn', 'status'], cwd=repo).communicate()[0] |
181 assert len(st) == 0, st | 183 assert len(st) == 0, st |
182 logging.debug('At revision %s' % rev) | 184 logging.debug('At revision %s' % rev) |
183 return rev | 185 return rev |
184 | 186 |
(...skipping 21 matching lines...) Expand all Loading... |
206 populateSvn() and populateGit() need to be implemented by the subclass. | 208 populateSvn() and populateGit() need to be implemented by the subclass. |
207 """ | 209 """ |
208 | 210 |
209 # Should leak the repositories. | 211 # Should leak the repositories. |
210 SHOULD_LEAK = False | 212 SHOULD_LEAK = False |
211 # Override if unhappy. | 213 # Override if unhappy. |
212 TRIAL_DIR = None | 214 TRIAL_DIR = None |
213 # Hostname | 215 # Hostname |
214 HOST = '127.0.0.1' | 216 HOST = '127.0.0.1' |
215 NB_GIT_REPOS = 1 | 217 NB_GIT_REPOS = 1 |
| 218 USERS = [ |
| 219 ('user1@example.com', 'foo'), |
| 220 ('user2@example.com', 'bar'), |
| 221 ] |
216 | 222 |
217 def __init__(self, trial_dir=None, leak=None, host=None): | 223 def __init__(self, trial_dir=None, leak=None, host=None): |
218 global _FAKE_LOADED | 224 global _FAKE_LOADED |
219 if _FAKE_LOADED: | 225 if _FAKE_LOADED: |
220 raise Exception('You can only start one FakeRepos at a time.') | 226 raise Exception('You can only start one FakeRepos at a time.') |
221 _FAKE_LOADED = True | 227 _FAKE_LOADED = True |
222 # Quick hack. | 228 # Quick hack. |
223 if '-v' in sys.argv: | 229 if '-v' in sys.argv: |
224 logging.basicConfig(level=logging.DEBUG) | 230 logging.basicConfig(level=logging.DEBUG) |
225 elif leak is not None: | 231 elif leak is not None: |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 root = join(self.repos_dir, 'svn') | 305 root = join(self.repos_dir, 'svn') |
300 try: | 306 try: |
301 check_call(['svnadmin', 'create', root]) | 307 check_call(['svnadmin', 'create', root]) |
302 except OSError: | 308 except OSError: |
303 return False | 309 return False |
304 write(join(root, 'conf', 'svnserve.conf'), | 310 write(join(root, 'conf', 'svnserve.conf'), |
305 '[general]\n' | 311 '[general]\n' |
306 'anon-access = read\n' | 312 'anon-access = read\n' |
307 'auth-access = write\n' | 313 'auth-access = write\n' |
308 'password-db = passwd\n') | 314 'password-db = passwd\n') |
309 write(join(root, 'conf', 'passwd'), | 315 text = '[users]\n' |
310 '[users]\n' | 316 text += ''.join('%s = %s\n' % (usr, pwd) for usr, pwd in self.USERS) |
311 'user1 = foo\n' | 317 write(join(root, 'conf', 'passwd'), text) |
312 'user2 = bar\n') | |
313 | 318 |
314 # Start the daemon. | 319 # Start the daemon. |
315 cmd = ['svnserve', '-d', '--foreground', '-r', self.repos_dir] | 320 cmd = ['svnserve', '-d', '--foreground', '-r', self.repos_dir] |
316 if self.HOST == '127.0.0.1': | 321 if self.HOST == '127.0.0.1': |
317 cmd.append('--listen-host=127.0.0.1') | 322 cmd.append('--listen-host=127.0.0.1') |
318 self.svnserve = Popen(cmd, cwd=root) | 323 self.svnserve = Popen(cmd, cwd=root) |
319 self.populateSvn() | 324 self.populateSvn() |
320 return True | 325 return True |
321 | 326 |
322 def setUpGIT(self): | 327 def setUpGIT(self): |
(...skipping 10 matching lines...) Expand all Loading... |
333 # Start the daemon. | 338 # Start the daemon. |
334 cmd = ['git', 'daemon', '--export-all', '--base-path=' + self.repos_dir] | 339 cmd = ['git', 'daemon', '--export-all', '--base-path=' + self.repos_dir] |
335 if self.HOST == '127.0.0.1': | 340 if self.HOST == '127.0.0.1': |
336 cmd.append('--listen=127.0.0.1') | 341 cmd.append('--listen=127.0.0.1') |
337 logging.debug(cmd) | 342 logging.debug(cmd) |
338 self.gitdaemon = Popen(cmd, cwd=self.repos_dir) | 343 self.gitdaemon = Popen(cmd, cwd=self.repos_dir) |
339 return True | 344 return True |
340 | 345 |
341 def _commit_svn(self, tree): | 346 def _commit_svn(self, tree): |
342 self._genTree(self.svn_root, tree) | 347 self._genTree(self.svn_root, tree) |
343 commit_svn(self.svn_root) | 348 commit_svn(self.svn_root, self.USERS[0][0], self.USERS[0][1]) |
344 if self.svn_revs and self.svn_revs[-1]: | 349 if self.svn_revs and self.svn_revs[-1]: |
345 new_tree = self.svn_revs[-1].copy() | 350 new_tree = self.svn_revs[-1].copy() |
346 new_tree.update(tree) | 351 new_tree.update(tree) |
347 else: | 352 else: |
348 new_tree = tree.copy() | 353 new_tree = tree.copy() |
349 self.svn_revs.append(new_tree) | 354 self.svn_revs.append(new_tree) |
350 | 355 |
351 def _commit_git(self, repo, tree): | 356 def _commit_git(self, repo, tree): |
352 repo_root = join(self.git_root, repo) | 357 repo_root = join(self.git_root, repo) |
353 self._genTree(repo_root, tree) | 358 self._genTree(repo_root, tree) |
(...skipping 14 matching lines...) Expand all Loading... |
368 | 373 |
369 class FakeRepos(FakeReposBase): | 374 class FakeRepos(FakeReposBase): |
370 """Implements populateSvn() and populateGit().""" | 375 """Implements populateSvn() and populateGit().""" |
371 NB_GIT_REPOS = 4 | 376 NB_GIT_REPOS = 4 |
372 | 377 |
373 def populateSvn(self): | 378 def populateSvn(self): |
374 """Creates a few revisions of changes including DEPS files.""" | 379 """Creates a few revisions of changes including DEPS files.""" |
375 # Repos | 380 # Repos |
376 check_call(['svn', 'checkout', 'svn://127.0.0.1/svn', self.svn_root, '-q', | 381 check_call(['svn', 'checkout', 'svn://127.0.0.1/svn', self.svn_root, '-q', |
377 '--non-interactive', '--no-auth-cache', | 382 '--non-interactive', '--no-auth-cache', |
378 '--username', 'user1', '--password', 'foo']) | 383 '--username', self.USERS[0][0], '--password', self.USERS[0][1]]) |
379 assert os.path.isdir(join(self.svn_root, '.svn')) | 384 assert os.path.isdir(join(self.svn_root, '.svn')) |
380 def file_system(rev, DEPS): | 385 def file_system(rev, DEPS): |
381 fs = { | 386 fs = { |
382 'origin': 'svn@%(rev)d\n', | 387 'origin': 'svn@%(rev)d\n', |
383 'trunk/origin': 'svn/trunk@%(rev)d\n', | 388 'trunk/origin': 'svn/trunk@%(rev)d\n', |
384 'trunk/src/origin': 'svn/trunk/src@%(rev)d\n', | 389 'trunk/src/origin': 'svn/trunk/src@%(rev)d\n', |
385 'trunk/src/third_party/origin': 'svn/trunk/src/third_party@%(rev)d\n', | 390 'trunk/src/third_party/origin': 'svn/trunk/src/third_party@%(rev)d\n', |
386 'trunk/other/origin': 'src/trunk/other@%(rev)d\n', | 391 'trunk/other/origin': 'src/trunk/other@%(rev)d\n', |
387 'trunk/third_party/origin': 'svn/trunk/third_party@%(rev)d\n', | 392 'trunk/third_party/origin': 'svn/trunk/third_party@%(rev)d\n', |
388 'trunk/third_party/foo/origin': 'svn/trunk/third_party/foo@%(rev)d\n', | 393 'trunk/third_party/foo/origin': 'svn/trunk/third_party/foo@%(rev)d\n', |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 | 693 |
689 | 694 |
690 # Kind of hack. | 695 # Kind of hack. |
691 if '-l' in sys.argv: | 696 if '-l' in sys.argv: |
692 FakeRepos.SHOULD_LEAK = True | 697 FakeRepos.SHOULD_LEAK = True |
693 sys.argv.remove('-l') | 698 sys.argv.remove('-l') |
694 | 699 |
695 | 700 |
696 if __name__ == '__main__': | 701 if __name__ == '__main__': |
697 sys.exit(main(sys.argv)) | 702 sys.exit(main(sys.argv)) |
OLD | NEW |