Statistics
| Branch: | Tag: | Revision:

root / devflow / autopkg.py @ d3af231f

History | View | Annotate | Download (13 kB)

1 8df4ab84 Vangelis Koukis
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
2 55775645 Vangelis Koukis
#
3 55775645 Vangelis Koukis
# Redistribution and use in source and binary forms, with or
4 55775645 Vangelis Koukis
# without modification, are permitted provided that the following
5 55775645 Vangelis Koukis
# conditions are met:
6 55775645 Vangelis Koukis
#
7 55775645 Vangelis Koukis
#   1. Redistributions of source code must retain the above
8 55775645 Vangelis Koukis
#      copyright notice, this list of conditions and the following
9 55775645 Vangelis Koukis
#      disclaimer.
10 55775645 Vangelis Koukis
#
11 55775645 Vangelis Koukis
#   2. Redistributions in binary form must reproduce the above
12 55775645 Vangelis Koukis
#      copyright notice, this list of conditions and the following
13 55775645 Vangelis Koukis
#      disclaimer in the documentation and/or other materials
14 55775645 Vangelis Koukis
#      provided with the distribution.
15 55775645 Vangelis Koukis
#
16 55775645 Vangelis Koukis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 55775645 Vangelis Koukis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 55775645 Vangelis Koukis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 55775645 Vangelis Koukis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 55775645 Vangelis Koukis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 55775645 Vangelis Koukis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 55775645 Vangelis Koukis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 55775645 Vangelis Koukis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 55775645 Vangelis Koukis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 55775645 Vangelis Koukis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 55775645 Vangelis Koukis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 55775645 Vangelis Koukis
# POSSIBILITY OF SUCH DAMAGE.
28 55775645 Vangelis Koukis
#
29 55775645 Vangelis Koukis
# The views and conclusions contained in the software and
30 55775645 Vangelis Koukis
# documentation are those of the authors and should not be
31 55775645 Vangelis Koukis
# interpreted as representing official policies, either expressed
32 55775645 Vangelis Koukis
# or implied, of GRNET S.A.
33 55775645 Vangelis Koukis
34 4a45f70c Christos Stavrakakis
"""Helper script for automatic build of debian packages."""
35 4a45f70c Christos Stavrakakis
36 55775645 Vangelis Koukis
import os
37 55775645 Vangelis Koukis
import sys
38 18be409c Christos Stavrakakis
39 18be409c Christos Stavrakakis
from git import GitCommandError
40 55775645 Vangelis Koukis
from optparse import OptionParser
41 4a45f70c Christos Stavrakakis
from sh import mktemp, cd, rm, git_dch  # pylint: disable=E0611
42 55775645 Vangelis Koukis
43 e727d1ba Christos Stavrakakis
from devflow import versioning
44 9fe1ecd8 Christos Stavrakakis
from devflow import utils
45 c181882a Christos Stavrakakis
from devflow import BRANCH_TYPES
46 866bb9c1 Christos Stavrakakis
47 8efe95c4 Christos Stavrakakis
if sys.stdout.isatty():
48 8efe95c4 Christos Stavrakakis
    try:
49 8efe95c4 Christos Stavrakakis
        import colors
50 8efe95c4 Christos Stavrakakis
        use_colors = True
51 8efe95c4 Christos Stavrakakis
    except AttributeError:
52 8efe95c4 Christos Stavrakakis
        use_colors = False
53 f9f89675 Christos Stavrakakis
else:
54 f9f89675 Christos Stavrakakis
    use_colors = False
55 8efe95c4 Christos Stavrakakis
56 8efe95c4 Christos Stavrakakis
57 8efe95c4 Christos Stavrakakis
if use_colors:
58 8efe95c4 Christos Stavrakakis
    red = colors.red
59 8efe95c4 Christos Stavrakakis
    green = colors.green
60 8efe95c4 Christos Stavrakakis
else:
61 55775645 Vangelis Koukis
    red = lambda x: x
62 55775645 Vangelis Koukis
    green = lambda x: x
63 55775645 Vangelis Koukis
64 55775645 Vangelis Koukis
print_red = lambda x: sys.stdout.write(red(x) + "\n")
65 55775645 Vangelis Koukis
print_green = lambda x: sys.stdout.write(green(x) + "\n")
66 55775645 Vangelis Koukis
67 55775645 Vangelis Koukis
AVAILABLE_MODES = ["release", "snapshot"]
68 55775645 Vangelis Koukis
69 7316df0e Christos Stavrakakis
DESCRIPTION = """Tool for automatical build of debian packages.
70 7316df0e Christos Stavrakakis

71 7316df0e Christos Stavrakakis
%(prog)s is a helper script for automatic build of debian packages from
72 7316df0e Christos Stavrakakis
repositories that follow the `git flow` development model
73 7316df0e Christos Stavrakakis
<http://nvie.com/posts/a-successful-git-branching-model/>.
74 7316df0e Christos Stavrakakis

75 b1aa3d49 Christos Stavrakakis
This script must run from inside a clean git repository and will perform the
76 b1aa3d49 Christos Stavrakakis
following steps:
77 7316df0e Christos Stavrakakis
    * Clone your repository to a temporary directory
78 7316df0e Christos Stavrakakis
    * Merge the current branch with the corresponding debian branch
79 7316df0e Christos Stavrakakis
    * Compute the version of the new package and update the python
80 7316df0e Christos Stavrakakis
      version files
81 7316df0e Christos Stavrakakis
    * Create a new entry in debian/changelog, using `git-dch`
82 7316df0e Christos Stavrakakis
    * Create the debian packages, using `git-buildpackage`
83 7316df0e Christos Stavrakakis
    * Tag the appropriate branches if in `release` mode
84 7316df0e Christos Stavrakakis

85 b1aa3d49 Christos Stavrakakis
%(prog)s will work with the packages that are declared in `autopkg.conf`
86 b1aa3d49 Christos Stavrakakis
file, which must exist in the toplevel directory of the git repository.
87 b1aa3d49 Christos Stavrakakis

88 7316df0e Christos Stavrakakis
"""
89 7316df0e Christos Stavrakakis
90 7316df0e Christos Stavrakakis
91 7316df0e Christos Stavrakakis
def print_help(prog):
92 7316df0e Christos Stavrakakis
    print DESCRIPTION % {"prog": prog}
93 7316df0e Christos Stavrakakis
94 55775645 Vangelis Koukis
95 55775645 Vangelis Koukis
def main():
96 c642d7cb Christos Stavrakakis
    from devflow.version import __version__  # pylint: disable=E0611,F0401
97 55775645 Vangelis Koukis
    parser = OptionParser(usage="usage: %prog [options] mode",
98 7316df0e Christos Stavrakakis
                          version="devflow %s" % __version__,
99 7316df0e Christos Stavrakakis
                          add_help_option=False)
100 7316df0e Christos Stavrakakis
    parser.add_option("-h", "--help",
101 7316df0e Christos Stavrakakis
                      action="store_true",
102 7316df0e Christos Stavrakakis
                      default=False,
103 7316df0e Christos Stavrakakis
                      help="show this help message")
104 55775645 Vangelis Koukis
    parser.add_option("-k", "--keep-repo",
105 55775645 Vangelis Koukis
                      action="store_true",
106 55775645 Vangelis Koukis
                      dest="keep_repo",
107 55775645 Vangelis Koukis
                      default=False,
108 55775645 Vangelis Koukis
                      help="Do not delete the cloned repository")
109 55775645 Vangelis Koukis
    parser.add_option("-b", "--build-dir",
110 55775645 Vangelis Koukis
                      dest="build_dir",
111 55775645 Vangelis Koukis
                      default=None,
112 55775645 Vangelis Koukis
                      help="Directory to store created pacakges")
113 55775645 Vangelis Koukis
    parser.add_option("-r", "--repo-dir",
114 55775645 Vangelis Koukis
                      dest="repo_dir",
115 55775645 Vangelis Koukis
                      default=None,
116 55775645 Vangelis Koukis
                      help="Directory to clone repository")
117 55775645 Vangelis Koukis
    parser.add_option("-d", "--dirty",
118 55775645 Vangelis Koukis
                      dest="force_dirty",
119 55775645 Vangelis Koukis
                      default=False,
120 55775645 Vangelis Koukis
                      action="store_true",
121 55775645 Vangelis Koukis
                      help="Do not check if working directory is dirty")
122 b1aa3d49 Christos Stavrakakis
    parser.add_option("-c", "--config-file",
123 b1aa3d49 Christos Stavrakakis
                      dest="config_file",
124 b1aa3d49 Christos Stavrakakis
                      help="Override default configuration file")
125 c9c385c0 Christos Stavrakakis
    parser.add_option("--no-sign",
126 c9c385c0 Christos Stavrakakis
                      dest="sign",
127 c9c385c0 Christos Stavrakakis
                      action="store_false",
128 c9c385c0 Christos Stavrakakis
                      default=True,
129 c9c385c0 Christos Stavrakakis
                      help="Do not sign the packages")
130 4a8d727c Christos Stavrakakis
    parser.add_option("--key-id",
131 4a8d727c Christos Stavrakakis
                      dest="keyid",
132 4a8d727c Christos Stavrakakis
                      help="Use this keyid for gpg signing")
133 d4b7f566 Christos Stavrakakis
    parser.add_option("--dist",
134 d4b7f566 Christos Stavrakakis
                      dest="dist",
135 42868817 Christos Stavrakakis
                      default=None,
136 42868817 Christos Stavrakakis
                      help="Force distribution in Debian changelog"),
137 a09634f8 Christos Stavrakakis
    parser.add_option("-S", "--source-only",
138 a09634f8 Christos Stavrakakis
                      dest="source_only",
139 a09634f8 Christos Stavrakakis
                      default=False,
140 a09634f8 Christos Stavrakakis
                      action="store_true",
141 a09634f8 Christos Stavrakakis
                      help="Specifies a source-only build, no binary packages"
142 a09634f8 Christos Stavrakakis
                           " need to be made.")
143 1296e42b Christos Stavrakakis
    parser.add_option("--debian-branch",
144 1296e42b Christos Stavrakakis
                      dest="debian_branch",
145 1296e42b Christos Stavrakakis
                      default=None,
146 1296e42b Christos Stavrakakis
                      help="Use this debian branch, instead of"
147 1296e42b Christos Stavrakakis
                           "auto-discovering the debian branch to use")
148 55775645 Vangelis Koukis
149 55775645 Vangelis Koukis
    (options, args) = parser.parse_args()
150 55775645 Vangelis Koukis
151 7316df0e Christos Stavrakakis
    if options.help:
152 7316df0e Christos Stavrakakis
        print_help(parser.get_prog_name())
153 7316df0e Christos Stavrakakis
        parser.print_help()
154 7316df0e Christos Stavrakakis
        return
155 7316df0e Christos Stavrakakis
156 b1aa3d49 Christos Stavrakakis
    # Get build mode
157 866bb9c1 Christos Stavrakakis
    try:
158 866bb9c1 Christos Stavrakakis
        mode = args[0]
159 866bb9c1 Christos Stavrakakis
    except IndexError:
160 c181882a Christos Stavrakakis
        mode = utils.get_build_mode()
161 55775645 Vangelis Koukis
    if mode not in AVAILABLE_MODES:
162 55775645 Vangelis Koukis
        raise ValueError(red("Invalid argument! Mode must be one: %s"
163 55775645 Vangelis Koukis
                         % ", ".join(AVAILABLE_MODES)))
164 55775645 Vangelis Koukis
165 b1aa3d49 Christos Stavrakakis
    # Load the repository
166 9fe1ecd8 Christos Stavrakakis
    original_repo = utils.get_repository()
167 55775645 Vangelis Koukis
168 b1aa3d49 Christos Stavrakakis
    # Check that repository is clean
169 1e4d1435 Christos Stavrakakis
    toplevel = original_repo.working_dir
170 55775645 Vangelis Koukis
    if original_repo.is_dirty() and not options.force_dirty:
171 55775645 Vangelis Koukis
        raise RuntimeError(red("Repository %s is dirty." % toplevel))
172 55775645 Vangelis Koukis
173 b1aa3d49 Christos Stavrakakis
    # Get packages from configuration file
174 ffcbf2bb Christos Stavrakakis
    config = utils.get_config(options.config_file)
175 bec4bf12 Christos Stavrakakis
    packages = config['packages'].keys()
176 8c028e36 Christos Stavrakakis
    print_green("Will build the following packages:\n" + "\n".join(packages))
177 55775645 Vangelis Koukis
178 8c028e36 Christos Stavrakakis
    # Get current branch name and type and check if it is a valid one
179 9be34db8 Christos Stavrakakis
    branch = original_repo.head.reference.name
180 b78d6238 Christos Stavrakakis
    branch = utils.undebianize(branch)
181 4f36685f Christos Stavrakakis
    branch_type_str = utils.get_branch_type(branch)
182 55775645 Vangelis Koukis
183 445f53a7 Christos Stavrakakis
    if branch_type_str not in BRANCH_TYPES.keys():
184 8c028e36 Christos Stavrakakis
        allowed_branches = ", ".join(BRANCH_TYPES.keys())
185 5a29a44e Christos Stavrakakis
        raise ValueError("Malformed branch name '%s', cannot classify as"
186 5a29a44e Christos Stavrakakis
                         " one of %s" % (branch, allowed_branches))
187 5a29a44e Christos Stavrakakis
188 b54fa347 Christos Stavrakakis
    # Fix needed environment variables
189 b54fa347 Christos Stavrakakis
    os.environ["DEVFLOW_BUILD_MODE"] = mode
190 b54fa347 Christos Stavrakakis
    git_config = original_repo.config_reader()
191 694db487 Christos Stavrakakis
    try:
192 694db487 Christos Stavrakakis
        os.environ["DEBFULLNAME"] = git_config.get_value("user", "name")
193 694db487 Christos Stavrakakis
        os.environ["DEBEMAIL"] = git_config.get_value("user", "email")
194 694db487 Christos Stavrakakis
    except:
195 694db487 Christos Stavrakakis
        print "Could not load user/email from config"
196 b54fa347 Christos Stavrakakis
197 4de00f9c Christos Stavrakakis
    # Check that base version file and branch are correct
198 4de00f9c Christos Stavrakakis
    versioning.get_python_version()
199 4de00f9c Christos Stavrakakis
200 d0c4fc17 Christos Stavrakakis
    # Get the debian branch
201 1296e42b Christos Stavrakakis
    if options.debian_branch:
202 1296e42b Christos Stavrakakis
        debian_branch = options.debian_branch
203 1296e42b Christos Stavrakakis
    else:
204 1296e42b Christos Stavrakakis
        debian_branch = utils.get_debian_branch(branch)
205 e727d1ba Christos Stavrakakis
    origin_debian = "origin/" + debian_branch
206 9be34db8 Christos Stavrakakis
207 9be34db8 Christos Stavrakakis
    # Clone the repo
208 9be34db8 Christos Stavrakakis
    repo_dir = options.repo_dir or create_temp_directory("df-repo")
209 5b60dcab Christos Stavrakakis
    repo_dir = os.path.abspath(repo_dir)
210 2ec250c7 Christos Stavrakakis
    repo = original_repo.clone(repo_dir, branch=branch)
211 9be34db8 Christos Stavrakakis
    print_green("Cloned repository to '%s'." % repo_dir)
212 8c028e36 Christos Stavrakakis
213 5b60dcab Christos Stavrakakis
    build_dir = options.build_dir or create_temp_directory("df-build")
214 5b60dcab Christos Stavrakakis
    build_dir = os.path.abspath(build_dir)
215 5b60dcab Christos Stavrakakis
    print_green("Build directory: '%s'" % build_dir)
216 5b60dcab Christos Stavrakakis
217 9be34db8 Christos Stavrakakis
    # Create the debian branch
218 8c028e36 Christos Stavrakakis
    repo.git.branch(debian_branch, origin_debian)
219 e727d1ba Christos Stavrakakis
    print_green("Created branch '%s' to track '%s'" % (debian_branch,
220 e727d1ba Christos Stavrakakis
                origin_debian))
221 55775645 Vangelis Koukis
222 b1aa3d49 Christos Stavrakakis
    # Go to debian branch
223 55775645 Vangelis Koukis
    repo.git.checkout(debian_branch)
224 55775645 Vangelis Koukis
    print_green("Changed to branch '%s'" % debian_branch)
225 55775645 Vangelis Koukis
226 b1aa3d49 Christos Stavrakakis
    # Merge with starting branch
227 55775645 Vangelis Koukis
    repo.git.merge(branch)
228 8c028e36 Christos Stavrakakis
    print_green("Merged branch '%s' into '%s'" % (branch, debian_branch))
229 55775645 Vangelis Koukis
230 b1aa3d49 Christos Stavrakakis
    # Compute python and debian version
231 55775645 Vangelis Koukis
    cd(repo_dir)
232 e727d1ba Christos Stavrakakis
    python_version = versioning.get_python_version()
233 7316df0e Christos Stavrakakis
    debian_version = versioning.\
234 2ec7054e Christos Stavrakakis
        debian_version_from_python_version(python_version)
235 866bb9c1 Christos Stavrakakis
    print_green("The new debian version will be: '%s'" % debian_version)
236 55775645 Vangelis Koukis
237 8334fb57 Christos Stavrakakis
    # Update the version files
238 0dcfcb5f Christos Stavrakakis
    versioning.update_version()
239 8334fb57 Christos Stavrakakis
240 d3af231f Christos Stavrakakis
241 d3af231f Christos Stavrakakis
    if not options.sign:
242 d3af231f Christos Stavrakakis
        sign_tag_opt = None
243 d3af231f Christos Stavrakakis
    elif options.keyid:
244 d3af231f Christos Stavrakakis
        sign_tag_opt = "-u=%s" % options.keyid
245 d3af231f Christos Stavrakakis
    elif mode == "release":
246 d3af231f Christos Stavrakakis
        sign_tag_opt = "-s"
247 d3af231f Christos Stavrakakis
    else:
248 d3af231f Christos Stavrakakis
        sign_tag_opt = None
249 d3af231f Christos Stavrakakis
250 8c028e36 Christos Stavrakakis
    # Tag branch with python version
251 8c028e36 Christos Stavrakakis
    branch_tag = python_version
252 d3af231f Christos Stavrakakis
    tag_message = "%s version %s" % (mode.capitalize(), python_version)
253 18be409c Christos Stavrakakis
    try:
254 d3af231f Christos Stavrakakis
        repo.git.tag(branch_tag, branch, sign_tag_opt, "-m=%s" % tag_message)
255 18be409c Christos Stavrakakis
    except GitCommandError:
256 18be409c Christos Stavrakakis
        # Tag may already exist, if only the debian branch has changed
257 18be409c Christos Stavrakakis
        pass
258 ce5f5240 Christos Stavrakakis
    upstream_tag = "upstream/" + branch_tag
259 ce5f5240 Christos Stavrakakis
    repo.git.tag(upstream_tag, branch)
260 8c028e36 Christos Stavrakakis
261 b1aa3d49 Christos Stavrakakis
    # Update changelog
262 55775645 Vangelis Koukis
    dch = git_dch("--debian-branch=%s" % debian_branch,
263 2ec7054e Christos Stavrakakis
                  "--git-author",
264 2ec7054e Christos Stavrakakis
                  "--ignore-regex=\".*\"",
265 2ec7054e Christos Stavrakakis
                  "--multimaint-merge",
266 2ec7054e Christos Stavrakakis
                  "--since=HEAD",
267 2ec7054e Christos Stavrakakis
                  "--new-version=%s" % debian_version)
268 55775645 Vangelis Koukis
    print_green("Successfully ran '%s'" % " ".join(dch.cmd))
269 55775645 Vangelis Koukis
270 42868817 Christos Stavrakakis
    if options.dist is not None:
271 42868817 Christos Stavrakakis
        distribution = options.dist
272 42868817 Christos Stavrakakis
    elif mode == "release":
273 42868817 Christos Stavrakakis
        distribution = utils.get_distribution_codename()
274 42868817 Christos Stavrakakis
    else:
275 42868817 Christos Stavrakakis
        distribution = "unstable"
276 42868817 Christos Stavrakakis
277 42868817 Christos Stavrakakis
    f = open("debian/changelog", 'r+')
278 42868817 Christos Stavrakakis
    lines = f.readlines()
279 42868817 Christos Stavrakakis
    lines[0] = lines[0].replace("UNRELEASED", distribution)
280 42868817 Christos Stavrakakis
    lines[2] = lines[2].replace("UNRELEASED", "%s build" % mode)
281 42868817 Christos Stavrakakis
    f.seek(0)
282 42868817 Christos Stavrakakis
    f.writelines(lines)
283 42868817 Christos Stavrakakis
    f.close()
284 42868817 Christos Stavrakakis
285 55775645 Vangelis Koukis
    if mode == "release":
286 1b883fea Christos Stavrakakis
        call("vim debian/changelog")
287 8c028e36 Christos Stavrakakis
288 8c028e36 Christos Stavrakakis
    # Add changelog to INDEX
289 8c028e36 Christos Stavrakakis
    repo.git.add("debian/changelog")
290 8c028e36 Christos Stavrakakis
    # Commit Changes
291 8c028e36 Christos Stavrakakis
    repo.git.commit("-s", "-a", m="Bump version to %s" % debian_version)
292 8c028e36 Christos Stavrakakis
    # Tag debian branch
293 6e9193cb Christos Stavrakakis
    debian_branch_tag = "debian/" + utils.version_to_tag(debian_version)
294 d3af231f Christos Stavrakakis
    tag_message = "%s version %s" % (mode.capitalize(), debian_version)
295 7fcadb0c Christos Stavrakakis
    if mode == "release":
296 d3af231f Christos Stavrakakis
        repo.git.tag(debian_branch_tag, sign_tag_opt, "-m=%s" % tag_message)
297 55775645 Vangelis Koukis
298 55775645 Vangelis Koukis
    # Add version.py files to repo
299 1b883fea Christos Stavrakakis
    call("grep \"__version_vcs\" -r . -l -I | xargs git add -f")
300 55775645 Vangelis Koukis
301 8c028e36 Christos Stavrakakis
    # Create debian packages
302 866bb9c1 Christos Stavrakakis
    cd(repo_dir)
303 3a150e7c Christos Stavrakakis
    version_files = []
304 3a150e7c Christos Stavrakakis
    for _, pkg_info in config['packages'].items():
305 3a150e7c Christos Stavrakakis
        version_files.append(pkg_info['version_file'])
306 3a150e7c Christos Stavrakakis
    ignore_regexp = "|".join(["^(%s)$" % vf for vf in version_files])
307 c9c385c0 Christos Stavrakakis
    build_cmd = "git-buildpackage --git-export-dir=%s"\
308 c9c385c0 Christos Stavrakakis
                " --git-upstream-branch=%s --git-debian-branch=%s"\
309 c9c385c0 Christos Stavrakakis
                " --git-export=INDEX --git-ignore-new -sa"\
310 3a150e7c Christos Stavrakakis
                " --source-option='\"--extend-diff-ignore=%s\"'"\
311 3a150e7c Christos Stavrakakis
                " --git-upstream-tag=%s"\
312 3a150e7c Christos Stavrakakis
                % (build_dir, branch, debian_branch, ignore_regexp,
313 3a150e7c Christos Stavrakakis
                   upstream_tag)
314 a09634f8 Christos Stavrakakis
    if options.source_only:
315 a09634f8 Christos Stavrakakis
        build_cmd += " -S"
316 c9c385c0 Christos Stavrakakis
    if not options.sign:
317 c9c385c0 Christos Stavrakakis
        build_cmd += " -uc -us"
318 4a8d727c Christos Stavrakakis
    elif options.keyid:
319 4a8d727c Christos Stavrakakis
        build_cmd += " -k\"'%s'\"" % options.keyid
320 c9c385c0 Christos Stavrakakis
    call(build_cmd)
321 55775645 Vangelis Koukis
322 b1aa3d49 Christos Stavrakakis
    # Remove cloned repo
323 f80b3f6a Christos Stavrakakis
    if mode != 'release' and not options.keep_repo:
324 55775645 Vangelis Koukis
        print_green("Removing cloned repo '%s'." % repo_dir)
325 55775645 Vangelis Koukis
        rm("-r", repo_dir)
326 55775645 Vangelis Koukis
327 8c028e36 Christos Stavrakakis
    # Print final info
328 8c028e36 Christos Stavrakakis
    info = (("Version", debian_version),
329 8c028e36 Christos Stavrakakis
            ("Upstream branch", branch),
330 8c028e36 Christos Stavrakakis
            ("Upstream tag", branch_tag),
331 8c028e36 Christos Stavrakakis
            ("Debian branch", debian_branch),
332 8c028e36 Christos Stavrakakis
            ("Debian tag", debian_branch_tag),
333 8c028e36 Christos Stavrakakis
            ("Repository directory", repo_dir),
334 8c028e36 Christos Stavrakakis
            ("Packages directory", build_dir))
335 8c028e36 Christos Stavrakakis
    print_green("\n".join(["%s: %s" % (name, val) for name, val in info]))
336 866bb9c1 Christos Stavrakakis
337 b1aa3d49 Christos Stavrakakis
    # Print help message
338 866bb9c1 Christos Stavrakakis
    if mode == "release":
339 8c028e36 Christos Stavrakakis
        origin = original_repo.remote().url
340 8c028e36 Christos Stavrakakis
        repo.create_remote("original_origin", origin)
341 8c028e36 Christos Stavrakakis
        print_green("Created remote 'original_origin' for the repository '%s'"
342 8c028e36 Christos Stavrakakis
                    % origin)
343 866bb9c1 Christos Stavrakakis
344 8c028e36 Christos Stavrakakis
        print_green("To update repositories '%s' and '%s' go to '%s' and run:"
345 8c028e36 Christos Stavrakakis
                    % (toplevel, origin, repo_dir))
346 8c028e36 Christos Stavrakakis
        for remote in ['origin', 'original_origin']:
347 8c2716c5 Christos Stavrakakis
            objects = [debian_branch, branch_tag, debian_branch_tag]
348 8c2716c5 Christos Stavrakakis
            print_green("git push %s %s" % (remote, " ".join(objects)))
349 866bb9c1 Christos Stavrakakis
350 866bb9c1 Christos Stavrakakis
351 ca01e50e Christos Stavrakakis
def create_temp_directory(suffix):
352 ca01e50e Christos Stavrakakis
    create_dir_cmd = mktemp("-d", "/tmp/" + suffix + "-XXXXX")
353 ca01e50e Christos Stavrakakis
    return create_dir_cmd.stdout.strip()
354 55775645 Vangelis Koukis
355 55775645 Vangelis Koukis
356 1b883fea Christos Stavrakakis
def call(cmd):
357 1b883fea Christos Stavrakakis
    rc = os.system(cmd)
358 1b883fea Christos Stavrakakis
    if rc:
359 06dcdc1b Christos Stavrakakis
        raise RuntimeError("Command '%s' failed!" % cmd)
360 b1aa3d49 Christos Stavrakakis
361 b1aa3d49 Christos Stavrakakis
362 55775645 Vangelis Koukis
if __name__ == "__main__":
363 55775645 Vangelis Koukis
    sys.exit(main())