From: Zac Medico Date: Sat, 24 Dec 2011 11:17:26 +0000 (-0800) Subject: Add FEATURES=config-protect-if-modified support. X-Git-Tag: v2.2.0_alpha83~2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=770bb7ae204643be1968f0fd0379706b6ce017c0;p=portage.git Add FEATURES=config-protect-if-modified support. This causes the CONFIG_PROTECT behavior to be skipped for files that have not been modified since they were installed. --- diff --git a/man/make.conf.5 b/man/make.conf.5 index 8a66c2111..33f4e455c 100644 --- a/man/make.conf.5 +++ b/man/make.conf.5 @@ -260,6 +260,10 @@ Log file names have an extension that is appropriate for the compression type. Currently, only \fBgzip\fR(1) compression is supported, so build logs will have a '.gz' extension when this feature is enabled. .TP +.B config\-protect\-if\-modified +This causes the \fBCONFIG_PROTECT\fR behavior to be skipped for files +that have not been modified since they were installed. +.TP .B digest Autogenerate digests for packages when running the \fBemerge\fR(1), \fBebuild\fR(1), or \fBrepoman\fR(1) commands. If diff --git a/pym/portage/const.py b/pym/portage/const.py index 77c68eb0d..5fcb24f73 100644 --- a/pym/portage/const.py +++ b/pym/portage/const.py @@ -89,6 +89,7 @@ SUPPORTED_FEATURES = frozenset([ "assume-digests", "binpkg-logs", "buildpkg", "buildsyspkg", "candy", "ccache", "chflags", "clean-logs", "collision-protect", "compress-build-logs", + "config-protect-if-modified", "digest", "distcc", "distcc-pump", "distlocks", "ebuild-locks", "fakeroot", "fail-clean", "force-mirror", "force-prefix", "getbinpkg", "installsources", "keeptemp", "keepwork", "fixlafiles", "lmirror", diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index b9ef58341..a66316ba1 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -4056,6 +4056,10 @@ class dblink(object): destroot = normalize_path(destroot).rstrip(sep) + sep calc_prelink = "prelink-checksums" in self.settings.features + protect_if_modified = \ + "config-protect-if-modified" in self.settings.features and \ + self._installed_instance is not None + # this is supposed to merge a list of files. There will be 2 forms of argument passing. if isinstance(stufftomerge, basestring): #A directory is specified. Figure out protection paths, listdir() it and process it. @@ -4296,10 +4300,19 @@ class dblink(object): # 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 = perform_md5(mydest, calc_prelink=calc_prelink) + if protect_if_modified: + contents_key = \ + self._installed_instance._match_contents(myrealdest) + if contents_key: + inst_info = self._installed_instance.getcontents()[contents_key] + if inst_info[0] == "obj" and inst_info[2] == destmd5: + protected = False + if protected: # we have a protection path; enable config file management. cfgprot = 0 - destmd5 = perform_md5(mydest, calc_prelink=calc_prelink) if mymd5 == destmd5: #file already in place; simply update mtimes of destination moveme = 1