Changeset 1135 in tailor
- Timestamp:
- 05/26/06 00:57:50 (7 years ago)
- Hash name:
- 20060525225750-97f81-fe30e21967f7b5fcd68c6994c566fe5038a0a60f
- Location:
- vcpx
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
vcpx/target.py
r1113 r1135 265 265 266 266 from os.path import join, isdir 267 268 added = changeset.addedEntries() 269 renamed = changeset.renamedEntries() 270 removed = changeset.removedEntries() 271 272 # Sort added entries, to be sure that /root/addedDir/ comes 273 # before /root/addedDir/addedSubdir 274 added.sort(lambda x,y: cmp(x.name, y.name)) 275 276 # Sort removes in reverse order, to delete directories after 277 # their contents. 278 removed.sort(lambda x,y: cmp(y.name, x.name)) 279 280 # Replay the actions 281 282 if renamed and removed: 283 # Handle the "replace" operation, that is a remove+rename 284 285 renames = [e.name for e in renamed] 286 removesfirst = [] 287 for rem in removed: 288 if rem.name in renames: 289 removesfirst.append(rem) 290 291 if removesfirst: 292 self._removeEntries(removesfirst) 293 for rem in removesfirst: 294 removed.remove(rem) 295 296 if renamed: self._renameEntries(renamed) 297 if removed: self._removeEntries(removed) 298 if added: self._addEntries(added) 267 from changes import ChangesetEntry 268 269 added = [] 270 actions = { ChangesetEntry.ADDED: self._addEntries, 271 ChangesetEntry.DELETED: self._removeEntries, 272 # ChangesetEntry.UPDATED: nothing 273 ChangesetEntry.RENAMED: self._renameEntries 274 } 275 276 last = None 277 group = [] 278 for e in changeset.entries: 279 if last is None or last.action_kind == e.action_kind: 280 last = e 281 group.append(e) 282 if last.action_kind != e.action_kind: 283 actions[last.action_kind](group) 284 group = [e] 285 if e.action_kind == e.ADDED: 286 added.append(e) 287 if group: 288 actions[group[0].action_kind](group) 289 299 290 300 291 # Finally, deal with "copied" directories. The simple way is … … 393 384 """ 394 385 395 from os import rename 386 from os import rename, unlink 396 387 from os.path import split, join, exists 397 388 … … 409 400 self._addPathnames(parents) 410 401 411 # Check to see if the oldentry is still there. If it is, 412 # that probably means one thing: it's been moved and then 413 # replaced, see svn 'R' event. In this case, rename the 414 # existing old entry to something else to trick targets 415 # (that will assume the move was already done manually) and 416 # finally restore its name. 417 418 absold = join(self.basedir, e.old_name) 419 renamed = exists(absold) 420 if renamed: 421 rename(absold, absold + '-TAILOR-HACKED-TEMP-NAME') 402 if self.shared_basedirs: 403 # Check to see if the oldentry is still there. If it is, 404 # that probably means one thing: it's been moved and then 405 # replaced, see svn 'R' event. In this case, rename the 406 # existing old entry to something else to trick targets 407 # (that will assume the move was already done manually) and 408 # finally restore its name. 409 410 absold = join(self.basedir, e.old_name) 411 renamed = exists(absold) 412 if renamed: 413 rename(absold, absold + '-TAILOR-HACKED-TEMP-NAME') 414 else: 415 # With disjunct directories, old entries are *always* 416 # there because we dropped the --delete option to rsync. 417 # So, instead of renaming the old entry, we temporarily 418 # rename the new one, perform the target system rename 419 # and replace back the real content (it may be a 420 # renamed+edited event). 421 renamed = False 422 absnew = join(self.basedir, e.name) 423 renamed = exists(absnew) 424 if renamed: 425 rename(absnew, absnew + '-TAILOR-HACKED-TEMP-NAME') 426 422 427 try: 423 428 self._renamePathname(e.old_name, e.name) 424 429 finally: 425 430 if renamed: 426 rename(absold + '-TAILOR-HACKED-TEMP-NAME', absold) 431 if self.shared_basedirs: 432 rename(absold + '-TAILOR-HACKED-TEMP-NAME', absold) 433 else: 434 unlink(absnew) 435 rename(absnew + '-TAILOR-HACKED-TEMP-NAME', absnew) 427 436 428 437 def _renamePathname(self, oldname, newname): -
vcpx/dualwd.py
r1113 r1135 108 108 109 109 def _syncTargetWithSource(self): 110 cmd = ['rsync', '-- delete', '--archive']110 cmd = ['rsync', '--archive'] 111 111 now = datetime.now() 112 112 if hasattr(self, '_last_rsync'): -
vcpx/tests/tailor.py
r1131 r1135 214 214 215 215 216 [darcs_add_remove] 217 source = darcs:darcs_add_remove 218 target = svn:darcs_add_remove 219 root-directory = %(testdir)s/darcs_add_remove 220 start-revision = 20050214010941-5007d-0c6d72fdbd6bb35b8a511d2cce0aec2dd3d6288d.gz 221 222 [darcs:darcs_add_remove] 223 repository = http://darcs.vexi.org/_mike/experimental/org.ibex.util 224 subdir = util 225 226 [svn:darcs_add_remove] 227 repository = file://%(testdir)s/darcs_add_remove.svnrepo 228 module = /ibex 229 use-propset = True 216 [darcs_rename_delete] 217 source = darcs:darcs_rename_delete 218 target = svn:darcs_rename_delete 219 root-directory = %(testdir)s/darcs_rename_delete 220 start-revision = INITIAL 221 222 [darcs:darcs_rename_delete] 223 repository = %(testdir)s/rename_delete 224 subdir = darcs 225 226 [svn:darcs_rename_delete] 227 repository = file://%(testdir)s/darcs_rename_delete.svnrepo 228 module = / 229 subdir = svn 230 231 232 [darcs_rename_delete_dir] 233 source = darcs:darcs_rename_delete_dir 234 target = svn:darcs_rename_delete_dir 235 root-directory = %(testdir)s/darcs_rename_delete_dir 236 start-revision = INITIAL 237 238 [darcs:darcs_rename_delete_dir] 239 repository = %(testdir)s/rename_delete_dir 240 subdir = darcs 241 242 [svn:darcs_rename_delete_dir] 243 repository = file://%(testdir)s/darcs_rename_delete_dir.svnrepo 244 module = / 245 subdir = svn 230 246 231 247 ''' … … 393 409 self.failUnless(exists(external % '_we')) 394 410 395 def testDarcsAddRemove(self): 396 "Try to migrate a buggy darcs patch that adds and removes the same file" 397 398 self.tailorize('darcs_add_remove') 411 def testDarcsRenameDelete(self): 412 "Try to migrate a darcs patch that renames and removes the same file" 413 414 from os import mkdir 415 from os.path import join 416 417 drepo = join(self.TESTDIR, 'rename_delete') 418 mkdir(drepo) 419 420 dinit = ExternalCommand(command=['darcs', 'init'], cwd=drepo) 421 dinit.execute() 422 423 fileA = join(drepo, 'fileA') 424 open(fileA, 'w') 425 dadd = ExternalCommand(command=['darcs', 'add'], cwd=drepo) 426 dadd.execute(fileA) 427 428 drecord = ExternalCommand(command=['darcs', 'record', 429 '-a', '-m'], cwd=drepo) 430 drecord.execute('Add A') 431 432 fileB = join(drepo, 'fileB') 433 drename = ExternalCommand(command=['darcs', 'mv'], cwd=drepo) 434 drename.execute(fileA, fileB) 435 436 dremove = ExternalCommand(command=['darcs', 'remove'], cwd=drepo) 437 dremove.execute(fileB) 438 439 drecord.execute('Move A to B and delete B') 440 441 self.tailorize('darcs_rename_delete') 442 443 def testDarcsRenameDeleteDir(self): 444 "Test if darcs to svn fails on moves combined with directory deletes" 445 446 from os import mkdir 447 from os.path import join 448 449 drepo = join(self.TESTDIR, 'rename_delete_dir') 450 mkdir(drepo) 451 452 dinit = ExternalCommand(command=['darcs', 'init'], cwd=drepo) 453 dinit.execute() 454 455 dir = join(drepo, 'dir') 456 mkdir(dir) 457 dadd = ExternalCommand(command=['darcs', 'add'], cwd=drepo) 458 dadd.execute(dir) 459 fileA = join(dir, 'fileA') 460 open(fileA, 'w') 461 dadd.execute(fileA) 462 463 drecord = ExternalCommand(command=['darcs', 'record', 464 '-a', '-m'], cwd=drepo) 465 drecord.execute('Add dir and dir/A') 466 467 fileB = join(drepo, 'fileA') 468 drename = ExternalCommand(command=['darcs', 'mv'], cwd=drepo) 469 drename.execute(fileA, fileB) 470 471 dremove = ExternalCommand(command=['darcs', 'remove'], cwd=drepo) 472 dremove.execute(dir) 473 474 drecord.execute('Move dir/A to A and delete dir') 475 476 self.tailorize('darcs_rename_delete_dir')
Note: See TracChangeset
for help on using the changeset viewer.
