changeset 1000:348b096ebdbb

split Package_manager in Dependency_manager and baseclass Package_manager
author hanwen <hanwen@xs4all.nl>
date Fri, 13 Jan 2006 16:28:42 +0100
parents 667fc7269d17
children d2a55817064c
files specs/xpm.py
diffstat 1 files changed, 92 insertions(+), 144 deletions(-) [+]
line wrap: on
line diff
--- a/specs/xpm.py	Fri Jan 13 16:28:21 2006 +0100
+++ b/specs/xpm.py	Fri Jan 13 16:28:42 2006 +0100
@@ -14,15 +14,9 @@
 import fcntl
 import sys
 
-# X package manager (x for want of better name)
+from misc import *
 
-def tar_compression_flag (ball):
-	compression_flag = ''
-	if ball.endswith ('bz2'):
-		compression_flag = 'j'
-	if ball.endswith ('gz'):
-		compression_flag = 'z'
-	return compression_flag
+# X package manager (x for want of better name)
 
 #
 # TODO:
@@ -61,7 +55,7 @@
 		self._package_version_db = dbmodule.open (self.config
 						       + '/versions.db', 'c')
 		
-		
+
 	def is_installable (self, package):
 		ball = package.expand ('%(gub_uploads)s/%(gub_name)s')
 		return os.path.exists (ball)
@@ -83,7 +77,7 @@
 	def is_installed (self, package):
 		return self._package_file_db.has_key (package.name())
 
-	def _build_package (self, package):
+	def build_package (self, package):
 		if self.is_installed (package):
 			return
 		if not self.is_installable (package):
@@ -94,62 +88,14 @@
 		    and not self.is_installed (package)):
 			self._install_package (package)
 
-	def _dependencies_package (self, package):
-		if package._dependencies != None:
-			return
 
-		if package.verbose:
-			self.os_interface.log_command ('resolving dependencies: %s\n'
-						       % `package`)
-		package._dependencies = []
-		package._build_dependencies = []
-		try:
-			package._dependencies = map (lambda x:
-						     self._packages[x],
-						     package.name_dependencies)
-			if package in package._dependencies:
-				print ('simple circular dependency',
-				       package,
-				       package.name_dependencies,
-				       package._dependencies,
-				       self._packages)
-				raise 'BARF'
-
-			package._build_dependencies = map (lambda x:
-							   self._packages[x],
-							   package.name_build_dependencies)
-
-			if package in package._build_dependencies:
-				print ('simple circular build dependency',
-				       package,
-				       package.name_build_dependencies,
-				       package._build_dependencies,
-				       self._packages)
-				raise 'BARF'
-
-			## should use name_dependencies ?
-			#if self.include_build_deps:
-			#	package._dependencies += package._build_dependencies
-
-
-		except KeyError, k:
-			print 'xpm: resolving dependencies for: %s' % package
-			print 'xpm: unknown package: %s' % k
-			print 'xpm: available packages: %s' % self._packages
-			print 'xpm: deps: %s' % package.name_dependencies
-
-			# don't barf.  This fucks up with SDK
-			# packages, and separate target/framework
-			# managers.
 	def is_downloaded (self, package):
 		return package.is_downloaded ()
 	
-	def _download_package (self, package):
-		self.os_interface.log_command ('downloading package: %s\n'
-					       % `package`)
-		package._download ()
+	def download_package (self, package):
+		package.download ()
 
-	def _install_package (self, package):
+	def install_package (self, package):
 		if self.is_installed (package):
 			return
 		self.os_interface.log_command ('installing package: %s\n'
@@ -191,13 +137,13 @@
 	def is_registered (self, package):
 		return self._packages.has_key (package.name())
 	
-	def _register_package (self, package):
+	def register_package (self, package):
 		if package.verbose:
 			self.os_interface.log_command ('registering package: %s\n'
 						       % `package`)
 		self._packages[package.name ()] = package
 
-	def _uninstall_package (self, package):
+	def uninstall_package (self, package):
 		self.os_interface.log_command ('uninstalling package: %s\n'
 					       % `package`)
 		lst = self.installed_files (package)
@@ -238,7 +184,78 @@
 				print 'db delete failing for ', f
 		del self._package_file_db[name]
 		del self._package_version_db[name]
+	
+	# NAME_ shortcuts
+	def name_build (self, name):
+		self.build_package (self._packages[name])
+	def name_download (self, name):
+		self.download_package (self._packages[name])
+	def name_files (self, name):
+		return self.installed_files (self._packages[name])
+	def name_install (self, name):
+		self.install_package (self._packages[name])
+	def name_uninstall (self, name):
+		self.uninstall_package (self._packages[name])
+	def name_is_installed (self, name):
+		try:
+			return self.is_installed (self._packages[name])
+		except KeyError, k:
+			print 'known packages', self._packages
+			raise "Unknown package", k
 
+class Dependency_manager (Package_manager):
+	def determine_dependencies (self, package):
+		if package.verbose:
+			self.os_interface.log_command ('resolving dependencies: %s\n'
+						       % `package`)
+		package._dependencies = []
+		package._build_dependencies = []
+		try:
+			package._dependencies = map (lambda x:
+						     self._packages[x],
+						     package.name_dependencies)
+			if package in package._dependencies:
+				print ('simple circular dependency',
+				       package,
+				       package.name_dependencies,
+				       package._dependencies,
+				       self._packages)
+				raise 'BARF'
+
+			package._build_dependencies = map (lambda x:
+							   self._packages[x],
+							   package.name_build_dependencies)
+
+			if package in package._build_dependencies:
+				print ('simple circular build dependency',
+				       package,
+				       package.name_build_dependencies,
+				       package._build_dependencies,
+				       self._packages)
+				raise 'BARF'
+			
+			## should use name_dependencies ?
+			#if self.include_build_deps:
+			#	package._dependencies += package._build_dependencies
+
+
+		except KeyError, k:
+			print 'xpm: resolving dependencies for: %s' % package
+			print 'xpm: unknown package: %s' % k
+			print 'xpm: available packages: %s' % self._packages
+			print 'xpm: deps: %s' % package.name_dependencies
+
+			# don't barf.  This fucks up with SDK
+			# packages, and separate target/framework
+			# managers.
+
+
+	def dependencies (self, package):
+		if package._dependencies == None:
+			self.determine_dependencies (package)
+
+		return package._dependencies + package._build_dependencies
+	
 	def with_dependencies (self, package, action=None, recurse_stop_predicate=None):
 		todo = []
 		add_packages = [package]
@@ -259,63 +276,22 @@
 			add_packages = new_add
 			
 		sorted = self.topological_sort (todo)
-		print 'packages sorted by dep', sorted
 		for p in sorted:
 			action (p)
 
-	def xwith_dependencies (self, package, before=None, after=None):
-
-		# FIXME: circular depends hack for debian
-		busy = ''
-		if before:
-			busy += before.__name__
-		if after:
-			busy += after.__name__
-		if package.__dict__.has_key (busy):
-			return
-		package.__dict__[busy] = None
-		if before:
-			before (package)
-
-		for d in self.dependencies (package):
-			if package.verbose:
-				self.os_interface.log_command (busy + ': '
-							       + 'dependency: '
-							       + d.name ()
-							       + ' for package: '
-							       + package.name ()
-							       + '\n')
-			self.with_dependencies (d, before, after)
-		if after:
-			after (package)
-			
-		# FIXME: work around debian's circular dependencies
-		del (package.__dict__[busy])
-
-
-	def dependencies (self, package):
-		self._dependencies_package (package) 
-		return package._dependencies + package._build_dependencies
 
 	def build_package (self, package):
-		self.with_dependencies (package, action=self._build_package,
+		self.with_dependencies (package, action=bind_method (Package_manager.build_package, self),
 					recurse_stop_predicate=self.is_installed)
 
 	def download_package (self, package):
-		self.with_dependencies (package, action=self._download_package,
+		self.with_dependencies (package, action=bind_method (Package_manager.download_package, self),
 					recurse_stop_predicate=None)
 
 	def install_package (self, package):
-		self.with_dependencies (package, action=self._install_package,
+		self.with_dependencies (package, action=bind_method (Package_manager.install_package, self),
 					recurse_stop_predicate=self.is_installed)
 
-	def uninstall_package (self, package):
-		self._uninstall_package (package)
-
-	def register_package (self, package):
-		self.with_dependencies (package, action=self._register_package,
-					recurse_stop_predicate=self.is_registered)
-
 	def topological_sort (manager, nodes):
 		deps = dict ([(n, [d for d in manager.dependencies (n)
 				   if d in nodes])
@@ -342,26 +318,9 @@
 
 	def package_version (self, pkg):
 		return self._package_version_db[pkg.name()]
-	
-	# NAME_ shortcuts
-	def name_build (self, name):
-		self.build_package (self._packages[name])
-	def name_download (self, name):
-		self.download_package (self._packages[name])
-	def name_files (self, name):
-		return self.installed_files (self._packages[name])
-	def name_install (self, name):
-		self.install_package (self._packages[name])
-	def name_uninstall (self, name):
-		self.uninstall_package (self._packages[name])
-	def name_is_installed (self, name):
-		try:
-			return self.is_installed (self._packages[name])
-		except KeyError, k:
-			print 'known packages', self._packages
-			raise "Unknown package", k
+
 
-class Cygwin_package_manager (Package_manager):
+class Cygwin_package_manager (Dependency_manager):
 	def __init__ (self, settings):
 		Package_manager.__init__ (self, settings.system_root,
 					  settings.os_interface)
@@ -445,7 +404,7 @@
 		return self._dists[self.dist]
 		#return self._dists['curr'] + self._dists['test']
 
-class Debian_package_manager (Package_manager):
+class Debian_package_manager (Dependency_manager):
 	def __init__ (self, settings):
 		Package_manager.__init__ (self, settings.system_root,
 					  settings.os_interface)
@@ -512,12 +471,13 @@
 
 	cross_packages = cross_module.get_packages (settings)
 	
-	target_manager = Package_manager (settings.system_root,
-					  settings.os_interface)
+	target_manager = Dependency_manager (settings.system_root,
+					     settings.os_interface)
 
-	map (target_manager._register_package, cross_packages)
-	map (target_manager._register_package,
-	     framework.get_packages (settings))
+	map (target_manager.register_package, cross_packages)
+
+	target_pkgs = framework.get_packages (settings)
+	map (target_manager.register_package, target_pkgs)
 
 	for p in target_manager._packages.values ():
 		settings.build_number_db.set_build_number (p)
@@ -526,15 +486,3 @@
 
 	return target_manager
 
-def intersect (l1, l2):
-	return [l for l in l1 if l in l2]
-
-def determine_manager (settings, managers, args):
-	for p in managers:
-		if intersect (args, p._packages.keys ()):
-			return p
-
-	if settings.use_tools:
-		return managers[0]
-	else:
-		return managers[-1]