#!/usr/bin/python -u # vim: set fileencoding=utf-8 : # # (C) 2008 Guido Guenther # 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 multiple dsc files in one go""" import sys import re import os import tempfile import glob import pipes import gbp.deb_utils import gbp.command_wrappers as gbpc from gbp.deb_utils import parse_dsc, DscFile from gbp.config import GbpOptionParser from gbp.errors import GbpError from gbp.git_utils import GitRepository, GitRepositoryError class DpkgCompareVersions(gbpc.Command): cmd='/usr/bin/dpkg' def __init__(self): if not os.access(self.cmd, os.X_OK): raise GbpError, "%s not found - cannot use compare versions" % self.cmd gbpc.Command.__init__(self, self.cmd, ['--compare-versions']) def __call__(self, version1, version2): self.run_error = "Couldn't compare %s with %s" % (version1, version2) res = gbpc.Command.call(self, [ version1, 'lt', version2 ]) if res not in [ 0, 1 ]: raise gbpc.CommandExecFailed, "%s: bad return code %d" % (self.run_error, res) if res == 0: return -1 elif res == 1: res = gbpc.Command.call(self, [ version1, 'gt', version2 ]) if res not in [ 0, 1 ]: raise gbpc.CommandExecFailed, "%s: bad return code %d" % (self.run_error, res) if res == 0: return 1 return 0 class DscCompareVersions(DpkgCompareVersions): def __init__(self): DpkgCompareVersions.__init__(self) def __call__(self, dsc1, dsc2): return DpkgCompareVersions.__call__(self, dsc1.version, dsc2.version) class GitImportDsc(gbpc.Command): cmd='/usr/bin/git-import-dsc' def __init__(self, args): if not os.access(self.cmd, os.X_OK): raise GbpError, "%s not found - can't import packages" % self.cmd gbpc.Command.__init__(self, self.cmd, args) def __call__(self, dsc): gbpc.Command.__call__(self, [dsc.dscfile]) def usage(): print """Usage: git-import-dscs [git-import-dsc options] /path/to/dsc1 [/path/to/dsc2] ...""" def main(argv): dirs = {'top': os.path.abspath(os.curdir)} dscs = [] ret = 0 dsc_cmp = DscCompareVersions() try: import_args = argv[1:] for arg in argv[::-1]: if arg.endswith('.dsc'): dscs.append(parse_dsc(arg)) import_args.remove(arg) if not dscs: usage() sys.exit(1) dscs.sort(cmp=dsc_cmp) importer = GitImportDsc(import_args) try: repo = GitRepository('.') (clean, out) = repo.is_clean() if not clean: print >>sys.stderr, "Repository has uncommitted changes, commit these first: " raise GbpError, out else: dirs['pkg'] = dirs['top'] except GitRepositoryError: # no git repository there yet dirs['pkg'] = os.path.join(dirs['top'], dscs[0].pkg) importer(dscs[0]) os.chdir(dirs['pkg']) for dsc in dscs[1:]: importer(dsc) except (GbpError, gbpc.CommandExecFailed), err: if len(err.__str__()): print >>sys.stderr, err ret = 1 finally: os.chdir(dirs['top']) if not ret: print 'Everything imported under %s' % dirs['pkg'] return ret if __name__ == '__main__': sys.exit(main(sys.argv)) # vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: