Statistics
| Branch: | Tag: | Revision:

root / devflow / autopkg.py @ c13bf70a

History | View | Annotate | Download (13.2 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 938a4739 Christos Stavrakakis
    parser.add_option("--push-back",
149 938a4739 Christos Stavrakakis
                      dest="push_back",
150 938a4739 Christos Stavrakakis
                      default=False,
151 938a4739 Christos Stavrakakis
                      action="store_true",
152 938a4739 Christos Stavrakakis
                      help="Automatically push branches and tags to repo.")
153 55775645 Vangelis Koukis
154 55775645 Vangelis Koukis
    (options, args) = parser.parse_args()
155 55775645 Vangelis Koukis
156 7316df0e Christos Stavrakakis
    if options.help:
157 7316df0e Christos Stavrakakis
        print_help(parser.get_prog_name())
158 7316df0e Christos Stavrakakis
        parser.print_help()
159 7316df0e Christos Stavrakakis
        return
160 7316df0e Christos Stavrakakis
161 b1aa3d49 Christos Stavrakakis
    # Get build mode
162 866bb9c1 Christos Stavrakakis
    try:
163 866bb9c1 Christos Stavrakakis
        mode = args[0]
164 866bb9c1 Christos Stavrakakis
    except IndexError:
165 c181882a Christos Stavrakakis
        mode = utils.get_build_mode()
166 55775645 Vangelis Koukis
    if mode not in AVAILABLE_MODES:
167 55775645 Vangelis Koukis
        raise ValueError(red("Invalid argument! Mode must be one: %s"
168 55775645 Vangelis Koukis
                         % ", ".join(AVAILABLE_MODES)))
169 55775645 Vangelis Koukis
170 b1aa3d49 Christos Stavrakakis
    # Load the repository
171 9fe1ecd8 Christos Stavrakakis
    original_repo = utils.get_repository()
172 55775645 Vangelis Koukis
173 b1aa3d49 Christos Stavrakakis
    # Check that repository is clean
174 1e4d1435 Christos Stavrakakis
    toplevel = original_repo.working_dir
175 55775645 Vangelis Koukis
    if original_repo.is_dirty() and not options.force_dirty:
176 55775645 Vangelis Koukis
        raise RuntimeError(red("Repository %s is dirty." % toplevel))
177 55775645 Vangelis Koukis
178 b1aa3d49 Christos Stavrakakis
    # Get packages from configuration file
179 ffcbf2bb Christos Stavrakakis
    config = utils.get_config(options.config_file)
180 bec4bf12 Christos Stavrakakis
    packages = config['packages'].keys()
181 8c028e36 Christos Stavrakakis
    print_green("Will build the following packages:\n" + "\n".join(packages))
182 55775645 Vangelis Koukis
183 8c028e36 Christos Stavrakakis
    # Get current branch name and type and check if it is a valid one
184 9be34db8 Christos Stavrakakis
    branch = original_repo.head.reference.name
185 b78d6238 Christos Stavrakakis
    branch = utils.undebianize(branch)
186 4f36685f Christos Stavrakakis
    branch_type_str = utils.get_branch_type(branch)
187 55775645 Vangelis Koukis
188 445f53a7 Christos Stavrakakis
    if branch_type_str not in BRANCH_TYPES.keys():
189 8c028e36 Christos Stavrakakis
        allowed_branches = ", ".join(BRANCH_TYPES.keys())
190 5a29a44e Christos Stavrakakis
        raise ValueError("Malformed branch name '%s', cannot classify as"
191 5a29a44e Christos Stavrakakis
                         " one of %s" % (branch, allowed_branches))
192 5a29a44e Christos Stavrakakis
193 b54fa347 Christos Stavrakakis
    # Fix needed environment variables
194 6b88d711 Christos Stavrakakis
    v = utils.get_vcs_info()
195 b54fa347 Christos Stavrakakis
    os.environ["DEVFLOW_BUILD_MODE"] = mode
196 6b88d711 Christos Stavrakakis
    os.environ["DEBFULLNAME"] = v.name
197 6b88d711 Christos Stavrakakis
    os.environ["DEBEMAIL"] = v.email
198 b54fa347 Christos Stavrakakis
199 4de00f9c Christos Stavrakakis
    # Check that base version file and branch are correct
200 4de00f9c Christos Stavrakakis
    versioning.get_python_version()
201 4de00f9c Christos Stavrakakis
202 d0c4fc17 Christos Stavrakakis
    # Get the debian branch
203 1296e42b Christos Stavrakakis
    if options.debian_branch:
204 1296e42b Christos Stavrakakis
        debian_branch = options.debian_branch
205 1296e42b Christos Stavrakakis
    else:
206 1296e42b Christos Stavrakakis
        debian_branch = utils.get_debian_branch(branch)
207 e727d1ba Christos Stavrakakis
    origin_debian = "origin/" + debian_branch
208 9be34db8 Christos Stavrakakis
209 9be34db8 Christos Stavrakakis
    # Clone the repo
210 9be34db8 Christos Stavrakakis
    repo_dir = options.repo_dir or create_temp_directory("df-repo")
211 5b60dcab Christos Stavrakakis
    repo_dir = os.path.abspath(repo_dir)
212 2ec250c7 Christos Stavrakakis
    repo = original_repo.clone(repo_dir, branch=branch)
213 9be34db8 Christos Stavrakakis
    print_green("Cloned repository to '%s'." % repo_dir)
214 8c028e36 Christos Stavrakakis
215 5b60dcab Christos Stavrakakis
    build_dir = options.build_dir or create_temp_directory("df-build")
216 5b60dcab Christos Stavrakakis
    build_dir = os.path.abspath(build_dir)
217 5b60dcab Christos Stavrakakis
    print_green("Build directory: '%s'" % build_dir)
218 5b60dcab Christos Stavrakakis
219 9be34db8 Christos Stavrakakis
    # Create the debian branch
220 8c028e36 Christos Stavrakakis
    repo.git.branch(debian_branch, origin_debian)
221 e727d1ba Christos Stavrakakis
    print_green("Created branch '%s' to track '%s'" % (debian_branch,
222 e727d1ba Christos Stavrakakis
                origin_debian))
223 55775645 Vangelis Koukis
224 b1aa3d49 Christos Stavrakakis
    # Go to debian branch
225 55775645 Vangelis Koukis
    repo.git.checkout(debian_branch)
226 55775645 Vangelis Koukis
    print_green("Changed to branch '%s'" % debian_branch)
227 55775645 Vangelis Koukis
228 b1aa3d49 Christos Stavrakakis
    # Merge with starting branch
229 55775645 Vangelis Koukis
    repo.git.merge(branch)
230 8c028e36 Christos Stavrakakis
    print_green("Merged branch '%s' into '%s'" % (branch, debian_branch))
231 55775645 Vangelis Koukis
232 b1aa3d49 Christos Stavrakakis
    # Compute python and debian version
233 55775645 Vangelis Koukis
    cd(repo_dir)
234 e727d1ba Christos Stavrakakis
    python_version = versioning.get_python_version()
235 7316df0e Christos Stavrakakis
    debian_version = versioning.\
236 2ec7054e Christos Stavrakakis
        debian_version_from_python_version(python_version)
237 866bb9c1 Christos Stavrakakis
    print_green("The new debian version will be: '%s'" % debian_version)
238 55775645 Vangelis Koukis
239 8334fb57 Christos Stavrakakis
    # Update the version files
240 0dcfcb5f Christos Stavrakakis
    versioning.update_version()
241 8334fb57 Christos Stavrakakis
242 d3af231f Christos Stavrakakis
243 d3af231f Christos Stavrakakis
    if not options.sign:
244 d3af231f Christos Stavrakakis
        sign_tag_opt = None
245 d3af231f Christos Stavrakakis
    elif options.keyid:
246 d3af231f Christos Stavrakakis
        sign_tag_opt = "-u=%s" % options.keyid
247 d3af231f Christos Stavrakakis
    elif mode == "release":
248 d3af231f Christos Stavrakakis
        sign_tag_opt = "-s"
249 d3af231f Christos Stavrakakis
    else:
250 d3af231f Christos Stavrakakis
        sign_tag_opt = None
251 d3af231f Christos Stavrakakis
252 8c028e36 Christos Stavrakakis
    # Tag branch with python version
253 8c028e36 Christos Stavrakakis
    branch_tag = python_version
254 d3af231f Christos Stavrakakis
    tag_message = "%s version %s" % (mode.capitalize(), python_version)
255 18be409c Christos Stavrakakis
    try:
256 d3af231f Christos Stavrakakis
        repo.git.tag(branch_tag, branch, sign_tag_opt, "-m=%s" % tag_message)
257 18be409c Christos Stavrakakis
    except GitCommandError:
258 18be409c Christos Stavrakakis
        # Tag may already exist, if only the debian branch has changed
259 18be409c Christos Stavrakakis
        pass
260 ce5f5240 Christos Stavrakakis
    upstream_tag = "upstream/" + branch_tag
261 ce5f5240 Christos Stavrakakis
    repo.git.tag(upstream_tag, branch)
262 8c028e36 Christos Stavrakakis
263 b1aa3d49 Christos Stavrakakis
    # Update changelog
264 55775645 Vangelis Koukis
    dch = git_dch("--debian-branch=%s" % debian_branch,
265 2ec7054e Christos Stavrakakis
                  "--git-author",
266 2ec7054e Christos Stavrakakis
                  "--ignore-regex=\".*\"",
267 2ec7054e Christos Stavrakakis
                  "--multimaint-merge",
268 2ec7054e Christos Stavrakakis
                  "--since=HEAD",
269 2ec7054e Christos Stavrakakis
                  "--new-version=%s" % debian_version)
270 55775645 Vangelis Koukis
    print_green("Successfully ran '%s'" % " ".join(dch.cmd))
271 55775645 Vangelis Koukis
272 42868817 Christos Stavrakakis
    if options.dist is not None:
273 42868817 Christos Stavrakakis
        distribution = options.dist
274 42868817 Christos Stavrakakis
    elif mode == "release":
275 42868817 Christos Stavrakakis
        distribution = utils.get_distribution_codename()
276 42868817 Christos Stavrakakis
    else:
277 42868817 Christos Stavrakakis
        distribution = "unstable"
278 42868817 Christos Stavrakakis
279 42868817 Christos Stavrakakis
    f = open("debian/changelog", 'r+')
280 42868817 Christos Stavrakakis
    lines = f.readlines()
281 42868817 Christos Stavrakakis
    lines[0] = lines[0].replace("UNRELEASED", distribution)
282 42868817 Christos Stavrakakis
    lines[2] = lines[2].replace("UNRELEASED", "%s build" % mode)
283 42868817 Christos Stavrakakis
    f.seek(0)
284 42868817 Christos Stavrakakis
    f.writelines(lines)
285 42868817 Christos Stavrakakis
    f.close()
286 42868817 Christos Stavrakakis
287 55775645 Vangelis Koukis
    if mode == "release":
288 1b883fea Christos Stavrakakis
        call("vim debian/changelog")
289 8c028e36 Christos Stavrakakis
290 8c028e36 Christos Stavrakakis
    # Add changelog to INDEX
291 8c028e36 Christos Stavrakakis
    repo.git.add("debian/changelog")
292 8c028e36 Christos Stavrakakis
    # Commit Changes
293 8c028e36 Christos Stavrakakis
    repo.git.commit("-s", "-a", m="Bump version to %s" % debian_version)
294 8c028e36 Christos Stavrakakis
    # Tag debian branch
295 6e9193cb Christos Stavrakakis
    debian_branch_tag = "debian/" + utils.version_to_tag(debian_version)
296 d3af231f Christos Stavrakakis
    tag_message = "%s version %s" % (mode.capitalize(), debian_version)
297 7fcadb0c Christos Stavrakakis
    if mode == "release":
298 d3af231f Christos Stavrakakis
        repo.git.tag(debian_branch_tag, sign_tag_opt, "-m=%s" % tag_message)
299 55775645 Vangelis Koukis
300 55775645 Vangelis Koukis
    # Add version.py files to repo
301 1b883fea Christos Stavrakakis
    call("grep \"__version_vcs\" -r . -l -I | xargs git add -f")
302 55775645 Vangelis Koukis
303 8c028e36 Christos Stavrakakis
    # Create debian packages
304 866bb9c1 Christos Stavrakakis
    cd(repo_dir)
305 3a150e7c Christos Stavrakakis
    version_files = []
306 3a150e7c Christos Stavrakakis
    for _, pkg_info in config['packages'].items():
307 3a150e7c Christos Stavrakakis
        version_files.append(pkg_info['version_file'])
308 c13bf70a Christos Stavrakakis
    # Export version info to debuilg environment
309 c13bf70a Christos Stavrakakis
    os.environ["DEB_DEVFLOW_DEBIAN_VERSION"] = debian_version
310 c9c385c0 Christos Stavrakakis
    build_cmd = "git-buildpackage --git-export-dir=%s"\
311 c9c385c0 Christos Stavrakakis
                " --git-upstream-branch=%s --git-debian-branch=%s"\
312 c9c385c0 Christos Stavrakakis
                " --git-export=INDEX --git-ignore-new -sa"\
313 8f939e17 Christos Stavrakakis
                " --source-option=--auto-commit"\
314 3a150e7c Christos Stavrakakis
                " --git-upstream-tag=%s"\
315 8f939e17 Christos Stavrakakis
                % (build_dir, branch, debian_branch, upstream_tag)
316 a09634f8 Christos Stavrakakis
    if options.source_only:
317 a09634f8 Christos Stavrakakis
        build_cmd += " -S"
318 c9c385c0 Christos Stavrakakis
    if not options.sign:
319 c9c385c0 Christos Stavrakakis
        build_cmd += " -uc -us"
320 4a8d727c Christos Stavrakakis
    elif options.keyid:
321 4a8d727c Christos Stavrakakis
        build_cmd += " -k\"'%s'\"" % options.keyid
322 c9c385c0 Christos Stavrakakis
    call(build_cmd)
323 55775645 Vangelis Koukis
324 b1aa3d49 Christos Stavrakakis
    # Remove cloned repo
325 f80b3f6a Christos Stavrakakis
    if mode != 'release' and not options.keep_repo:
326 55775645 Vangelis Koukis
        print_green("Removing cloned repo '%s'." % repo_dir)
327 55775645 Vangelis Koukis
        rm("-r", repo_dir)
328 55775645 Vangelis Koukis
329 8c028e36 Christos Stavrakakis
    # Print final info
330 8c028e36 Christos Stavrakakis
    info = (("Version", debian_version),
331 8c028e36 Christos Stavrakakis
            ("Upstream branch", branch),
332 8c028e36 Christos Stavrakakis
            ("Upstream tag", branch_tag),
333 8c028e36 Christos Stavrakakis
            ("Debian branch", debian_branch),
334 8c028e36 Christos Stavrakakis
            ("Debian tag", debian_branch_tag),
335 8c028e36 Christos Stavrakakis
            ("Repository directory", repo_dir),
336 8c028e36 Christos Stavrakakis
            ("Packages directory", build_dir))
337 8c028e36 Christos Stavrakakis
    print_green("\n".join(["%s: %s" % (name, val) for name, val in info]))
338 866bb9c1 Christos Stavrakakis
339 b1aa3d49 Christos Stavrakakis
    # Print help message
340 866bb9c1 Christos Stavrakakis
    if mode == "release":
341 8c028e36 Christos Stavrakakis
        origin = original_repo.remote().url
342 8c028e36 Christos Stavrakakis
        repo.create_remote("original_origin", origin)
343 8c028e36 Christos Stavrakakis
        print_green("Created remote 'original_origin' for the repository '%s'"
344 8c028e36 Christos Stavrakakis
                    % origin)
345 866bb9c1 Christos Stavrakakis
346 8c028e36 Christos Stavrakakis
        print_green("To update repositories '%s' and '%s' go to '%s' and run:"
347 8c028e36 Christos Stavrakakis
                    % (toplevel, origin, repo_dir))
348 8c028e36 Christos Stavrakakis
        for remote in ['origin', 'original_origin']:
349 8c2716c5 Christos Stavrakakis
            objects = [debian_branch, branch_tag, debian_branch_tag]
350 8c2716c5 Christos Stavrakakis
            print_green("git push %s %s" % (remote, " ".join(objects)))
351 938a4739 Christos Stavrakakis
        if options.push_back:
352 938a4739 Christos Stavrakakis
            objects = [debian_branch, branch_tag, debian_branch_tag]
353 938a4739 Christos Stavrakakis
            repo.git.push("origin", *objects)
354 938a4739 Christos Stavrakakis
            print_green("Automatically updated origin repo.")
355 866bb9c1 Christos Stavrakakis
356 866bb9c1 Christos Stavrakakis
357 ca01e50e Christos Stavrakakis
def create_temp_directory(suffix):
358 ca01e50e Christos Stavrakakis
    create_dir_cmd = mktemp("-d", "/tmp/" + suffix + "-XXXXX")
359 ca01e50e Christos Stavrakakis
    return create_dir_cmd.stdout.strip()
360 55775645 Vangelis Koukis
361 55775645 Vangelis Koukis
362 1b883fea Christos Stavrakakis
def call(cmd):
363 1b883fea Christos Stavrakakis
    rc = os.system(cmd)
364 1b883fea Christos Stavrakakis
    if rc:
365 06dcdc1b Christos Stavrakakis
        raise RuntimeError("Command '%s' failed!" % cmd)
366 b1aa3d49 Christos Stavrakakis
367 b1aa3d49 Christos Stavrakakis
368 55775645 Vangelis Koukis
if __name__ == "__main__":
369 55775645 Vangelis Koukis
    sys.exit(main())