summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2013-04-13 03:02:02 +0200
committerGuido Günther <agx@sigxcpu.org>2013-04-13 14:26:24 +0200
commitd510f2a0c1cf6ca3a2c112e864774a46b2836efb (patch)
tree0e5653873dfc8a3b7e9501b3b12e216e0b0061ab
parenta60f37dab018ee827aef631f0e1646e720194655 (diff)
Honor debian/source/format
when checking if a package is a native package Closes: #669267
-rw-r--r--gbp/deb/source.py16
-rwxr-xr-xgbp/scripts/buildpackage.py77
-rw-r--r--tests/test_GitVfs.py3
3 files changed, 57 insertions, 39 deletions
diff --git a/gbp/deb/source.py b/gbp/deb/source.py
index 5d2a9478..699038ae 100644
--- a/gbp/deb/source.py
+++ b/gbp/deb/source.py
@@ -49,6 +49,8 @@ class DebianSource(object):
@param vfs: a class that implemented GbpVFS interfacce or
a directory (which will used the DirGbpVFS class.
"""
+ self._changelog = None
+
if isinstance(vfs, basestring):
self._vfs = FileVfs(vfs)
else:
@@ -66,10 +68,16 @@ class DebianSource(object):
pass # Fall back to changelog parsing
try:
- clf = self._vfs.open('debian/changelog')
- cl = ChangeLog(clf.read())
- return cl.is_native()
+ return self.changelog.is_native()
except IOError as e:
raise DebianSourceError("Failed to determine source format: %s" % e)
-
+ @property
+ def changelog(self):
+ """
+ Return the L{gbp.deb.ChangeLog}
+ """
+ if not self._changelog:
+ clf = self._vfs.open('debian/changelog')
+ self._changelog = ChangeLog(clf.read())
+ return self._changelog
diff --git a/gbp/scripts/buildpackage.py b/gbp/scripts/buildpackage.py
index bdb3177e..3410d745 100755
--- a/gbp/scripts/buildpackage.py
+++ b/gbp/scripts/buildpackage.py
@@ -28,7 +28,8 @@ from gbp.command_wrappers import (Command,
RemoveTree)
from gbp.config import (GbpOptionParserDebian, GbpOptionGroup)
from gbp.deb.git import (GitRepositoryError, DebianGitRepository)
-from gbp.deb.changelog import ChangeLog, NoChangeLogError, ParseChangeLogError
+from gbp.deb.source import DebianSource
+from gbp.git.vfs import GitVfs
from gbp.errors import GbpError
import gbp.log
import gbp.notifications
@@ -130,13 +131,13 @@ def write_tree(repo, options):
return tree
-def export_source(repo, tree, cp, options, dest_dir, tarball_dir):
+def export_source(repo, tree, source, options, dest_dir, tarball_dir):
"""
Export a version of the source tree when building in a separate directory
@param repo: the git repository to export from
@type repo: L{gbp.git.GitRepository}
- @param cp: the package's changelog
+ @param source: the source package
@param options: options to apply
@param dest_dir: where to export the source to
@param tarball_dir: where to fetch the tarball from in overlay mode
@@ -144,9 +145,12 @@ def export_source(repo, tree, cp, options, dest_dir, tarball_dir):
"""
# Extract orig tarball if git-overlay option is selected:
if options.overlay:
- if cp.is_native():
+ if source.is_native():
raise GbpError("Cannot overlay Debian native package")
- extract_orig(os.path.join(tarball_dir, du.orig_file(cp, options.comp_type)), dest_dir)
+ extract_orig(os.path.join(tarball_dir,
+ du.orig_file(source.changelog,
+ options.comp_type)),
+ dest_dir)
gbp.log.info("Exporting '%s' to '%s'" % (options.export, dest_dir))
if not dump_tree(repo, dest_dir, tree, options.with_submodules):
@@ -181,22 +185,18 @@ def extract_orig(orig_tarball, dest_dir):
#}
-def fetch_changelog(repo, options, tree):
- """Fetch the correct changelog based on the options given"""
- changelog = 'debian/changelog'
-
+def source_vfs(repo, options, tree):
+ """Init source package info either from git or from working copy"""
+ # FIXME: just init the correct vfs
try:
if tree:
- cp = du.parse_changelog_repo(repo, tree, changelog)
+ source = DebianSource(GitVfs(repo, tree))
else:
- cp = ChangeLog(filename=changelog)
- except NoChangeLogError:
- raise GbpError("'%s' does not exist, not a debian package" % changelog)
- except ParseChangeLogError as err:
- raise GbpError("Error parsing Changelog: %s" % err)
- except KeyError:
- raise GbpError("Can't parse version from changelog")
- return cp
+ source = DebianSource('.')
+ source.is_native() # check early if this works
+ except Exception as e:
+ raise GbpError("Can't determine package type: %s" % e)
+ return source
def prepare_output_dir(dir):
@@ -452,7 +452,7 @@ def parse_args(argv, prefix):
def main(argv):
retval = 0
prefix = "git-"
- cp = None
+ source = None
branch = None
options, gbp_args, dpkg_args = parse_args(argv, prefix)
@@ -490,7 +490,7 @@ def main(argv):
raise GbpError("Use --git-ignore-branch to ignore or --git-debian-branch to set the branch name.")
tree = write_tree(repo, options)
- cp = fetch_changelog(repo, options, tree)
+ source = source_vfs(repo, options, tree)
if not options.tag_only:
output_dir = prepare_output_dir(options.export_dir)
tarball_dir = options.tarball_dir or output_dir
@@ -500,17 +500,17 @@ def main(argv):
# sources and create different tarballs (#640382)
# We don't delay it in general since we want to fail early if the
# tarball is missing.
- if not cp.is_native():
+ if not source.is_native():
if options.postexport:
gbp.log.info("Postexport hook set, delaying tarball creation")
else:
- prepare_upstream_tarball(repo, cp, options, tarball_dir,
+ prepare_upstream_tarball(repo, source.changelog, options, tarball_dir,
output_dir)
# Export to another build dir if requested:
if options.export_dir:
- tmp_dir = os.path.join(output_dir, "%s-tmp" % cp['Source'])
- export_source(repo, tree, cp, options, tmp_dir, output_dir)
+ tmp_dir = os.path.join(output_dir, "%s-tmp" % source.changelog['Source'])
+ export_source(repo, tree, source.changelog, options, tmp_dir, output_dir)
# Run postexport hook
if options.postexport:
@@ -518,15 +518,16 @@ def main(argv):
extra_env={'GBP_GIT_DIR': repo.git_dir,
'GBP_TMP_DIR': tmp_dir})(dir=tmp_dir)
- major = (cp.debian_version if cp.is_native() else cp.upstream_version)
- export_dir = os.path.join(output_dir, "%s-%s" % (cp['Source'], major))
+ major = (source.changelog.debian_version if source.is_native()
+ else source.changelog.upstream_version)
+ export_dir = os.path.join(output_dir, "%s-%s" % (source.changelog['Source'], major))
gbp.log.info("Moving '%s' to '%s'" % (tmp_dir, export_dir))
move_old_export(export_dir)
os.rename(tmp_dir, export_dir)
# Delayed tarball creation in case a postexport hook is used:
- if not cp.is_native() and options.postexport:
- prepare_upstream_tarball(repo, cp, options, tarball_dir,
+ if not source.is_native() and options.postexport:
+ prepare_upstream_tarball(repo, source.changelog, options, tarball_dir,
output_dir)
if options.export_dir:
@@ -546,20 +547,26 @@ def main(argv):
if options.postbuild:
arch = os.getenv('ARCH', None) or du.get_arch()
changes = os.path.abspath("%s/../%s_%s_%s.changes" %
- (build_dir, cp['Source'], cp.noepoch, arch))
+ (build_dir,
+ source.changelog['Source'],
+ source.changelog.noepoch, arch))
gbp.log.debug("Looking for changes file %s" % changes)
if not os.path.exists(changes):
changes = os.path.abspath("%s/../%s_%s_source.changes" %
- (build_dir, cp['Source'], cp.noepoch))
+ (build_dir,
+ source.changelog['Source'],
+ source.changelog.noepoch))
Command(options.postbuild, shell=True,
extra_env={'GBP_CHANGES_FILE': changes,
'GBP_BUILD_DIR': build_dir})()
if options.tag or options.tag_only:
- gbp.log.info("Tagging %s" % cp.version)
- tag = repo.version_to_tag(options.debian_tag, cp.version)
+ gbp.log.info("Tagging %s" % source.changelog.version)
+ tag = repo.version_to_tag(options.debian_tag, source.changelog.version)
if options.retag and repo.has_tag(tag):
repo.delete_tag(tag)
- repo.create_tag(name=tag, msg="%s Debian release %s" % (cp['Source'], cp.version),
+ repo.create_tag(name=tag,
+ msg="%s Debian release %s" % (source.changelog['Source'],
+ source.changelog.version),
sign=options.sign_tags, keyid=options.keyid)
if options.posttag:
sha = repo.rev_parse("%s^{}" % tag)
@@ -580,7 +587,9 @@ def main(argv):
if options.export_dir and options.purge and not retval:
RemoveTree(export_dir)()
- if cp and not gbp.notifications.notify(cp, not retval, options.notify):
+ if source.changelog and not gbp.notifications.notify(source.changelog,
+ not retval,
+ options.notify):
gbp.log.err("Failed to send notification")
retval = 1
diff --git a/tests/test_GitVfs.py b/tests/test_GitVfs.py
index 05ff5456..dda156d5 100644
--- a/tests/test_GitVfs.py
+++ b/tests/test_GitVfs.py
@@ -11,8 +11,8 @@ from . import context
gbp.log.setup(color=False, verbose=True)
import gbp.git
+
def test_read():
- repo_dir = context.new_tmpdir(__name__)
"""
Create a repository
@@ -24,6 +24,7 @@ def test_read():
- L{gbp.git.GitVfs._File.close}
>>> import os, gbp.git.vfs
+ >>> repo_dir = context.new_tmpdir(__name__)
>>> repo = gbp.git.GitRepository.create(str(repo_dir))
>>> f = file(os.path.join(repo.path, 'foo.txt'), 'w')
>>> content = 'al pha\\na\\nb\\nc'