aboutsummaryrefslogtreecommitdiffhomepage
path: root/gbp/scripts/import_dscs.py
diff options
context:
space:
mode:
Diffstat (limited to 'gbp/scripts/import_dscs.py')
-rw-r--r--gbp/scripts/import_dscs.py156
1 files changed, 156 insertions, 0 deletions
diff --git a/gbp/scripts/import_dscs.py b/gbp/scripts/import_dscs.py
new file mode 100644
index 00000000..fc39ce4a
--- /dev/null
+++ b/gbp/scripts/import_dscs.py
@@ -0,0 +1,156 @@
+# vim: set fileencoding=utf-8 :
+#
+# (C) 2008, 2009, 2010 Guido Guenther <agx@sigxcpu.org>
+# 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 glob
+import os
+import sys
+import tempfile
+import gbp.command_wrappers as gbpc
+from gbp.deb import parse_dsc, DscFile, DpkgCompareVersions
+from gbp.errors import GbpError
+from gbp.git import GitRepository, GitRepositoryError
+import gbp.log
+
+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):
+ # git-import-dsc should reside in the same directory as git-import-dscs
+ # so we can reuse the full path from the later
+ cmd = os.path.abspath(__file__[:-1])
+ 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 importdsc(self, dsc):
+ gbpc.Command.__call__(self, [dsc.dscfile])
+
+
+def fetch_snapshots(pkg, downloaddir):
+ "Fetch snapshots using debsnap von snapshots.debian.org"
+ dscs = None
+
+ gbp.log.info("Downloading snapshots of '%s' to '%s'..." % (pkg, downloaddir))
+ debsnap = gbpc.Command("debsnap", [ '--force', '--destdir=%s' % (downloaddir), pkg])
+ try:
+ debsnap()
+ except gbpc.CommandExecFailed:
+ if debsnap.retcode == 2:
+ gbp.log.warn("Some packages failed to download. Continuing.")
+ pass
+ else:
+ raise
+
+ dscs = glob.glob(os.path.join(downloaddir, '*.dsc'))
+ if not dscs:
+ raise GbpError, 'No package downloaded'
+
+ return [os.path.join(downloaddir, dsc) for dsc in dscs]
+
+
+def print_help():
+ print """Usage:
+ git-import-dscs [git-import-dsc options] /path/to/dsc1 [/path/to/dsc2] ...
+or
+ git-import-dscs --debsnap [git-import-dsc options] package
+"""
+
+
+def main(argv):
+ dirs = dict(top=os.path.abspath(os.curdir))
+ dscs = []
+ ret = 0
+ verbose = False
+ dsc_cmp = DscCompareVersions()
+ use_debsnap = False
+
+ try:
+ import_args = argv[1:]
+
+ if '--verbose' in import_args:
+ verbose = True
+ gbp.log.setup(False, verbose)
+
+ # Not using Configparser since we want to pass all unknown options
+ # unaltered to git-import-dsc
+ if '--debsnap' in import_args:
+ use_debsnap = True
+ import_args.remove('--debsnap')
+ if import_args == []:
+ print_help()
+ raise GbpError
+ pkg = import_args[-1]
+ import_args = import_args[:-1]
+ else:
+ for arg in argv[::-1]:
+ if arg.endswith('.dsc'):
+ dscs.append(parse_dsc(arg))
+ import_args.remove(arg)
+
+ if not use_debsnap and not dscs:
+ print_help()
+ raise GbpError
+
+ if use_debsnap:
+ dirs['tmp'] = os.path.abspath(tempfile.mkdtemp())
+ dscs = [ parse_dsc(f) for f in fetch_snapshots(pkg, dirs['tmp']) ]
+
+ dscs.sort(cmp=dsc_cmp)
+ importer = GitImportDsc(import_args)
+
+ try:
+ repo = GitRepository('.')
+ (clean, out) = repo.is_clean()
+ if not clean:
+ gbp.log.err("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.importdsc(dscs[0])
+ os.chdir(dirs['pkg'])
+
+ for dsc in dscs[1:]:
+ importer.importdsc(dsc)
+
+ except (GbpError, gbpc.CommandExecFailed), err:
+ if len(err.__str__()):
+ gbp.log.err(err)
+ ret = 1
+ finally:
+ if dirs.has_key('tmp'):
+ gbpc.RemoveTree(dirs['tmp'])()
+ os.chdir(dirs['top'])
+
+ if not ret:
+ gbp.log.info('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\:·: