################################################################################
+def write_helper(suite_name, argv):
+ session = DBConn().session()
+ suite = get_suite(suite_name, session)
+ architecture = get_architecture(argv[0], session)
+ debtype = get_override_type(argv[1], session)
+ if len(argv) == 3:
+ component = get_component(argv[2], session)
+ else:
+ component = None
+ session.rollback()
+ ContentsWriter(suite, architecture, debtype, component).write_file()
+ session.close()
+
+################################################################################
+
def scan_all(cnf, limit):
Logger = daklog.Logger(cnf.Cnf, 'contents scan')
result = ContentsScanner.scan_all(limit)
args = apt_pkg.ParseCommandLine(cnf.Cnf, arguments, sys.argv)
options = cnf.SubTree('Contents::Options')
- if (len(args) != 1) or options['Help']:
+ if (len(args) < 1) or options['Help']:
usage()
limit = None
write_all(cnf, suite_names, force)
return
+ if args[0] == 'generate_helper':
+ write_helper(suite_names[0], args[1:])
+ return
+
usage()
from daklib.dbconn import *
from daklib.config import Config
from daklib.threadpool import ThreadPool
+from multiprocessing import Pool
from sqlalchemy import desc, or_
-from subprocess import Popen, PIPE
+from subprocess import Popen, PIPE, call
import os.path
sure that the new ContentsWriter object can be executed in a different
thread.
'''
- self.suite = suite.clone()
- self.session = self.suite.session()
- self.architecture = architecture.clone(self.session)
- self.overridetype = overridetype.clone(self.session)
- if component is not None:
- self.component = component.clone(self.session)
- else:
- self.component = None
+ self.suite = suite
+ self.architecture = architecture
+ self.overridetype = overridetype
+ self.component = component
+ self.session = suite.session()
def query(self):
'''
if header_file:
header_file.close()
- def write_file(self, dummy_arg = None):
+ def write_file(self):
'''
- Write the output file. The argument dummy_arg is ignored but needed by
- our threadpool implementation.
+ Write the output file.
'''
command = ['gzip', '--rsyncable']
output_file = open(self.output_filename(), 'w')
- pipe = Popen(command, stdin = PIPE, stdout = output_file).stdin
- pipe.write(self.get_header())
+ gzip = Popen(command, stdin = PIPE, stdout = output_file)
+ gzip.stdin.write(self.get_header())
for item in self.fetch():
- pipe.write(item)
- pipe.close()
+ gzip.stdin.write(item)
+ gzip.stdin.close()
output_file.close()
+ gzip.wait()
@classmethod
def write_all(class_, suite_names = [], force = False):
suite_query = suite_query.filter(Suite.suite_name.in_(suite_names))
if not force:
suite_query = suite_query.filter_by(untouchable = False)
- main = get_component('main', session)
- non_free = get_component('non-free', session)
- deb = get_override_type('deb', session)
- udeb = get_override_type('udeb', session)
- threadpool = ThreadPool()
+ pool = Pool()
for suite in suite_query:
for architecture in suite.get_architectures(skipsrc = True, skipall = True):
# handle 'deb' packages
- writer = ContentsWriter(suite, architecture, deb)
- threadpool.queueTask(writer.write_file)
+ command = ['dak', 'contents', '-s', suite.suite_name, \
+ 'generate_helper', architecture.arch_string, 'deb']
+ pool.apply_async(call, (command, ))
# handle 'udeb' packages for 'main' and 'non-free'
- writer = ContentsWriter(suite, architecture, udeb, component = main)
- threadpool.queueTask(writer.write_file)
- writer = ContentsWriter(suite, architecture, udeb, component = non_free)
- threadpool.queueTask(writer.write_file)
- threadpool.joinAll()
+ command = ['dak', 'contents', '-s', suite.suite_name, \
+ 'generate_helper', architecture.arch_string, 'udeb', 'main']
+ pool.apply_async(call, (command, ))
+ command = ['dak', 'contents', '-s', suite.suite_name, \
+ 'generate_helper', architecture.arch_string, 'udeb', 'non-free']
+ pool.apply_async(call, (command, ))
+ pool.close()
+ pool.join()
session.close()
from daklib.dbconn import *
from daklib.contents import ContentsWriter, ContentsScanner
+from os.path import normpath
from sqlalchemy.exc import FlushError, IntegrityError
import unittest
self.assertEqual('/usr/bin/hello editors/emacs,python/hello,utils/sl\n', \
cw.formatline('/usr/bin/hello', ['editors/emacs', 'python/hello', 'utils/sl']))
# test output_filename
- self.assertEqual('tests/fixtures/ftp/squeeze/Contents-i386.gz', \
- cw.output_filename())
+ self.assertEqual('tests/fixtures/ftp/dists/squeeze/Contents-i386.gz', \
+ normpath(cw.output_filename()))
cw = ContentsWriter(self.suite['squeeze'], self.arch['i386'], \
self.otype['udeb'], self.comp['main'])
- self.assertEqual('tests/fixtures/ftp/squeeze/main/Contents-i386.gz', \
- cw.output_filename())
+ self.assertEqual('tests/fixtures/ftp/dists/squeeze/main/Contents-i386.gz', \
+ normpath(cw.output_filename()))
# test unicode support
self.binary['hello_2.2-1_i386'].contents.append(BinContents(file = '\xc3\xb6'))
self.session.commit()