Guido Günther <[email protected]> writes:
[...]
>> I did it in gbp.deb.Changelog.create.
>>
>> I was thinking about adding a "first=Fales" parameter to
>> Changelog.__init__ and make Changelog.create using True.
>>
>> But this seems to be a "private" attribute, I don't like the idea of
>> exposing it in __init__ signature.
>
> Can you point me to your tree that uses the first attribute?
Here is the tag information, I includ patch against experimental after
for direct review[1].
This version suffer the direct gbp.script import.
Regards.
The following changes since commit c57d4af675910ec151cf982532db0f877aef413f:
gbp.git.repository: Add a "git merge-base" wrapper (2012-05-14 13:16:15 +0200)
are available in the git repository at:
git://git.baby-gnu.org/git-buildpackage
tags/dad/create-inexistant-changelog/rebasable/on-c57d4af
for you to fetch changes up to f488942231ce317f11bce2e69fdaa313671c79a2:
Create debian/changelog if it does not exist. (2012-05-14 22:37:55 +0200)
----------------------------------------------------------------
Consolidated patch rebased on latest experimental which integrate
GitRepository.get_merge_base.
Fixes in test:
- use of self.assertEqual as suggested by Guido Günther
- remove sys.path manipulation in test, the caller handle it
----------------------------------------------------------------
Daniel Dehennin (1):
Create debian/changelog if it does not exist.
gbp/deb/changelog.py | 40 ++++++++++
gbp/scripts/dch.py | 29 ++++++-
tests/11_test_changelog_create.py | 159 +++++++++++++++++++++++++++++++++++++
3 files changed, 225 insertions(+), 3 deletions(-)
create mode 100644 tests/11_test_changelog_create.py
From f488942231ce317f11bce2e69fdaa313671c79a2 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.
Guess last time debian/changelog was touched if debian/changelog was
just created.
---
gbp/deb/changelog.py | 40 ++++++++++
gbp/scripts/dch.py | 29 ++++++-
tests/11_test_changelog_create.py | 159 +++++++++++++++++++++++++++++++++++++
3 files changed, 225 insertions(+), 3 deletions(-)
create mode 100644 tests/11_test_changelog_create.py
diff --git a/gbp/deb/changelog.py b/gbp/deb/changelog.py
index b8c10b8..b238baf 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,42 @@ 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
+ elif package == None:
+ raise NoChangeLogError, "No package name provided and no
debian/control file"
+
+ 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)
+
+ cp = klass(filename="debian/changelog")
+ cp.first = True
+ return cp
diff --git a/gbp/scripts/dch.py b/gbp/scripts/dch.py
index 14dff29..0309aa4 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:
@@ -357,6 +359,8 @@ def main(argv):
parser.add_option_group(custom_group)
parser.add_boolean_config_file_option(option_name = "ignore-branch",
dest="ignore_branch")
+ naming_group.add_config_file_option(option_name="upstream-tree",
dest="upstream_tree")
+ naming_group.add_config_file_option(option_name="upstream-branch",
dest="upstream_branch")
naming_group.add_config_file_option(option_name="debian-branch",
dest="debian_branch")
naming_group.add_config_file_option(option_name="upstream-tag",
dest="upstream_tag")
naming_group.add_config_file_option(option_name="debian-tag",
dest="debian_tag")
@@ -423,13 +427,17 @@ 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
else:
since = ''
- if options.auto:
+ if options.auto or hasattr(cp, 'first') and cp.first:
since = guess_snapshot_commit(cp, repo, options)
if since:
gbp.log.info("Continuing from commit '%s'" % since)
@@ -437,7 +445,22 @@ def main(argv):
else:
gbp.log.info("Couldn't find snapshot header, using version
info")
if not since:
- since = repo.find_version(options.debian_tag, cp['Version'])
+ # Take care of newly created debian/changelog
+ if hasattr(cp, 'first') and cp.first:
+ pattern = options.upstream_tag % dict(version='*')
+ try:
+ upstream = repo.find_tag('HEAD', pattern=pattern)
+ except GitRepositoryError:
+ gbp.debug('No upstream tag found')
+ upstream = options.upstream_branch
+ if options.upstream_tree == 'branch':
+ upstream = options.upstream_branch
+ since = repo.get_merge_base('HEAD', upstream)
+ if since and options.snapshot:
+ # Snapshot can not be guessed
+ found_snapshot_header = True
+ else:
+ since = repo.find_version(options.debian_tag,
cp['Version'])
if not since:
raise GbpError, "Version %s not found" % cp['Version']
diff --git a/tests/11_test_changelog_create.py
b/tests/11_test_changelog_create.py
new file mode 100644
index 0000000..270bdf1
--- /dev/null
+++ b/tests/11_test_changelog_create.py
@@ -0,0 +1,159 @@
+# vim: set fileencoding=utf-8 :
+
+"""Test L{Changelog}'s create"""
+
+import unittest
+
+from testutils import DebianGitTestRepo
+
+from gbp.scripts import dch
+from gbp.deb.changelog import ChangeLog
+
+import os
+import re
+
+snap_header =
r'^test-package\s\(1.0-1~1\.gbp([0-9a-f]{6})\)\sUNRELEASED;\surgency=low'
+snap_mark = r'\s{2}\*{2}\sSNAPSHOT\sbuild\s@'
+
+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(): 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 not include upstream log
in debian/changelog"""
+ ret = dch.main(["--upstream-tag=%s" % self.upstream_tag,
"--debian-branch=debian"])
+ self.assertEqual(ret, 0)
+ 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 debian/control\n""" in lines
+
+ def test_create_from_dch_main_with_auto(self):
+ """Test dch.py like git-dch script does: guess last commit"""
+ ret = dch.main(["--upstream-tag=%s" % self.upstream_tag,
"--debian-branch=debian", "-a"])
+ self.assertEqual(ret, 0)
+ 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 debian/control\n""" in lines
+
+ def test_create_from_dch_main_with_snapshot(self):
+ """Test dch.py like git-dch script does: snashot mode"""
+ ret = dch.main(["--upstream-tag=%s" % self.upstream_tag,
"--debian-branch=debian", "-S"])
+ self.assertEqual(ret, 0)
+ lines = file("debian/changelog").readlines()
+ header = re.search(snap_header, lines[0])
+ self.assertEqual(header.lastindex, 1)
+ assert re.search(snap_mark + header.group(1), lines[2])
+ assert """ * debian/changelog: generated by git-dch.\n""" in lines
+ assert """ * added debian/control\n""" in lines
+
+ def test_create_from_dch_main_after_delete(self):
+ """Test dch.py like git-dch script does: debian/changelog was
deleted"""
+ self.add_file("debian/changelog", "fake")
+ self.repo.remove_files("debian/changelog")
+ self.repo.commit_files(self.repo.path, "removed debian/changelog")
+ ret = dch.main(["--upstream-tag=%s" % self.upstream_tag,
"--debian-branch=debian"])
+ self.assertEqual(ret, 0)
+ 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_with_auto_snapshot(self):
+ """Test dch.py like git-dch script does: guess last commit, snashot"""
+ ret = dch.main(["--upstream-tag=%s" % self.upstream_tag,
"--debian-branch=debian", "-a", "-S"])
+ self.assertEqual(ret, 0)
+ lines = file("debian/changelog").readlines()
+ header = re.search(snap_header, lines[0])
+ self.assertEqual(header.lastindex, 1)
+ assert re.search(snap_mark + header.group(1), lines[2])
+ assert """ * debian/changelog: generated by git-dch.\n""" in lines
+ assert """ * added debian/control\n""" in lines
+
+ def test_create_from_dch_main_with_auto_after_delete(self):
+ """Test dch.py like git-dch script does: guess last commit,
debian/changelog was deleted"""
+ self.add_file("debian/changelog", "fake")
+ self.repo.remove_files("debian/changelog")
+ self.repo.commit_files(self.repo.path, "removed debian/changelog")
+ ret = dch.main(["--upstream-tag=%s" % self.upstream_tag,
"--debian-branch=debian", "-a"])
+ self.assertEqual(ret, 0)
+ 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_with_snapshot_after_delete(self):
+ """Test dch.py like git-dch script does: snapshot, debian/changelog
was deleted"""
+ self.add_file("debian/changelog", "fake")
+ self.repo.remove_files("debian/changelog")
+ self.repo.commit_files(self.repo.path, "removed debian/changelog")
+ ret = dch.main(["--upstream-tag=%s" % self.upstream_tag,
"--debian-branch=debian", "-S"])
+ self.assertEqual(ret, 0)
+ lines = file("debian/changelog").readlines()
+ header = re.search(snap_header, lines[0])
+ self.assertEqual(header.lastindex, 1)
+ assert re.search(snap_mark + header.group(1), lines[2])
+ assert """ * debian/changelog: generated by git-dch.\n""" in lines
+ assert """ * removed debian/changelog\n""" not in lines
+
+ def test_create_from_dch_main_with_auto_snapshot_after_delete(self):
+ """Test dch.py like git-dch script does: guess last commit, snapshot,
debian/changelog was deleted"""
+ self.add_file("debian/changelog", "fake")
+ self.repo.remove_files("debian/changelog")
+ self.repo.commit_files(self.repo.path, "removed debian/changelog")
+ ret = dch.main(["--upstream-tag=%s" % self.upstream_tag,
"--debian-branch=debian", "-a", "-S"])
+ self.assertEqual(ret, 0)
+ lines = file("debian/changelog").readlines()
+ header = re.search(snap_header, lines[0])
+ self.assertEqual(header.lastindex, 1)
+ assert re.search(snap_mark + header.group(1), lines[2])
+ assert """ * debian/changelog: generated by git-dch.\n""" in lines
+ assert """ * removed debian/changelog\n""" not in lines
--
1.7.10
Footnotes:
[1] This make longer mail but as the rebasable signed tags are not
meant to stay for ever, this make history available on the BTS.
--
Daniel Dehennin
Récupérer ma clef GPG:
gpg --keyserver pgp.mit.edu --recv-keys 0x7A6FE2DF
pgp0nmXtTkj66.pgp
Description: PGP signature

