aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2014-09-25 20:02:41 -0700
committerZac Medico <zmedico@gentoo.org>2014-10-19 10:23:07 -0700
commit5f7b4865ecafe4f04a92c5e1158f657b0dcd41d6 (patch)
treefaddc2d578b22c9242b3d08e9cb7afe273ede9d2 /pym/portage/dbapi/vartree.py
parentemerge-delta-webrsync: fix bug #506192 (diff)
downloadportage-5f7b4865ecafe4f04a92c5e1158f657b0dcd41d6.tar.gz
portage-5f7b4865ecafe4f04a92c5e1158f657b0dcd41d6.tar.bz2
portage-5f7b4865ecafe4f04a92c5e1158f657b0dcd41d6.zip
dblink.mergeme: implement bug #523684
If a CONFIG_PROTECTed file was installed but no longer exists in the file system, then it may have been deleted or renamed by the admin. Therefore, force the file to be merged with a ._cfg name, so that the admin will be prompted for this update. X-Gentoo-Bug: 523684 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=523684
Diffstat (limited to 'pym/portage/dbapi/vartree.py')
-rw-r--r--pym/portage/dbapi/vartree.py32
1 files changed, 24 insertions, 8 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index b46ba0b3f..11384bf38 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -4687,10 +4687,7 @@ class dblink(object):
zing = "!!!"
mymtime = None
protected = self.isprotected(mydest)
- if mydmode != None:
- # destination file exists
-
- if stat.S_ISDIR(mydmode):
+ if mydmode is not None and stat.S_ISDIR(mydmode):
# install of destination is blocked by an existing directory with the same name
newdest = self._new_backup_path(mydest)
msg = []
@@ -4703,12 +4700,15 @@ class dblink(object):
self._eerror("preinst", msg)
mydest = newdest
- elif stat.S_ISREG(mydmode) or (stat.S_ISLNK(mydmode) and os.path.exists(mydest) and stat.S_ISREG(os.stat(mydest)[stat.ST_MODE])):
+ elif mydmode is None or stat.S_ISREG(mydmode) or \
+ (stat.S_ISLNK(mydmode) and os.path.exists(mydest)
+ and stat.S_ISREG(os.stat(mydest)[stat.ST_MODE])):
# install of destination is blocked by an existing regular file,
# or by a symlink to an existing regular file;
# now, config file management may come into play.
# we only need to tweak mydest if cfg file management is in play.
- if protected:
+ destmd5 = None
+ if protected and mydmode is not None:
destmd5 = perform_md5(mydest, calc_prelink=calc_prelink)
if protect_if_modified:
contents_key = \
@@ -4721,7 +4721,21 @@ class dblink(object):
if protected:
# we have a protection path; enable config file management.
cfgprot = 0
- if mymd5 == destmd5:
+ cfgprot_force = False
+ if mydmode is None:
+ if self._installed_instance is not None and \
+ self._installed_instance._match_contents(
+ myrealdest) is not False:
+ # If the file doesn't exist, then it may
+ # have been deleted or renamed by the
+ # admin. Therefore, force the file to be
+ # merged with a ._cfg name, so that the
+ # admin will be prompted for this update
+ # (see bug #523684).
+ cfgprot_force = True
+ moveme = True
+ cfgprot = True
+ elif mymd5 == destmd5:
#file already in place; simply update mtimes of destination
moveme = 1
else:
@@ -4749,7 +4763,9 @@ class dblink(object):
del cfgfiledict[myrealdest]
if cfgprot:
- mydest = new_protect_filename(mydest, newmd5=mymd5)
+ mydest = new_protect_filename(mydest,
+ newmd5=mymd5,
+ force=cfgprot_force)
# whether config protection or not, we merge the new file the
# same way. Unless moveme=0 (blocking directory)