diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-12-23 09:20:18 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-12-23 09:20:18 +0000 |
commit | 8101b6de73ff47074f5062c213e9956139c1d829 (patch) | |
tree | 43c0a9fa066b2b5e8bbf232c0b8e9e40e8aaee42 | |
parent | 414d1ef2d9137277c2ba4ad3ab49058b73e8805c (diff) | |
download | portage-8101b6de73ff47074f5062c213e9956139c1d829.tar.gz portage-8101b6de73ff47074f5062c213e9956139c1d829.tar.bz2 portage-8101b6de73ff47074f5062c213e9956139c1d829.zip |
Bug #252243 - Fix binarytree.prevent_collision() so that it won't create a circular
symlink if there happens to be a symlink in $PKGDIR/All for some reason.
svn path=/main/trunk/; revision=12280
-rw-r--r-- | pym/portage/dbapi/bintree.py | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py index 04f598a13..c71567f82 100644 --- a/pym/portage/dbapi/bintree.py +++ b/pym/portage/dbapi/bintree.py @@ -322,7 +322,21 @@ class binarytree(object): myfile = mypkg + ".tbz2" mypath = os.path.join("All", myfile) dest_path = os.path.join(self.pkgdir, mypath) - if os.path.exists(dest_path): + + try: + st = os.lstat(dest_path) + except OSError: + st = None + else: + if stat.S_ISLNK(st.st_mode): + st = None + try: + os.unlink(dest_path) + except OSError: + if os.path.exist(dest_path): + raise + + if st is not None: # For invalid packages, other_cat could be None. other_cat = portage.xpak.tbz2(dest_path).getfile("CATEGORY") if other_cat: @@ -330,11 +344,7 @@ class binarytree(object): other_cpv = other_cat + "/" + mypkg self._move_from_all(other_cpv) self.inject(other_cpv) - """The file may or may not exist. Move it if necessary and update - internal state for future calls to getname().""" self._move_to_all(cpv) - if os.path.exists(full_path): - self.inject(cpv) def _ensure_dir(self, path): """ @@ -361,6 +371,7 @@ class binarytree(object): for future getname() calls.""" mycat, mypkg = catsplit(cpv) myfile = mypkg + ".tbz2" + self._pkg_paths[cpv] = os.path.join("All", myfile) src_path = os.path.join(self.pkgdir, mycat, myfile) try: mystat = os.lstat(src_path) @@ -371,7 +382,7 @@ class binarytree(object): dest_path = os.path.join(self.pkgdir, "All", myfile) _movefile(src_path, dest_path, mysettings=self.settings) self._create_symlink(cpv) - self._pkg_paths[cpv] = os.path.join("All", myfile) + self.inject(cpv) def _move_from_all(self, cpv): """Move a package from ${PKGDIR}/All/${PF}.tbz2 to |