summaryrefslogtreecommitdiff
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2006-11-26 12:40:07 +0000
committerZac Medico <zmedico@gentoo.org>2006-11-26 12:40:07 +0000
commit29b02fec7d72276923fe30c72e78e915b657c318 (patch)
tree955962cea18af328d63756e30e5d4364096bcd57 /pym
parentFor bug #8423, allow the merge phase to overwrite untouched config files and ... (diff)
downloadportage-multirepo-29b02fec7d72276923fe30c72e78e915b657c318.tar.gz
portage-multirepo-29b02fec7d72276923fe30c72e78e915b657c318.tar.bz2
portage-multirepo-29b02fec7d72276923fe30c72e78e915b657c318.zip
Never overwrite an untouched config file and trigger config protection instead (in case the new config has an unwanted change). In cases where an installed package in the same slot owns a protected file that will be merged, bump the mtime on the installed file in order to ensure that it isn't unmerged. Thanks to Ciaran McCreesh <ciaranm@ciaranm.org> for his suggestion on bug #8423, comment #40.
svn path=/main/trunk/; revision=5133
Diffstat (limited to 'pym')
-rw-r--r--pym/portage.py41
1 files changed, 6 insertions, 35 deletions
diff --git a/pym/portage.py b/pym/portage.py
index 7498d993..5d697012 100644
--- a/pym/portage.py
+++ b/pym/portage.py
@@ -6438,48 +6438,19 @@ class dblink:
mydata = self._installed_instance.getcontents().get(filename, None)
if mydata is None:
return True
- # Duplicate unmerge logic. Protect the file if it's not identical
- # to the one that was originally merged.
+
+ # Bump the mtime in order to ensure that the old config file doesn't
+ # get unmerged. The user will have an opportunity to merge the new
+ # config with the old one.
try:
- lstatobj = os.lstat(filename)
+ os.utime(filename, None)
except OSError, e:
if e.errno != errno.ENOENT:
raise
del e
# The file has disappeared, so it's not protected.
return False
- try:
- statobj = os.stat(filename)
- except OSError, e:
- if e.errno != errno.ENOENT:
- raise
- del e
- statobj = None
- lmtime = str(lstatobj[stat.ST_MTIME])
- mytype = mydata[0]
- if mytype not in ("dir","fif","dev") and \
- lmtime != mydata[1]:
- return True
- if "dir" == mytype:
- return statobj is None or not stat.S_ISDIR(statobj.st_mode)
- elif "sym" == mytype:
- return not stat.S_ISLNK(lstatobj.st_mode)
- elif "obj" == mytype:
- if statobj is None or not stat.S_ISREG(statobj.st_mode):
- return True
- try:
- mymd5 = portage_checksum.perform_md5(filename, calc_prelink=1)
- except portage_exception.FileNotFound:
- # The file has disappeared, so it's not protected.
- return False
- return mymd5 != mydata[2].lower()
- elif "fif" == mytype:
- return not stat.S_ISFIFO(lstatobj[stat.ST_MODE])
- elif "dev" == mytype:
- return True
- # This should be unreachable.
- raise AssertionError("Unrecognized type '%s' in file '%s'" % (mytype,
- os.path.join(self._installed_instance.dbdir, "CONTENTS")))
+ return True
def treewalk(self, srcroot, destroot, inforoot, myebuild, cleanup=0,
mydbapi=None, prev_mtimes=None):