if [ "x${dopolicy}x" = "xtruex" ]; then
# We had something approved from a policy queue, push out new archive
dak dominate
- #dak generate-filelist
cd $configdir
$configdir/map.sh
dak generate-packages-sources2 -a security
)
stage $GO
-GO=(
- FUNC="filelist"
- TIME="generate-filelist"
- ARGS=""
- ERR=""
-)
-#stage $GO
-
GO=(
FUNC="fingerprints"
TIME="import-keyring"
dak dominate
}
-function filelist() {
- log "Generating file lists for apt-ftparchive"
- dak generate-filelist
-}
-
function fingerprints() {
log "Updating fingerprints"
dak import-keyring -L /srv/keyring.debian.org/keyrings/debian-keyring.gpg
"export a suite to a flat directory structure"),
("make-pkg-file-mapping",
"Generate package <-> file mapping"),
- ("generate-filelist",
- "Generate file lists for apt-ftparchive"),
("generate-releases",
"Generate Release files"),
- ("generate-packages-sources",
- "Generate Packages/Sources files"),
("generate-packages-sources2",
- "Generate Packages/Sources files [directly from database]"),
+ "Generate Packages/Sources files"),
("contents",
"Generate content files"),
("metadata",
+++ /dev/null
-#!/usr/bin/python
-
-"""
-Generate file lists for apt-ftparchive.
-
-@contact: Debian FTP Master <ftpmaster@debian.org>
-@copyright: 2009 Torsten Werner <twerner@debian.org>
-@copyright: 2011 Ansgar Burchardt <ansgar@debian.org>
-@license: GNU General Public License version 2 or later
-"""
-
-# 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.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-################################################################################
-
-# Ganneff> Please go and try to lock mhy now. After than try to lock NEW.
-# twerner> !lock mhy
-# dak> twerner: You suck, this is already locked by Ganneff
-# Ganneff> now try with NEW
-# twerner> !lock NEW
-# dak> twerner: also locked NEW
-# mhy> Ganneff: oy, stop using me for locks and highlighting me you tall muppet
-# Ganneff> hehe :)
-
-################################################################################
-
-from daklib.dbconn import *
-from daklib.config import Config
-from daklib import utils, daklog
-from daklib.dakmultiprocessing import DakProcessPool, PROC_STATUS_SUCCESS, PROC_STATUS_SIGNALRAISED
-import apt_pkg, os, stat, sys
-
-from daklib.lists import getSources, getBinaries, getArchAll
-
-def listPath(suite, component, architecture = None, type = None,
- incremental_mode = False):
- """returns full path to the list file"""
- suffixMap = { 'deb': "binary-",
- 'udeb': "debian-installer_binary-" }
- if architecture:
- suffix = suffixMap[type] + architecture.arch_string
- else:
- suffix = "source"
- filename = "%s_%s_%s.list" % \
- (suite.suite_name, component.component_name, suffix)
- pathname = os.path.join(Config()["Dir::Lists"], filename)
- file = utils.open_file(pathname, "a")
- timestamp = None
- if incremental_mode:
- timestamp = os.fstat(file.fileno())[stat.ST_MTIME]
- else:
- file.seek(0)
- file.truncate()
- return (file, timestamp)
-
-def writeSourceList(suite_id, component_id, incremental_mode):
- session = DBConn().session()
- suite = Suite.get(suite_id, session)
- component = Component.get(component_id, session)
- (file, timestamp) = listPath(suite, component,
- incremental_mode = incremental_mode)
-
- message = "sources list for %s %s" % (suite.suite_name, component.component_name)
-
- for _, filename in getSources(suite, component, session, timestamp):
- file.write(filename + '\n')
- session.rollback()
- file.close()
- return (PROC_STATUS_SUCCESS, message)
-
-def writeAllList(suite_id, component_id, architecture_id, type, incremental_mode):
- session = DBConn().session()
- suite = Suite.get(suite_id, session)
- component = Component.get(component_id, session)
- architecture = Architecture.get(architecture_id, session)
- (file, timestamp) = listPath(suite, component, architecture, type,
- incremental_mode)
-
- message = "all list for %s %s (arch=%s, type=%s)" % (suite.suite_name, component.component_name, architecture.arch_string, type)
-
- for _, filename in getArchAll(suite, component, architecture, type,
- session, timestamp):
- file.write(filename + '\n')
- session.rollback()
- file.close()
- return (PROC_STATUS_SUCCESS, message)
-
-def writeBinaryList(suite_id, component_id, architecture_id, type, incremental_mode):
- session = DBConn().session()
- suite = Suite.get(suite_id, session)
- component = Component.get(component_id, session)
- architecture = Architecture.get(architecture_id, session)
- (file, timestamp) = listPath(suite, component, architecture, type,
- incremental_mode)
-
- message = "binary list for %s %s (arch=%s, type=%s)" % (suite.suite_name, component.component_name, architecture.arch_string, type)
-
- for _, filename in getBinaries(suite, component, architecture, type,
- session, timestamp):
- file.write(filename + '\n')
- session.rollback()
- file.close()
- return (PROC_STATUS_SUCCESS, message)
-
-def usage():
- print """Usage: dak generate_filelist [OPTIONS]
-Create filename lists for apt-ftparchive.
-
- -s, --suite=SUITE act on this suite
- -c, --component=COMPONENT act on this component
- -a, --architecture=ARCH act on this architecture
- -h, --help show this help and exit
- -i, --incremental activate incremental mode
-
-ARCH, COMPONENT and SUITE can be comma (or space) separated list, e.g.
- --suite=testing,unstable
-
-Incremental mode appends only newer files to existing lists."""
- sys.exit()
-
-def main():
- cnf = Config()
- Logger = daklog.Logger('generate-filelist')
- Arguments = [('h', "help", "Filelist::Options::Help"),
- ('s', "suite", "Filelist::Options::Suite", "HasArg"),
- ('c', "component", "Filelist::Options::Component", "HasArg"),
- ('a', "architecture", "Filelist::Options::Architecture", "HasArg"),
- ('i', "incremental", "Filelist::Options::Incremental")]
- session = DBConn().session()
- query_suites = session.query(Suite)
- suites = [suite.suite_name for suite in query_suites]
- if not cnf.has_key('Filelist::Options::Suite'):
- cnf['Filelist::Options::Suite'] = ','.join(suites).encode()
- query_components = session.query(Component)
- components = \
- [component.component_name for component in query_components]
- if not cnf.has_key('Filelist::Options::Component'):
- cnf['Filelist::Options::Component'] = ','.join(components).encode()
- query_architectures = session.query(Architecture)
- architectures = \
- [architecture.arch_string for architecture in query_architectures]
- if not cnf.has_key('Filelist::Options::Architecture'):
- cnf['Filelist::Options::Architecture'] = ','.join(architectures).encode()
- cnf['Filelist::Options::Help'] = ''
- cnf['Filelist::Options::Incremental'] = ''
- apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv)
- Options = cnf.subtree("Filelist::Options")
- if Options['Help']:
- usage()
- pool = DakProcessPool()
- query_suites = query_suites. \
- filter(Suite.suite_name.in_(utils.split_args(Options['Suite'])))
- query_components = query_components. \
- filter(Component.component_name.in_(utils.split_args(Options['Component'])))
- query_architectures = query_architectures. \
- filter(Architecture.arch_string.in_(utils.split_args(Options['Architecture'])))
-
- def parse_results(message):
- # Split out into (code, msg)
- code, msg = message
- if code == PROC_STATUS_SUCCESS:
- Logger.log([msg])
- elif code == PROC_STATUS_SIGNALRAISED:
- Logger.log(['E: Subprocess recieved signal ', msg])
- else:
- Logger.log(['E: ', msg])
-
- for suite in query_suites:
- suite_id = suite.suite_id
- for component in query_components:
- component_id = component.component_id
- for architecture in query_architectures:
- architecture_id = architecture.arch_id
- if architecture not in suite.architectures:
- pass
- elif architecture.arch_string == 'source':
- pool.apply_async(writeSourceList,
- (suite_id, component_id, Options['Incremental']), callback=parse_results)
- elif architecture.arch_string == 'all':
- pool.apply_async(writeAllList,
- (suite_id, component_id, architecture_id, 'deb',
- Options['Incremental']), callback=parse_results)
- pool.apply_async(writeAllList,
- (suite_id, component_id, architecture_id, 'udeb',
- Options['Incremental']), callback=parse_results)
- else: # arch any
- pool.apply_async(writeBinaryList,
- (suite_id, component_id, architecture_id, 'deb',
- Options['Incremental']), callback=parse_results)
- pool.apply_async(writeBinaryList,
- (suite_id, component_id, architecture_id, 'udeb',
- Options['Incremental']), callback=parse_results)
- pool.close()
- pool.join()
-
- # this script doesn't change the database
- session.close()
-
- Logger.close()
-
- sys.exit(pool.overall_status())
-
-if __name__ == '__main__':
- main()
-
+++ /dev/null
-#!/usr/bin/env python
-
-""" Generate Packages/Sources files
-
-@contact: Debian FTPMaster <ftpmaster@debian.org>
-@copyright: 2000, 2001, 2002, 2006 James Troup <james@nocrew.org>
-@copyright: 2009 Mark Hymers <mhy@debian.org>
-@copyright: 2010 Joerg Jaspert <joerg@debian.org>
-@license: GNU General Public License version 2 or later
-
-"""
-
-# 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.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-################################################################################
-
-import os
-import os.path
-import sys
-import apt_pkg
-from tempfile import mkstemp, mkdtemp
-import commands
-from multiprocessing import Pool, TimeoutError
-
-from daklib import daklog
-from daklib.dbconn import *
-from daklib.config import Config
-
-################################################################################
-
-Options = None #: Commandline arguments parsed into this
-Logger = None #: Our logging object
-results = [] #: Results of the subprocesses
-
-################################################################################
-
-def usage (exit_code=0):
- print """Usage: dak generate-packages-sources [OPTIONS]
-Generate the Packages/Sources files
-
- -s, --suite=SUITE(s) process this suite
- Default: All suites not marked 'untouchable'
- -f, --force Allow processing of untouchable suites
- CAREFUL: Only to be used at point release time!
- -h, --help show this help and exit
-
-SUITE can be a space seperated list, e.g.
- --suite=unstable testing
- """
-
- sys.exit(exit_code)
-
-################################################################################
-
-def generate_packages_sources(arch, suite, tmppath):
- """
- Generate Packages/Sources files with apt-ftparchive for the given suite/arch
-
- @type suite: string
- @param suite: Suite name
-
- @type arch: string
- @param arch: Architecture name
-
- @type tmppath: string
- @param tmppath: The temporary path to work ing
- """
-
- DAILY_APT_CONF="""
-Dir
-{
- ArchiveDir "/srv/ftp-master.debian.org/ftp/";
- OverrideDir "/srv/ftp-master.debian.org/scripts/override/";
- CacheDir "/srv/ftp-master.debian.org/database/";
-};
-
-Default
-{
- Packages::Compress "bzip2 gzip";
- Sources::Compress "bzip2 gzip";
- Contents::Compress "gzip";
- DeLinkLimit 0;
- MaxContentsChange 25000;
- FileMode 0664;
-}
-
-TreeDefault
-{
- Contents::Header "/srv/ftp-master.debian.org/dak/config/debian/Contents.top";
-};
-
-"""
-
- apt_trees={}
- apt_trees["di"]={}
-
- apt_trees["oldstable"]="""
-tree "dists/oldstable"
-{
- FileList "/srv/ftp-master.debian.org/database/dists/oldstable_$(SECTION)_binary-$(ARCH).list";
- SourceFileList "/srv/ftp-master.debian.org/database/dists/oldstable_$(SECTION)_source.list";
- Sections "main contrib non-free";
- Architectures "%(arch)s";
- BinOverride "override.squeeze.$(SECTION)";
- ExtraOverride "override.squeeze.extra.$(SECTION)";
- SrcOverride "override.squeeze.$(SECTION).src";
-};
-"""
-
- apt_trees["di"]["oldstable"]="""
-tree "dists/oldstable/main"
-{
- FileList "/srv/ftp-master.debian.org/database/dists/oldstable_main_$(SECTION)_binary-$(ARCH).list";
- Sections "debian-installer";
- Architectures "%(arch)s";
- BinOverride "override.squeeze.main.$(SECTION)";
- SrcOverride "override.squeeze.main.src";
- BinCacheDB "packages-debian-installer-$(ARCH).db";
- Packages::Extensions ".udeb";
- %(contentsline)s
-};
-
-tree "dists/oldstable/non-free"
-{
- FileList "/srv/ftp-master.debian.org/database/dists/oldstable_non-free_$(SECTION)_binary-$(ARCH).list";
- Sections "debian-installer";
- Architectures "%(arch)s";
- BinOverride "override.squeeze.main.$(SECTION)";
- SrcOverride "override.squeeze.main.src";
- BinCacheDB "packages-debian-installer-$(ARCH).db";
- Packages::Extensions ".udeb";
- %(contentsline)s
-};
-"""
-
-
- cnf = Config()
- try:
- # Write apt.conf
- (ac_fd, ac_name) = mkstemp(dir=tmppath, suffix=suite, prefix=arch)
- os.write(ac_fd, DAILY_APT_CONF)
- # here we want to generate the tree entries
- os.write(ac_fd, apt_trees[suite] % {'arch': arch})
- # this special casing needs to go away, but this whole thing may just want an
- # aptconfig class anyways
- if arch != 'source':
- if arch == 'hurd-i386' and suite == 'experimental':
- pass
- elif apt_trees["di"].has_key(suite):
- if arch == "amd64":
- os.write(ac_fd, apt_trees["di"][suite] %
- {'arch': arch, 'contentsline': 'Contents "$(DIST)/../Contents-udeb";'})
- else:
- os.write(ac_fd, apt_trees["di"][suite] % {'arch': arch, 'contentsline': ''})
- os.close(ac_fd)
-
- print "Going to run apt-ftparchive for %s/%s" % (arch, suite)
- # Run apt-ftparchive generate
- # We dont want to add a -q or -qq here, this output should go into our logs, sometimes
- # it has errormessages we like to see
- os.environ['GZIP'] = '--rsyncable'
- os.chdir(tmppath)
- (result, output) = commands.getstatusoutput('apt-ftparchive -o APT::FTPArchive::Contents=off -o APT::FTPArchive::SHA512=off generate %s' % os.path.basename(ac_name))
- sn="a-f %s,%s: " % (suite, arch)
- print sn + output.replace('\n', '\n%s' % (sn))
- return result
-
- # Clean up any left behind files
- finally:
- if ac_fd:
- try:
- os.close(ac_fd)
- except OSError:
- pass
-
- if ac_name:
- try:
- os.unlink(ac_name)
- except OSError:
- pass
-
-def sname(arch):
- return arch.arch_string
-
-def get_result(arg):
- global results
- if arg:
- results.append(arg)
-
-########################################################################
-########################################################################
-
-def main ():
- global Options, Logger, results
-
- cnf = Config()
-
- for i in ["Help", "Suite", "Force"]:
- if not cnf.has_key("Generate-Packages-Sources::Options::%s" % (i)):
- cnf["Generate-Packages-Sources::Options::%s" % (i)] = ""
-
- Arguments = [('h',"help","Generate-Packages-Sources::Options::Help"),
- ('s',"suite","Generate-Packages-Sources::Options::Suite"),
- ('f',"force","Generate-Packages-Sources::Options::Force")]
-
- suite_names = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv)
- Options = cnf.subtree("Generate-Packages-Sources::Options")
-
- if Options["Help"]:
- usage()
-
- Logger = daklog.Logger('generate-packages-sources')
-
- session = DBConn().session()
-
- if Options["Suite"]:
- # Something here
- suites = []
- for s in suite_names:
- suite = get_suite(s.lower(), session)
- if suite:
- suites.append(suite)
- else:
- print "cannot find suite %s" % s
- Logger.log(['cannot find suite %s' % s])
- else:
- suites=session.query(Suite).filter(Suite.untouchable == False).all()
-
- startdir = os.getcwd()
- os.chdir(cnf["Dir::TempPath"])
-
- broken=[]
- # For each given suite, each architecture, run one apt-ftparchive
- for s in suites:
- results=[]
- # Setup a multiprocessing Pool. As many workers as we have CPU cores.
- pool = Pool()
- arch_list=get_suite_architectures(s.suite_name, skipsrc=False, skipall=False, session=session)
- Logger.log(['generating output for Suite %s, Architectures %s' % (s.suite_name, map(sname, arch_list))])
- for a in arch_list:
- pool.apply_async(generate_packages_sources, (a.arch_string, s.suite_name, cnf["Dir::TempPath"]), callback=get_result)
-
- # No more work will be added to our pool, close it and then wait for all to finish
- pool.close()
- pool.join()
-
- if len(results) > 0:
- Logger.log(['Trouble, something with a-f broke, resultcodes: %s' % (results)])
- print "Trouble, something with a-f broke, resultcodes: %s" % (results)
- sys.exit(1)
-
- os.chdir(startdir)
- # this script doesn't change the database
- session.close()
- Logger.close()
-
-#######################################################################################
-
-if __name__ == '__main__':
- main()
# 3. Run all the steps that are needed to publish the changed archive
print "Domination"
spawn("dak dominate")
- # print "Generating filelist for apt-ftparchive"
- # spawn("dak generate-filelist")
print "Updating Packages and Sources files... This may take a while, be patient"
spawn("/srv/security-master.debian.org/dak/config/debian-security/map.sh")
spawn("dak generate-packages-sources2 -a security")
+++ /dev/null
-#!/usr/bin/python
-
-"""
-Helper functions for list generating commands (Packages, Sources).
-
-@contact: Debian FTP Master <ftpmaster@debian.org>
-@copyright: 2009-2011 Torsten Werner <twerner@debian.org>
-@license: GNU General Public License version 2 or later
-"""
-
-# 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.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-################################################################################
-
-from dbconn import get_architecture
-
-def fetch(query, args, session):
- for (id, path, filename) in session.execute(query, args).fetchall():
- yield (id, path + filename)
-
-def getSources(suite, component, session, timestamp = None):
- '''
- Calculates the sources in suite and component optionally limited by
- sources newer than timestamp. Returns a generator that yields a
- tuple of source id and full pathname to the dsc file. See function
- writeSourceList() in dak/generate_filelist.py for an example that
- uses this function.
- '''
- extra_cond = ""
- if timestamp:
- extra_cond = "AND extract(epoch from sa.created) > %d" % timestamp
- query = """
- SELECT s.id, archive.path || 'pool/', c.name || '/' || f.filename
- FROM source s
- JOIN src_associations sa
- ON s.id = sa.source AND sa.suite = :suite %s
- JOIN suite
- ON sa.suite = suite.id
- JOIN archive
- ON suite.archive_id = archive.id
- JOIN files f
- ON s.file = f.id
- JOIN files_archive_map fam
- ON fam.file_id = f.id AND fam.component_id = :component
- JOIN component c
- ON fam.component_id = c.id
- ORDER BY filename
- """ % extra_cond
- args = { 'suite': suite.suite_id,
- 'component': component.component_id }
- return fetch(query, args, session)
-
-def getArchAll(suite, component, architecture, type, session, timestamp = None):
- '''
- Calculates all binaries in suite and component of architecture 'all' (and
- only 'all') and type 'deb' or 'udeb' optionally limited to binaries newer
- than timestamp. Returns a generator that yields a tuple of binary id and
- full pathname to the u(deb) file. See function writeAllList() in
- dak/generate_filelist.py for an example that uses this function.
- '''
- query = suite.clone(session).binaries. \
- filter_by(architecture = architecture, binarytype = type)
- if timestamp is not None:
- extra_cond = 'extract(epoch from bin_associations.created) > %d' % timestamp
- query = query.filter(extra_cond)
- for binary in query:
- yield (binary.binary_id, binary.poolfile.fullpath)
-
-def getBinaries(suite, component, architecture, type, session, timestamp = None):
- '''
- Calculates the binaries in suite and component of architecture and
- type 'deb' or 'udeb' optionally limited to binaries newer than
- timestamp. Returns a generator that yields a tuple of binary id and
- full pathname to the u(deb) file. See function writeBinaryList() in
- dak/generate_filelist.py for an example that uses this function.
- '''
- extra_cond = ""
- if timestamp:
- extra_cond = "AND extract(epoch from ba.created) > %d" % timestamp
- query = """
-CREATE TEMP TABLE b_candidates (
- id integer,
- source integer,
- file integer,
- architecture integer);
-
-INSERT INTO b_candidates (id, source, file, architecture)
- SELECT b.id, b.source, b.file, b.architecture
- FROM binaries b
- JOIN bin_associations ba ON b.id = ba.bin
- WHERE b.type = :type AND ba.suite = :suite AND
- b.architecture IN (:arch_all, :architecture) %s;
-
-CREATE TEMP TABLE gf_candidates (
- id integer,
- filename text,
- path text,
- architecture integer,
- src integer,
- source text);
-
-INSERT INTO gf_candidates (id, filename, path, architecture, src, source)
- SELECT bc.id, c.name || '/' || f.filename, archive.path || 'pool/' , bc.architecture, bc.source as src, s.source
- FROM b_candidates bc
- JOIN source s ON bc.source = s.id
- JOIN files f ON bc.file = f.id
- JOIN files_archive_map fam ON f.id = fam.file_id
- JOIN component c ON fam.component_id = c.id
- JOIN archive ON fam.archive_id = archive.id
- JOIN suite ON suite.archive_id = archive.id
-
- WHERE c.id = :component AND suite.id = :suite;
-
-WITH arch_any AS
-
- (SELECT id, path, filename FROM gf_candidates
- WHERE architecture <> :arch_all),
-
- arch_all_with_any AS
- (SELECT id, path, filename FROM gf_candidates
- WHERE architecture = :arch_all AND
- src IN (SELECT src FROM gf_candidates WHERE architecture <> :arch_all)),
-
- arch_all_without_any AS
- (SELECT id, path, filename FROM gf_candidates
- WHERE architecture = :arch_all AND
- source NOT IN (SELECT DISTINCT source FROM gf_candidates WHERE architecture <> :arch_all)),
-
- filelist AS
- (SELECT * FROM arch_any
- UNION
- SELECT * FROM arch_all_with_any
- UNION
- SELECT * FROM arch_all_without_any)
-
- SELECT * FROM filelist ORDER BY filename
- """ % extra_cond
- args = { 'suite': suite.suite_id,
- 'component': component.component_id,
- 'architecture': architecture.arch_id,
- 'arch_all': get_architecture('all', session).arch_id,
- 'type': type }
- return fetch(query, args, session)
-
- check output from cruft report:
dak cruft-report -s ${suite}
-dak generate-filelist -s ${suite}
-
- Let SRM see if all is ok
- then:
-if [[ ${suitename} == squeeze ]]; then
- dak generate-packages-sources -s ${suite} && dak contents generate -f -s ${suite} -a ftp-master
-else
- dak generate-packages-sources2 --force -s ${suite} && dak contents generate -f -s ${suite} -a ftp-master
-fi
+dak generate-packages-sources2 --force -s ${suite} && dak contents generate -f -s ${suite} -a ftp-master
- For squeeze: merge Contents
if [ "${suitename}" = "squeeze" ]; then