Statistics
| Branch: | Tag: | Revision:

root / fabfile.py @ f388beb9

History | View | Annotate | Download (7 kB)

1 6a8baac1 Kostas Papadimitriou
# Copyright 2011 GRNET S.A. All rights reserved.
2 6a8baac1 Kostas Papadimitriou
#
3 6a8baac1 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 6a8baac1 Kostas Papadimitriou
# without modification, are permitted provided that the following
5 6a8baac1 Kostas Papadimitriou
# conditions are met:
6 6a8baac1 Kostas Papadimitriou
#
7 6a8baac1 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 6a8baac1 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 6a8baac1 Kostas Papadimitriou
#      disclaimer.
10 6a8baac1 Kostas Papadimitriou
#
11 6a8baac1 Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 6a8baac1 Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 6a8baac1 Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 6a8baac1 Kostas Papadimitriou
#      provided with the distribution.
15 6a8baac1 Kostas Papadimitriou
#
16 6a8baac1 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 6a8baac1 Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 6a8baac1 Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 6a8baac1 Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 6a8baac1 Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 6a8baac1 Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 6a8baac1 Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 6a8baac1 Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 6a8baac1 Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 6a8baac1 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 6a8baac1 Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 6a8baac1 Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 6a8baac1 Kostas Papadimitriou
#
29 6a8baac1 Kostas Papadimitriou
# The views and conclusions contained in the software and
30 6a8baac1 Kostas Papadimitriou
# documentation are those of the authors and should not be
31 6a8baac1 Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 6a8baac1 Kostas Papadimitriou
# or implied, of GRNET S.A.
33 6a8baac1 Kostas Papadimitriou
#
34 6a8baac1 Kostas Papadimitriou
35 6a8baac1 Kostas Papadimitriou
import os
36 6a8baac1 Kostas Papadimitriou
import sys
37 6a8baac1 Kostas Papadimitriou
38 6a8baac1 Kostas Papadimitriou
from contextlib import contextmanager
39 6a8baac1 Kostas Papadimitriou
from fabric.api import *
40 6a8baac1 Kostas Papadimitriou
from fabric.colors import *
41 6a8baac1 Kostas Papadimitriou
42 6a8baac1 Kostas Papadimitriou
env.project_root = "./"
43 6a8baac1 Kostas Papadimitriou
env.develop = False
44 6a8baac1 Kostas Papadimitriou
env.autoremove = True
45 f3b8de1a Kostas Papadimitriou
env.packages = ['snf-pithos-lib', 'snf-pithos-backend', 'snf-pithos-app',
46 858e0ab9 Kostas Papadimitriou
                        'snf-pithos-tools']
47 6a8baac1 Kostas Papadimitriou
env.capture = False
48 6a8baac1 Kostas Papadimitriou
env.colors = True
49 6a8baac1 Kostas Papadimitriou
env.pypi_root = 'pypi'
50 6a8baac1 Kostas Papadimitriou
env.roledefs = {
51 6a8baac1 Kostas Papadimitriou
    'docs': ['docs.dev.grnet.gr'],
52 6a8baac1 Kostas Papadimitriou
    'pypi': ['docs.dev.grnet.gr']
53 6a8baac1 Kostas Papadimitriou
}
54 6a8baac1 Kostas Papadimitriou
55 858e0ab9 Kostas Papadimitriou
56 858e0ab9 Kostas Papadimitriou
# colored logging
57 6a8baac1 Kostas Papadimitriou
notice = lambda x: sys.stdout.write(yellow(x) + "\n")
58 6a8baac1 Kostas Papadimitriou
info = lambda x: sys.stdout.write(green(x) + "\n")
59 6a8baac1 Kostas Papadimitriou
error = lambda x: sys.stdout.write(red(x) + "\n")
60 6a8baac1 Kostas Papadimitriou
61 6a8baac1 Kostas Papadimitriou
62 6a8baac1 Kostas Papadimitriou
def dev():
63 6a8baac1 Kostas Papadimitriou
    env.develop = True
64 6a8baac1 Kostas Papadimitriou
65 858e0ab9 Kostas Papadimitriou
66 6a8baac1 Kostas Papadimitriou
# wrap local to respect global capturing setting from env.capture
67 6a8baac1 Kostas Papadimitriou
oldlocal = local
68 6a8baac1 Kostas Papadimitriou
def local(cmd, capture="default"):
69 6a8baac1 Kostas Papadimitriou
    if capture != "default":
70 6a8baac1 Kostas Papadimitriou
        capture = capture
71 6a8baac1 Kostas Papadimitriou
    else:
72 6a8baac1 Kostas Papadimitriou
        capture = env.capture
73 6a8baac1 Kostas Papadimitriou
    return oldlocal(cmd, capture=capture)
74 6a8baac1 Kostas Papadimitriou
75 6a8baac1 Kostas Papadimitriou
76 6a8baac1 Kostas Papadimitriou
def package_root(p):
77 6a8baac1 Kostas Papadimitriou
    return os.path.join(env.project_root, p)
78 6a8baac1 Kostas Papadimitriou
79 6a8baac1 Kostas Papadimitriou
80 6a8baac1 Kostas Papadimitriou
def remove_pkg(p):
81 6a8baac1 Kostas Papadimitriou
    notice("uninstalling package: %s" % p)
82 6a8baac1 Kostas Papadimitriou
    with lcd(package_root(p)):
83 6a8baac1 Kostas Papadimitriou
        with settings(warn_only=True):
84 6a8baac1 Kostas Papadimitriou
            local("pip uninstall %s -y" % p, env.capture)
85 6a8baac1 Kostas Papadimitriou
86 6a8baac1 Kostas Papadimitriou
87 6a8baac1 Kostas Papadimitriou
def build_pkg(p):
88 6a8baac1 Kostas Papadimitriou
    info ("building package: %s" % p)
89 6a8baac1 Kostas Papadimitriou
    with lcd(package_root(p)):
90 f388beb9 Kostas Papadimitriou
        try:
91 f388beb9 Kostas Papadimitriou
            local("rm -r dist build")
92 f388beb9 Kostas Papadimitriou
        except:
93 f388beb9 Kostas Papadimitriou
            pass
94 6a8baac1 Kostas Papadimitriou
        local("python setup.py egg_info -d sdist")
95 6a8baac1 Kostas Papadimitriou
96 6a8baac1 Kostas Papadimitriou
97 6a8baac1 Kostas Papadimitriou
def install_pkg(p):
98 6a8baac1 Kostas Papadimitriou
    info("installing package: %s" % p)
99 6a8baac1 Kostas Papadimitriou
    with lcd(package_root(p)):
100 6a8baac1 Kostas Papadimitriou
        if env.develop:
101 6a8baac1 Kostas Papadimitriou
            local("python setup.py develop")
102 6a8baac1 Kostas Papadimitriou
        else:
103 6a8baac1 Kostas Papadimitriou
            local("python setup.py install")
104 6a8baac1 Kostas Papadimitriou
105 6a8baac1 Kostas Papadimitriou
106 6a8baac1 Kostas Papadimitriou
def install(*packages):
107 6a8baac1 Kostas Papadimitriou
    for p in packages:
108 6a8baac1 Kostas Papadimitriou
        install_pkg("snf-%s" % p)
109 6a8baac1 Kostas Papadimitriou
110 6a8baac1 Kostas Papadimitriou
111 6a8baac1 Kostas Papadimitriou
def buildall():
112 6a8baac1 Kostas Papadimitriou
    for p in env.packages:
113 6a8baac1 Kostas Papadimitriou
        build_pkg(p)
114 6a8baac1 Kostas Papadimitriou
    collectdists()
115 6a8baac1 Kostas Papadimitriou
116 6a8baac1 Kostas Papadimitriou
117 6a8baac1 Kostas Papadimitriou
def installall():
118 6a8baac1 Kostas Papadimitriou
    for p in env.packages:
119 6a8baac1 Kostas Papadimitriou
        install_pkg(p)
120 6a8baac1 Kostas Papadimitriou
121 858e0ab9 Kostas Papadimitriou
122 6a8baac1 Kostas Papadimitriou
def collectdists():
123 6a8baac1 Kostas Papadimitriou
    if os.path.exists("./packages"):
124 6a8baac1 Kostas Papadimitriou
        notice("removing 'packages' directory")
125 6a8baac1 Kostas Papadimitriou
        local("rm -r packages");
126 6a8baac1 Kostas Papadimitriou
127 6a8baac1 Kostas Papadimitriou
    local("mkdir packages");
128 6a8baac1 Kostas Papadimitriou
    for p in env.packages:
129 6a8baac1 Kostas Papadimitriou
        local("cp %s/dist/*.tar.gz ./packages/" % package_root(p));
130 6a8baac1 Kostas Papadimitriou
131 858e0ab9 Kostas Papadimitriou
132 6a8baac1 Kostas Papadimitriou
def removeall():
133 6a8baac1 Kostas Papadimitriou
    for p in env.packages:
134 6a8baac1 Kostas Papadimitriou
        remove_pkg(p)
135 6a8baac1 Kostas Papadimitriou
136 6a8baac1 Kostas Papadimitriou
137 6a8baac1 Kostas Papadimitriou
def remove(*packages):
138 6a8baac1 Kostas Papadimitriou
    for p in packages:
139 6a8baac1 Kostas Papadimitriou
        remove_pkg("snf-%s" % p)
140 6a8baac1 Kostas Papadimitriou
141 6a8baac1 Kostas Papadimitriou
142 6a8baac1 Kostas Papadimitriou
#
143 6a8baac1 Kostas Papadimitriou
# GIT helpers
144 6a8baac1 Kostas Papadimitriou
#
145 6a8baac1 Kostas Papadimitriou
146 6a8baac1 Kostas Papadimitriou
147 6a8baac1 Kostas Papadimitriou
def git(params, locl=True):
148 6a8baac1 Kostas Papadimitriou
    cmd = local if locl else run
149 6a8baac1 Kostas Papadimitriou
    return cmd("git %s" % params, capture=True)
150 6a8baac1 Kostas Papadimitriou
151 6a8baac1 Kostas Papadimitriou
152 6a8baac1 Kostas Papadimitriou
def branch():
153 6a8baac1 Kostas Papadimitriou
    return git("symbolic-ref HEAD").split("/")[-1]
154 6a8baac1 Kostas Papadimitriou
155 6a8baac1 Kostas Papadimitriou
156 6a8baac1 Kostas Papadimitriou
@contextmanager
157 6a8baac1 Kostas Papadimitriou
def co(c):
158 6a8baac1 Kostas Papadimitriou
    current_branch = branch();
159 6a8baac1 Kostas Papadimitriou
    git("checkout %s" % c)
160 858e0ab9 Kostas Papadimitriou
    # Use a try block to make sure we checkout the original branch.
161 858e0ab9 Kostas Papadimitriou
    try:
162 858e0ab9 Kostas Papadimitriou
        yield
163 858e0ab9 Kostas Papadimitriou
    finally:
164 858e0ab9 Kostas Papadimitriou
        try:
165 858e0ab9 Kostas Papadimitriou
            git("checkout %s" % current_branch)
166 858e0ab9 Kostas Papadimitriou
        except Exception:
167 858e0ab9 Kostas Papadimitriou
            error("Could not checkout %s, you're still left at %s" % c)
168 6a8baac1 Kostas Papadimitriou
169 6a8baac1 Kostas Papadimitriou
#
170 6a8baac1 Kostas Papadimitriou
# Debian packaging helpers
171 6a8baac1 Kostas Papadimitriou
#
172 6a8baac1 Kostas Papadimitriou
173 858e0ab9 Kostas Papadimitriou
env.debian_branch = 'debian-0.8'
174 284be19f Vangelis Koukis
env.deb_packages = ['snf-pithos-lib', 'snf-pithos-backend',
175 284be19f Vangelis Koukis
                    'snf-pithos-tools', 'snf-pithos-app']
176 fa36b326 Vangelis Koukis
env.signdebs = False
177 858e0ab9 Kostas Papadimitriou
env.debrelease = False  # Increase release number in Debian changelogs
178 858e0ab9 Kostas Papadimitriou
env.upstream = 'packaging'
179 6a8baac1 Kostas Papadimitriou
180 858e0ab9 Kostas Papadimitriou
181 858e0ab9 Kostas Papadimitriou
def _last_commit(f):
182 858e0ab9 Kostas Papadimitriou
    return local("git rev-list --all --date-order --max-count=1 %s" % f,
183 858e0ab9 Kostas Papadimitriou
            capture=True).strip()
184 858e0ab9 Kostas Papadimitriou
185 858e0ab9 Kostas Papadimitriou
186 858e0ab9 Kostas Papadimitriou
def _diff_from_master(c,f):
187 858e0ab9 Kostas Papadimitriou
    return local("git log --oneline %s..%s %s" \
188 858e0ab9 Kostas Papadimitriou
                 " | wc -l" % (c, env.upstream, f), capture=True)
189 858e0ab9 Kostas Papadimitriou
190 858e0ab9 Kostas Papadimitriou
191 858e0ab9 Kostas Papadimitriou
def dch(p):
192 858e0ab9 Kostas Papadimitriou
    with co(env.debian_branch):
193 858e0ab9 Kostas Papadimitriou
        local("git merge %s" % env.upstream)
194 858e0ab9 Kostas Papadimitriou
        with lcd(package_root(p)):
195 858e0ab9 Kostas Papadimitriou
            local("if [ ! -d .git ]; then mkdir .git; fi")
196 858e0ab9 Kostas Papadimitriou
197 858e0ab9 Kostas Papadimitriou
            # FIXME:
198 858e0ab9 Kostas Papadimitriou
            # Checking for new changes in packages
199 858e0ab9 Kostas Papadimitriou
            # has been removed temporarily.
200 858e0ab9 Kostas Papadimitriou
            # Always create a new Debian changelog entry.
201 858e0ab9 Kostas Papadimitriou
            ## Check for new changes in package dir
202 858e0ab9 Kostas Papadimitriou
            #diff = _diff_from_master(_last_commit("debian/changelog"), ".")
203 858e0ab9 Kostas Papadimitriou
            #vercmd  = "git describe --tags --abbrev=0"\
204 858e0ab9 Kostas Papadimitriou
            #          " | sed -rn '\''s/^v(.*)/\\1/p'\''"
205 858e0ab9 Kostas Papadimitriou
            #version = local(vercmd, capture=True)
206 858e0ab9 Kostas Papadimitriou
            #if int(diff) > 0:
207 858e0ab9 Kostas Papadimitriou
            if True:
208 858e0ab9 Kostas Papadimitriou
                # Run git-dch in snapshot mode.
209 858e0ab9 Kostas Papadimitriou
                # TODO: Support a --release mode in fabfile
210 858e0ab9 Kostas Papadimitriou
                local(("git-dch --debian-branch=%s --auto %s" %
211 858e0ab9 Kostas Papadimitriou
                       (env.debian_branch,
212 858e0ab9 Kostas Papadimitriou
                        "--release" if env.debrelease else "--snapshot")))
213 858e0ab9 Kostas Papadimitriou
                local(("git commit debian/changelog"
214 858e0ab9 Kostas Papadimitriou
                       " -m 'Updated %s changelog'" % p))
215 858e0ab9 Kostas Papadimitriou
                notice(("Make sure to tag Debian release in %s" %
216 858e0ab9 Kostas Papadimitriou
                        env.debian_branch))
217 858e0ab9 Kostas Papadimitriou
218 858e0ab9 Kostas Papadimitriou
            local("rmdir .git")
219 858e0ab9 Kostas Papadimitriou
220 858e0ab9 Kostas Papadimitriou
221 858e0ab9 Kostas Papadimitriou
def debrelease():
222 858e0ab9 Kostas Papadimitriou
    env.debrelease = True
223 858e0ab9 Kostas Papadimitriou
224 858e0ab9 Kostas Papadimitriou
225 fa36b326 Vangelis Koukis
def signdebs():
226 fa36b326 Vangelis Koukis
    env.signdebs = True
227 858e0ab9 Kostas Papadimitriou
228 858e0ab9 Kostas Papadimitriou
229 858e0ab9 Kostas Papadimitriou
def builddeb(p, master="packaging", branch="debian-0.8"):
230 858e0ab9 Kostas Papadimitriou
    with co(branch):
231 858e0ab9 Kostas Papadimitriou
        info("Building debian package for %s" % p)
232 858e0ab9 Kostas Papadimitriou
        with lcd(package_root(p)):
233 858e0ab9 Kostas Papadimitriou
            local("git merge %s" % master)
234 858e0ab9 Kostas Papadimitriou
            local("if [ ! -d .git ]; then mkdir .git; fi")
235 6a8baac1 Kostas Papadimitriou
            local("python setup.py clean")
236 858e0ab9 Kostas Papadimitriou
            local("git add ./*/*/version.py -f")
237 858e0ab9 Kostas Papadimitriou
            local(("git-buildpackage --git-upstream-branch=%s --git-debian-branch=%s"
238 858e0ab9 Kostas Papadimitriou
                   " --git-export=INDEX --git-ignore-new %s") %
239 858e0ab9 Kostas Papadimitriou
                   (master, branch, "" if env.signdebs else "-us -uc"))
240 6a8baac1 Kostas Papadimitriou
            local("rm -rf .git")
241 858e0ab9 Kostas Papadimitriou
            local("git reset ./*/*/version.py")
242 858e0ab9 Kostas Papadimitriou
        info("Done building debian package for %s" % p)
243 6a8baac1 Kostas Papadimitriou
244 6a8baac1 Kostas Papadimitriou
245 6a8baac1 Kostas Papadimitriou
def builddeball(b="debian-0.8"):
246 858e0ab9 Kostas Papadimitriou
    for p in env.deb_packages:
247 f3204cb9 Vangelis Koukis
        builddeb(p=p, branch=b)
248 6a8baac1 Kostas Papadimitriou
249 6a8baac1 Kostas Papadimitriou
250 6a8baac1 Kostas Papadimitriou
251 6a8baac1 Kostas Papadimitriou
@roles('pypi')
252 6a8baac1 Kostas Papadimitriou
def uploadtars():
253 6a8baac1 Kostas Papadimitriou
    put("packages/*.tar.gz", 'www/pypi/')