Merged from trunk 4883:4889
authorFabian Groffen <grobian@gentoo.org>
Tue, 31 Oct 2006 21:14:14 +0000 (21:14 -0000)
committerFabian Groffen <grobian@gentoo.org>
Tue, 31 Oct 2006 21:14:14 +0000 (21:14 -0000)
Rely on PYTHONPATH instead of PORTAGE_PYM_PATH for locating portage's
python modules, then fall back to an explicit sys.path insertion if an
ImportError occurs.

Fix a KeyError when the profile doesn't define default USE.

Add support for frozen config files for which updates are automatically
zapped.  Thanks to Bo ?\195?\152rsted Andresen for the initial patch
from bug #151685.

Recommend people use `emake` rather than `make` when installing with
DESTDIR.

svn path=/main/branches/prefix/; revision=4892

20 files changed:
NEWS
bin/archive-conf
bin/chkcontents
bin/clean_locks
bin/dispatch-conf
bin/ebuild
bin/emaint
bin/emerge
bin/env-update
bin/fix-db.py
bin/fixpackages
bin/md5check.py
bin/pkgname
bin/portageq
bin/regenworld
bin/repoman
bin/xpak
cnf/dispatch-conf.conf
man/ebuild.5
pym/portage.py

diff --git a/NEWS b/NEWS
index a4c96ed62db92568bc17ecd17c1f553aa7e9e517..40ca03644e618b1b3f8ad725814b6dc9c5d449ea 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,7 +19,7 @@ portage-2.1.2
   order and detection of circular dependencies.
 * The world and system sets allow automatic update of all installed slots.
 * DEPEND atoms support SLOT dependencies of the form ${CATEGORY}/${PN}:${SLOT}.
-* Development: Extend PORTAGE_PYM_PATH support to allow overriding the hardcoded 
+* Development: Extend PYTHONPATH support to allow overriding the hardcoded 
   /usr/lib/portage/pym for development/testing purposes
 
 portage-2.1.1
index 4909f9b33a3753dd7674eb208d8230a1f0e2ff1d..95e9135ed8ac111b27116db967141e3b291a62ec 100755 (executable)
 #
 
 import os, sys, string
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
+try:
+    import portage
+except ImportError:
+    sys.path.insert(0, "@PORTAGE_BASE@/pym")
+    import portage
 
-import portage, dispatch_conf
+import dispatch_conf
 
 FIND_EXTANT_CONTENTS  = "find %s -name CONTENTS"
 
index 65f1a8190853ca0b89442fd0fa4529816affa98f..eecb55762d748011cae02d3a3daf1b59f950080e 100755 (executable)
@@ -9,8 +9,11 @@
 # the right files).
 
 import string, os.path, os, sys
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
-import portage
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 
 def CONTENTScheck(path):
        try:
index d6cfee1512cd28ac94992117d8cdd1b9b50ed8b1..87ae18a588a4ad30893af4c7ec87c1f897ad5149 100755 (executable)
@@ -4,9 +4,13 @@
 # $Id: /var/cvsroot/gentoo-src/portage/bin/clean_locks,v 1.1 2004/09/26 10:44:31 carpaski Exp $
 
 import os,sys,errno
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
+try:
+       import portage_locks
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage_locks
 
-import portage_locks, portage_const
+import portage_const
 
 if not sys.argv[1:] or "--help" in sys.argv or "-h" in sys.argv:
        print
index 29ecb89d440fdb3db54e1fc81b886e11f59e7a6a..03f8b4d5fbe9f69725e0a295021cc057f4940071 100755 (executable)
 #  dialog menus
 #
 
+if not hasattr(__builtins__, "set"):
+       from sets import Set as set
+
 from stat import *
 from random import *
 import atexit, commands, os, re, shutil, stat, string, sys
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
+try:
+    import portage
+except ImportError:
+    sys.path.insert(0, "@PORTAGE_BASE@/pym")
+    import portage
 
-import portage, dispatch_conf, portage_const
+import dispatch_conf, portage_const
+from portage_exec import find_binary
 
 FIND_EXTANT_CONFIGS  = "find '%s' %s -iname '._cfg????_%s'"
 DIFF_CONTENTS        = 'diff -Nu %s %s'
@@ -99,6 +107,10 @@ class dispatch:
             return False
 
 
+        # config file freezing support
+        frozen_files = set(self.options.get("frozen-files", "").split())
+        auto_zapped = []
+
         #
         # Remove new configs identical to current
         #                  and
@@ -142,6 +154,18 @@ class dispatch:
                 if os.path.exists(mrgconf):
                     os.unlink(mrgconf)
                 return False
+            elif conf['current'] in frozen_files:
+                """Frozen files are automatically zapped. The new config has
+                already been archived with a .new suffix.  When zapped, it is
+                left with the .new suffix (post_process is skipped), since it
+                hasn't been merged into the current config."""
+                auto_zapped.append(conf['current'])
+                os.unlink(conf['new'])
+                try:
+                    os.unlink(mrgconf)
+                except OSError:
+                    pass
+                return False
             elif unmodified or same_cvs or same_wsc or conf ['dir'] in portage.settings ['CONFIG_PROTECT_MASK'].split ():
                 self.replace(newconf, conf['current'])
                 self.post_process(conf['current'])
@@ -232,6 +256,13 @@ class dispatch:
                 else:
                     continue
 
+        if auto_zapped:
+            print
+            print " One or more updates are frozen and have been automatically zapped:"
+            print
+            for frozen in auto_zapped:
+                print "  * '%s'" % frozen
+            print
 
     def replace (self, newconf, curconf):
         """Replace current config with the new/merged version.  Also logs
index be83ba5d58cf02829ea1226fbbfe35e833163daa..4452ab3c83c8575b707991cf7dae2c865557dd4e 100755 (executable)
@@ -21,9 +21,13 @@ if "merge" in pargs:
        os.environ["FEATURES"] = os.environ.get("FEATURES", "") + " -noauto"
 
 os.environ["PORTAGE_CALLER"]="ebuild"
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 
-import portage, portage_util, portage_const
+import portage_util, portage_const
 
 # do this _after_ 'import portage' to prevent unnecessary tracing
 if debug and "python-trace" in portage.features:
index 23ca3bc9745c8b28fef4073a480f1546e01f1099..703d89ca1d3612d9d6b74a19e1dbfeb3c0ecc275 100755 (executable)
@@ -1,12 +1,16 @@
 #!@PYTHON@ -O
 
 import sys, os
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
 from optparse import OptionParser, OptionValueError
 
 import re
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 
-import os, portage, portage_const, portage_exception
+import portage_const, portage_exception
 class WorldHandler(object):
 
        def name():
index 6bbb88446fb391a0e9d870145d7fc28370865a87..fda949f5384811fc7d9b279c1dc6a088be6090fb 100755 (executable)
@@ -21,10 +21,13 @@ except KeyboardInterrupt:
        sys.exit(1)
 
 import os, stat
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
 
 os.environ["PORTAGE_LEGACY_GLOBALS"] = "false"
-import portage
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 del os.environ["PORTAGE_LEGACY_GLOBALS"]
 from portage import digraph
 
index 6390ae4d989cf314f598b54d535d5b2e651b7d7c..bf6f12902074f613166d28b7bb5719b7653d7454 100755 (executable)
@@ -4,7 +4,6 @@
 # $Id: /var/cvsroot/gentoo-src/portage/bin/env-update,v 1.9 2004/10/04 13:56:50 vapier Exp $
 
 import os,sys
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
 
 def usage(status):
        print "Usage: env-update [--no-ldconfig]"
@@ -24,5 +23,9 @@ if len(sys.argv) > 1:
        print "!!! Invalid command line options!\n"
        usage(1)
 
-import portage
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 portage.env_update(makelinks)
index b12b316c8d4cddb06551c7e39eb87fad11943051..c8469b138959a62c1a8383c2a27273b429510dc2 100755 (executable)
@@ -4,7 +4,12 @@
 # $Id: /var/cvsroot/gentoo-src/portage/bin/fix-db.py,v 1.8 2004/10/11 04:01:00 jstubbs Exp $
 
 import os,sys,re
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
+
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 
 from stat import *
 from output import *
index 928a7107c6f10be7605a49695c39d4dab459a771..006ef0b8512c48dd86ac2fa031002af72c15d150 100755 (executable)
@@ -5,9 +5,11 @@
 
 import os,sys
 os.environ["PORTAGE_CALLER"]="fixpackages"
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
-
-import portage
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 
 print
 print "Done."
index df95ad2a89e37ebfe3096e3082a9fd7c2de35921..e9c36cf7f90041ab85e2724ebcface22d284a34a 100755 (executable)
@@ -5,9 +5,11 @@
 
 import os,sys,string
 os.environ["FEATURES"]="mirror cvs"
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
-
-import portage
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 from threading import *
 from output import red,green,blue,bold
 from random import shuffle
index ef946abe70d74e8593f1ccafc707b491730bd1d7..378e603c356b23a39a66997000d8b90874edfefd 100755 (executable)
@@ -4,9 +4,11 @@
 # $Id: /var/cvsroot/gentoo-src/portage/bin/pkgname,v 1.8 2004/10/04 13:56:50 vapier Exp $
 
 import sys, os
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
-
-import portage
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 
 a=portage.pkgsplit(sys.argv[1])
 if a:
index f4fe1f5cdb70c1667aac873905f2d6aa083ba4bc..8f067181b5aa96be5c2c7e4a4b9757171b8119c3 100755 (executable)
@@ -20,7 +20,6 @@ except KeyboardInterrupt:
        sys.exit(1)
 
 import os
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
 
 import types,string
 
@@ -322,7 +321,11 @@ def main():
                if uses_root:
                        os.environ["ROOT"] = sys.argv[2]
                global portage
-               import portage
+               try:
+                       import portage
+               except ImportError:
+                       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+                       import portage
                if uses_root:
                        sys.argv[2] = portage.root
                function(sys.argv[2:])
index ebf315d77fe40395229eb89362afe69008798144..ea1b46e824f3da304d7b61b8cf5d27896d1e5484 100755 (executable)
@@ -4,8 +4,12 @@
 # $Id: /var/cvsroot/gentoo-src/portage/bin/regenworld,v 1.10.2.1 2005/01/11 03:40:57 carpaski Exp $
 
 import sys, os
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
-import portage, string, re, portage_const
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
+import string, re, portage_const
 
 __candidatematcher__ = re.compile("^[0-9]+: \\*\\*\\* emerge ")
 __noncandidatematcher__ = re.compile(" sync( |$)| clean( |$)| search( |$)|--oneshot|--fetchonly| unmerge( |$)")
index 3a63c5ce3e05144b6337258ff8a68728fb56e90a..9b30bb7f189aa8d8dd1f650bb203d3e18c869146 100755 (executable)
@@ -11,7 +11,6 @@ import errno, os, shutil, sys
 if not hasattr(__builtins__, "set"):
        from sets import Set as set
 exename=os.path.basename(sys.argv[0])  
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
 version="1.2"  
 
 allowed_filename_chars="a-zA-Z0-9._-+:"
@@ -24,7 +23,11 @@ map(allowed_filename_chars_set.setdefault, map(chr, map(ord, [".", "-", "_", "+"
 import string,signal,re,pickle,tempfile
 
 os.environ["PORTAGE_LEGACY_GLOBALS"] = "false"
-import portage
+try:
+       import portage
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import portage
 del os.environ["PORTAGE_LEGACY_GLOBALS"]
 
 import portage_checksum
index c983c14392c64ec4ecaae95824826cc82e016a03..58491f977f346543ccdd16e8ccdea8e599eb6ca6 100755 (executable)
--- a/bin/xpak
+++ b/bin/xpak
@@ -8,7 +8,10 @@ if len(sys.argv)!=3:
        print "xpak: expecting three arguments."
        sys.exit(1)
 
-sys.path.insert(0, os.environ.get("PORTAGE_PYM_PATH", "@PORTAGE_BASE@/pym"))
+try:
+       import xpak
+except ImportError:
+       sys.path.insert(0, "@PORTAGE_BASE@/pym")
+       import xpak
 
-import xpak
 xpak.xpak(sys.argv[1],sys.argv[2])
index 11123b2a8a299675996b10674867a5df35ee9ab2..b1ece73bb5f1eb13561fa19037c07705a71e5bb8 100644 (file)
@@ -34,3 +34,6 @@ replace-unmodified=no
 
 # Per-session log file of changes made to configuration files
 #log-file=/var/log/dispatch-conf.log
+
+# List of frozen files for which dispatch-conf will automatically zap updates
+#frozen-files=""
index 7492774c2eaebf529ee57181ac84ce2c79c4c856..40aed0410970daf8b25f51f443c367d68f38bc8b 100644 (file)
@@ -616,7 +616,7 @@ make \\
        \fImake options\fR \\
        install
 .fi
-Please do \fBnot\fR use this in place of 'make install DESTDIR=${D}'.  
+Please do \fBnot\fR use this in place of 'emake install DESTDIR=${D}'.  
 That is the preferred way of installing make-based packages.  Also, do 
 not utilize the \fIEXTRA_EINSTALL\fR variable since it is for users.
 
index 4cf304ea480d8887403e1d6e3d2f62bb767063fa..e95fa485c4f6973f02fc73ebe1787ab04895593a 100644 (file)
@@ -1552,7 +1552,7 @@ class config:
                                if best_match:
                                        defaults.append(cpdict[best_match])
                defaults = " ".join(defaults)
-               if defaults != self.configdict["defaults"]["USE"]:
+               if defaults != self.configdict["defaults"].get("USE",""):
                        self.configdict["defaults"]["USE"] = defaults
                        has_changed = True
                useforce = []