Changeset 1135 in tailor


Ignore:
Timestamp:
05/26/06 00:57:50 (7 years ago)
Author:
lele@…
Hash name:
20060525225750-97f81-fe30e21967f7b5fcd68c6994c566fe5038a0a60f
Message:

Don't propagate deletions with rsync

Location:
vcpx
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • vcpx/target.py

    r1113 r1135  
    265265 
    266266        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 
    299290 
    300291        # Finally, deal with "copied" directories. The simple way is 
     
    393384        """ 
    394385 
    395         from os import rename 
     386        from os import rename, unlink 
    396387        from os.path import split, join, exists 
    397388 
     
    409400                self._addPathnames(parents) 
    410401 
    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 
    422427            try: 
    423428                self._renamePathname(e.old_name, e.name) 
    424429            finally: 
    425430                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) 
    427436 
    428437    def _renamePathname(self, oldname, newname): 
  • vcpx/dualwd.py

    r1113 r1135  
    108108 
    109109    def _syncTargetWithSource(self): 
    110         cmd = ['rsync', '--delete', '--archive'] 
     110        cmd = ['rsync', '--archive'] 
    111111        now = datetime.now() 
    112112        if hasattr(self, '_last_rsync'): 
  • vcpx/tests/tailor.py

    r1131 r1135  
    214214 
    215215 
    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] 
     217source = darcs:darcs_rename_delete 
     218target = svn:darcs_rename_delete 
     219root-directory = %(testdir)s/darcs_rename_delete 
     220start-revision = INITIAL 
     221 
     222[darcs:darcs_rename_delete] 
     223repository = %(testdir)s/rename_delete 
     224subdir = darcs 
     225 
     226[svn:darcs_rename_delete] 
     227repository = file://%(testdir)s/darcs_rename_delete.svnrepo 
     228module = / 
     229subdir = svn 
     230 
     231 
     232[darcs_rename_delete_dir] 
     233source = darcs:darcs_rename_delete_dir 
     234target = svn:darcs_rename_delete_dir 
     235root-directory = %(testdir)s/darcs_rename_delete_dir 
     236start-revision = INITIAL 
     237 
     238[darcs:darcs_rename_delete_dir] 
     239repository = %(testdir)s/rename_delete_dir 
     240subdir = darcs 
     241 
     242[svn:darcs_rename_delete_dir] 
     243repository = file://%(testdir)s/darcs_rename_delete_dir.svnrepo 
     244module = / 
     245subdir = svn 
    230246 
    231247''' 
     
    393409        self.failUnless(exists(external % '_we')) 
    394410 
    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.