mirror of
				https://git.launchpad.net/ubuntu-dev-tools
				synced 2025-11-03 23:44:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			126 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/python
 | 
						|
# -*- coding: utf-8 -*-
 | 
						|
#
 | 
						|
# Copyright 2006-2007 (C) Pete Savage <petesavage@ubuntu.com>
 | 
						|
# Copyright 2007 (C) Siegfried-A. Gevatter <rainct@ubuntu.com>
 | 
						|
#
 | 
						|
# ##################################################################
 | 
						|
#
 | 
						|
# This program is free software; you can redistribute it and/or
 | 
						|
# modify it under the terms of the GNU General Public License
 | 
						|
# as published by the Free Software Foundation; either version 2
 | 
						|
# of the License, or (at your option) any later version.
 | 
						|
# 
 | 
						|
# This program is distributed in the hope that it will be useful,
 | 
						|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
# GNU General Public License for more details.
 | 
						|
#
 | 
						|
# See file /usr/share/common-licenses/GPL for more details.
 | 
						|
#
 | 
						|
# ##################################################################
 | 
						|
#
 | 
						|
# This script is used to check if a package and all its build
 | 
						|
# dependencies are in main or not.
 | 
						|
 | 
						|
import subprocess
 | 
						|
import sys
 | 
						|
 | 
						|
def process_deps(deps):
 | 
						|
	"""Takes a list of (build) dependencies and processes it."""
 | 
						|
	
 | 
						|
	for package in [ package.split('|')[0] for package in deps ]:
 | 
						|
		
 | 
						|
		# Cut package name (from something like "name ( >= version)")
 | 
						|
		name = package.split(' ')[0]
 | 
						|
		
 | 
						|
		if not packages.has_key(name) and name != '':
 | 
						|
			# Check the (build) dependencies recursively
 | 
						|
			find_main(name)
 | 
						|
 | 
						|
 | 
						|
def find_main(pack):
 | 
						|
	"""Searches the dependencies and build dependencies of a package recursively
 | 
						|
	to determine if they are all in the 'main' component or not."""
 | 
						|
	
 | 
						|
	global packages
 | 
						|
	
 | 
						|
	# Retrieve information about the package
 | 
						|
	out = subprocess.Popen('apt-cache madison ' + pack + '  | grep ' + distro + ' | grep -m 1 Packages', shell=True, stdout=subprocess.PIPE).stdout.read()
 | 
						|
	
 | 
						|
	if out.find("/main") != -1:
 | 
						|
		packages[pack] = True
 | 
						|
		return 1
 | 
						|
	else:
 | 
						|
		if not packages.has_key(pack):
 | 
						|
			packages[pack] = False
 | 
						|
		
 | 
						|
		# Retrive package dependencies
 | 
						|
		deps = subprocess.Popen('apt-cache show ' + pack + ' | grep -m 1 ^Depends', shell=True, stdout=subprocess.PIPE).stdout.read().split('\n')[0].replace('Depends: ', '').split(', ')
 | 
						|
		
 | 
						|
		process_deps(deps)
 | 
						|
		
 | 
						|
		# Retrieve package build dependencies
 | 
						|
		deps1 = subprocess.Popen('apt-cache showsrc ' + pack + ' | grep -m 1 ^Build-Depends', shell=True, stdout=subprocess.PIPE).stdout.readlines()
 | 
						|
		deps = []
 | 
						|
		
 | 
						|
		for builddep in deps1:
 | 
						|
			if builddep.startswith('Build-Depends'):
 | 
						|
				deps += builddep.strip('\n').replace('Build-Depends: ', '').replace('Build-Depends-Indep: ',  '').split(', ')
 | 
						|
		
 | 
						|
		process_deps(deps)
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
	
 | 
						|
	global packages, distro
 | 
						|
	
 | 
						|
	# Check if the amount of arguments is correct
 | 
						|
	if len(sys.argv) < 2 or len(sys.argv) > 3 or sys.argv[1] in ('help', '-h', '--help'):
 | 
						|
		print 'Usage: %s <package name> [<distribution>]' % sys.argv[0]
 | 
						|
		sys.exit(1)
 | 
						|
	
 | 
						|
	if len(sys.argv) == 3 and sys.argv[2]:
 | 
						|
		distro = sys.argv[2]
 | 
						|
		if not subprocess.Popen('apt-cache madison bash | grep ' + distro, shell=True, stdout=subprocess.PIPE).stdout.read():
 | 
						|
			print '«%s» is not a valid distribution.' % distro
 | 
						|
			print 'Remember that for 404main to work with a certain distribution it must be in your /etc/apt/sources.list file.'
 | 
						|
			sys.exit(1)
 | 
						|
	else:
 | 
						|
		distro = subprocess.Popen('lsb_release -cs', shell=True, stdout=subprocess.PIPE).stdout.read().strip('\n')
 | 
						|
	
 | 
						|
	if not subprocess.Popen('apt-cache madison ' + sys.argv[1] + ' | grep ' + distro, shell=True, stdout=subprocess.PIPE).stdout.read():
 | 
						|
		print 'Can\'t find package «%s» in distribution «%s».' % (sys.argv[1], distro)
 | 
						|
		sys.exit(1)
 | 
						|
	
 | 
						|
	print 'Checking package «%s» in distribution «%s»...' % (sys.argv[1], distro)
 | 
						|
	
 | 
						|
	find_main(sys.argv[1])
 | 
						|
	
 | 
						|
	# True if everything checked until the point is in main
 | 
						|
	all_in_main = True
 | 
						|
	
 | 
						|
	for package in packages:
 | 
						|
		if not packages[package]:
 | 
						|
			if all_in_main:
 | 
						|
				print 'The following packages aren\'t in main:'
 | 
						|
				all_in_main = False
 | 
						|
			print '  ', package
 | 
						|
	
 | 
						|
	if all_in_main:
 | 
						|
		print 'Package «%s» and all its dependencies and build dependencies are in main.' % sys.argv[1]
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
	
 | 
						|
	# Global variable to hold the status of all packages
 | 
						|
	packages = {}
 | 
						|
	
 | 
						|
	# Global variable to hold the target distribution
 | 
						|
	distro = ''
 | 
						|
	
 | 
						|
	try:
 | 
						|
		main()
 | 
						|
	except KeyboardInterrupt:
 | 
						|
		print 'Aborted.'
 | 
						|
		sys.exit(1)
 |