From: Zac Medico <zmedico@gentoo.org>
Date: Mon, 3 Apr 2006 03:59:26 +0000 (-0000)
Subject: Move DISTDIR initialization from doebuild to fetch and handle read-only file system... 
X-Git-Tag: v2.1_pre8~42
X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=09a00db962e429d0247ab6209ec312dde5b00866;p=portage.git

Move DISTDIR initialization from doebuild to fetch and handle read-only file system errors for bug #128506.

svn path=/main/trunk/; revision=3058
---

diff --git a/pym/portage.py b/pym/portage.py
index 0c348bd48..3b69bebc6 100644
--- a/pym/portage.py
+++ b/pym/portage.py
@@ -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 :/
diff --git a/pym/portage_exception.py b/pym/portage_exception.py
index 0d0206df1..c00965d6e 100644
--- a/pym/portage_exception.py
+++ b/pym/portage_exception.py
@@ -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"""
 
diff --git a/pym/portage_util.py b/pym/portage_util.py
index ae7525186..5c128d59d 100644
--- a/pym/portage_util.py
+++ b/pym/portage_util.py
@@ -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):