diff options
author | Guido Guenther <agx@sigxcpu.org> | 2008-03-19 08:32:49 +0100 |
---|---|---|
committer | Guido Guenther <agx@sigxcpu.org> | 2008-03-19 08:32:49 +0100 |
commit | 6b7bdd2c7aca2c6c853a3041630b9017d07a629d (patch) | |
tree | a29c1115abedeb23d2c5634f7da271ea06879d84 | |
parent | b460974a039aa6665e3d129f4349b5f4281db750 (diff) | |
parent | 410adc82eb7717b94ef5336fc5c61033679e48b3 (diff) |
Merge branch '0.4.20' into bpo-etch
Conflicts:
debian/changelog
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | debian/changelog | 64 | ||||
-rw-r--r-- | debian/control | 2 | ||||
-rwxr-xr-x | debian/rules | 1 | ||||
-rw-r--r-- | docs/chapters/building.sgml | 33 | ||||
-rw-r--r-- | docs/chapters/import.sgml | 18 | ||||
-rw-r--r-- | docs/chapters/releases.sgml | 2 | ||||
-rw-r--r-- | docs/chapters/special.sgml | 64 | ||||
-rw-r--r-- | docs/manpages/git-buildpackage.sgml | 11 | ||||
-rw-r--r-- | docs/manpages/git-dch.sgml | 3 | ||||
-rw-r--r-- | docs/manpages/git-import-dsc.sgml | 16 | ||||
-rw-r--r-- | docs/manpages/git-import-orig.sgml | 20 | ||||
-rw-r--r-- | gbp.conf | 4 | ||||
-rw-r--r-- | gbp/command_wrappers.py | 69 | ||||
-rw-r--r-- | gbp/config.py | 10 | ||||
-rw-r--r-- | gbp/deb_utils.py | 26 | ||||
-rw-r--r-- | gbp/git_utils.py | 26 | ||||
-rwxr-xr-x | git-buildpackage | 82 | ||||
-rwxr-xr-x | git-import-dsc | 152 | ||||
-rwxr-xr-x | git-import-orig | 66 |
20 files changed, 487 insertions, 184 deletions
@@ -3,8 +3,6 @@ - add --git-overlay as discussed in #448357 - git-import-orig: - show untracked files using 'git-ls-files -o' after import -- git-import-dsc: - - allow to import into a git repository for backports - git-dch - make format of log messages more flexible - don't forcibly start a new version diff --git a/debian/changelog b/debian/changelog index 18856290..85b98325 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,67 @@ +git-buildpackage (0.4.20) unstable; urgency=low + + * add missing pngs (Closes: #469403) + * be more verbose on pbuilder (Closes: #469138) + * explain howto push tags and mention linda and lintian (Closes: #469436) + + -- Guido Guenther <agx@sigxcpu.org> Thu, 06 Mar 2008 08:48:02 +0100 + +git-buildpackage (0.4.19) unstable; urgency=low + + * don't fail of the pristine-tar branch doesn't exist + (Closes: #468675) + + -- Guido Guenther <agx@sigxcpu.org> Sat, 01 Mar 2008 14:22:20 +0100 + +git-buildpackage (0.4.18) unstable; urgency=low + + * update documentation about git-import-dsc and --filter + * gbp/command_wrappers.py: make error messages more consistent + * git-import-dsc: don't throw a python exception on tag failures or non + existant branches + + -- Guido Guenther <agx@sigxcpu.org> Fri, 29 Feb 2008 18:05:40 +0100 + +git-buildpackage (0.4.17) unstable; urgency=low + + * make dsc import repeatable (Closes: #468120, #432082) + * drop now (due to git-apply) unneeded code + + -- Guido Guenther <agx@sigxcpu.org> Fri, 29 Feb 2008 16:09:47 +0100 + +git-buildpackage (0.4.16) unstable; urgency=low + + [ Guido Guenther ] + * speed up git-import-dsc by using git-apply (addresses parts of + #449075) + * update docs and gbp.conf with --filter and filter = [ ... ] + + [ Harald Braumann ] + * allow multiple file filters for git-import-{orig,dsc} (Closes: #464653) + + -- Guido Guenther <agx@sigxcpu.org> Sun, 24 Feb 2008 14:56:47 +0100 + +git-buildpackage (0.4.15) unstable; urgency=low + + * add (for now experimental) pristine-tar support based on a patch from + Julian Andres Klode (Closes: #463580) + * document pristine-tar options + * suggest pristine-tar + * don't use the deprecated git-* command versions + + -- Guido Guenther <agx@sigxcpu.org> Thu, 21 Feb 2008 16:25:33 +0100 + +git-buildpackage (0.4.14) unstable; urgency=low + + * correct several typos in the manual (Closes: #464582, #464583, + #464617) + * better dpkg-parsechangelog error reporting (Closes: #460195) + * document default tag formats (Closes: #464100) + * git-import-orig: detect flat tar archives (Closes: #463822) + * git-import-orig: add --no-dch options + + -- Guido Guenther <agx@sigxcpu.org> Fri, 08 Feb 2008 17:38:29 +0100 + git-buildpackage (0.4.13~bpo40+1) etch-backports; urgency=low * Rebuild for Etch backports. diff --git a/debian/control b/debian/control index e8682afe..0d45530a 100644 --- a/debian/control +++ b/debian/control @@ -12,7 +12,7 @@ Package: git-buildpackage Architecture: all Depends: ${python:Depends}, ${shlibs:Depends}, ${misc:Depends}, devscripts (>= 2.10.9), git-core (>= 1:1.5.0.1-1) -Suggests: git-load-dirs +Suggests: git-load-dirs, pristine-tar (>= 0.5) Description: Suite to help with Debian packages in Git repositories This package contains the following tools: * git-import-dsc: import an existing Debian source package into a git diff --git a/debian/rules b/debian/rules index 3474e37d..3f973bbc 100755 --- a/debian/rules +++ b/debian/rules @@ -22,6 +22,7 @@ docs/manual.sgml: docs/version.ent $(MANUAL): docs/manual.sgml docs/chapters/*.sgml docs/manpages/*.sgml docbook-2-html -s local $< + cp /usr/share/gtk-doc/data/*.png $(MANUAL) %.py: % ln -s $< $@ diff --git a/docs/chapters/building.sgml b/docs/chapters/building.sgml index 0bbc836d..02ed91b5 100644 --- a/docs/chapters/building.sgml +++ b/docs/chapters/building.sgml @@ -2,9 +2,14 @@ <title>Building packages from the &git; repository</title> <para> In order to build a &debian; package from the &git; repository you use: - &git-buildpackage;. During the development phase (when you're either not - on the <emphasis>debian-branch</emphasis> or when you have uncommitted - changes in your repository) you'll usually use: + &git-buildpackage;. This builds the upstream tarball as will be described below and + invokes &debuild; to build the package. To use another build command you + can use the <option>--git-builder</option> option as described later in the manual + but &debuild; is nice since it can invoke <productname>linda</productname> + und <productname>lintian</productname>. + During the development phase (when you're either not on the + <emphasis>debian-branch</emphasis> or when you have uncommitted changes in + your repository) you'll usually use: <screen> &git-buildpackage; <option>--git-ignore-new</option> </screen> @@ -13,7 +18,7 @@ found it uses the tip of the current <option>upstream-branch</option>. Any other treeish objecto to create the upstream tarball from can be given with the <option>--upstream-branch</option> option.</para> - <para>Once you're satisfied with the build and want to do a relese you commit all + <para>Once you're satisfied with the build and want to do a release you commit all your changes and issue:</para> <screen> &git-buildpackage; <option>--git-tag</option> @@ -24,7 +29,7 @@ <option>--git-keyid</option> options. To safe typing these option can be specified via the configuration files. You can futhermore change the tag format used when creating tags with the <option>debian-tag</option> - option.</para> + option, the default is <replaceable>debian/<version></replaceable>.</para> <sect1 id="gbp.building.export"> <title>Using a separate build dir</title> <para>Tools like &svn-buildpackage; use a separate build-area. To achieve a similar behaviour @@ -45,7 +50,6 @@ </screen> <para>If you want to default to build in a separate build area you can specify the directory to use in the gbp.conf. - </para> <programlisting> [git-buildpackage] # use a build area relative to the git repository @@ -53,5 +57,22 @@ export-dir=../build-area # to use the same build area for all packages use an absolute path: #export-dir=/home/debian-packages/build-area </programlisting> + </para> + </sect1> + <sect1 id="gbp.building.push"> + <title>Pushing into a remote repository:</title> + <para>If you want to push your changes automatically after a succesful build and tag + you can use &git-buildpackage;'s posttag hook: +<programlisting> +<command>git-buildpackage</command> <option>--git-tag</option> <option>--git-posttag</option>=<replaceable>"git push && git push --tags"</replaceable> +</programlisting> + This assumes you have set up a remote repository to push to in either + <filename>.git/config</filename> or + <filename>.git/remotes/</filename>. Setting up the posttag hook in + <filename>.gbp.conf</filename> looks like: +<programlisting> +<option>posttag</option>=<replaceable>"git push git.debian.org && git push --tags git.debian.org"</replaceable> +</programlisting> + </para> </sect1> </chapter> diff --git a/docs/chapters/import.sgml b/docs/chapters/import.sgml index 1bbca3f0..9a54ae30 100644 --- a/docs/chapters/import.sgml +++ b/docs/chapters/import.sgml @@ -16,6 +16,16 @@ options or via the <option>upstream-branch</option> and <option>debian-branch</option> options in the configuration file. </para> + <para> + If you want to import further versions you can change into your shiny new + &git; repository and just continue with the same command: + <screen> +cd package/ +&git-import-dsc; package_0.1-2.dsc +&git-import-dsc; package_0.1-3.dsc +&git-import-dsc; package_0.2-1.dsc + </screen> + </para> </sect1> <sect1 id="gbp.import.new.upstream"> @@ -27,8 +37,10 @@ &git-import-orig; <filename>/path/to/package_0.2.tar.bz2</filename> &git-import-orig; <filename>/path/to/package-0.2/</filename> </screen> - This puts the upstream souces onto the <option>upstream-branch</option>. - The result of this is then merged onto the <option>debian-branch</option> + This puts the upstream souces onto the <option>upstream-branch</option> and + tags them accordingly (the default tag format is + <replaceable>upstream/<version></replaceable>). + The result is then merged onto the <option>debian-branch</option> and a new &debian; changelog entry is created. You can again specify different branch names via the <option>--upstream-branch</option> and <option>--debian-branch</option> options. You can also filter out content @@ -36,6 +48,8 @@ <screen> &git-import-orig; <option>--filter</option>=<replaceable>'CVS/*'</replaceable> <filename>/path/to/package_0.2.orig.tar.gz</filename> </screen> + The <option>--filter</option> option can be used multiple times for more + complex filtering. </para> <para> If you expect a merge conflict you can delay the merge to the diff --git a/docs/chapters/releases.sgml b/docs/chapters/releases.sgml index 07195a15..1509ae10 100644 --- a/docs/chapters/releases.sgml +++ b/docs/chapters/releases.sgml @@ -2,7 +2,7 @@ <title>Releases and Snapshots</title> <para>When branching and merging frequently, the different Debian changelog entries on the different branches tend to get into the way of the automatic - merge and the the merge fails - leaving the (patholigical) merge to the + merge and the the merge fails - leaving the (pathological) merge to the committer. In order to avoid this &git-dch; offers a way for creating changelog entries from &git; commits before doing a release or anytime between releases.</para> diff --git a/docs/chapters/special.sgml b/docs/chapters/special.sgml index 3ab3bc3d..8f430572 100644 --- a/docs/chapters/special.sgml +++ b/docs/chapters/special.sgml @@ -48,41 +48,55 @@ cleanup-script.sh &gitcmd; <option>branch</option> <replaceable>nmu</replaceable> <replaceable>master</replaceable> </screen> <para> - To import an NMU instead of a new upstream version simply import the - unpacked NUMs source tree into your repository using &git-import-orig: + To import an NMU change into the git repository and use &git-import-dsc;: </para> <screen> &gitcmd; checkout <replaceable>master</replaceable> -&git-import-orig; <option>-u</option> <replaceable>10-1.1</replaceable> <option>--upstream-branch</option>=<replaceable>nmu</replaceable> <filename>/path/to/nmu-10/</filename> +&git-import-dsc; <option>--debian-branch</option>=<replaceable>nmu</replaceable> <filename>/path/to/package_1.0-1nmu0.dsc</filename> </screen> <para> - This will import the NMU onto the branched named <emphasis>nmu</emphasis> branch instead of - the default <option>upstream-branch</option> and merge the changes to the - <option>debian-branch</option> as usual. This method can also be used to - import "old" releases into the &git; repository when migrating to &git; from - another VCS. + This will import the NMU onto the branched named <emphasis>nmu</emphasis> + instead of the default <option>master</option>. This method can also + be used to import "old" releases into the &git; repository when migrating + to &git; from another VCS. </para> </sect1> <sect1 id="gbp.special.pbuilder"> <title>Using &pbuilder;</title> <para> - Since pbuilder use different command line arguments than - &debuild; and &dpkg-buildpackage; we have to use a tiny script that gets - invoked by &git-buildpackage;: + Since &pbuilder; uses different command line arguments than + &debuild; and &dpkg-buildpackage; we can't simply pass the options on the + command line but have to wrap them in the <option>--git-builder</option> + option instead: + +<programlisting> +<command>git-buildpackage</command> <option>--git-builder="pdebuild --debbuildopts '-I.git -i\.git"</option> <option>--git-cleaner="fakeroot debian/rules clean"</option> +</programlisting> + + Note that we also used a different clean command since since &pdebuildcmd; + <option>clean</option> means something different than &debuildcmd; + <option>clean</option>. + + The above is a bit long, so using a tiny script that gets invoked by + &git-buildpackage; is more convienient: + <programlisting> cat <<EOF >/usr/local/bin/git-pbuilder #!/bin/sh -# pass all options to dpkg-buildpackage: +# pass commandline arguments to dpkg-buildpackage <command>pdebuild</command> <option>--debbuildopts</option> "-i\.git -I.git $*" EOF <command>chmod</command> a+x /usr/local/bin/git-pbuilder </programlisting> - Furthermore we need a different clean command, since &pdebuildcmd; - <option>clean</option> means something different than &debuildcmd; - <option>clean</option>. We could put all this on the command line, but - let's put it into the config file to safe typing: + This makes the above look like: + +<programlisting> +<command>git-buildpackage</command> <option>--git-builder=git-pbuilder</option> <option>--git-cleaner="fakeroot debian/rules clean"</option> +</programlisting> + + We can shorten this further by using <filename>~/.gbp.conf</filename>: <programlisting> cat <<EOF > <filename>~/.gbp.conf</filename> @@ -93,11 +107,19 @@ cleaner = fakeroot debian/rules clean # passed to dpkg-buildpackge in the chroot builder = /usr/local/bin/git-pbuilder </programlisting> - - Invoking &git-buildpackage; will now invoke &pdebuildcmd;</para> - <para> - If you don't want this for all your invocations of &git-buildpackage; you can instead - put this into <filename>.git/gbp.conf</filename> in one of your &git; repositories. + + Invoking &git-buildpackage; will now invoke &pdebuildcmd; by + default and all additional command line arguments are passed to + dpkg-buildpackage. If you want to use debuild again (without modifying + <filename>~/.gbp.conf</filename>) you can use: +<programlisting> +<command>git-buildpackage</command> --git-builder=debuild +</programlisting> + + Futhrermore, if you don't want this for all your invocations of + &git-buildpackage; you can use <filename>.git/gbp.conf</filename> in + one of your &git; repositories instead of + <filename>~/.gbp.conf</filename>. </para> <sect1 id="gbp.special.hacking"> diff --git a/docs/manpages/git-buildpackage.sgml b/docs/manpages/git-buildpackage.sgml index 2f1d998f..a0f14c13 100644 --- a/docs/manpages/git-buildpackage.sgml +++ b/docs/manpages/git-buildpackage.sgml @@ -34,6 +34,7 @@ <arg><option>--git-tarball-dir=</option><replaceable>directory</replaceable></arg> <arg><option>--git-export-dir=</option><replaceable>directory</replaceable></arg> <arg><option>--git-export=</option><replaceable>treeish</replaceable></arg> + <arg><option>--git-pristine-tar</option></arg> </cmdsynopsis> </refsynopsisdiv> <refsect1> @@ -160,7 +161,8 @@ <term><option>--git-debian-tag=</option><replaceable>tag-format</replaceable> </term> <listitem> - <para>use this tag format when tagging Debian versions</para> + <para>use this tag format when tagging Debian versions, + default is <replaceable>debian/<version></replaceable></para> </listitem> </varlistentry> <varlistentry> @@ -191,6 +193,13 @@ the treeish object <replaceable>treeish</replaceable>.</para> </listitem> </varlistentry> + <varlistentry> + <term><option>--git-pristine-tar</option> + </term> + <listitem> + <para>use pristine-tar to create the orig.tar.gz</para> + </listitem> + </varlistentry> </variablelist> </refsect1> <refsect1> diff --git a/docs/manpages/git-dch.sgml b/docs/manpages/git-dch.sgml index 0208a651..9f1eccb9 100644 --- a/docs/manpages/git-dch.sgml +++ b/docs/manpages/git-dch.sgml @@ -80,7 +80,8 @@ <term><option>--debian-tag=</option><replaceable>tag-format</replaceable> </term> <listitem> - <para>tag format used, when tagging debian versions</para> + <para>tag format used, when tagging debian versions, + default is <replaceable>debian/<version></replaceable></para> </listitem> </varlistentry> <varlistentry> diff --git a/docs/manpages/git-import-dsc.sgml b/docs/manpages/git-import-dsc.sgml index 38940f76..6fb2cecd 100644 --- a/docs/manpages/git-import-dsc.sgml +++ b/docs/manpages/git-import-dsc.sgml @@ -29,6 +29,7 @@ <arg><option>--debian-tag=</option><replaceable>tag-format</replaceable></arg> <arg><option>--upstream-tag=</option><replaceable>tag-format</replaceable></arg> <arg><option>--filter=</option><replaceable>pattern</replaceable></arg> + <arg><option>--pristine-tar</option></arg> <arg choice="plain"><replaceable>debian-source.dsc</replaceable></arg> </cmdsynopsis> </refsynopsisdiv> @@ -86,21 +87,30 @@ <term><option>--debian-tag=</option><replaceable>tag-format</replaceable> </term> <listitem> - <para>use this tag format when tagging Debian versions</para> + <para>use this tag format when tagging Debian versions, + default is <replaceable>debian/<version></replaceable></para> </listitem> </varlistentry> <varlistentry> <term><option>--upstream-tag=</option><replaceable>tag-format</replaceable> </term> <listitem> - <para>use this tag format when tagging upstream versions</para> + <para>use this tag format when tagging upstream versions, + default is <replaceable>upstream/<version></replaceable></para> </listitem> </varlistentry> <varlistentry> <term><option>--filter=</option><replaceable>filter</replaceable> </term> <listitem> - <para>filter out these files during import</para> + <para>filter out these files during import. Can be given multiple times.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>--pristine-tar</option> + </term> + <listitem> + <para>generate pristine-tar delta file</para> </listitem> </varlistentry> </variablelist> diff --git a/docs/manpages/git-import-orig.sgml b/docs/manpages/git-import-orig.sgml index a8900ddb..d1034eb5 100644 --- a/docs/manpages/git-import-orig.sgml +++ b/docs/manpages/git-import-orig.sgml @@ -24,6 +24,7 @@ <arg><option>--verbose</option></arg> <arg><option>--upstream-version=</option><replaceable>version</replaceable></arg> <arg><option>--no-merge</option></arg> + <arg><option>--no-dch</option></arg> <arg><option>--upstream-branch=</option><replaceable>branch_name</replaceable></arg> <arg><option>--debian-branch=</option><replaceable>branch_name</replaceable></arg> <arg><option>--upstream-version=</option><replaceable>version</replaceable></arg> @@ -31,6 +32,7 @@ <arg><option>--keyid=</option><replaceable>gpg-keyid</replaceable></arg> <arg><option>--upstream-tag=</option><replaceable>tag-format</replaceable></arg> <arg><option>--filter=</option><replaceable>pattern</replaceable></arg> + <arg><option>--pristine-tar</option></arg> <arg choice="plain"><replaceable>upstream-source</replaceable></arg> </cmdsynopsis> </refsynopsisdiv> @@ -69,6 +71,12 @@ </listitem> </varlistentry> <varlistentry> + <term><option>--no-dch</option></term> + <listitem> + <para>don't call dch after the import</para> + </listitem> + </varlistentry> + <varlistentry> <term><option>--upstream-branch</option>=<replaceable>branch_name</replaceable> </term> <listitem> @@ -111,14 +119,22 @@ <term><option>--upstream-tag=</option><replaceable>tag-format</replaceable> </term> <listitem> - <para>use this tag format when tagging upstream versions</para> + <para>use this tag format when tagging upstream versions, + default is <replaceable>upstream/<version></replaceable></para> </listitem> </varlistentry> <varlistentry> <term><option>--filter=</option><replaceable>filter</replaceable> </term> <listitem> - <para>filter out these files during import</para> + <para>filter out these files during import. Can be given multiple times.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>--pristine-tar</option> + </term> + <listitem> + <para>generate pristine-tar delta file</para> </listitem> </varlistentry> </variablelist> @@ -12,6 +12,8 @@ # the default tag formats used: #upstream-tag = upstream/%(version)s #debian-tag = debian/%(version)s +# use pristine-tar: +#pristine-tar = True # Options only affecting git-buildpackage [git-buildpackage] @@ -30,10 +32,12 @@ [git-import-orig] #upstream-branch = newupstream #debian-branch = dfsgclean +#filter = .svn # Options only affecting git-import-dsc [git-import-dsc] #upstream-branch = svn-upstream +#filter = [ 'CVS', '.cvsignore' ] # Options only affecting git-dch [git-dch] diff --git a/gbp/command_wrappers.py b/gbp/command_wrappers.py index f025dfeb..45692da3 100644 --- a/gbp/command_wrappers.py +++ b/gbp/command_wrappers.py @@ -67,20 +67,38 @@ class RunAtCommand(Command): raise +class PristineTar(Command): + cmd='/usr/bin/pristine-tar' + branch='pristine-tar' + + def __init__(self): + if not os.access(self.cmd, os.X_OK): + raise GbpError, "%s not found - cannot use pristine-tar" + Command.__init__(self, self.cmd) + + def commit(self, archive, branch): + self.run_errror = 'Couldn\'t commit to "%s"' % branch + self.__call__(['commit', archive, branch]) + + def checkout(self, archive): + self.run_errror = 'Couldn\'t checkout "%s"' % archive + self.__call__(['checkout', archive]) + + class UnpackTarArchive(Command): """Wrap tar to Unpack a gzipped tar archive""" - def __init__(self, archive, dir, filter=""): + def __init__(self, archive, dir, filters=[]): self.archive = archive self.dir = dir - exclude = [ "", "--exclude=%s" % filter ][len(filter) > 0] + exclude = [("--exclude=%s" % filter) for filter in filters] if archive.lower().endswith(".bz2"): decompress = "--bzip2" else: decompress = "--gzip" - Command.__init__(self, 'tar', [ exclude, '-C', dir, decompress, '-xf', archive ]) - self.run_error = "Couldn't unpack %s" % self.archive + Command.__init__(self, 'tar', exclude + ['-C', dir, decompress, '-xf', archive ]) + self.run_error = 'Couldn\'t unpack "%s"' % self.archive class RemoveTree(Command): @@ -88,7 +106,7 @@ class RemoveTree(Command): def __init__(self, tree): self.tree = tree Command.__init__(self, 'rm', [ '-rf', tree ]) - self.run_error = "Couldn't remove %s" % self.tree + self.run_error = 'Couldn\'t remove "%s"' % self.tree class Dch(Command): @@ -110,64 +128,64 @@ class DpkgSourceExtract(Command): Command.__init__(self, 'dpkg-source', ['-x']) def __call__(self, dsc, output_dir): - self.run_error = "Couldn't extract %s" % dsc + self.run_error = 'Couldn\'t extract "%s"' % dsc Command.__call__(self, [dsc, output_dir]) class GitCommand(Command): "Mother/Father of all git commands" def __init__(self, cmd, args=[]): - Command.__init__(self, 'git-'+cmd, args) + Command.__init__(self, 'git', [cmd] + args) class GitInitDB(GitCommand): - """Wrap git-init-db""" + """Wrap git init-db""" def __init__(self): GitCommand.__init__(self, 'init-db') self.run_error = "Couldn't init git repository" class GitShowBranch(GitCommand): - """Wrap git-show-branch""" + """Wrap git show-branch""" def __init__(self): GitCommand.__init__(self, 'branch') self.run_error = "Couldn't list branches" class GitBranch(GitCommand): - """Wrap git-branch""" + """Wrap git branch""" def __init__(self): GitCommand.__init__(self, 'branch') def __call__(self, branch): - self.run_error = "Couldn't create branch %s" % (branch,) + self.run_error = 'Couldn\'t create branch "%s"' % (branch,) GitCommand.__call__(self, [branch]) class GitCheckoutBranch(GitCommand): - """Wrap git-checkout in order tos switch to a certain branch""" + """Wrap git checkout in order tos switch to a certain branch""" def __init__(self, branch): GitCommand.__init__(self, 'checkout', [branch]) self.branch = branch - self.run_error = "Couldn't switch to %s branch" % self.branch + self.run_error = 'Couldn\'t switch to branch "%s"' % self.branch class GitPull(GitCommand): - """Wrap git-pull""" + """Wrap git pull""" def __init__(self, repo, branch): GitCommand.__init__(self, 'pull', [repo, branch]) - self.run_error = "Couldn't pull %s to %s" % (branch, repo) + self.run_error = 'Couldn\'t pull "%s" to "%s"' % (branch, repo) class GitTag(GitCommand): - """Wrap git-tag""" + """Wrap git tag""" def __init__(self, sign_tag=False, keyid=None): GitCommand.__init__(self,'tag') self.sign_tag = sign_tag self.keyid = keyid def __call__(self, version, msg="Tagging %(version)s"): - self.run_error = "Couldn't tag %s" % (version,) + self.run_error = 'Couldn\'t tag "%s"' % (version,) if self.sign_tag: if self.keyid: sign_opts = [ '-u', self.keyid ] @@ -179,21 +197,22 @@ class GitTag(GitCommand): class GitAdd(GitCommand): - """Wrap git-add to add new files""" + """Wrap git add to add new files""" def __init__(self): GitCommand.__init__(self, 'add') self.run_error = "Couldn't add files" class GitRm(GitCommand): - """Wrap git-rm to remove files""" - def __init__(self): - GitCommand.__init__(self, 'rm') + """Wrap git rm to remove files""" + def __init__(self, verbose=False): + args = [ ['-q'], [] ][verbose] + GitCommand.__init__(self, cmd='rm', args=args) self.run_error = "Couldn't remove files" class GitCommitAll(GitCommand): - """Wrap git-commit to commit all changes""" + """Wrap git commit to commit all changes""" def __init__(self, verbose=False): args = ['-a'] + [ ['-q'], [] ][verbose] GitCommand.__init__(self, cmd='commit', args=args) @@ -204,7 +223,7 @@ class GitCommitAll(GitCommand): GitCommand.__call__(self, args) -def copy_from(orig_dir, filter=""): +def copy_from(orig_dir, filters=[]): """ copy a source tree over via tar @param orig_dir: where to copy from @@ -212,10 +231,10 @@ def copy_from(orig_dir, filter=""): @return: list of copied files @rtype: list """ - exclude = [ "", "--exclude=%s" % filter ][len(filter) > 0] + exclude = [("--exclude=%s" % filter) for filter in filters] try: - p1 = subprocess.Popen(["tar", exclude, "-cSpf", "-", "." ], stdout=subprocess.PIPE, cwd=orig_dir) + p1 = subprocess.Popen(["tar"] + exclude + ["-cSpf", "-", "." ], stdout=subprocess.PIPE, cwd=orig_dir) p2 = subprocess.Popen(["tar", "-xvSpf", "-" ], stdin=p1.stdout, stdout=subprocess.PIPE) files = p2.communicate()[0].split('\n') except OSError, err: diff --git a/gbp/config.py b/gbp/config.py index e1e11a2e..c18fc283 100644 --- a/gbp/config.py +++ b/gbp/config.py @@ -27,13 +27,14 @@ class GbpOptionParser(OptionParser): 'cleaner' : 'debuild clean', 'debian-branch' : 'master', 'upstream-branch' : 'upstream', + 'pristine-tar' : '', # empty means False 'sign-tags' : '', # empty means False 'no-create-orig' : '', # empty means False 'keyid' : '', 'posttag' : '', 'debian-tag' : 'debian/%(version)s', 'upstream-tag' : 'upstream/%(version)s', - 'filter' : '', + 'filter' : [], 'snapshot-number' : 'snapshot + 1', 'git-log' : '--no-merges', 'export-dir' : '', @@ -51,6 +52,13 @@ class GbpOptionParser(OptionParser): self.config = dict(parser.defaults()) if parser.has_section(self.command): self.config.update(dict(parser.items(self.command, raw=True))) + # filter can be either a list or a string, always build a list: + if self.config['filter']: + if self.config['filter'].startswith('['): + self.config['filter'] = eval(self.config['filter']) + else: + self.config['filter'] = [ self.config['filter'] ] + def __init__(self, command, prefix='', usage=None): self.command = command diff --git a/gbp/deb_utils.py b/gbp/deb_utils.py index e62de26b..2e7b7078 100644 --- a/gbp/deb_utils.py +++ b/gbp/deb_utils.py @@ -7,16 +7,27 @@ import email import commands import os import shutil +import command_wrappers as gbpc # When trying to parse a version-number from a dsc or changes file, these are # the valid characters. debian_version_chars = 'a-zA-Z\d.~+-' +class NoChangelogError(Exception): + """no changelog found""" + pass + +class ParseChangeLogError(Exception): + """problem parsing changelog""" + pass + def parse_changelog(changelog): """parse changelog file changelog""" + if not os.access(changelog, os.F_OK): + raise NoChangelogError, "Changelog %s not found" % (changelog, ) status, output = commands.getstatusoutput('dpkg-parsechangelog -l%s' % (changelog, )) if status: - return None + raise ParseChangeLogError, output cp = email.message_from_string(output) if '-' in cp['Version']: upstream_version, cp['Debian-Version'] = cp['Version'].rsplit('-', 1) @@ -62,4 +73,17 @@ def copy_orig(cp, orig_dir, output_dir): return False return True +def unpack_orig(archive, tmpdir, filters): + """ + unpack a .orig.tar.gz to tmpdir, leave the cleanup to the caller in case of + an error + """ + try: + unpackArchive = gbpc.UnpackTarArchive(archive, tmpdir, filters) + unpackArchive() + except gbpc.CommandExecFailed: + print >>sys.stderr, "Unpacking of %s failed" % archive + raise GbpError + return unpackArchive.dir + # vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: diff --git a/gbp/git_utils.py b/gbp/git_utils.py index fffa3f64..90802cc3 100644 --- a/gbp/git_utils.py +++ b/gbp/git_utils.py @@ -5,6 +5,7 @@ import subprocess import os.path +from command_wrappers import (GitAdd, GitRm, copy_from) class GitRepositoryError(Exception): """Exception thrown by GitRepository""" @@ -21,7 +22,7 @@ class GitRepository(object): raise GitRepositoryError self.path = os.path.abspath(path) - + def __check_path(self): if os.getcwd() != self.path: raise GitRepositoryError @@ -53,6 +54,12 @@ class GitRepository(object): out, ret = self.__git_getoutput('ls-tree', [ treeish ]) return [ True, False ][ret != 0] + def has_tag(self, tag): + """check if the repository has the given tag""" + self.__check_path() + out, ret = self.__git_getoutput('tag', [ '-l', tag ]) + return [ False, True ][len(out)] + def get_branch(self): """on what branch is the current working copy""" @@ -98,4 +105,19 @@ def sanitize_version(version): version = version.split(':', 1)[1] return version.replace('~', '.') -# vim:et:ts=4:sw=4: + +def replace_source_tree(repo, src_dir, filters, verbose=False): + """ + make the current wc match what's in src_dir + @return: True if wc was modified + @rtype: boolean + """ + old = set(repo.index_files()) + new = set(copy_from(src_dir, filters)) + GitAdd()(['.']) + files = [ obj for obj in old - new if not os.path.isdir(obj)] + if files: + GitRm(verbose=verbose)(files) + return not repo.is_clean()[0] + +# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: diff --git a/git-buildpackage b/git-buildpackage index 5d037cd3..a11e43e6 100755 --- a/git-buildpackage +++ b/git-buildpackage @@ -23,9 +23,10 @@ import os, os.path import errno import pipes import time +import gbp.deb_utils as du from gbp.git_utils import (GitRepositoryError, GitRepository, build_tag) -from gbp.deb_utils import (parse_changelog, is_native, orig_file, has_orig, copy_orig) -from gbp.command_wrappers import (GitTag, Command, RunAtCommand, CommandExecFailed, RemoveTree) +from gbp.command_wrappers import (GitTag, Command, RunAtCommand, CommandExecFailed, + PristineTar, RemoveTree) from gbp.config import GbpOptionParser from gbp.errors import GbpError @@ -47,9 +48,9 @@ def git_archive_pipe(prefix, pipe, output, treeish): return True -def create_orig(cp, output_dir, treeish): - "create an orig.tar.gz in output_dir" - output = os.path.join(output_dir, orig_file(cp)) +def git_archive(cp, output_dir, treeish): + "create an orig.tar.gz in output_dir using git_archive" + output = os.path.join(output_dir, du.orig_file(cp)) prefix = "%s-%s" % (cp['Source'], cp['Upstream-Version']) gzip_opts = "-9 -n" @@ -89,6 +90,35 @@ def prepare_output_dir(dir): raise GbpError, "Cannot create output dir %s" % output_dir return output_dir +def pristine_tar_build_orig(repo, cp, output_dir, options): + """ + build orig using pristine-tar + @return: True: orig.tar.gz build, False: noop + """ + if options.pristine_tar: + pt = PristineTar() + if not repo.has_branch(pt.branch): + print >>sys.stderr, 'Pristine-tar branch "%s" not found' % pt.branch + pt.checkout(os.path.join(output_dir, du.orig_file(cp))) + return True + else: + return False + +def git_archive_build_orig(repo, cp, output_dir, options): + """build orig using git-archive""" + # --upstream-branch was given on the command line, so use this: + if options.upstream_branch != GbpOptionParser.defaults['upstream-branch']: + upstream_tree = options.upstream_branch + else: + upstream_tree = build_tag(options.upstream_tag, cp['Upstream-Version']) + # fall back to the upstream-branch tip if the tag doesn't exist + if not repo.has_treeish(upstream_tree): + upstream_tree = GbpOptionParser.defaults['upstream-branch'] + print "%s does not exist, creating from '%s'" % (du.orig_file(cp), upstream_tree) + if not repo.has_treeish(upstream_tree): + raise GbpError # git-ls-tree printed an error message already + if not git_archive(cp, output_dir, upstream_tree): + raise GbpError, "Cannot create upstream tarball at '%s'" % output_dir def main(argv): changelog = 'debian/changelog' @@ -135,6 +165,8 @@ def main(argv): help="before building export into EXPORT_DIR") parser.add_config_file_option(option_name="tarball-dir", dest="tarball_dir", help="location to look for external tarballs") + parser.add_config_file_option(option_name="pristine-tar", dest="pristine_tar", + help="Use pristine-tar to create .orig.tar.gz", action="store_true") parser.add_option("--git-export", dest="treeish", default=default_tree, help="export treeish object TREEISH, default is '%s'" % default_tree) (options, args) = parser.parse_args(args) @@ -164,15 +196,18 @@ def main(argv): print >>sys.stderr, "You are not on branch '%s' but on '%s'" % (options.debian_branch, branch) raise GbpError, "Use --git-ignore-new to ignore or --git-debian-branch to set the branch name." - cp = parse_changelog(changelog) - if not cp: - raise GbpError,"'%s' does not exist, not a debian package" % changelog + try: + cp = du.parse_changelog(changelog) + except du.NoChangelogError: + raise GbpError, "'%s' does not exist, not a debian package" % changelog + except du.ParseChangeLogError, err: + raise GbpError, "Error parsing Changelog: %s" % err output_dir = prepare_output_dir(options.export_dir) if options.tarball_dir: - tarball_dir = options.tarball_dir + tarball_dir = options.tarball_dir else: - tarball_dir = output_dir + tarball_dir = output_dir if not repo.has_treeish(options.treeish): raise GbpError # git-ls-tree printed an error message already @@ -181,8 +216,8 @@ def main(argv): tmp_dir = os.path.join(output_dir, "%s-tmp" % cp['Source']) print "Exporting '%s' to '%s'" % (options.treeish, tmp_dir) dump_tree(tmp_dir, options.treeish) - cp = parse_changelog(os.path.join(tmp_dir, 'debian', 'changelog')) - if is_native(cp): + cp = du.parse_changelog(os.path.join(tmp_dir, 'debian', 'changelog')) + if du.is_native(cp): version = cp['Debian-Version'] else: version = cp['Upstream-Version'] @@ -191,28 +226,17 @@ def main(argv): move_old_export(export_dir) os.rename(tmp_dir, export_dir) - # Get the orig.tar.gz if necessary: - if not is_native(cp): - if has_orig(cp, output_dir): + # Get/build the orig.tar.gz if necessary: + if not du.is_native(cp): + if du.has_orig(cp, output_dir): pass elif options.tarball_dir: # separate tarball dir specified print "Getting orig tarbball from %s" % tarball_dir - if not copy_orig(cp, tarball_dir, output_dir): + if not du.copy_orig(cp, tarball_dir, output_dir): raise GbpError, "Cannot copy orig tarball from %s" % tarball_dir elif not options.no_create_orig: - # --upstream-branch was given on the command line, so use this: - if options.upstream_branch != GbpOptionParser.defaults['upstream-branch']: - upstream_tree = options.upstream_branch - else: - upstream_tree = build_tag(options.upstream_tag, cp['Upstream-Version']) - # fall back to the upstream-branch tip if the tag doesn't exist - if not repo.has_treeish(upstream_tree): - upstream_tree = GbpOptionParser.defaults['upstream-branch'] - print "%s does not exist, creating from '%s'" % (orig_file(cp), upstream_tree) - if not repo.has_treeish(upstream_tree): - raise GbpError # git-ls-tree printed an error message already - if not create_orig(cp, output_dir, upstream_tree): - raise GbpError, "Cannot create upstream tarball at '%s'" % output_dir + if not pristine_tar_build_orig(repo, cp, output_dir, options): + git_archive_build_orig(repo, cp, output_dir, options) if options.export_dir: build_dir = export_dir diff --git a/git-import-dsc b/git-import-dsc index 37de62d7..59d2c215 100755 --- a/git-import-dsc +++ b/git-import-dsc @@ -22,9 +22,10 @@ import re import os import tempfile import glob +import pipes import gbp.command_wrappers as gbpc -from gbp.deb_utils import debian_version_chars -from gbp.git_utils import build_tag, GitRepository +from gbp.deb_utils import debian_version_chars, unpack_orig +from gbp.git_utils import build_tag, GitRepository, GitRepositoryError, replace_source_tree from gbp.config import GbpOptionParser from gbp.errors import GbpError @@ -34,10 +35,12 @@ class DscFile(object): pkg_re = re.compile('Source:\s+(?P<pkg>.+)\s*') version_re = re.compile("Version:\s(\d+\:)?(?P<version>[%s]+)\s*$" % debian_version_chars) tar_re = re.compile('^\s\w+\s\d+\s+(?P<tar>[^_]+_[^_]+(\.orig)?\.tar\.(gz|bz2))') + diff_re = re.compile('^\s\w+\s\d+\s+(?P<diff>[^_]+_[^_]+\.diff.(gz|bz2))') def __init__(self, dscfile): self.dscfile = os.path.abspath(dscfile) f = file(self.dscfile) + fromdir = os.path.dirname(os.path.abspath(dscfile)) for line in f: m = self.version_re.match(line) if m: @@ -55,9 +58,12 @@ class DscFile(object): continue m = self.tar_re.match(line) if m: - fromdir = os.path.dirname(dscfile) self.tgz = os.path.join(fromdir, m.group('tar')) continue + m = self.diff_re.match(line) + if m: + self.diff = os.path.join(fromdir, m.group('diff')) + continue f.close() @@ -82,64 +88,64 @@ def parse_dsc(dscfile): return dsc -def import_initial(src, dirs, options, tagger, filter): +def import_initial(src, dirs, options): """ import the intial version and (in the case of a non native package) create the 'upstream' branch. Tag everything appropriately. """ try: - unpackTGZ = gbpc.UnpackTarArchive(src.tgz, dirs['tmp'], filter=filter) - unpackTGZ() - except gbpc.CommandExecFailed: - print >>sys.stderr, "Unpacking of %s failed" % src.tgz - gbpc.RemoveTree(dirs['tmp'])() - return False - - try: - dirs['git'] = glob.glob('%s/*' % unpackTGZ.dir)[0] os.chdir(dirs['git']) gbpc.GitInitDB()() gbpc.GitAdd()(['.']) gbpc.GitCommitAll()( - msg="Imported %s version %s" % (['upstream', 'Debian'][src.native], + msg="Imported %s version %s" % (['Upstream', 'Debian'][src.native], src.upstream_version)) - format = [options.upstream_tag, options.debian_tag][src.native] - tagger(build_tag(format, src.upstream_version), - msg="Upstream version %s" % src.upstream_version) if not src.native: gbpc.GitBranch()(options.upstream_branch) + if options.pristine_tar: + gbpc.PristineTar().commit(os.path.join(dirs['top'], src.tgz), + options.upstream_branch) except gbpc.CommandExecFailed: print >>sys.stderr, "Creation of git repository failed" - gbpc.RemoveTree(unpackTGZ.dir)() return False return True -def apply_debian_patch(src, dirs, options, tagger, filter): +def git_apply_patch(diff): + "Import patch via git-apply" + pipe = pipes.Template() + pipe.prepend('gunzip -c %s' % diff, '.-') + pipe.append('git-apply --index --apply --whitespace=nowarn -', '-.') + try: + ret = pipe.copy('', '') + if ret: + print >>sys.stderr, "Error import %s: %d" % (diff, ret) + return False + except OSError, err: + print >>sys.stderr, "Error importing %s: %s" % (diff, err[0]) + return False + return True + + +def apply_debian_patch(src, dirs, options): """apply the debian patch and tag appropriately""" + version = "%s-%s" % (src.upstream_version, src.debian_version) + gitTag = gbpc.GitTag(options.sign_tags, options.keyid) try: - version = "%s-%s" % (src.upstream_version, src.debian_version) - gbpc.DpkgSourceExtract()(src.dscfile, dirs['dpkg-src']) os.chdir(dirs['git']) repo = GitRepository('.') - - old = set(repo.index_files()) - new = set(gbpc.copy_from(dirs['dpkg-src'], filter)) - gbpc.GitAdd()(['.']) - files = [ obj for obj in old - new if not os.path.isdir(obj)] - if files: - gbpc.GitRm()(files) + if src.__dict__.has_key('diff') and not git_apply_patch(src.diff): + raise GbpError + os.chmod('debian/rules', 0755) if not repo.is_clean()[0]: gbpc.GitCommitAll()(msg="Imported Debian patch %s" % version) else: print "Nothing to commit, nothing imported." - - tagger(build_tag(options.debian_tag, version), + gitTag(build_tag(options.debian_tag, version), msg="Debian release %s" % version) except gbpc.CommandExecFailed: print >>sys.stderr, "Failed to import Debian package" - return False - return True + raise GbpError def move_tree(src, dirs): @@ -150,12 +156,11 @@ def move_tree(src, dirs): print >>sys.stderr, "Cannot move git repository '%s' to it's final location '%s': %s" % (dirs['git'], os.path.abspath(src.pkg), err) return False - else: - gbpc.RemoveTree(dirs['tmp'])() return True def create_debian_branch(debian_branch, dirs): + """create the debian branch if necessary""" os.chdir(dirs['git']) repo = GitRepository('.') if repo.get_branch() != debian_branch: @@ -187,8 +192,11 @@ def main(argv): help="Format string for debian tags, default is '%(debian-tag)s'") parser.add_config_file_option(option_name="upstream-tag", dest="upstream_tag", help="Format string for upstream tags, default is '%(upstream-tag)s'") - parser.add_config_file_option(option_name="filter", dest="filter", - help="files to filter out during import") + parser.add_config_file_option(option_name="filter", dest="filters", + help="files to filter out during import (can be given multiple times)", + action="append") + parser.add_config_file_option(option_name="pristine-tar", dest="pristine_tar", + help="Use pristine-tar to import the tarball", action="store_true") (options, args) = parser.parse_args(argv[1:]) if options.verbose: @@ -200,31 +208,71 @@ def main(argv): if len(args) != 1: parser.print_help() raise GbpError - else: + else: src = parse_dsc(args[0]) if not src: raise GbpError - dirs['tmp'] = os.path.abspath(tempfile.mkdtemp(dir='.')) - if not import_initial(src, dirs, options, gitTag, options.filter): - raise GbpError - os.chdir(dirs['top']) - if not src.native: - dirs['unpack'] = os.path.join(dirs['tmp'], 'unpack') - os.mkdir(dirs['unpack']) - dirs['dpkg-src'] = os.path.join(dirs['unpack'], - "%s-%s-%s" % (src.pkg, src.upstream_version, src.debian_version)) - if not apply_debian_patch(src, dirs, options, gitTag, options.filter): + try: + repo = GitRepository('.') + (clean, out) = repo.is_clean() + if not clean: + print >>sys.stderr, "Repository has uncommitted changes, commit these first: " + raise GbpError, out + dirs['tmp'] = os.path.abspath(tempfile.mkdtemp(dir='..')) + initial = False + except GitRepositoryError: + # The initial import is different: + print "No git repository found, creating one." + dirs['tmp'] = os.path.abspath(tempfile.mkdtemp(dir='.')) + initial = True + + unpack_dir = unpack_orig(src.tgz, dirs['tmp'], options.filters) + + format = [(options.upstream_tag, "Upstream"), (options.debian_tag, "Debian")][src.native] + tag = build_tag(format[0], src.upstream_version) + msg = "%s version %s" % (format[1], src.upstream_version) + + if initial: + dirs['git'] = glob.glob('%s/*' % unpack_dir)[0] + if not import_initial(src, dirs, options): raise GbpError - create_debian_branch(options.debian_branch, dirs) - os.chdir(dirs['top']) - if not move_tree(src, dirs): - raise GbpError + gitTag(tag, msg=msg) + os.chdir(dirs['top']) + if not src.native: + apply_debian_patch(src, dirs, options) + create_debian_branch(options.debian_branch, dirs) + os.chdir(dirs['top']) + if not move_tree(src, dirs): + raise GbpError + else: # not the initial import + dirs['git'] = dirs['top'] + unpack_dir = glob.glob('%s/*' % unpack_dir)[0] + if not repo.has_tag(tag): + print "tag %s not found, importing %s tarball" % (tag, format[1]) + # FIXME: this is what import-orig does - merge + if not src.native: + gbpc.GitCheckoutBranch(options.upstream_branch)() + replace_source_tree(repo, unpack_dir, options.filters, verbose=True) + gbpc.GitCommitAll()(msg="Imported %s" % msg) + gitTag(tag, msg=msg) + if options.pristine_tar and not src.native: + gbpc.PristineTar().commit(src.tgz, options.upstream_branch) + if not src.native: + gbpc.GitCheckoutBranch(options.debian_branch)() + replace_source_tree(repo, unpack_dir, options.filters) + apply_debian_patch(src, dirs, options) + except gbpc.CommandExecFailed: + os.chdir(dirs['top']) + ret = 1 except GbpError, err: if len(err.__str__()): print >>sys.stderr, err - ret = 1 os.chdir(dirs['top']) + ret = 1 + + if dirs.has_key('tmp'): + gbpc.RemoveTree(dirs['tmp'])() if not ret: print 'Everything imported under %s' % src.pkg diff --git a/git-import-orig b/git-import-orig index f3344bec..0d0d3a65 100755 --- a/git-import-orig +++ b/git-import-orig @@ -25,7 +25,8 @@ import re import glob import subprocess import gbp.command_wrappers as gbpc -from gbp.git_utils import (GitRepositoryError, GitRepository, build_tag) +from gbp.deb_utils import unpack_orig +from gbp.git_utils import (GitRepositoryError, GitRepository, build_tag, replace_source_tree) from gbp.config import GbpOptionParser from gbp.errors import GbpError @@ -38,29 +39,11 @@ def cleanup_tmp_tree(tree): print >>sys.stderr, "Removal of tmptree %s failed." % tree -def unpack_orig(archive, tmpdir): - """unpack a .orig.tar.gz""" +def import_upstream_tree(repo, src_dir, version, filters, verbose): + """import the source uptream tree to the current branch""" try: - unpackArchive = gbpc.UnpackTarArchive(archive, tmpdir) - unpackArchive() - except gbpc.CommandExecFailed: - print "Unpacking of %s failed" % archive - cleanup_tmp_tree(unpackArchive.dir) - raise GbpError - return unpackArchive.dir - - -def import_source_tree(repo, orig_dir, version, filter, verbose): - """import source tree to the current branch""" - try: - old = set(repo.index_files()) - new = set(gbpc.copy_from(orig_dir, filter)) - gbpc.GitAdd()(['.']) - files = [ obj for obj in old - new if not os.path.isdir(obj)] - if files: - gbpc.GitRm()(files) - if not repo.is_clean()[0]: - gbpc.GitCommitAll(verbose=verbose)(msg="Imported upstream version %s" % version) + if replace_source_tree(repo, src_dir, filters, verbose=True): + gbpc.GitCommitAll(verbose=verbose)(msg="Imported Upstream version %s" % version) else: raise GbpError, "Nothing to commit, nothing imported." except gbpc.CommandExecFailed: @@ -98,6 +81,8 @@ def main(argv): help="verbose command execution") parser.add_option("--no-merge", dest='merge', action="store_false", default=True, help="after import dont do any merging to another branch") + parser.add_option("--no-dch", dest='run_dch', action="store_false", default=True, + help="don't call dch after the import") parser.add_config_file_option(option_name="debian-branch", dest='debian_branch', help="branch the debian patch is being developed on, default is '%(debian-branch)s'") parser.add_config_file_option(option_name="upstream-branch", dest="upstream_branch", @@ -108,18 +93,21 @@ def main(argv): help="GPG keyid to sign tags with") parser.add_config_file_option(option_name="upstream-tag", dest="upstream_tag", help="format string for upstream tags, default is '%(upstream-tag)s'") - parser.add_config_file_option(option_name="filter", dest="filter", - help="files to filter out during import") + parser.add_config_file_option(option_name="filter", dest="filters", + help="files to filter out during import (can be given multiple times)", + action="append") + parser.add_config_file_option(option_name="pristine-tar", dest="pristine_tar", + help="run pristine-tar to import the tarball", action="store_true") (options, args) = parser.parse_args(argv[1:]) + if options.verbose: + gbpc.Command.verbose = True + gitCheckoutMaster = gbpc.GitCheckoutBranch(options.debian_branch) gitShowBranch = gbpc.GitShowBranch() gitPullUpstream = gbpc.GitPull('.', options.upstream_branch) try: - if options.verbose: - gbpc.Command.verbose = True - if len(args) != 1: parser.print_help() raise GbpError @@ -166,19 +154,28 @@ on howto create it otherwise use --upstream-branch to specify it. orig_dir = archive else: tmpdir = tempfile.mkdtemp(dir='../') - unpack_orig(archive, tmpdir) + unpack_orig(archive, tmpdir, options.filters) if options.verbose: print "Unpacked %s to '%s'" % (archive , tmpdir) - orig_dir = glob.glob(tmpdir+'/*')[0] + unpacked = glob.glob(tmpdir+'/*') + # archive has everything packed up in one subdir: + if len(unpacked) == 1: + orig_dir = unpacked[0] + # archive content not in a subdir + else: + orig_dir = tmpdir try: + filter_msg = ["", " (filtering out %s)" % options.filters][len(options.filters) > 0] if not is_empty: - print "Importing '%s' to branch '%s'..." % (archive, options.upstream_branch) + print "Importing '%s' to branch '%s'%s..." % (archive, options.upstream_branch, filter_msg) gbpc.GitCheckoutBranch(options.upstream_branch)() else: - print "Initial import of '%s'..." % archive + print "Initial import of '%s' %s..." % (archive, filter_msg) - import_source_tree(repo, orig_dir, version, options.filter, verbose=not is_empty) + import_upstream_tree(repo, orig_dir, version, options.filters, verbose=not is_empty) + if options.pristine_tar: + gbpc.PristineTar().commit(archive, options.upstream_branch) gbpc.GitTag(options.sign_tags, options.keyid)(build_tag(options.upstream_tag, version), msg="Upstream version %s" % version) @@ -192,7 +189,8 @@ on howto create it otherwise use --upstream-branch to specify it. gitPullUpstream() except gbpc.CommandExecFailed: raise GbpError, """Merge failed, please resolve and run "dch -v %s-1".""" % version - gbpc.Dch("%s-1" % version, 'New Upstream Version')() + if options.run_dch: + gbpc.Dch("%s-1" % version, 'New Upstream Version')() except gbpc.CommandExecFailed: raise GbpError, "Import of %s failed" % archive except GbpError, err: |