return fields
-def create_packaging_tag(repo, commit, spec, options):
- """Create a packaging/release Git tag"""
- version_dict = dict(spec.version,
- version=rpm.compose_version_str(spec.version))
+def packaging_tag_data(repo, commit, name, version, options):
+ """Compose packaging tag name and msg"""
+ version_dict = dict(version, version=rpm.compose_version_str(version))
# Compose tag name and message
tag_name_fields = dict(version_dict, vendor=options.vendor.lower())
tag_name = repo.version_to_tag(options.packaging_tag, tag_name_fields)
tag_msg = format_str(options.packaging_tag_msg,
- dict(version_dict, pkg=spec.name,
+ dict(version_dict, pkg=name,
vendor=options.vendor))
+ return (tag_name, tag_msg)
+
+
+def create_packaging_tag(repo, commit, spec, options):
+ """Create a packaging/release Git tag"""
+ tag_name, tag_msg = packaging_tag_data(repo, commit, spec.name,
+ spec.version, options)
- # (Re-)create Git tag
if options.retag and repo.has_tag(tag_name):
repo.delete_tag(tag_name)
repo.create_tag(name=tag_name, msg=tag_msg, sign=options.sign_tags,
import gbp.log
from gbp.config import GbpOptionParserRpm, GbpOptionGroup
from gbp.errors import GbpError
+from gbp.git.modifier import GitModifier
from gbp.rpm import (guess_spec, NoSpecError, SpecFile, split_version_str,
compose_version_str)
from gbp.rpm.changelog import Changelog, ChangelogParser, ChangelogError
from gbp.rpm.git import GitRepositoryError, RpmGitRepository
from gbp.rpm.policy import RpmPkgPolicy
+from gbp.scripts.buildpackage_rpm import (packaging_tag_data,
+ create_packaging_tag)
from gbp.tmpfile import init_tmpdir, del_tmpdir
gbp.log.error("Unstaged changes in:\n %s" %
'\n '.join(unstaged))
raise GbpError("Please commit or stage your changes before using "
- "the --commit option")
+ "the --commit or --tag option")
def parse_spec_file(repo, options):
# Get info for section header
now = datetime.now()
name, email = get_author(repo, options.git_author)
+ author = None
+ committer = None
rev_str_fields = dict(spec.version,
version=compose_version_str(spec.version),
- vendor=options.vendor,
- tagname=repo.describe('HEAD', longfmt=True,
- always=True))
+ vendor=options.vendor)
+ if options.tag:
+ # Get fake information for the to-be-created git commit
+ author = committer = GitModifier(date=now)
+ tag, msg = packaging_tag_data(repo, 'HEAD', spec.name, spec.version,
+ options)
+ else:
+ tag = repo.describe('HEAD', longfmt=True, always=True)
+ msg = None
+ rev_str_fields['tagname'] = tag
+
try:
revision = options.changelog_revision % rev_str_fields
except KeyError as err:
# Add new entries to the topmost section
for entry in entries:
top_section.append_entry(entry)
+ return (tag, msg, author, committer)
def create_commit_message(spec, options):
"""Generate commit message"""
dest="packaging_branch")
naming_grp.add_config_file_option(option_name="packaging-tag",
dest="packaging_tag")
+ naming_grp.add_config_file_option(option_name="packaging-tag-msg",
+ dest="packaging_tag_msg")
naming_grp.add_config_file_option(option_name="packaging-dir",
dest="packaging_dir")
naming_grp.add_config_file_option(option_name="changelog-file",
dest="spawn_editor")
format_grp.add_config_file_option(option_name="editor-cmd",
dest="editor_cmd")
- # Commit group options
+ # Commit/tag group options
commit_grp.add_option("-c", "--commit", action="store_true",
help="commit changes")
commit_grp.add_config_file_option(option_name="commit-msg",
dest="commit_msg")
+ commit_grp.add_option("--tag", action="store_true",
+ help="commit the changes and create a packaging/release"
+ "tag")
+ commit_grp.add_option("--retag", action="store_true",
+ help="Overwrite packaging tag if it already exists")
+ commit_grp.add_boolean_config_file_option(option_name="sign-tags",
+ dest="sign_tags")
+ commit_grp.add_config_file_option(option_name="keyid", dest="keyid")
return parser
def parse_args(argv):
options, args = parser.parse_args(argv[1:])
+ if options.tag:
+ options.commit = True
if not options.changelog_revision:
options.changelog_revision = RpmPkgPolicy.Changelog.header_rev_format
# Do the actual update
entries = entries_from_commits(ch_file.changelog, repo, commits,
options)
- update_changelog(ch_file.changelog, entries, repo, spec, options)
+ tag, tag_msg, author, committer = update_changelog(ch_file.changelog,
+ entries, repo, spec,
+ options)
# Write to file
ch_file.write()
if options.commit:
edit = True if editor_cmd else False
msg = create_commit_message(spec, options)
- commit_changelog(repo, ch_file, msg, None, None, edit)
+ commit_changelog(repo, ch_file, msg, author, committer, edit)
+ if options.tag:
+ if options.retag and repo.has_tag(tag):
+ repo.delete_tag(tag)
+ repo.create_tag(tag, tag_msg, 'HEAD', options.sign_tags,
+ options.keyid)
except (GbpError, GitRepositoryError, ChangelogError, NoSpecError) as err:
if len(err.__str__()):
eq_(mock_ch(['--commit', '--since=HEAD^', '--commit-msg=%(foo)s']), 1)
self._check_log(-1, "gbp:error: Unknown key 'foo' in commit-msg string")
+ def test_tagging(self):
+ """Test commiting/tagging"""
+ repo = self.init_test_repo('gbp-test-native')
+
+ # Update and commit+tag
+ eq_(mock_ch(['--tag', '--packaging-tag=new-tag', '--since=HEAD^']), 0)
+ ok_(repo.has_tag('new-tag'))
+ sha = repo.rev_parse('HEAD')
+ eq_(sha, repo.rev_parse('new-tag^0'))
+
+ # Should fail if the tag already exists
+ eq_(mock_ch(['--tag', '--packaging-tag=new-tag', '--since=HEAD^']), 1)
+
+ # Update and commit+tag
+ eq_(mock_ch(['--tag', '--packaging-tag=new-tag', '--since=HEAD^',
+ '--retag']), 0)
+ ok_(repo.has_tag('new-tag'))
+ sha2 = repo.rev_parse('HEAD')
+ ok_(sha2 != sha)
+ eq_(sha2, repo.rev_parse('new-tag^0'))
+
+ def test_tagging2(self):
+ """Test commiting/tagging spec file"""
+ repo = self.init_test_repo('gbp-test2')
+
+ # Check unclean repo
+ with open('untracked-file', 'w') as fobj:
+ fobj.write('this file is not tracked\n')
+ with open('README', 'a') as fobj:
+ fobj.write('some new content\n')
+
+ # Unstaged file (README) -> failure
+ eq_(mock_ch(['--tag', '--packaging-tag=new-tag', '--since=HEAD^']), 1)
+ self._check_log(-1, 'gbp:error: Please commit or stage your changes')
+
+ # Add file, update and commit+tag, untracked file should be ignored
+ repo.add_files('README')
+ eq_(mock_ch(['--tag', '--packaging-tag=new-tag', '--since=HEAD^']), 0)
+ ok_(repo.has_tag('new-tag'))
+ sha = repo.rev_parse('HEAD')
+ eq_(sha, repo.rev_parse('new-tag^0'))
+
def test_option_editor_cmd(self):
"""Test the --editor-cmd and --spawn-editor cmdline options"""
repo = self.init_test_repo('gbp-test-native')