diff --git a/tools/build-system/bin/git-dch b/tools/build-system/bin/git-dch deleted file mode 100755 index f9ee5bc56f14d320c63c27da987ca0029fbb244f..0000000000000000000000000000000000000000 --- a/tools/build-system/bin/git-dch +++ /dev/null @@ -1,404 +0,0 @@ -#!/usr/bin/python -u -# vim: set fileencoding=utf-8 : -# -# (C) 2007,2008 Guido Guenther <agx@sigxcpu.org> -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -"""Generate Debian changelog entries from git commit messages""" - -import sys -import re -import os.path -import shutil -import subprocess -import gbp.command_wrappers as gbpc -from gbp.git_utils import (GitRepositoryError, GitRepository, build_tag) -from gbp.config import GbpOptionParser, GbpOptionGroup -from gbp.errors import GbpError -from gbp.deb_utils import parse_changelog -from gbp.command_wrappers import (Command, CommandExecFailed) - -snapshot_re = re.compile("\s*\*\* SNAPSHOT build @(?P<commit>[a-z0-9]+)\s+\*\*") -author_re = re.compile('Author: (?P<author>.*) <(?P<email>.*)>') -bug_r = r'(?:bug)?\#?\s?\d+' -bug_re = re.compile(bug_r, re.I) - -def system(cmd): - try: - Command(cmd, shell=True)() - except CommandExecFailed: - raise GbpError - - -def escape_commit(msg): - return msg.replace('"','\\\"').replace("$","\$").replace("`","\`") - - -def spawn_dch(msg='', author=None, email=None, newversion=False, version=None, release=False, distribution=None): - distopt = "" - versionopt = "" - env = "" - - if newversion: - if version: - versionopt = '--newversion=%s' % version - else: - versionopt = '-i' - elif release: - versionopt = "--release" - msg = None - - if author and email: - env = """DEBFULLNAME="%s" DEBEMAIL="%s" """ % (author, email) - - if distribution: - distopt = "--distribution=%s" % distribution - - cmd = '%(env)s dch --no-auto-nmu %(distopt)s %(versionopt)s ' % locals() - if type(msg) == type(''): - cmd += '"%s"' % escape_commit(msg) - system(cmd) - - -def add_changelog_entry(msg, author, email): - "add aa single changelog entry" - spawn_dch(msg=msg, author=author, email=email) - - -def add_changelog_section(msg, distribution, author=None, email=None, version=None): - "add a new changelog section" - spawn_dch(msg=msg, newversion= True, version=version, author=author, email=email, distribution=distribution) - - -def fixup_trailer(repo, git_author=False): - """fixup the changelog trailer's comitter and email address - it might - otherwise point to the last git committer instead of the person creating - the changelog""" - author = email = None - if git_author: - try: author = repo.get_config('user.name') - except KeyError: pass - - try: email = repo.get_config('user.email') - except KeyError: pass - - spawn_dch(msg='', author=author, email=email) - - -def head_commit(): - """get the full sha1 of the last commit on HEAD""" - commit = subprocess.Popen([ 'git', 'log', 'HEAD^..' ], stdout=subprocess.PIPE).stdout - sha = commit.readline().split()[-1] - return sha - - -def snapshot_version(version): - """ - get the current release and snapshot version - Format is <debian-version>~<release>.gbp<short-commit-id> - """ - try: - (release, suffix) = version.rsplit('~', 1) - (snapshot, commit) = suffix.split('.', 1) - if not commit.startswith('gbp'): - raise ValueError - else: - snapshot = int(snapshot) - except ValueError: # not a snapshot release - release = version - snapshot = 0 - return release, snapshot - - -def mangle_changelog(changelog, cp, snapshot=''): - """ - Mangle changelog to either add or remove snapshot markers - - @param snapshot: SHA1 if snapshot header should be added/maintained, empty if it should be removed - @type snapshot: str - """ - try: - tmpfile = '%s.%s' % (changelog, snapshot) - cw = file(tmpfile, 'w') - cr = file(changelog, 'r') - - cr.readline() # skip version and empty line - cr.readline() - print >>cw, "%(Source)s (%(MangledVersion)s) %(Distribution)s; urgency=%(urgency)s\n" % cp - - line = cr.readline() - if snapshot_re.match(line): - cr.readline() # consume the empty line after the snapshot header - line = '' - - if snapshot: - print >>cw, " ** SNAPSHOT build @%s **\n" % snapshot - - if line: - print >>cw, line.rstrip() - shutil.copyfileobj(cr, cw) - cw.close() - cr.close() - os.unlink(changelog) - os.rename(tmpfile, changelog) - except OSError, e: - raise GbpError, "Error mangling changelog %s" % e - - -def do_release(changelog, cp): - "remove the snapshot header and set the distribution" - (release, snapshot) = snapshot_version(cp['Version']) - if snapshot: - cp['MangledVersion'] = release - mangle_changelog(changelog, cp) - # <julien.bonjean@savoirfairelinux.com> - # prevent doing a release - # spawn_dch(release=True) - - -def do_snapshot(changelog, next_snapshot): - """ - Add new snapshot banner to most recent changelog section. The next snapshot - number is calculated by eval()'ing next_snapshot - """ - # commit = head_commit() - - cp = parse_changelog(changelog) - - # <julien.bonjean@savoirfairelinux.com> - # clean version before generate snapshot - version=cp['Version'] - try: - (release, suffix) = version.rsplit('~', 1) - except: - pass - try: - (snapshot, commit) = suffix.split('.', 1) - stripped = str(int(snapshot)) - except: - version=release - commit = head_commit() - - (release, snapshot) = snapshot_version(version) - snapshot = int(eval(next_snapshot)) - - suffix = "%d.gbp%s" % (snapshot, "".join(commit[0:6])) - cp['MangledVersion'] = "%s~%s" % (release, suffix) - - mangle_changelog(changelog, cp, commit) - return snapshot, commit - - -def get_author(commit): - """get the author from a commit message""" - for line in commit: - m = author_re.match(line) - if m: - return m.group('author'), m.group('email') - - -def parse_commit(repo, commitid, options): - """parse a commit and return message and author""" - msg = '' - thanks = '' - closes = '' - bugs = {} - bts_closes = re.compile(r'(?P<bts>%s):\s+%s' % (options.meta_closes, bug_r), re.I) - - commit = repo.show(commitid) - author, email = get_author(commit) - if not author: - raise GbpError, "can't parse author of commit %s" % commit - for line in commit: - if line.startswith(' '): # commit body - line = line[4:] - m = bts_closes.match(line) - if m: - bug_nums = [ bug.strip() for bug in bug_re.findall(line, re.I) ] - try: - bugs[m.group('bts')] += bug_nums - except KeyError: - bugs[m.group('bts')] = bug_nums - elif line.startswith('Thanks: '): - thanks = line.split(' ', 1)[1].strip() - else: # normal commit message - if options.short and msg: - continue - elif line.strip(): # don't add all whitespace lines - msg += line - # start of diff output: - elif line.startswith('diff '): - break - if options.meta: - for bts in bugs: - closes += '(%s: %s) ' % (bts, ', '.join(bugs[bts])) - if thanks: - thanks = '- thanks to %s' % thanks - msg += closes + thanks - if options.idlen: - msg = "[%s] " % commitid[0:options.idlen] + msg - return msg, (author, email) - - -def shortlog_to_dch(repo, commits, options): - """convert the changes in git shortlog format to debian changelog format""" - author = 'Unknown' - - for commit in commits: - msg, (author, email) = parse_commit(repo, commit, options) - add_changelog_entry(msg, author, email) - - -def guess_snapshot_commit(cp): - """guess the last commit documented in the changelog from the snapshot banner""" - sr = re.search(snapshot_re, cp['Changes']) - if sr: - return sr.group('commit') - - -def main(argv): - ret = 0 - changelog = 'debian/changelog' - until = 'HEAD' - found_snapshot_header = False - first_commit = None - - parser = GbpOptionParser(command=os.path.basename(argv[0]), prefix='', - usage='%prog [options] paths') - range_group = GbpOptionGroup(parser, "commit range options", "which commits to add to the changelog") - version_group = GbpOptionGroup(parser, "release & version number options", "what version number and release to use") - commit_group = GbpOptionGroup(parser, "commit message formatting", "howto format the changelog entries") - naming_group = GbpOptionGroup(parser, "branch and tag naming", "branch names and tag formats") - parser.add_option_group(range_group) - parser.add_option_group(version_group) - parser.add_option_group(commit_group) - parser.add_option_group(naming_group) - - 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") - naming_group.add_config_file_option(option_name="snapshot-number", dest="snapshot_number", - help="expression to determine the next snapshot number, default is '%(snapshot-number)s'") - parser.add_config_file_option(option_name="git-log", dest="git_log", - help="options to pass to git-log, default is '%(git-log)s'") - parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, - help="verbose command execution") - range_group.add_option("-s", "--since", dest="since", help="commit to start from (e.g. HEAD^^^, debian/0.4.3)") - range_group.add_option("-a", "--auto", action="store_true", dest="auto", default=False, - help="autocomplete changelog from last snapshot or tag") - version_group.add_option("-R", "--release", action="store_true", dest="release", default=False, - help="mark as release") - version_group.add_option("-S", "--snapshot", action="store_true", dest="snapshot", default=False, - help="mark as snapshot build") - version_group.add_option("-N", "--new-version", dest="new_version", - help="use this as base for the new version number") - version_group.add_config_file_option(option_name="git-author", dest="git_author", action="store_true") - version_group.add_config_file_option(option_name="no-git-author", dest="git_author", action="store_false") - commit_group.add_config_file_option(option_name="meta", dest="meta", - help="parse meta tags in commit messages, default is '%(meta)s'", action="store_true") - commit_group.add_config_file_option(option_name="meta-closes", dest="meta_closes", - help="Meta tags for the bts close commands, default is '%(meta-closes)s'") - commit_group.add_option("--full", action="store_false", dest="short", default=True, - help="include the full commit message instead of only the first line") - commit_group.add_config_file_option(option_name="id-length", dest="idlen", - help="include N digits of the commit id in the changelog entry, default is '%(id-length)s'", - type="int", metavar="N") - (options, args) = parser.parse_args(argv[1:]) - - if options.snapshot and options.release: - parser.error("'--snapshot' and '--release' are incompatible options") - - if options.since and options.auto: - parser.error("'--since' and '--auto' are incompatible options") - - try: - if options.verbose: - gbpc.Command.verbose = True - - try: - repo = GitRepository('.') - except GitRepositoryError: - raise GbpError, "%s is not a git repository" % (os.path.abspath('.')) - - branch = repo.get_branch() - if options.debian_branch != branch: - print >>sys.stderr, "You are not on branch '%s' but on '%s'" % (options.debian_branch, branch) - raise GbpError, "Use --debian-branch to set the branch to pick changes from" - - cp = parse_changelog(changelog) - - if options.since: - since = options.since - else: - since = '' - if options.auto: - since = guess_snapshot_commit(cp) - if since: - print "Continuing from commit '%s'" % since - found_snapshot_header = True - else: - print "Couldn't find snapshot header, using version info" - if not since: - since = build_tag(options.debian_tag, cp['Version']) - - if args: - print "Only looking for changes on '%s'" % " ".join(args) - commits = repo.commits(since, until, " ".join(args), options.git_log.split(" ")) - - # add a new changelog section if: - if cp['Distribution'] != "UNRELEASED" and not found_snapshot_header and commits: - # the last version was a release and we have pending commits - add_section = True - elif options.new_version or not found_snapshot_header: - # the user wants to force a new version or switch to snapshot mode - add_section = True - else: - add_section = False - - if add_section: - if commits: - first_commit = commits[0] - commits = commits[1:] - commit_msg, (commit_author, commit_email) = parse_commit(repo, first_commit, options) - else: - commit_msg = "UNRELEASED" - commit_author = None - commit_email = None - add_changelog_section(distribution="UNRELEASED", msg=commit_msg, - version=options.new_version, author=commit_author, - email=commit_email) - - if commits: - shortlog_to_dch(repo, commits, options) - fixup_trailer(repo, git_author=options.git_author) - elif not first_commit: - print "No changes detected from %s to %s." % (since, until) - - if options.release: - do_release(changelog, cp) - elif options.snapshot: - (snap, version) = do_snapshot(changelog, options.snapshot_number) - print "Changelog has been prepared for snapshot #%d at %s" % (snap, version) - - except (GbpError, GitRepositoryError), err: - if len(err.__str__()): - print >>sys.stderr, err - ret = 1 - return ret - -if __name__ == "__main__": - sys.exit(main(sys.argv)) - -# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: diff --git a/tools/build-system/launch-build-machine.sh b/tools/build-system/launch-build-machine.sh index 1c6748d0985d21c6df5bc90136526aad4d77b2cd..874e68abcceff2fa003fd5e75b7abf97ff24f718 100755 --- a/tools/build-system/launch-build-machine.sh +++ b/tools/build-system/launch-build-machine.sh @@ -7,9 +7,17 @@ # Author: Julien Bonjean (julien@bonjean.info) # # Creation Date: 2009-04-20 -# Last Modified: +# Last Modified: 2009-05-14 16:16:49 -0400 ##################################################### +# +# Not working with git 1.5.4.3 +# +# +# +# + + TAG=`date +%Y-%m-%d` # wait delay after startup and shutdown of VMs @@ -220,27 +228,13 @@ if [ ${DO_PREPARE} ]; then # generate the changelog, according to the distribution and the git commit messages echo "Update changelogs" - # use git to generate changelogs - # TODO : currently do symlink to workaround git-dch bug, check if better way is possible - if [ ${RELEASE_MODE} ]; then - cd ${REPOSITORY_DIR} && ln -s ${REPOSITORY_SFLPHONE_COMMON_DIR}/debian/ . && ${BIN_DIR}/git-dch -a -N "${FULL_VER}${VERSION_APPEND}" --debian-branch=release && rm debian && \ - # cd ${REPOSITORY_DIR} && ln -s ${REPOSITORY_SFLPHONE_CLIENT_KDE_DIR}/debian . && ${BIN_DIR}/git-dch -a -N "${FULL_VER}${VERSION_APPEND}" --debian-branch=release && rm debian && \ - cd ${REPOSITORY_DIR} && ln -s ${REPOSITORY_SFLPHONE_CLIENT_GNOME_DIR}/debian . && ${BIN_DIR}/git-dch -a -N "${FULL_VER}${VERSION_APPEND}" --debian-branch=release && rm debian - else - cd ${REPOSITORY_DIR} && ln -s ${REPOSITORY_SFLPHONE_COMMON_DIR}/debian . && ${BIN_DIR}/git-dch -a -S && rm debian && \ - # cd ${REPOSITORY_DIR} && ln -s ${REPOSITORY_SFLPHONE_CLIENT_KDE_DIR}/debian . && ${BIN_DIR}/git-dch -a -S && rm debian && \ - cd ${REPOSITORY_DIR} && ln -s ${REPOSITORY_SFLPHONE_CLIENT_GNOME_DIR}/debian . && ${BIN_DIR}/git-dch -a -S && rm debian - fi + ${SCRIPTS_DIR}/sfl-git-dch.sh ${RELEASE_MODE} if [ "$?" -ne "0" ]; then echo "!! Cannot update changelogs" exit -1 fi - # change UNRELEASED flag to system as we alway do a build for each distribution - # and distribution is set by another script - find ${REPOSITORY_DIR} -name changelog -exec sed -i 's/UNRELEASED/SYSTEM/g' {} \; - cd ${REPOSITORY_DIR} echo "Update repository with new changelog" echo " Switch to master branch to commit" @@ -255,9 +249,9 @@ if [ ${DO_PREPARE} ]; then if [ ! ${RELEASE_MODE} ]; then VERSION_COMMIT=${FULL_VER}" Snapshot ${TAG}" fi - git-commit -m "[#1262] Updated changelogs for version ${VERSION_COMMIT}" . >/dev/null + git commit -m "[#1262] Updated changelogs for version ${VERSION_COMMIT}" . >/dev/null echo " Pushing commit" - git push origin master >/dev/null +# git push origin master >/dev/null # change back current branch if needed if [ ${RELEASE_MODE} ]; then diff --git a/tools/build-system/remote/build-package-ubuntu.sh b/tools/build-system/remote/build-package-ubuntu.sh index 0a28c1790cc75c6bb621289cced618085ca0640c..8228b78e2945f10db7c51fa05d3debde9a0579fe 100755 --- a/tools/build-system/remote/build-package-ubuntu.sh +++ b/tools/build-system/remote/build-package-ubuntu.sh @@ -82,11 +82,14 @@ exec 2>&3 echo "SFLPhone version is ${VER}" -# generate the changelog, according to the distribution and the git commit messages +# generate the changelog, according to the distribution echo "Generate changelogs" sed -i 's/SYSTEM/'${OS_VERSION}'/g' ${REPOSITORY_SFLPHONE_COMMON_DIR}/debian/changelog && \ +sed -i 's/SYSVER/0ubuntu1/g' ${REPOSITORY_SFLPHONE_COMMON_DIR}/debian/changelog && \ # sed -i 's/SYSTEM/'${OS_VERSION}'/g' ${REPOSITORY_SFLPHONE_CLIENT_KDE_DIR}/debian/changelog && \ - sed -i 's/SYSTEM/'${OS_VERSION}'/g' ${REPOSITORY_SFLPHONE_CLIENT_GNOME_DIR}/debian/changelog + # sed -i 's/SYSVER/0ubuntu1/g' ${REPOSITORY_SFLPHONE_CLIENT_KDE_DIR}/debian/changelog && \ + sed -i 's/SYSTEM/'${OS_VERSION}'/g' ${REPOSITORY_SFLPHONE_CLIENT_GNOME_DIR}/debian/changelog && \ + sed -i 's/SYSVER/0ubuntu1/g' ${REPOSITORY_SFLPHONE_CLIENT_GNOME_DIR}/debian/changelog if [ "$?" -ne "0" ]; then echo "!! Cannot generate changelogs" diff --git a/tools/build-system/sfl-git-dch.sh b/tools/build-system/sfl-git-dch.sh new file mode 100755 index 0000000000000000000000000000000000000000..cae9803dcafe3e25df21a3b5bd256dea9c3039cd --- /dev/null +++ b/tools/build-system/sfl-git-dch.sh @@ -0,0 +1,165 @@ +#!/bin/bash +##################################################### +# File Name: sfl-git-dch.sh +# +# Purpose : +# +# Author: Julien Bonjean (julien@bonjean.info) +# +# Creation Date: 2009-05-13 +# Last Modified: 2009-05-14 16:13:47 -0400 +##################################################### + +# set -x + +RELEASE_MODE=$1 + +ROOT_DIR="/home/projects/sflphone" +TODEPLOY_DIR="${ROOT_DIR}/sflphone-packaging" +TODEPLOY_BUILD_DIR="${TODEPLOY_DIR}/build" +REPOSITORY_DIR="${TODEPLOY_BUILD_DIR}/sflphone" +SCRIPTS_DIR="${ROOT_DIR}/build-system" + +CHANGELOG_FILES=( "sflphone-common/debian/changelog" "sflphone-client-gnome/debian/changelog" ) + +SNAPSHOT_TAG=`date +%s` + +export DEBFULLNAME="SFLphone Automatic Build System" +export DEBEMAIL="team@sflphone.org" +export EDITOR="echo" + +cd ${REPOSITORY_DIR} + +if [ "$?" -ne "0" ]; then + echo " !! Cannot cd to working directory" + exit -1 +fi + +# get last release tag +LAST_RELEASE_TAG_NAME=`git describe --tag HEAD --match "debian/*" --abbrev=40 | cut -d "-" -f1-2` + +if [ "$?" -ne "0" ]; then + echo " !! Error when retrieving last tag" + exit -1 +fi + +# get last release commit hash +LAST_RELEASE_COMMIT_HASH=`git show --pretty=format:"%H" -s ${LAST_RELEASE_TAG_NAME=} | tail -n 1` + +if [ "$?" -ne "0" ]; then + echo " !! Error when retrieving last release commit hash" + exit -1 +fi + +echo "Last release tag is : ${LAST_RELEASE_TAG_NAME} (commit ${LAST_RELEASE_COMMIT_HASH})" +echo + + +# use git log to retrieve changelog content +CHANGELOG_CONTENT=`git log --no-merges --pretty=format:"%s" ${LAST_RELEASE_COMMIT_HASH}.. | grep -v "\[\#1262\]"` + +if [ "$?" -ne "0" ]; then + echo " !! Error when retrieving changelog content" + exit -1 +fi + +# get version +SOFTWARE_VERSION=`echo ${LAST_RELEASE_TAG_NAME} | cut -d "/" -f2- | cut -d "-" -f1` + +if [ "$?" -ne "0" ]; then + echo " !! Error when retrieving software version" + exit -1 +fi + +# add version info +SOFTWARE_VERSION_APPEND= +if [ ${RELEASE_MODE} ] +then + if [ "${RELEASE_MODE}" != "release" ]; then + SOFTWARE_VERSION_APPEND="~${RELEASE_MODE}" + fi +else + SOFTWARE_VERSION_APPEND="~snapshot-${SNAPSHOT_TAG}" +fi + + + + +# iterate throw changelog files +for CHANGELOG_FILE in ${CHANGELOG_FILES[@]} +do + echo "Changelog : ${CHANGELOG_FILE}" + echo + rm -f ${CHANGELOG_FILE}.dch >/dev/null 2>&1 + + # if previous entry is a snapshot, remove it + sed -n 's/ //g;3p;3q' ${CHANGELOG_FILE} | grep "**SNAPSHOT" >/dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "Previous entry is a snapshot, removing it" + + # detect first section length + FIRST_SECTION_LENGTH=`tail -n +2 ${CHANGELOG_FILE} | nl -ba | grep -m 1 "sflphone-.* SYSTEM; urgency=.*" | awk '{print $1}'` + + if [ "$?" -ne "0" ] || [ ! ${FIRST_SECTION_LENGTH} ]; then + echo " !! Error when retrieving snapshot entry length" + exit -1 + fi + + # remove first section + sed -i "1,${FIRST_SECTION_LENGTH}d" ${CHANGELOG_FILE} + + if [ "$?" -ne "0" ]; then + echo " !! Error when removing snapshot section" + exit -1 + fi + fi + + echo -n "Generate changelog " + IS_FIRST=1 + echo "${CHANGELOG_CONTENT}" | while read line + do + + if [ ${IS_FIRST} ] + then + yes | dch --changelog ${CHANGELOG_FILE} -b --allow-lower-version --no-auto-nmu --distribution SYSTEM --newversion ${SOFTWARE_VERSION}-SYSVER${SOFTWARE_VERSION_APPEND} "$line" >/dev/null 2>&1 + + if [ "$?" -ne "0" ]; then + echo + echo " !! Error with new version" + exit -1 + fi + + IS_FIRST= + else + dch --changelog ${CHANGELOG_FILE} --no-auto-nmu "$line" + if [ "$?" -ne "0" ]; then + echo + echo " !! Error when adding changelog entry" + exit -1 + fi + fi + echo -n . + done + + # add snapshot or release flag if needed + echo + if [ ${RELEASE_MODE} ]; then + sed -i "3i\ ** ${SOFTWARE_VERSION} ${RELEASE_MODE} **\n" ${CHANGELOG_FILE} + if [ "$?" -ne "0" ]; then + echo " !! Error when adding snapshot flag" + exit -1 + fi + else + sed -i "3i\ ** SNAPSHOT ${SNAPSHOT_TAG} **\n" ${CHANGELOG_FILE} + if [ "$?" -ne "0" ]; then + echo " !! Error when adding snapshot flag" + exit -1 + fi + fi + echo +done + +echo "All done !" + +exit 0 +