diff options
author | Guido Guenther <agx@sigxcpu.org> | 2008-05-17 21:20:35 +0200 |
---|---|---|
committer | Guido Guenther <agx@sigxcpu.org> | 2008-05-17 21:34:24 +0200 |
commit | 6ddf1687fc176575707a33be1b17aad8961953e5 (patch) | |
tree | 989eabae1e4cce7e220e48aebf47f47075c42ff8 | |
parent | cd77e167e025880c7a872a0e3645ce702cde6d5d (diff) | |
download | git-buildpackage-6ddf1687fc176575707a33be1b17aad8961953e5.tar.gz git-buildpackage-6ddf1687fc176575707a33be1b17aad8961953e5.tar.bz2 git-buildpackage-6ddf1687fc176575707a33be1b17aad8961953e5.zip |
add git-import-dscs
to import mutiple dscs in one go
Closes: #471580
-rwxr-xr-x | debian/rules | 2 | ||||
-rw-r--r-- | docs/common.ent | 1 | ||||
-rw-r--r-- | docs/man.git-import-dscs.sgml | 11 | ||||
-rw-r--r-- | docs/manpages/git-import-dscs.sgml | 79 | ||||
-rw-r--r-- | docs/manpages/manpages.ent | 1 | ||||
-rw-r--r-- | docs/manual.sgml | 1 | ||||
-rwxr-xr-x | git-import-dscs | 133 | ||||
-rw-r--r-- | setup.py | 2 |
8 files changed, 228 insertions, 2 deletions
diff --git a/debian/rules b/debian/rules index 3f973bbc..ed34eca4 100755 --- a/debian/rules +++ b/debian/rules @@ -7,7 +7,7 @@ DEB_PYTHON_CLEAN_ARGS = --all include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/python-distutils.mk -COMMANDS=git-buildpackage git-import-dsc git-import-orig git-dch +COMMANDS=git-buildpackage git-import-dsc git-import-dscs git-import-orig git-dch MANPAGES=$(patsubst %,docs/%.1,$(COMMANDS)) MANUAL=docs/manual-html PYCHECKS=$(patsubst %,%.py,$(COMMANDS)) diff --git a/docs/common.ent b/docs/common.ent index 28cd7d39..98974da2 100644 --- a/docs/common.ent +++ b/docs/common.ent @@ -6,6 +6,7 @@ <!ENTITY git-buildpackage "<command>git-buildpackage</command>"> <!ENTITY git-import-orig "<command>git-import-orig</command>"> <!ENTITY git-import-dsc "<command>git-import-dsc</command>"> + <!ENTITY git-import-dscs "<command>git-import-dscs</command>"> <!ENTITY git-dch "<command>git-dch</command>"> <!ENTITY gitcmd "<command>git</command>"> <!ENTITY gitkcmd "<command>gitk</command>"> diff --git a/docs/man.git-import-dscs.sgml b/docs/man.git-import-dscs.sgml new file mode 100644 index 00000000..3777e895 --- /dev/null +++ b/docs/man.git-import-dscs.sgml @@ -0,0 +1,11 @@ +<!DOCTYPE reference PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ + <!ENTITY % COMMON SYSTEM "common.ent"> + %COMMON; + <!ENTITY % MANPAGES SYSTEM "manpages/manpages.ent"> + %MANPAGES; +]> + +<reference> +<title>git-buildpackage Manual</title> +&man.git.importdscs; +</reference> diff --git a/docs/manpages/git-import-dscs.sgml b/docs/manpages/git-import-dscs.sgml new file mode 100644 index 00000000..c9ea7d8a --- /dev/null +++ b/docs/manpages/git-import-dscs.sgml @@ -0,0 +1,79 @@ +<refentry id="gbp.man.git.import.dscs"> + <refentryinfo> + <address> + &dhemail; + </address> + <author> + &dhfirstname; + &dhsurname; + </author> + </refentryinfo> + <refmeta> + <refentrytitle>git-import-dscs</refentrytitle> + &dhsection; + </refmeta> + <refnamediv> + <refname>&git-import-dscs;</refname> + + <refpurpose>Import multiple versions of a Debian source packages into a Git repository</refpurpose> + </refnamediv> + <refsynopsisdiv> + <cmdsynopsis> + &git-import-dscs; + <arg><option>git-import-dsc ptions</option></arg> + <arg choice="plain"><replaceable>pkg_1.dsc</replaceable></arg> + <arg choice="plain"><replaceable>pkg_2.dsc</replaceable></arg> + <arg choice="plain"><replaceable>...</replaceable></arg> + </cmdsynopsis> + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + <para> + &git-import-dscs; imports several versions of a Debian source package into + a &git; repository. To do so it sorts the packages by their versions first + and then imports them via calling &git-import-dsc; on each package. + </para> + + <para> + If the current directory isn't a &git; repository already the repository is + created in a subdir of the current working directory, named after the first + imported package, otherwise the &git; repository in the current working + directory is being used. This allows for incremental imports. + </para> + </refsect1> + <refsect1> + <title>OPTIONS</title> + <para> + All options are passed on verbatim to &git-import-dsc;. + </para> + </refsect1> + <refsect1> + <title>SEE ALSO</title> + + <para> + <citerefentry> + <refentrytitle>git-import-dsc</refentrytitle> + <manvolnum>1</manvolnum> + </citerefentry>, + <citerefentry> + <refentrytitle>git-buildpackage</refentrytitle> + <manvolnum>1</manvolnum> + </citerefentry>, + <citerefentry> + <refentrytitle>git-import-orig</refentrytitle> + <manvolnum>1</manvolnum> + </citerefentry>, + <citerefentry> + <refentrytitle>git-dch</refentrytitle> + <manvolnum>1</manvolnum> + </citerefentry>, + &man.seealso.common; + </para> + </refsect1> + <refsect1> + <title>AUTHOR</title> + + <para>&dhusername; &dhemail;</para> + + </refsect1> +</refentry> diff --git a/docs/manpages/manpages.ent b/docs/manpages/manpages.ent index 6f22e564..21c5bf0d 100644 --- a/docs/manpages/manpages.ent +++ b/docs/manpages/manpages.ent @@ -1,5 +1,6 @@ <!ENTITY man.git.importorig SYSTEM "git-import-orig.sgml"> <!ENTITY man.git.importdsc SYSTEM "git-import-dsc.sgml"> +<!ENTITY man.git.importdscs SYSTEM "git-import-dscs.sgml"> <!ENTITY man.git.buildpackage SYSTEM "git-buildpackage.sgml"> <!ENTITY man.git.dch SYSTEM "git-dch.sgml"> <!ENTITY man.git.config-files SYSTEM "man.conffiles.sgml"> diff --git a/docs/manual.sgml b/docs/manual.sgml index e72ebec5..eb977536 100644 --- a/docs/manual.sgml +++ b/docs/manual.sgml @@ -29,6 +29,7 @@ <title>Command Reference</title> &man.git.buildpackage; &man.git.importdsc; + &man.git.importdscs; &man.git.importorig; &man.git.dch; </appendix> diff --git a/git-import-dscs b/git-import-dscs new file mode 100755 index 00000000..8b6d99ee --- /dev/null +++ b/git-import-dscs @@ -0,0 +1,133 @@ +#!/usr/bin/python +# vim: set fileencoding=utf-8 : +# +# (C) 2008 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 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\:·: @@ -21,7 +21,7 @@ from distutils.core import setup setup(name = "git_build_package", author = 'Guido Guenther', author_email = 'agx@sigxcpu.org', - scripts = [ 'git-buildpackage', 'git-import-dsc', 'git-import-orig', 'git-dch' ], + scripts = [ 'git-buildpackage', 'git-import-dsc', 'git-import-orig', 'git-dch', 'git-import-dscs' ], packages = [ 'gbp' ], data_files = [("/etc/git-buildpackage/", ["gbp.conf" ]),], ) |