Statistics
| Branch: | Tag: | Revision:

root / devflow / autopkg.py @ 0dcfcb5f

History | View | Annotate | Download (11.9 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 55775645 Vangelis Koukis
import git
35 55775645 Vangelis Koukis
import os
36 55775645 Vangelis Koukis
import sys
37 55775645 Vangelis Koukis
from optparse import OptionParser
38 e727d1ba Christos Stavrakakis
from collections import namedtuple
39 e727d1ba Christos Stavrakakis
from sh import mktemp, cd, rm, git_dch, python
40 bec4bf12 Christos Stavrakakis
from configobj import ConfigObj
41 55775645 Vangelis Koukis
42 e727d1ba Christos Stavrakakis
from devflow import versioning
43 866bb9c1 Christos Stavrakakis
44 55775645 Vangelis Koukis
try:
45 55775645 Vangelis Koukis
    from colors import red, green
46 55775645 Vangelis Koukis
except ImportError:
47 55775645 Vangelis Koukis
    red = lambda x: x
48 55775645 Vangelis Koukis
    green = lambda x: x
49 55775645 Vangelis Koukis
50 55775645 Vangelis Koukis
print_red = lambda x: sys.stdout.write(red(x) + "\n")
51 55775645 Vangelis Koukis
print_green = lambda x: sys.stdout.write(green(x) + "\n")
52 55775645 Vangelis Koukis
53 55775645 Vangelis Koukis
AVAILABLE_MODES = ["release", "snapshot"]
54 55775645 Vangelis Koukis
55 e727d1ba Christos Stavrakakis
branch_type = namedtuple("branch_type", ["default_debian_branch"])
56 e727d1ba Christos Stavrakakis
BRANCH_TYPES = {
57 e727d1ba Christos Stavrakakis
    "feature": branch_type("debian-develop"),
58 e727d1ba Christos Stavrakakis
    "develop": branch_type("debian-develop"),
59 e727d1ba Christos Stavrakakis
    "release": branch_type("debian-develop"),
60 e727d1ba Christos Stavrakakis
    "master": branch_type("debian"),
61 e727d1ba Christos Stavrakakis
    "hotfix": branch_type("debian")}
62 e727d1ba Christos Stavrakakis
63 1e4d1435 Christos Stavrakakis
64 7316df0e Christos Stavrakakis
DESCRIPTION = """Tool for automatical build of debian packages.
65 7316df0e Christos Stavrakakis

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

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

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

83 7316df0e Christos Stavrakakis
"""
84 7316df0e Christos Stavrakakis
85 7316df0e Christos Stavrakakis
86 7316df0e Christos Stavrakakis
def print_help(prog):
87 7316df0e Christos Stavrakakis
    print DESCRIPTION % {"prog": prog}
88 7316df0e Christos Stavrakakis
89 55775645 Vangelis Koukis
90 55775645 Vangelis Koukis
def main():
91 55775645 Vangelis Koukis
    from devflow.version import __version__
92 55775645 Vangelis Koukis
    parser = OptionParser(usage="usage: %prog [options] mode",
93 7316df0e Christos Stavrakakis
                          version="devflow %s" % __version__,
94 7316df0e Christos Stavrakakis
                          add_help_option=False)
95 7316df0e Christos Stavrakakis
    parser.add_option("-h", "--help",
96 7316df0e Christos Stavrakakis
                      action="store_true",
97 7316df0e Christos Stavrakakis
                      default=False,
98 7316df0e Christos Stavrakakis
                      help="show this help message")
99 55775645 Vangelis Koukis
    parser.add_option("-k", "--keep-repo",
100 55775645 Vangelis Koukis
                      action="store_true",
101 55775645 Vangelis Koukis
                      dest="keep_repo",
102 55775645 Vangelis Koukis
                      default=False,
103 55775645 Vangelis Koukis
                      help="Do not delete the cloned repository")
104 55775645 Vangelis Koukis
    parser.add_option("-b", "--build-dir",
105 55775645 Vangelis Koukis
                      dest="build_dir",
106 55775645 Vangelis Koukis
                      default=None,
107 55775645 Vangelis Koukis
                      help="Directory to store created pacakges")
108 55775645 Vangelis Koukis
    parser.add_option("-r", "--repo-dir",
109 55775645 Vangelis Koukis
                      dest="repo_dir",
110 55775645 Vangelis Koukis
                      default=None,
111 55775645 Vangelis Koukis
                      help="Directory to clone repository")
112 55775645 Vangelis Koukis
    parser.add_option("-d", "--dirty",
113 55775645 Vangelis Koukis
                      dest="force_dirty",
114 55775645 Vangelis Koukis
                      default=False,
115 55775645 Vangelis Koukis
                      action="store_true",
116 55775645 Vangelis Koukis
                      help="Do not check if working directory is dirty")
117 b1aa3d49 Christos Stavrakakis
    parser.add_option("-c", "--config-file",
118 b1aa3d49 Christos Stavrakakis
                      dest="config_file",
119 b1aa3d49 Christos Stavrakakis
                      help="Override default configuration file")
120 c9c385c0 Christos Stavrakakis
    parser.add_option("--no-sign",
121 c9c385c0 Christos Stavrakakis
                      dest="sign",
122 c9c385c0 Christos Stavrakakis
                      action="store_false",
123 c9c385c0 Christos Stavrakakis
                      default=True,
124 c9c385c0 Christos Stavrakakis
                      help="Do not sign the packages")
125 4a8d727c Christos Stavrakakis
    parser.add_option("--key-id",
126 4a8d727c Christos Stavrakakis
                      dest="keyid",
127 4a8d727c Christos Stavrakakis
                      help="Use this keyid for gpg signing")
128 d4b7f566 Christos Stavrakakis
    parser.add_option("--dist",
129 d4b7f566 Christos Stavrakakis
                      dest="dist",
130 d4b7f566 Christos Stavrakakis
                      default="unstable",
131 d4b7f566 Christos Stavrakakis
                      help="If running in snapshot mode, automatically set"
132 d4b7f566 Christos Stavrakakis
                            " the changelog distribution to this value"
133 d4b7f566 Christos Stavrakakis
                            " (default=unstable).")
134 55775645 Vangelis Koukis
135 55775645 Vangelis Koukis
    (options, args) = parser.parse_args()
136 55775645 Vangelis Koukis
137 7316df0e Christos Stavrakakis
    if options.help:
138 7316df0e Christos Stavrakakis
        print_help(parser.get_prog_name())
139 7316df0e Christos Stavrakakis
        parser.print_help()
140 7316df0e Christos Stavrakakis
        return
141 7316df0e Christos Stavrakakis
142 b1aa3d49 Christos Stavrakakis
    # Get build mode
143 866bb9c1 Christos Stavrakakis
    try:
144 866bb9c1 Christos Stavrakakis
        mode = args[0]
145 866bb9c1 Christos Stavrakakis
    except IndexError:
146 866bb9c1 Christos Stavrakakis
        raise ValueError("Mode argument is mandatory. Usage: %s"
147 866bb9c1 Christos Stavrakakis
                         % parser.usage)
148 55775645 Vangelis Koukis
    if mode not in AVAILABLE_MODES:
149 55775645 Vangelis Koukis
        raise ValueError(red("Invalid argument! Mode must be one: %s"
150 55775645 Vangelis Koukis
                         % ", ".join(AVAILABLE_MODES)))
151 55775645 Vangelis Koukis
152 a87012a9 Christos Stavrakakis
    os.environ["DEVFLOW_BUILD_MODE"] = mode
153 55775645 Vangelis Koukis
154 b1aa3d49 Christos Stavrakakis
    # Load the repository
155 55775645 Vangelis Koukis
    try:
156 55775645 Vangelis Koukis
        original_repo = git.Repo(".")
157 55775645 Vangelis Koukis
    except git.git.InvalidGitRepositoryError:
158 55775645 Vangelis Koukis
        raise RuntimeError(red("Current directory is not git repository."))
159 55775645 Vangelis Koukis
160 b1aa3d49 Christos Stavrakakis
    # Check that repository is clean
161 1e4d1435 Christos Stavrakakis
    toplevel = original_repo.working_dir
162 55775645 Vangelis Koukis
    if original_repo.is_dirty() and not options.force_dirty:
163 55775645 Vangelis Koukis
        raise RuntimeError(red("Repository %s is dirty." % toplevel))
164 55775645 Vangelis Koukis
165 b1aa3d49 Christos Stavrakakis
    # Get packages from configuration file
166 bec4bf12 Christos Stavrakakis
    config_file = options.config_file or os.path.join(toplevel, "devflow.conf")
167 bec4bf12 Christos Stavrakakis
    config = ConfigObj(config_file)
168 bec4bf12 Christos Stavrakakis
    packages = config['packages'].keys()
169 8c028e36 Christos Stavrakakis
    print_green("Will build the following packages:\n" + "\n".join(packages))
170 55775645 Vangelis Koukis
171 8c028e36 Christos Stavrakakis
    # Get current branch name and type and check if it is a valid one
172 9be34db8 Christos Stavrakakis
    branch = original_repo.head.reference.name
173 8c028e36 Christos Stavrakakis
    branch_type = versioning.get_branch_type(branch)
174 55775645 Vangelis Koukis
175 8c028e36 Christos Stavrakakis
    if branch_type not in BRANCH_TYPES.keys():
176 8c028e36 Christos Stavrakakis
        allowed_branches = ", ".join(BRANCH_TYPES.keys())
177 5a29a44e Christos Stavrakakis
        raise ValueError("Malformed branch name '%s', cannot classify as"
178 5a29a44e Christos Stavrakakis
                         " one of %s" % (branch, allowed_branches))
179 5a29a44e Christos Stavrakakis
180 9be34db8 Christos Stavrakakis
    # Check that original repo has the correct debian branch
181 8c028e36 Christos Stavrakakis
    debian_branch = "debian-" + branch
182 e727d1ba Christos Stavrakakis
    origin_debian = "origin/" + debian_branch
183 9be34db8 Christos Stavrakakis
    if not debian_branch in original_repo.branches:
184 e727d1ba Christos Stavrakakis
        # Get default debian branch
185 8c028e36 Christos Stavrakakis
        default_debian = BRANCH_TYPES[branch_type].default_debian_branch
186 8c028e36 Christos Stavrakakis
        origin_debian = "origin/" + default_debian
187 9be34db8 Christos Stavrakakis
        if not default_debian in original_repo.branches:
188 9be34db8 Christos Stavrakakis
            original_repo.git.branch(default_debian,
189 9be34db8 Christos Stavrakakis
                                     origin_debian)
190 9be34db8 Christos Stavrakakis
191 9be34db8 Christos Stavrakakis
    # Clone the repo
192 9be34db8 Christos Stavrakakis
    repo_dir = options.repo_dir or create_temp_directory("df-repo")
193 9be34db8 Christos Stavrakakis
    repo = original_repo.clone(repo_dir)
194 9be34db8 Christos Stavrakakis
    print_green("Cloned repository to '%s'." % repo_dir)
195 8c028e36 Christos Stavrakakis
196 9be34db8 Christos Stavrakakis
    # Create the debian branch
197 8c028e36 Christos Stavrakakis
    repo.git.branch(debian_branch, origin_debian)
198 e727d1ba Christos Stavrakakis
    print_green("Created branch '%s' to track '%s'" % (debian_branch,
199 e727d1ba Christos Stavrakakis
                origin_debian))
200 55775645 Vangelis Koukis
201 b1aa3d49 Christos Stavrakakis
    # Go to debian branch
202 55775645 Vangelis Koukis
    repo.git.checkout(debian_branch)
203 55775645 Vangelis Koukis
    print_green("Changed to branch '%s'" % debian_branch)
204 55775645 Vangelis Koukis
205 b1aa3d49 Christos Stavrakakis
    # Merge with starting branch
206 55775645 Vangelis Koukis
    repo.git.merge(branch)
207 8c028e36 Christos Stavrakakis
    print_green("Merged branch '%s' into '%s'" % (branch, debian_branch))
208 55775645 Vangelis Koukis
209 b1aa3d49 Christos Stavrakakis
    # Compute python and debian version
210 55775645 Vangelis Koukis
    cd(repo_dir)
211 e727d1ba Christos Stavrakakis
    python_version = versioning.get_python_version()
212 7316df0e Christos Stavrakakis
    debian_version = versioning.\
213 2ec7054e Christos Stavrakakis
        debian_version_from_python_version(python_version)
214 866bb9c1 Christos Stavrakakis
    print_green("The new debian version will be: '%s'" % debian_version)
215 55775645 Vangelis Koukis
216 8334fb57 Christos Stavrakakis
    # Update the version files
217 0dcfcb5f Christos Stavrakakis
    versioning.update_version()
218 8334fb57 Christos Stavrakakis
219 8c028e36 Christos Stavrakakis
    # Tag branch with python version
220 8c028e36 Christos Stavrakakis
    branch_tag = python_version
221 8c028e36 Christos Stavrakakis
    repo.git.tag(branch_tag, branch)
222 ce5f5240 Christos Stavrakakis
    upstream_tag = "upstream/" + branch_tag
223 ce5f5240 Christos Stavrakakis
    repo.git.tag(upstream_tag, branch)
224 8c028e36 Christos Stavrakakis
225 b1aa3d49 Christos Stavrakakis
    # Update changelog
226 55775645 Vangelis Koukis
    dch = git_dch("--debian-branch=%s" % debian_branch,
227 2ec7054e Christos Stavrakakis
                  "--git-author",
228 2ec7054e Christos Stavrakakis
                  "--ignore-regex=\".*\"",
229 2ec7054e Christos Stavrakakis
                  "--multimaint-merge",
230 2ec7054e Christos Stavrakakis
                  "--since=HEAD",
231 2ec7054e Christos Stavrakakis
                  "--new-version=%s" % debian_version)
232 55775645 Vangelis Koukis
    print_green("Successfully ran '%s'" % " ".join(dch.cmd))
233 55775645 Vangelis Koukis
234 55775645 Vangelis Koukis
    if mode == "release":
235 1b883fea Christos Stavrakakis
        call("vim debian/changelog")
236 adaef57d Christos Stavrakakis
    else:
237 adaef57d Christos Stavrakakis
        f = open("debian/changelog", 'r+')
238 adaef57d Christos Stavrakakis
        lines = f.readlines()
239 d4b7f566 Christos Stavrakakis
        lines[0] = lines[0].replace("UNRELEASED", options.dist)
240 8c028e36 Christos Stavrakakis
        lines[2] = lines[2].replace("UNRELEASED", "Snapshot build")
241 adaef57d Christos Stavrakakis
        f.seek(0)
242 adaef57d Christos Stavrakakis
        f.writelines(lines)
243 adaef57d Christos Stavrakakis
        f.close()
244 8c028e36 Christos Stavrakakis
245 8c028e36 Christos Stavrakakis
    # Add changelog to INDEX
246 8c028e36 Christos Stavrakakis
    repo.git.add("debian/changelog")
247 8c028e36 Christos Stavrakakis
    # Commit Changes
248 8c028e36 Christos Stavrakakis
    repo.git.commit("-s", "-a", m="Bump version to %s" % debian_version)
249 8c028e36 Christos Stavrakakis
    # Tag debian branch
250 8c028e36 Christos Stavrakakis
    debian_branch_tag = "debian/" + branch_tag
251 8c028e36 Christos Stavrakakis
    repo.git.tag(debian_branch_tag)
252 55775645 Vangelis Koukis
253 55775645 Vangelis Koukis
    # Add version.py files to repo
254 1b883fea Christos Stavrakakis
    call("grep \"__version_vcs\" -r . -l -I | xargs git add -f")
255 55775645 Vangelis Koukis
256 8c028e36 Christos Stavrakakis
    # Create debian packages
257 8c028e36 Christos Stavrakakis
    build_dir = options.build_dir or create_temp_directory("df-build")
258 8c028e36 Christos Stavrakakis
    print_green("Build directory: '%s'" % build_dir)
259 55775645 Vangelis Koukis
260 866bb9c1 Christos Stavrakakis
    cd(repo_dir)
261 3a150e7c Christos Stavrakakis
    version_files = []
262 3a150e7c Christos Stavrakakis
    for _, pkg_info in config['packages'].items():
263 3a150e7c Christos Stavrakakis
        version_files.append(pkg_info['version_file'])
264 3a150e7c Christos Stavrakakis
    ignore_regexp = "|".join(["^(%s)$" % vf for vf in version_files])
265 c9c385c0 Christos Stavrakakis
    build_cmd = "git-buildpackage --git-export-dir=%s"\
266 c9c385c0 Christos Stavrakakis
                " --git-upstream-branch=%s --git-debian-branch=%s"\
267 c9c385c0 Christos Stavrakakis
                " --git-export=INDEX --git-ignore-new -sa"\
268 3a150e7c Christos Stavrakakis
                " --source-option='\"--extend-diff-ignore=%s\"'"\
269 3a150e7c Christos Stavrakakis
                " --git-upstream-tag=%s"\
270 3a150e7c Christos Stavrakakis
                % (build_dir, branch, debian_branch, ignore_regexp,
271 3a150e7c Christos Stavrakakis
                   upstream_tag)
272 c9c385c0 Christos Stavrakakis
    if not options.sign:
273 c9c385c0 Christos Stavrakakis
        build_cmd += " -uc -us"
274 4a8d727c Christos Stavrakakis
    elif options.keyid:
275 4a8d727c Christos Stavrakakis
        build_cmd += " -k\"'%s'\"" % options.keyid
276 c9c385c0 Christos Stavrakakis
    call(build_cmd)
277 55775645 Vangelis Koukis
278 b1aa3d49 Christos Stavrakakis
    # Remove cloned repo
279 f80b3f6a Christos Stavrakakis
    if mode != 'release' and not options.keep_repo:
280 55775645 Vangelis Koukis
        print_green("Removing cloned repo '%s'." % repo_dir)
281 55775645 Vangelis Koukis
        rm("-r", repo_dir)
282 55775645 Vangelis Koukis
283 8c028e36 Christos Stavrakakis
    # Print final info
284 8c028e36 Christos Stavrakakis
    info = (("Version", debian_version),
285 8c028e36 Christos Stavrakakis
            ("Upstream branch", branch),
286 8c028e36 Christos Stavrakakis
            ("Upstream tag", branch_tag),
287 8c028e36 Christos Stavrakakis
            ("Debian branch", debian_branch),
288 8c028e36 Christos Stavrakakis
            ("Debian tag", debian_branch_tag),
289 8c028e36 Christos Stavrakakis
            ("Repository directory", repo_dir),
290 8c028e36 Christos Stavrakakis
            ("Packages directory", build_dir))
291 8c028e36 Christos Stavrakakis
    print_green("\n".join(["%s: %s" % (name, val) for name, val in info]))
292 866bb9c1 Christos Stavrakakis
293 b1aa3d49 Christos Stavrakakis
    # Print help message
294 866bb9c1 Christos Stavrakakis
    if mode == "release":
295 8c028e36 Christos Stavrakakis
        origin = original_repo.remote().url
296 8c028e36 Christos Stavrakakis
        repo.create_remote("original_origin", origin)
297 8c028e36 Christos Stavrakakis
        print_green("Created remote 'original_origin' for the repository '%s'"
298 8c028e36 Christos Stavrakakis
                    % origin)
299 866bb9c1 Christos Stavrakakis
300 8c028e36 Christos Stavrakakis
        print_green("To update repositories '%s' and '%s' go to '%s' and run:"
301 8c028e36 Christos Stavrakakis
                    % (toplevel, origin, repo_dir))
302 8c028e36 Christos Stavrakakis
        for remote in ['origin', 'original_origin']:
303 8c028e36 Christos Stavrakakis
            print
304 8c028e36 Christos Stavrakakis
            for obj in [debian_branch, branch_tag, debian_branch_tag]:
305 8c028e36 Christos Stavrakakis
                print_green("git push %s %s" % (remote, obj))
306 866bb9c1 Christos Stavrakakis
307 866bb9c1 Christos Stavrakakis
308 ca01e50e Christos Stavrakakis
def create_temp_directory(suffix):
309 ca01e50e Christos Stavrakakis
    create_dir_cmd = mktemp("-d", "/tmp/" + suffix + "-XXXXX")
310 ca01e50e Christos Stavrakakis
    return create_dir_cmd.stdout.strip()
311 55775645 Vangelis Koukis
312 55775645 Vangelis Koukis
313 1b883fea Christos Stavrakakis
def call(cmd):
314 1b883fea Christos Stavrakakis
    rc = os.system(cmd)
315 1b883fea Christos Stavrakakis
    if rc:
316 06dcdc1b Christos Stavrakakis
        raise RuntimeError("Command '%s' failed!" % cmd)
317 b1aa3d49 Christos Stavrakakis
318 b1aa3d49 Christos Stavrakakis
319 37866d7a Christos Stavrakakis
def create_temp_directory(suffix):
320 37866d7a Christos Stavrakakis
    create_dir_cmd = mktemp("-d", "/tmp/" + suffix + "-XXXXX")
321 37866d7a Christos Stavrakakis
    return create_dir_cmd.stdout.strip()
322 37866d7a Christos Stavrakakis
323 37866d7a Christos Stavrakakis
324 55775645 Vangelis Koukis
if __name__ == "__main__":
325 55775645 Vangelis Koukis
    sys.exit(main())