2
# -*- coding: UTF-8 -*-
4
# Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
7
# This file is part of Germinate.
9
# Germinate is free software; you can redistribute it and/or modify it
10
# under the terms of the GNU General Public License as published by the
11
# Free Software Foundation; either version 2, or (at your option) any
14
# Germinate is distributed in the hope that it will be useful, but
15
# WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
# General Public License for more details.
19
# You should have received a copy of the GNU General Public License
20
# along with Germinate; see the file COPYING. If not, write to the Free
21
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
32
imp.find_module('germinate.germinator')
34
# Running from build tree?
35
sys.path.insert(0, os.path.join(sys.path[0], os.pardir))
37
from germinate.germinator import Germinator
38
import germinate.archive
39
import germinate.defaults
40
from germinate.log import germinate_logging
41
from germinate.seeds import SeedError, SeedStructure
42
import germinate.version
44
MIRRORS = [germinate.defaults.mirror]
48
def __init__(self, name):
53
def set_seed(self, seed):
56
def set_installed(self):
59
def output(self, outmode):
60
ret = self.name.ljust(30) + "\t"
62
if self.installed and not len(self.seed):
64
elif not self.installed and len(self.seed):
69
if self.installed and not len(self.seed):
71
elif not self.installed and len(self.seed):
76
if self.installed and not len(self.seed):
78
elif not self.installed and len(self.seed):
82
ret += ",".join(sorted(self.seed.keys()))
93
def set_seeds(self, options, seeds):
96
# Suppress most log information
97
germinate_logging(logging.CRITICAL)
98
logging.getLogger('germinate.archive').setLevel(logging.INFO)
100
global MIRRORS, COMPONENTS
102
g = Germinator(options.arch)
104
archive = germinate.archive.TagFile(
105
options.dist, COMPONENTS, options.arch, MIRRORS, cleanup=True)
106
g.parse_archive(archive)
111
structure = SeedStructure(options.release, options.seeds)
112
for seedname in self.seeds:
113
if seedname == ('%s+build-depends' % structure.supported):
114
seedname = structure.supported
116
needed_seeds.append(seedname)
117
g.plant_seeds(structure, seeds=needed_seeds)
122
for seedname in structure.names:
123
for pkg in g.get_seed_entries(structure, seedname):
124
self.package.setdefault(pkg, Package(pkg))
125
self.package[pkg].set_seed(seedname + ".seed")
126
for pkg in g.get_seed_recommends_entries(structure, seedname):
127
self.package.setdefault(pkg, Package(pkg))
128
self.package[pkg].set_seed(seedname + ".seed-recommends")
129
for pkg in g.get_depends(structure, seedname):
130
self.package.setdefault(pkg, Package(pkg))
131
self.package[pkg].set_seed(seedname + ".depends")
134
build_depends = set(g.get_build_depends(structure, seedname))
135
for inner in structure.inner_seeds(structure.supported):
136
build_depends -= set(g.get_seed_entries(structure, inner))
137
build_depends -= set(g.get_seed_recommends_entries(
139
build_depends -= g.get_depends(structure, inner)
140
for pkg in build_depends:
141
self.package.setdefault(pkg, Package(pkg))
142
self.package[pkg].set_seed(structure.supported +
145
def parse_dpkg(self, fname):
147
dpkg_cmd = subprocess.Popen(['dpkg', '--get-selections'],
148
stdout=subprocess.PIPE)
150
lines = dpkg_cmd.stdout.readlines()
154
with open(fname) as f:
155
lines = f.readlines()
157
pkg, st = l.split(None)
158
self.package.setdefault(pkg, Package(pkg))
159
if st == "install" or st == "hold":
160
self.package[pkg].set_installed()
162
def set_output(self, mode):
166
for k in sorted(self.package.keys()):
167
l = self.package[k].output(self.outmode)
174
A list of seeds against which to compare may be supplied as non-option
175
arguments. Seeds from which they inherit will be added automatically. The
176
default is 'desktop'.'''
178
parser = optparse.OptionParser(
179
prog='germinate-pkg-diff',
180
usage='%prog [options] [seeds]',
181
version='%prog ' + germinate.version.VERSION,
183
parser.add_option('-l', '--list', dest='dpkg_file', metavar='FILE',
184
help='read list of packages from this file '
185
'(default: read from dpkg --get-selections)')
186
parser.add_option('-m', '--mode', dest='mode', type='choice',
187
choices=('i', 'r', 'd'), default='d', metavar='[i|r|d]',
188
help='show packages to install/remove/diff (default: d)')
189
parser.add_option('-S', '--seed-source', dest='seeds', metavar='SOURCE',
190
default=germinate.defaults.seeds,
191
help='fetch seeds from SOURCE (default: %s)' %
192
germinate.defaults.seeds)
193
parser.add_option('-s', '--seed-dist', dest='release', metavar='DIST',
194
default=germinate.defaults.release,
195
help='fetch seeds for distribution DIST '
196
'(default: %default)')
197
parser.add_option('-d', '--dist', dest='dist',
198
default=germinate.defaults.dist,
199
help='operate on distribution DIST (default: %default)')
200
parser.add_option('-a', '--arch', dest='arch',
201
default=germinate.defaults.arch,
202
help='operate on architecture ARCH (default: %default)')
204
options, args = parser.parse_args()
206
options.seeds = options.seeds.split(',')
207
options.dist = options.dist.split(',')
215
options, args = parse_options()
217
g.set_output(options.mode)
218
g.parse_dpkg(options.dpkg_file)
221
g.set_seeds(options, args)
224
if __name__ == "__main__":