Guido Günther <[email protected]> writes: > Hi Daniel, > thanks for your patch. Some more comments below:
I inline an updated version with some tests. I still have one trouble, when no previous changelog was in the repository, dch.py raise "GbpError, "Version %s not found" % cp['Version']" from line 448. It's triggered by test_create_from_dch_main and test_create_from_dch_main_with_auto. The version info is irrelevant in that case: - We may still need to figure out if the changelog was just created? - We may look for last modification under the "debian/" directory? - We may set "since" to the fist commit? - We may set "since" to the last merged upstream version? Regards.
From db8138f40e2e79ffd05c59bc2dc6c47360014515 Mon Sep 17 00:00:00 2001 From: Daniel Dehennin <[email protected]> Date: Thu, 3 May 2012 08:32:20 +0200 Subject: [PATCH] Create debian/changelog if it does not exist. * tests/11_test_changelog_create.py: Test several senarios of debian/changelog creation. * gbp/deb/changelog.py: Import scripts from gbp instead of dch to avoid include errors. (create): New class method to create debian/changelog with version from git-dch option "-N" or upstream tag. * gbp/scripts/dch.py (guess_version_from_upstream): cp is None when called by ChangeLog.create(). (main): Create a new changelog if it does not exist. --- gbp/deb/changelog.py | 36 ++++++++++++++++ gbp/scripts/dch.py | 8 +++- tests/11_test_changelog_create.py | 86 +++++++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 tests/11_test_changelog_create.py diff --git a/gbp/deb/changelog.py b/gbp/deb/changelog.py index b8c10b8..a410e86 100644 --- a/gbp/deb/changelog.py +++ b/gbp/deb/changelog.py @@ -19,6 +19,7 @@ import email import os import subprocess +from gbp import scripts class NoChangeLogError(Exception): """No changelog found""" @@ -148,3 +149,38 @@ class ChangeLog(object): """ return self._cp['Date'] + @classmethod + def create(klass, repo=None, package=None, version=None, upstream_tag_format=None): + """ + Create an empty debian/changelog + + @param repo: git repository object + @type repo: L{GitRepository} + @param package: name of the package, get it from debian/control if None + @type package: C{str} + @param upstream_tag_format: format of the upstream tag + @type upstream_tag_format: C{str} + @return: changelog object + @rtype: L{ChangeLog} + """ + + if package == None and os.path.isfile("debian/control"): + try: + control = open("debian/control", "r") + for line in control: + if line.startswith("Source: "): + package = line.split()[1] + break + except Exception, e: + raise NoChangeLogError, "Error parsing debian/control: %s" % e + + if version == None: + version = scripts.dch.guess_version_from_upstream(repo, upstream_tag_format, None) + if version == None: + raise NoChangeLogError, "No suitable version found" + + scripts.dch.spawn_dch(msg=["debian/changelog: generated by git-dch."], + newversion=True, version={'version':version}, + dch_options="--create --package %s" % package) + + return klass(filename="debian/changelog") diff --git a/gbp/scripts/dch.py b/gbp/scripts/dch.py index 14dff29..2a18f47 100644 --- a/gbp/scripts/dch.py +++ b/gbp/scripts/dch.py @@ -112,6 +112,8 @@ def guess_version_from_upstream(repo, upstream_tag_format, cp): version = repo.tag_to_version(tag, upstream_tag_format) if version: gbp.log.debug("Found upstream version %s." % version) + if cp == None: + return "%s-1" % version if cp.has_epoch(): version = "%s:%s" % (cp.epoch, version) if compare_versions(version, cp.version) > 0: @@ -423,7 +425,11 @@ def main(argv): gbp.log.err("You are not on branch '%s' but on '%s'" % (options.debian_branch, branch)) raise GbpError, "Use --ignore-branch to ignore or --debian-branch to set the branch name." - cp = ChangeLog(filename=changelog) + try: + cp = ChangeLog(filename=changelog) + except NoChangeLogError, e: + gbp.log.debug("No debian/changelog: create a new one") + cp = ChangeLog.create(repo, version=options.new_version, upstream_tag_format=options.upstream_tag) if options.since: since = options.since diff --git a/tests/11_test_changelog_create.py b/tests/11_test_changelog_create.py new file mode 100644 index 0000000..51a8b04 --- /dev/null +++ b/tests/11_test_changelog_create.py @@ -0,0 +1,86 @@ +# vim: set fileencoding=utf-8 : + +"""Test L{Changelog}'s create""" + +import sys +sys.path.insert(0, "..") +sys.path.insert(0, ".") + +import unittest + +from testutils import DebianGitTestRepo + +from gbp.errors import GbpError +from gbp.scripts import dch +from gbp.deb.changelog import ChangeLog +from gbp.deb.git import DebianGitRepository + +import os + +class TestScriptDch(DebianGitTestRepo): + """Test git-dch""" + + def setUp(self): + DebianGitTestRepo.setUp(self) + self.add_file("foo", "bar") + self.repo.create_tag("upstream/1.0", msg="upstream version 1.0") + self.repo.create_branch("debian") + self.repo.set_branch("debian") + self.upstream_tag = "upstream/%(version)s" + self.top = os.path.abspath(os.path.curdir) + os.mkdir(os.path.join(self.repo.path, "debian")) + os.chdir(self.repo.path) + self.add_file("debian/control", """Source: test-package\nSection: test\n""") + + def tearDown(self): + os.chdir(self.top) + DebianGitTestRepo.tearDown(self) + + def test_create(self): + """Test direct call to ChangeLog.create(): guess package name from debian/control""" + ChangeLog.create(self.repo, upstream_tag_format=self.upstream_tag) + lines = file("debian/changelog").readlines() + assert """test-package (1.0-1) UNRELEASED; urgency=low\n""" in lines + assert """ * debian/changelog: generated by git-dch.\n""" in lines + + def test_create_without_control(self): + """Test direct call to ChangeLog.create()""" + ChangeLog.create(self.repo, package="test-package", upstream_tag_format=self.upstream_tag) + lines = file("debian/changelog").readlines() + assert """test-package (1.0-1) UNRELEASED; urgency=low\n""" in lines + assert """ * debian/changelog: generated by git-dch.\n""" in lines + + def test_create_without_upstream_log(self): + """Test direct call to ChangeLog.create(): must not include upstream log in debian/changelog""" + ChangeLog.create(self.repo, upstream_tag_format=self.upstream_tag) + lines = file("debian/changelog").readlines() + assert """test-package (1.0-1) UNRELEASED; urgency=low\n""" in lines + assert """ * added foo.\n""" not in lines + + def test_create_after_delete(self): + """Test direct call to ChangeLog.create(): previous debian/changelog deleted""" + self.add_file("debian/changelog", "fake") + self.repo.remove_files("debian/changelog") + self.repo.commit_files(self.repo.path, "removed debian/changelog") + ChangeLog.create(self.repo, upstream_tag_format=self.upstream_tag) + lines = file("debian/changelog").readlines() + assert """test-package (1.0-1) UNRELEASED; urgency=low\n""" in lines + assert """ * debian/changelog: generated by git-dch.\n""" in lines + assert """ * removed debian/changelog.\n""" not in lines + + def test_create_from_dch_main(self): + """Test dch.py like git-dch script does: must include upstream log in debian/changelog""" + dch.main(["--upstream-tag=%s" % self.upstream_tag, "--debian-branch=debian"]) + lines = file("debian/changelog").readlines() + assert "test-package (1.0-1) UNRELEASED; urgency=low\n" in lines + assert """ * debian/changelog: generated by git-dch.\n""" in lines + assert """ * added foo.\n""" in lines + + def test_create_from_dch_main_with_auto(self): + """Test dch.py like git-dch script does: must include upstream log in debian/changelog""" + dch.main(["--upstream-tag=%s" % self.upstream_tag, "--debian-branch=debian", "-a"]) + lines = file("debian/changelog").readlines() + assert "test-package (1.0-1) UNRELEASED; urgency=low\n" in lines + assert """ * debian/changelog: generated by git-dch.\n""" in lines + assert """ * added foo.\n""" in lines + -- 1.7.10
-- Daniel Dehennin Récupérer ma clef GPG: gpg --keyserver pgp.mit.edu --recv-keys 0x7A6FE2DF
pgpXE4PgsgJHp.pgp
Description: PGP signature

