Move DISTDIR initialization from doebuild to fetch and handle read-only file system...
authorZac Medico <zmedico@gentoo.org>
Mon, 3 Apr 2006 03:59:26 +0000 (03:59 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 3 Apr 2006 03:59:26 +0000 (03:59 -0000)
svn path=/main/trunk/; revision=3058

pym/portage.py
pym/portage_exception.py
pym/portage_util.py

index 0c348bd48ea3890e2f161b21b45dc399aca568e5..3b69bebc6feafd242919f3128fda7fc10e3799cd 100644 (file)
@@ -1853,6 +1853,33 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks",
        del missingSourceHost
 
        can_fetch=True
+
+       if not listonly:
+               dirmode  = 02070
+               filemode =   060
+               modemask =    02
+               distdir_dirs = ["", "cvs-src"]
+               if "distlocks" in features:
+                       distdir_dirs.append(".locks")
+               try:
+                       
+                       for x in distdir_dirs:
+                               mydir = os.path.join(mysettings["DISTDIR"], x)
+                               if portage_util.ensure_dirs(mydir, gid=portage_gid, mode=dirmode, mask=modemask):
+                                       writemsg("Adjusting permissions recursively: '%s'\n" % mydir)
+                                       def onerror(e):
+                                               raise # bail out on the first error that occurs during recursion
+                                       if not apply_recursive_permissions(mydir,
+                                               gid=portage_gid, dirmode=dirmode, dirmask=modemask,
+                                               filemode=filemode, filemask=modemask, onerror=onerror):
+                                               raise portage_exception.OperationNotPermitted(
+                                                       "Failed to apply recursive permissions for the portage group.")
+               except portage_exception.PortageException, e:
+                       if not os.path.dir(mysettings["DISTDIR"]):
+                               writemsg("!!! %s\n" % str(e))
+                               writemsg("!!! Directory Not Found: DISTDIR='%s'\n" % mysettings["DISTDIR"])
+                               writemsg("!!! Fetching will fail!\n")
+
        if not os.access(mysettings["DISTDIR"]+"/",os.W_OK):
                if not fetch_to_ro:
                        print "!!! No write access to %s" % mysettings["DISTDIR"]+"/"
@@ -2730,31 +2757,6 @@ def doebuild(myebuild,mydo,myroot,mysettings,debug=0,listonly=0,fetchonly=0,clea
                fetchme=newuris[:]
                checkme=alist[:]
 
-       if not listonly:
-               dirmode  = 02070
-               filemode =   060
-               modemask =    02
-               distdir_dirs = ["", "cvs-src"]
-               if "distlocks" in features:
-                       distdir_dirs.append(".locks")
-               try:
-                       
-                       for x in distdir_dirs:
-                               mydir = os.path.join(mysettings["DISTDIR"], x)
-                               if portage_util.ensure_dirs(mydir, gid=portage_gid, mode=dirmode, mask=modemask):
-                                       writemsg("Adjusting permissions recursively: '%s'\n" % mydir)
-                                       def onerror(e):
-                                               raise # bail out on the first error that occurs during recursion
-                                       if not apply_recursive_permissions(mydir,
-                                               gid=portage_gid, dirmode=dirmode, dirmask=modemask,
-                                               filemode=filemode, filemask=modemask, onerror=onerror):
-                                               raise portage_exception.OperationNotPermitted(
-                                                       "Failed to apply recursive permissions for the portage group.")
-               except portage_exception.PortageException, e:
-                       writemsg("!!! %s\n" % str(e))
-                       writemsg("!!! Problem adjusting permissions on DISTDIR='%s'\n" % mysettings["DISTDIR"])
-                       writemsg("!!! Fetching may fail!\n")
-
        # Only try and fetch the files if we are going to need them ... otherwise,
        # if user has FEATURES=noauto and they run `ebuild clean unpack compile install`,
        # we will try and fetch 4 times :/
index 0d0206df1cbd832846273185e56b998ca5c40c98..c00965d6e54e0f9003237b8f425db048cb9d06c6 100644 (file)
@@ -49,6 +49,9 @@ class DirectoryNotFound(InvalidLocation):
 class OperationNotPermitted(PortageException):
        """An operation was not permitted operating system"""
 
+class ReadOnlyFileSystem(PortageException):
+       """Read-only file system"""
+
 class CommandNotFound(PortageException):
        """A required binary was not available or executable"""
 
index ae75251869ba4b180536c372ba994c1f83465afc..5c128d59de052e67b1010c4043c90603179c8dcf 100644 (file)
@@ -2,7 +2,7 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Id: /var/cvsroot/gentoo-src/portage/pym/portage_util.py,v 1.11.2.6 2005/04/23 07:26:04 jstubbs Exp $
 
-from portage_exception import PortageException, FileNotFound, OperationNotPermitted
+from portage_exception import PortageException, FileNotFound, OperationNotPermitted, ReadOnlyFileSystem
 
 import sys,string,shlex,os,errno
 try:
@@ -512,12 +512,14 @@ def apply_permissions(filename, uid=-1, gid=-1, mode=-1, mask=-1,
                        os.chmod(filename, new_mode)
                        modified = True
                except OSError, oe:
+                       func_call = "chmod('%s', %s)" % (filename, oct(new_mode))
                        if oe.errno == errno.EPERM:
-                               raise OperationNotPermitted("chmod('%s', %s)" % (filename, oct(new_mode)))
+                               raise OperationNotPermitted(func_call)
+                       elif oe.errno == errno.EROFS:
+                               raise ReadOnlyFileSystem(func_call)
                        elif oe.errno == errno.ENOENT:
                                raise FileNotFound(filename)
-                       else:
-                               raise
+                       raise
        return modified
 
 def apply_stat_permissions(filename, newstat, **kwargs):