Ticket #204: patch

File patch, 3.5 kB (added by ferringb, 5 months ago)

rev 3496, make map_directory_structure go recursive.

  • NEWS

    === modified file 'NEWS'
     
    44See ChangeLog for full commit logs; this is summarized/major changes. 
    55 
    66 
     7* make contentsSet.map_directory_structure go recursive- 
     8  this fixes ticket #204, invalid removal of files previously just merged. 
     9 
    710* make --newuse work with atoms/sets 
    811 
    912* add a cpy version of incremental_expansion 
  • pkgcore/fs/contents.py

    === modified file 'pkgcore/fs/contents.py'
     
    317317        # rewrite each node (resolving down the filepath chain) 
    318318        conflicts = sorted(contentsSet(self.iterdirs()).intersection(conflicts_d)) 
    319319        obj = self.clone() 
    320         for conflict in conflicts: 
    321             # punt the conflict first, since we don't want it getting rewritten 
    322             obj.remove(conflict) 
    323             subset = self.child_nodes(conflict.location) 
    324             obj.difference_update(subset) 
    325             subset = subset.change_offset(conflict.location, conflict.resolved_target) 
    326             obj.update(subset) 
    327             if add_conflicting_sym: 
    328                 obj.add(other[conflicts_d[conflict]]) 
     320        while conflicts: 
     321            for conflict in conflicts: 
     322                # punt the conflict first, since we don't want it getting rewritten 
     323                obj.remove(conflict) 
     324                subset = obj.child_nodes(conflict.location) 
     325                obj.difference_update(subset) 
     326                subset = subset.change_offset(conflict.location, conflict.resolved_target) 
     327                obj.update(subset) 
     328                if add_conflicting_sym: 
     329                    obj.add(other[conflicts_d[conflict]]) 
     330 
     331            # rebuild the targets first; sorted due to the fact that we want to 
     332            # rewrite each node (resolving down the filepath chain) 
     333            conflicts = sorted(contentsSet(obj.iterdirs()).intersection(conflicts_d)) 
    329334        return obj 
    330335 
    331336    def add_missing_directories(self, mode=0775, uid=0, gid=0, mtime=None): 
  • pkgcore/test/fs/test_contents.py

    === modified file 'pkgcore/test/fs/test_contents.py'
     
    196196                self.mk_file("/usr/foo")]))) 
    197197 
    198198    def test_map_directory_structure(self): 
    199         old = contents.contentsSet([self.mk_file("/dir/a"), 
    200             self.mk_dir("/dir"), self.mk_link("/sym", "dir")]) 
     199        old = contents.contentsSet([self.mk_dir("/dir"), 
     200            self.mk_link("/sym", "dir")]) 
    201201        new = contents.contentsSet([self.mk_file("/sym/a"), 
    202202            self.mk_dir("/sym")]) 
    203203        # verify the machinery is working as expected. 
    204         self.assertNotEqual(list(old.difference(new)), [self.mk_dir("/dir")]) 
    205204        ret = new.map_directory_structure(old) 
    206205        self.assertEqual(sorted(ret), sorted([self.mk_dir("/dir"), 
    207206            self.mk_file("/dir/a")])) 
    208207 
     208        # test recursion next. 
     209        old.add(self.mk_link("/dir/sym", "dir2")) 
     210        old.add(self.mk_dir("/dir/dir2")) 
     211        new.add(self.mk_file("/dir/sym/b")) 
     212        new.add(self.mk_dir("/sym/sym")) 
     213 
     214        ret = new.map_directory_structure(old) 
     215        self.assertEqual(sorted(ret), sorted([self.mk_dir("/dir"), 
     216            self.mk_file("/dir/a"), self.mk_dir("/dir/dir2"), 
     217            self.mk_file("/dir/dir2/b")])) 
     218         
     219 
    209220    def test_add_missing_directories(self): 
    210221        src = [self.mk_file("/dir1/a"), self.mk_file("/dir2/dir3/b"), 
    211222            self.mk_dir("/dir1/dir4")]