Browse Source

Remove dead tooling

Remove the following collections of tools

  analyze-oslo.sh, new_core.py, new_core_analyzer.py,
  new_core_recruit.py
    Used to handle identification and onboarding of new cores. Committed
    in 2015 and likely unused in recent years.

  apply_cookiecutter.sh
    References "graduation" of oslo projects. Oslo Incubator is dead and
    so is this.

  dashboards/*, build_dashboards.sh
    From 2015 and untouched so likely unused nowadays. Most of these are
    available in the gerrit-dash-creator now.

  clean_oslo_namespaces.sh
    A remnant from the days we thought namespace packages were a good
    idea. I miss those days...

  clone_openstack.sh
    Clones the entirety of OpenStack to your local drive. Seems
    initially useful but references stackforge and untouched in years so
    not really.

  lint.py
    Runs PyLint with our special flavor of settings. Initially replaced
    by tox and now dead because PyLint is a PITA.

  find_used_deleted_modules.py
    Another reference to the incubator. Now dead.

  remove-namespace-packages-project.txt
    Describe the long-since-completed effort to drop namespace packages.
    No references and therefore removable.

  run_tests_common.sh, with_venv.sh, install_venv.py,
  install_venv_common.py
    All replaced by tox for, well, everything nowadays.

  colorizer.py
    No users after everything else is removed.

  virtual_sprint.py
    Sends an email about a virtual sprint. No one's using this anymore
    and it was last modified in 2014.

Change-Id: I6c5bd16dcfacdd816caf568f30e55451acf03ae1
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
changes/57/583957/1
Stephen Finucane 10 months ago
parent
commit
75cd334d14

+ 0
- 90
analyze-oslo.sh View File

@@ -1,90 +0,0 @@
1
-#!/bin/bash
2
-
3
-# This requires gitinspector to be installed
4
-# it can be gotten from:
5
-#
6
-# - https://pypi.org/project/gitinspector/0.3.2
7
-# - https://github.com/ejwa/gitinspector
8
-
9
-# Check out a new copy of a repository and set it up to be a useful
10
-# local copy.
11
-function clone_new {
12
-    typeset repo="$1"
13
-    typeset url="$2"
14
-    echo
15
-    echo "Cloning $repo"
16
-    git clone $url $repo
17
-    return 0
18
-}
19
-
20
-# Determine the current branch of a local repository.
21
-function current_branch {
22
-    (cd $1 && git rev-parse --abbrev-ref HEAD)
23
-}
24
-
25
-# Update an existing copy of a repository, including all remotes and
26
-# pulling into the local master branch if we're on that branch
27
-# already.
28
-function update_existing {
29
-    typeset repo="$1"
30
-    echo
31
-    echo "Updating $repo"
32
-    (cd $repo && git remote update)
33
-    RC=$?
34
-    if [ $RC -ne 0 ]
35
-    then
36
-        return $RC
37
-    fi
38
-    # Only run git pull for repos where I'm not working in a branch.
39
-    typeset b=$(current_branch $repo)
40
-    if [ $b == "master" ]
41
-    then
42
-        if (cd $repo && git diff --exit-code >/dev/null)
43
-        then
44
-            (cd $repo && git pull)
45
-        else
46
-            echo "Skipping pull for master branch with local changes"
47
-            (cd $repo && git status)
48
-        fi
49
-    else
50
-        echo "Skipping pull for branch $b"
51
-        branched="$branched $repo"
52
-    fi
53
-}
54
-
55
-# Process a single repository found in gerrit, determining whether it
56
-# exists locally already or not.
57
-function get_one_repo {
58
-    typeset repo="$1"
59
-    typeset url="$2"
60
-    typeset pardir=$(dirname $repo)
61
-    if [ ! -z "$pardir" ]
62
-    then
63
-        mkdir -p $pardir
64
-    fi
65
-    if [ ! -d $repo ] ; then
66
-        clone_new $repo $url
67
-    else
68
-        update_existing $repo
69
-    fi
70
-    RC=$?
71
-    return $RC
72
-}
73
-
74
-current_dir=`pwd`
75
-base="git://git.openstack.org"
76
-projects=$(ssh review.openstack.org -p 29418 gerrit ls-projects | grep -v 'attic' | grep "oslo")
77
-projects="$projects openstack/taskflow openstack/tooz openstack/cliff openstack/debtcollector"
78
-projects="$projects openstack/futurist openstack/stevedore openstack-dev/cookiecutter"
79
-projects="$projects openstack/automaton"
80
-
81
-for repo in $projects; do
82
-    get_one_repo "$repo" "$base/$repo"
83
-    RC=$?
84
-    if [ $RC -ne 0 ] ; then
85
-        echo "Unable to obtain $repo"
86
-        exit 1
87
-    fi
88
-done
89
-
90
-python new_core_analyzer.py $projects > "${current_dir}/oslo_reports.txt"

+ 0
- 46
apply_cookiecutter.sh View File

@@ -1,46 +0,0 @@
1
-#!/bin/bash
2
-#
3
-# Apply the Oslo cookiecutter template to an existing directory,
4
-# usually as part of the graduation process.
5
-
6
-COOKIECUTTER_TEMPLATE_REPO=${COOKIECUTTER_TEMPLATE_REPO:-https://git.openstack.org/openstack-dev/oslo-cookiecutter}
7
-
8
-function usage {
9
-    echo "Usage: apply_cookiecutter.sh newlib" 1>&2
10
-}
11
-
12
-if [ $# -lt 1 ]
13
-then
14
-    usage
15
-    exit 1
16
-fi
17
-
18
-new_lib="$1"
19
-
20
-if [[ $new_lib =~ oslo.* ]]
21
-then
22
-    echo "You probably don't want 'oslo' in the lib name." 1>&2
23
-    exit 2
24
-fi
25
-
26
-# Set up a virtualenv with cookiecutter
27
-tmpdir=$(mktemp -d -t oslo-cookiecutter.XXXX)
28
-echo "Installing cookiecutter..."
29
-venv=$tmpdir/venv
30
-virtualenv $venv
31
-$venv/bin/python -m pip install cookiecutter
32
-cookiecutter=$venv/bin/cookiecutter
33
-
34
-# Apply the cookiecutter template by building out a fresh copy using
35
-# the name chosen for this library and then copying any parts of the
36
-# results into the local tree, without overwriting files that already
37
-# exist.
38
-git clone $COOKIECUTTER_TEMPLATE_REPO $tmpdir/oslo-cookiecutter
39
-
40
-# FIXME(dhellmann): We need a better non-interactive mode for cookiecutter
41
-(cd $tmpdir && $cookiecutter $tmpdir/oslo-cookiecutter) <<EOF
42
-$new_lib
43
-openstack
44
-oslo.${new_lib} library
45
-EOF
46
-rsync -a --verbose --ignore-existing $tmpdir/oslo.${new_lib}/ .

+ 0
- 16
build_dashboards.sh View File

@@ -1,16 +0,0 @@
1
-#!/bin/bash
2
-#
3
-# Process the dashboard files and emit the URLs
4
-
5
-creator_dir=$1
6
-dashboard_dir=$2
7
-
8
-cd $creator_dir
9
-
10
-for f in $dashboard_dir/*.dash
11
-do
12
-    echo '----------------------------------------'
13
-    echo $(basename $f .dash)
14
-    echo '----------------------------------------'
15
-    ./gerrit-dash-creator $f
16
-done

+ 0
- 36
clean_oslo_namespaces.sh View File

@@ -1,36 +0,0 @@
1
-#!/bin/bash
2
-#
3
-# Script to replace imports from the 'oslo' namespace package with the
4
-# appropriate alternative in the dist-specific packages.
5
-#
6
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
7
-#    not use this file except in compliance with the License. You may obtain
8
-#    a copy of the License at
9
-#
10
-#         http://www.apache.org/licenses/LICENSE-2.0
11
-#
12
-#    Unless required by applicable law or agreed to in writing, software
13
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
-#    License for the specific language governing permissions and limitations
16
-#    under the License.
17
-
18
-name=$(python setup.py --name)
19
-dir=${1:-$name}
20
-
21
-echo "Updating $dir"
22
-sed -i \
23
-    -e 's/from oslo\./from oslo_/g' \
24
-    -e 's/import oslo\./import oslo_/g' \
25
-    -e 's/from oslo import i18n/import oslo_i18n as i18n/g' \
26
-    -e 's/from oslo import messaging/import oslo_messaging as messaging/g' \
27
-    -e 's/from oslo import config/import oslo_config as config/g' \
28
-    -e 's/from oslo import serialization/import oslo_serialization as serialization/g' \
29
-    -e 's/from oslo import utils/import oslo_utils as utils/g' \
30
-    -e 's/oslo\.i18n\.TranslatorFactory/oslo_i18n.TranslatorFactory/g' \
31
-    $(find $dir -name '*.py' | grep -v "$name/tests/unit/test_hacking.py")
32
-
33
-set -x
34
-
35
-git grep 'from oslo import'
36
-git grep 'oslo\.'

+ 0
- 196
clone_openstack.sh View File

@@ -1,196 +0,0 @@
1
-#!/bin/bash
2
-#
3
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
4
-#    not use this file except in compliance with the License. You may obtain
5
-#    a copy of the License at
6
-#
7
-#         http://www.apache.org/licenses/LICENSE-2.0
8
-#
9
-#    Unless required by applicable law or agreed to in writing, software
10
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
-#    License for the specific language governing permissions and limitations
13
-#    under the License.
14
-#
15
-# Check out every active repository from git.openstack.org. For new
16
-# copies, set up git-review. For any existing copies, update their
17
-# remotes and pull changes up to the local master.
18
-#
19
-# This script is based on prior art from mordred on the openstack-dev
20
-# mailing list.
21
-# http://lists.openstack.org/pipermail/openstack-dev/2013-October/017532.html
22
-#
23
-# Usage:
24
-#
25
-#  Check out everything under the current directory:
26
-#    $ clone_openstack.sh
27
-#
28
-#  Check out a specific project (you can list multiple names):
29
-#    $ clone_openstack.sh openstack/oslo-incubator
30
-#
31
-
32
-trouble_with=""
33
-branched=""
34
-
35
-# Figure out if git-hooks is installed and should be used.
36
-# https://github.com/icefox/git-hooks
37
-which git-hooks 2>&1 > /dev/null
38
-USE_GIT_HOOKS=$?
39
-
40
-# Users can set INCLUDE_STACKFORGE=1 if they want to always check out
41
-# new copies of stackforge projects.
42
-INCLUDE_STACKFORGE=${INCLUDE_STACKFORGE:-0}
43
-
44
-# If we have any trouble at all working with a repository, report that
45
-# and then record the name for the summary at the end.
46
-function track_trouble {
47
-    if [ $1 -ne 0 ]
48
-    then
49
-        echo "Remembering trouble with $2"
50
-        trouble_with="$trouble_with $2"
51
-    fi
52
-}
53
-
54
-# Determine the current branch of a local repository.
55
-function current_branch {
56
-    (cd $1 && git rev-parse --abbrev-ref HEAD)
57
-}
58
-
59
-# Print a summary report for any repositories that had trouble
60
-# updating.
61
-function report_trouble {
62
-    if [ ! -z "$trouble_with" ]
63
-    then
64
-        echo
65
-        echo "Had trouble updating:"
66
-        for r in $trouble_with
67
-        do
68
-            echo "  $r - $(current_branch $r)"
69
-        done
70
-    fi
71
-}
72
-
73
-# Print a summary report for any repositories that were not on the
74
-# master branch when we updated them.
75
-function report_branched {
76
-    if [ ! -z "$branched" ]
77
-    then
78
-        echo
79
-        echo "Branched repos:"
80
-        for r in $branched
81
-        do
82
-            echo "  $r - $(current_branch $r)"
83
-        done
84
-    fi
85
-}
86
-
87
-# Check out a new copy of a repository and set it up to be a useful
88
-# local copy.
89
-function clone_new {
90
-    typeset repo="$1"
91
-    typeset url="$2"
92
-    # Ignore stackforge projects unless told otherwise.
93
-    if [[ $repo =~ ^stackforge/.* ]]
94
-    then
95
-        if [ $INCLUDE_STACKFORGE -ne 1 ]
96
-        then
97
-            return 0
98
-        fi
99
-    fi
100
-    echo
101
-    echo "Cloning $repo"
102
-    git clone $url $repo
103
-    (cd $repo && git review -s)
104
-    if [ $USE_GIT_HOOKS -eq 0 ]
105
-    then
106
-        echo "Configuring git hooks"
107
-        (cd $repo && git hooks --install)
108
-    fi
109
-    return 0
110
-}
111
-
112
-# Update an existing copy of a repository, including all remotes and
113
-# pulling into the local master branch if we're on that branch
114
-# already.
115
-function update_existing {
116
-    typeset repo="$1"
117
-    echo
118
-    echo "Updating $repo"
119
-    (cd $repo && git remote update)
120
-    RC=$?
121
-    if [ $RC -ne 0 ]
122
-    then
123
-        return $RC
124
-    fi
125
-    # Only run git pull for repos where I'm not working in a branch.
126
-    typeset b=$(current_branch $repo)
127
-    if [ $b == "master" ]
128
-    then
129
-        if (cd $repo && git diff --exit-code >/dev/null)
130
-        then
131
-            (cd $repo && git pull)
132
-        else
133
-            echo "Skipping pull for master branch with local changes"
134
-            (cd $repo && git status)
135
-        fi
136
-    else
137
-        echo "Skipping pull for branch $b"
138
-        branched="$branched $repo"
139
-    fi
140
-}
141
-
142
-# Process a single repository found in gerrit, determining whether it
143
-# exists locally already or not.
144
-function get_one_repo {
145
-    typeset repo="$1"
146
-    typeset url="$2"
147
-    typeset pardir=$(dirname $repo)
148
-    if [ ! -z "$pardir" ]
149
-    then
150
-        mkdir -p $pardir
151
-    fi
152
-    if [ ! -d $repo ] ; then
153
-        clone_new $repo $url
154
-    else
155
-        update_existing $repo
156
-    fi
157
-    RC=$?
158
-    return $RC
159
-}
160
-
161
-# If we are given a list of projects on the command line, we will only
162
-# work on those. Otherwise, ask gerrit for the full list of openstack
163
-# projects, ignoring the ones in the attic. Stackforge projects are
164
-# ignored if they do not exist locally, so we include them in the
165
-# output list and check for them when we decide what to do with each
166
-# repository.
167
-projects="$*"
168
-if [ -z "$projects" ]
169
-then
170
-    projects=$(ssh review.openstack.org -p 29418 gerrit ls-projects | grep '^openstack' | grep -v 'attic')
171
-    RC=$?
172
-    if [ $RC -ne 0 ]
173
-    then
174
-        echo "Unable to obtain a list of projects from gerrit. Check your ssh credientials for review.openstack.org"
175
-        userid=`id -un`
176
-        gerrit_userid=`git config --get gitreview.username`
177
-        if [ $userid != $gerrit_userid ]
178
-        then
179
-            echo "Identified a possible userid difference between $userid and $gerrit_userid"
180
-        fi
181
-        exit $RC
182
-    fi
183
-else
184
-    # Go ahead and set things up so we will work with stackforge
185
-    # repositories, in case the caller has specified one on the
186
-    # command line.
187
-    INCLUDE_STACKFORGE=1
188
-fi
189
-
190
-for repo in $projects; do
191
-    get_one_repo $repo git://git.openstack.org/$repo
192
-    track_trouble $? $repo
193
-done
194
-
195
-report_branched
196
-report_trouble

+ 0
- 333
colorizer.py View File

@@ -1,333 +0,0 @@
1
-#!/usr/bin/env python
2
-
3
-# Copyright (c) 2013, Nebula, Inc.
4
-# Copyright 2010 United States Government as represented by the
5
-# Administrator of the National Aeronautics and Space Administration.
6
-# All Rights Reserved.
7
-#
8
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
9
-#    not use this file except in compliance with the License. You may obtain
10
-#    a copy of the License at
11
-#
12
-#         http://www.apache.org/licenses/LICENSE-2.0
13
-#
14
-#    Unless required by applicable law or agreed to in writing, software
15
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
17
-#    License for the specific language governing permissions and limitations
18
-#    under the License.
19
-#
20
-# Colorizer Code is borrowed from Twisted:
21
-# Copyright (c) 2001-2010 Twisted Matrix Laboratories.
22
-#
23
-#    Permission is hereby granted, free of charge, to any person obtaining
24
-#    a copy of this software and associated documentation files (the
25
-#    "Software"), to deal in the Software without restriction, including
26
-#    without limitation the rights to use, copy, modify, merge, publish,
27
-#    distribute, sublicense, and/or sell copies of the Software, and to
28
-#    permit persons to whom the Software is furnished to do so, subject to
29
-#    the following conditions:
30
-#
31
-#    The above copyright notice and this permission notice shall be
32
-#    included in all copies or substantial portions of the Software.
33
-#
34
-#    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
35
-#    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
36
-#    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
37
-#    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
38
-#    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
39
-#    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
40
-#    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41
-
42
-"""Display a subunit stream through a colorized unittest test runner."""
43
-
44
-import heapq
45
-import sys
46
-import unittest
47
-
48
-import six
49
-import subunit
50
-import testtools
51
-
52
-
53
-class _AnsiColorizer(object):
54
-    """Colorizer allows callers to write text in a particular color.
55
-
56
-    A colorizer is an object that loosely wraps around a stream, allowing
57
-    callers to write text to the stream in a particular color.
58
-
59
-    Colorizer classes must implement C{supported()} and C{write(text, color)}.
60
-    """
61
-    _colors = dict(black=30, red=31, green=32, yellow=33,
62
-                   blue=34, magenta=35, cyan=36, white=37)
63
-
64
-    def __init__(self, stream):
65
-        self.stream = stream
66
-
67
-    def supported(cls, stream=sys.stdout):
68
-        """Check is the current platform supports coloring terminal output.
69
-
70
-        A class method that returns True if the current platform supports
71
-        coloring terminal output using this method. Returns False otherwise.
72
-        """
73
-        if not stream.isatty():
74
-            return False  # auto color only on TTYs
75
-        try:
76
-            import curses
77
-        except ImportError:
78
-            return False
79
-        else:
80
-            try:
81
-                try:
82
-                    return curses.tigetnum("colors") > 2
83
-                except curses.error:
84
-                    curses.setupterm()
85
-                    return curses.tigetnum("colors") > 2
86
-            except Exception:
87
-                # guess false in case of error
88
-                return False
89
-    supported = classmethod(supported)
90
-
91
-    def write(self, text, color):
92
-        """Write the given text to the stream in the given color.
93
-
94
-        @param text: Text to be written to the stream.
95
-
96
-        @param color: A string label for a color. e.g. 'red', 'white'.
97
-        """
98
-        color = self._colors[color]
99
-        self.stream.write('\x1b[%s;1m%s\x1b[0m' % (color, text))
100
-
101
-
102
-class _Win32Colorizer(object):
103
-    """See _AnsiColorizer docstring."""
104
-    def __init__(self, stream):
105
-        import win32console
106
-        red, green, blue, bold = (win32console.FOREGROUND_RED,
107
-                                  win32console.FOREGROUND_GREEN,
108
-                                  win32console.FOREGROUND_BLUE,
109
-                                  win32console.FOREGROUND_INTENSITY)
110
-        self.stream = stream
111
-        self.screenBuffer = win32console.GetStdHandle(
112
-            win32console.STD_OUT_HANDLE)
113
-        self._colors = {
114
-            'normal': red | green | blue,
115
-            'red': red | bold,
116
-            'green': green | bold,
117
-            'blue': blue | bold,
118
-            'yellow': red | green | bold,
119
-            'magenta': red | blue | bold,
120
-            'cyan': green | blue | bold,
121
-            'white': red | green | blue | bold,
122
-        }
123
-
124
-    def supported(cls, stream=sys.stdout):
125
-        try:
126
-            import win32console
127
-            screenBuffer = win32console.GetStdHandle(
128
-                win32console.STD_OUT_HANDLE)
129
-        except ImportError:
130
-            return False
131
-        import pywintypes
132
-        try:
133
-            screenBuffer.SetConsoleTextAttribute(
134
-                win32console.FOREGROUND_RED |
135
-                win32console.FOREGROUND_GREEN |
136
-                win32console.FOREGROUND_BLUE)
137
-        except pywintypes.error:
138
-            return False
139
-        else:
140
-            return True
141
-    supported = classmethod(supported)
142
-
143
-    def write(self, text, color):
144
-        color = self._colors[color]
145
-        self.screenBuffer.SetConsoleTextAttribute(color)
146
-        self.stream.write(text)
147
-        self.screenBuffer.SetConsoleTextAttribute(self._colors['normal'])
148
-
149
-
150
-class _NullColorizer(object):
151
-    """See _AnsiColorizer docstring."""
152
-    def __init__(self, stream):
153
-        self.stream = stream
154
-
155
-    def supported(cls, stream=sys.stdout):
156
-        return True
157
-    supported = classmethod(supported)
158
-
159
-    def write(self, text, color):
160
-        self.stream.write(text)
161
-
162
-
163
-def get_elapsed_time_color(elapsed_time):
164
-    if elapsed_time > 1.0:
165
-        return 'red'
166
-    elif elapsed_time > 0.25:
167
-        return 'yellow'
168
-    else:
169
-        return 'green'
170
-
171
-
172
-class OpenStackTestResult(testtools.TestResult):
173
-    def __init__(self, stream, descriptions, verbosity):
174
-        super(OpenStackTestResult, self).__init__()
175
-        self.stream = stream
176
-        self.showAll = verbosity > 1
177
-        self.num_slow_tests = 10
178
-        self.slow_tests = []  # this is a fixed-sized heap
179
-        self.colorizer = None
180
-        # NOTE(vish): reset stdout for the terminal check
181
-        stdout = sys.stdout
182
-        sys.stdout = sys.__stdout__
183
-        for colorizer in [_Win32Colorizer, _AnsiColorizer, _NullColorizer]:
184
-            if colorizer.supported():
185
-                self.colorizer = colorizer(self.stream)
186
-                break
187
-        sys.stdout = stdout
188
-        self.start_time = None
189
-        self.last_time = {}
190
-        self.results = {}
191
-        self.last_written = None
192
-
193
-    def _writeElapsedTime(self, elapsed):
194
-        color = get_elapsed_time_color(elapsed)
195
-        self.colorizer.write("  %.2f" % elapsed, color)
196
-
197
-    def _addResult(self, test, *args):
198
-        try:
199
-            name = test.id()
200
-        except AttributeError:
201
-            name = 'Unknown.unknown'
202
-        test_class, test_name = name.rsplit('.', 1)
203
-
204
-        elapsed = (self._now() - self.start_time).total_seconds()
205
-        item = (elapsed, test_class, test_name)
206
-        if len(self.slow_tests) >= self.num_slow_tests:
207
-            heapq.heappushpop(self.slow_tests, item)
208
-        else:
209
-            heapq.heappush(self.slow_tests, item)
210
-
211
-        self.results.setdefault(test_class, [])
212
-        self.results[test_class].append((test_name, elapsed) + args)
213
-        self.last_time[test_class] = self._now()
214
-        self.writeTests()
215
-
216
-    def _writeResult(self, test_name, elapsed, long_result, color,
217
-                     short_result, success):
218
-        if self.showAll:
219
-            self.stream.write('    %s' % str(test_name).ljust(66))
220
-            self.colorizer.write(long_result, color)
221
-            if success:
222
-                self._writeElapsedTime(elapsed)
223
-            self.stream.writeln()
224
-        else:
225
-            self.colorizer.write(short_result, color)
226
-
227
-    def addSuccess(self, test):
228
-        super(OpenStackTestResult, self).addSuccess(test)
229
-        self._addResult(test, 'OK', 'green', '.', True)
230
-
231
-    def addFailure(self, test, err):
232
-        if test.id() == 'process-returncode':
233
-            return
234
-        super(OpenStackTestResult, self).addFailure(test, err)
235
-        self._addResult(test, 'FAIL', 'red', 'F', False)
236
-
237
-    def addError(self, test, err):
238
-        super(OpenStackTestResult, self).addFailure(test, err)
239
-        self._addResult(test, 'ERROR', 'red', 'E', False)
240
-
241
-    def addSkip(self, test, reason=None, details=None):
242
-        super(OpenStackTestResult, self).addSkip(test, reason, details)
243
-        self._addResult(test, 'SKIP', 'blue', 'S', True)
244
-
245
-    def startTest(self, test):
246
-        self.start_time = self._now()
247
-        super(OpenStackTestResult, self).startTest(test)
248
-
249
-    def writeTestCase(self, cls):
250
-        if not self.results.get(cls):
251
-            return
252
-        if cls != self.last_written:
253
-            self.colorizer.write(cls, 'white')
254
-            self.stream.writeln()
255
-        for result in self.results[cls]:
256
-            self._writeResult(*result)
257
-        del self.results[cls]
258
-        self.stream.flush()
259
-        self.last_written = cls
260
-
261
-    def writeTests(self):
262
-        time = self.last_time.get(self.last_written, self._now())
263
-        if not self.last_written or (self._now() - time).total_seconds() > 2.0:
264
-            diff = 3.0
265
-            while diff > 2.0:
266
-                classes = self.results.keys()
267
-                oldest = min(classes, key=lambda x: self.last_time[x])
268
-                diff = (self._now() - self.last_time[oldest]).total_seconds()
269
-                self.writeTestCase(oldest)
270
-        else:
271
-            self.writeTestCase(self.last_written)
272
-
273
-    def done(self):
274
-        self.stopTestRun()
275
-
276
-    def stopTestRun(self):
277
-        for cls in list(six.iterkeys(self.results)):
278
-            self.writeTestCase(cls)
279
-        self.stream.writeln()
280
-        self.writeSlowTests()
281
-
282
-    def writeSlowTests(self):
283
-        # Pare out 'fast' tests
284
-        slow_tests = [item for item in self.slow_tests
285
-                      if get_elapsed_time_color(item[0]) != 'green']
286
-        if slow_tests:
287
-            slow_total_time = sum(item[0] for item in slow_tests)
288
-            slow = ("Slowest %i tests took %.2f secs:"
289
-                    % (len(slow_tests), slow_total_time))
290
-            self.colorizer.write(slow, 'yellow')
291
-            self.stream.writeln()
292
-            last_cls = None
293
-            # sort by name
294
-            for elapsed, cls, name in sorted(slow_tests,
295
-                                             key=lambda x: x[1] + x[2]):
296
-                if cls != last_cls:
297
-                    self.colorizer.write(cls, 'white')
298
-                    self.stream.writeln()
299
-                last_cls = cls
300
-                self.stream.write('    %s' % str(name).ljust(68))
301
-                self._writeElapsedTime(elapsed)
302
-                self.stream.writeln()
303
-
304
-    def printErrors(self):
305
-        if self.showAll:
306
-            self.stream.writeln()
307
-        self.printErrorList('ERROR', self.errors)
308
-        self.printErrorList('FAIL', self.failures)
309
-
310
-    def printErrorList(self, flavor, errors):
311
-        for test, err in errors:
312
-            self.colorizer.write("=" * 70, 'red')
313
-            self.stream.writeln()
314
-            self.colorizer.write(flavor, 'red')
315
-            self.stream.writeln(": %s" % test.id())
316
-            self.colorizer.write("-" * 70, 'red')
317
-            self.stream.writeln()
318
-            self.stream.writeln("%s" % err)
319
-
320
-
321
-test = subunit.ProtocolTestCase(sys.stdin, passthrough=None)
322
-
323
-if sys.version_info[0:2] <= (2, 6):
324
-    runner = unittest.TextTestRunner(verbosity=2)
325
-else:
326
-    runner = unittest.TextTestRunner(verbosity=2,
327
-                                     resultclass=OpenStackTestResult)
328
-
329
-if runner.run(test).wasSuccessful():
330
-    exit_code = 0
331
-else:
332
-    exit_code = 1
333
-sys.exit(exit_code)

+ 0
- 31
dashboards/libs_part1.dash View File

@@ -1,31 +0,0 @@
1
-[dashboard]
2
-title = Oslo Review Inbox(Part One)
3
-description = Review Inbox(Part One)
4
-foreach = status:open NOT owner:self
5
-
6
-[section "Oslo Specs"]
7
-query = project:openstack/oslo-specs
8
-
9
-[section "automaton"]
10
-query = project:openstack/automaton
11
-
12
-[section "castellan"]
13
-query = project:openstack/castellan
14
-
15
-[section "cookiecutter"]
16
-query = project:openstack-dev/cookiecutter
17
-
18
-[section "debtcollector"]
19
-query = project:openstack/debtcollector
20
-
21
-[section "futurist"]
22
-query = project:openstack/futurist
23
-
24
-[section "mox3"]
25
-query = project:openstack/mox3
26
-
27
-[section "oslo-cookiecutter"]
28
-query = project:openstack-dev/oslo-cookiecutter
29
-
30
-[section "oslo.cache"]
31
-query = project:openstack/oslo.cache

+ 0
- 31
dashboards/libs_part2.dash View File

@@ -1,31 +0,0 @@
1
-[dashboard]
2
-title = Oslo Review Inbox(Part Two)
3
-description = Review Inbox(Part Two)
4
-foreach = status:open NOT owner:self
5
-
6
-[section "oslo.privsep"]
7
-query = project:openstack/oslo.privsep
8
-
9
-[section "oslo.reports"]
10
-query = project:openstack/oslo.reports
11
-
12
-[section "oslo.rootwrap"]
13
-query = project:openstack/oslo.rootwrap
14
-
15
-[section "oslo.serialization"]
16
-query = project:openstack/oslo.serialization
17
-
18
-[section "oslo.service"]
19
-query = project:openstack/oslo.service
20
-
21
-[section "oslo.tools"]
22
-query = project:openstack/oslo.tools
23
-
24
-[section "oslo.utils"]
25
-query = project:openstack/oslo.utils
26
-
27
-[section "oslo.versionedobjects"]
28
-query = project:openstack/oslo.versionedobjects
29
-
30
-[section "oslo.vmware"]
31
-query = project:openstack/oslo.vmware

+ 0
- 31
dashboards/libs_part3.dash View File

@@ -1,31 +0,0 @@
1
-[dashboard]
2
-title = Oslo Review Inbox(Part Three)
3
-description = Review Inbox(Part Three)
4
-foreach = status:open NOT owner:self
5
-
6
-[section "oslo.concurrency"]
7
-query = project:openstack/oslo.concurrency
8
-
9
-[section "oslo.config"]
10
-query = project:openstack/oslo.config
11
-
12
-[section "oslo.context"]
13
-query = project:openstack/oslo.context
14
-
15
-[section "oslo.db"]
16
-query = project:openstack/oslo.db
17
-
18
-[section "oslo.i18n"]
19
-query = project:openstack/oslo.i18n
20
-
21
-[section "oslo.log"]
22
-query = project:openstack/oslo.log
23
-
24
-[section "oslo.messaging"]
25
-query = project:openstack/oslo.messaging
26
-
27
-[section "oslo.middleware"]
28
-query = project:openstack/oslo.middleware
29
-
30
-[section "oslo.policy"]
31
-query = project:openstack/oslo.policy

+ 0
- 28
dashboards/libs_part4.dash View File

@@ -1,28 +0,0 @@
1
-[dashboard]
2
-title = Oslo Review Inbox(Part Four)
3
-description = Review Inbox(Part Four)
4
-foreach = status:open NOT owner:self
5
-
6
-[section "oslosphinx"]
7
-query = project:openstack/oslosphinx
8
-
9
-[section "oslotest"]
10
-query = project:openstack/oslotest
11
-
12
-[section "osprofiler"]
13
-query = project:openstack/osprofiler
14
-
15
-[section "pbr"]
16
-query = project:openstack-dev/pbr
17
-
18
-[section "pylockfile"]
19
-query = project:openstack/pylockfile
20
-
21
-[section "stevedore"]
22
-query = project:openstack/stevedore
23
-
24
-[section "taskflow"]
25
-query = project:openstack/taskflow
26
-
27
-[section "tooz"]
28
-query = project:openstack/tooz

+ 0
- 39
dashboards/main.dash View File

@@ -1,39 +0,0 @@
1
-[dashboard]
2
-title = Oslo Review Inbox
3
-description = Review Inbox
4
-foreach = (project:^openstack/oslo.* OR project:openstack/debtcollector OR
5
-           project:openstack/pylockfile OR project:openstack/castellan OR
6
-           project:openstack/futurist OR project:openstack/automaton OR
7
-           project:openstack/stevedore OR project:openstack/taskflow OR
8
-           project:openstack/tooz OR project:openstack-dev/cookiecutter OR
9
-           project:openstack-dev/pbr OR project:openstack/debtcollector OR
10
-           project:openstack-dev/oslo-cookiecutter OR project:openstack/mox3)
11
-           status:open NOT owner:self NOT label:Workflow<=-1 label:Verified>=1
12
-           NOT reviewedby:self
13
-
14
-[section "Oslo Specs"]
15
-query = project:openstack/oslo-specs
16
-
17
-[section "Bug Fixes"]
18
-query = topic:^bug/.*
19
-
20
-[section "Blueprints"]
21
-query = message:"Blueprint"
22
-
23
-[section "Needs Feedback (Changes older than 5 days that have not been reviewed by anyone)"]
24
-query = NOT label:Code-Review<=2 age:5d
25
-
26
-[section "You are a reviewer, but haven't voted in the current revision"]
27
-query = reviewer:self
28
-
29
-[section "Needs final +2"]
30
-query = label:Code-Review>=2 limit:50
31
-
32
-[section "New Contributors"]
33
-query = reviewer:10068
34
-
35
-[section "Passed Jenkins, No Negative Feedback"]
36
-query = NOT label:Code-Review>=2 NOT label:Code-Review<=-1 limit:50
37
-
38
-[section "Wayward Changes (Changes with no code review in the last 2days)"]
39
-query = NOT label:Code-Review<=2 age:2d

+ 0
- 116
find_used_deleted_modules.py View File

@@ -1,116 +0,0 @@
1
-#!/usr/bin/env python
2
-#
3
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
4
-#    not use this file except in compliance with the License. You may obtain
5
-#    a copy of the License at
6
-#
7
-#         http://www.apache.org/licenses/LICENSE-2.0
8
-#
9
-#    Unless required by applicable law or agreed to in writing, software
10
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
-#    License for the specific language governing permissions and limitations
13
-#    under the License.
14
-"""
15
-Look through the openstack-common.conf files for projects to find
16
-any that are using modules that have been deleted from the
17
-incubator.
18
-"""
19
-
20
-from __future__ import print_function
21
-
22
-import glob
23
-import os
24
-import sys
25
-
26
-from oslo_config import cfg
27
-
28
-# Extend sys.path to find update.py
29
-my_dir = os.path.dirname(__file__)
30
-incubator_root = os.path.abspath(os.path.dirname(my_dir))
31
-sys.path.append(incubator_root)
32
-import update
33
-
34
-
35
-def main(argv=sys.argv[1:]):
36
-    repodir = os.path.abspath(
37
-        os.path.join(my_dir, os.pardir, os.pardir, os.pardir)
38
-    )
39
-
40
-    main_cfg = cfg.ConfigOpts()
41
-    main_cfg.register_cli_opt(
42
-        cfg.MultiStrOpt(
43
-            # NOTE(dhellmann): We can't call this "project" because
44
-            # that conflicts with another property of the ConfigOpts
45
-            # class.
46
-            'proj',
47
-            default=[],
48
-            positional=True,
49
-            help='list of repo subdirs to scan, e.g. "openstack/nova"',
50
-        )
51
-    )
52
-    main_cfg(argv)
53
-
54
-    # If the user gave us project names, turn them into full paths to
55
-    # the project directory. If not, build a full list of all the
56
-    # projects we find.
57
-    projects = main_cfg.proj
58
-    if projects:
59
-        projects = [os.path.join(repodir, p) for p in projects]
60
-    else:
61
-        projects = glob.glob(
62
-            os.path.join(repodir, '*', '*')
63
-        )
64
-
65
-    base_dir = os.path.join(
66
-        incubator_root,
67
-        'openstack',
68
-        'common',
69
-    )
70
-    tools_dir = os.path.join(incubator_root, 'tools')
71
-
72
-    previous_project = None
73
-    for project_path in projects:
74
-        conf_file = os.path.join(project_path, 'openstack-common.conf')
75
-        if not os.path.exists(conf_file):
76
-            # This is not a directory using oslo-incubator.
77
-            continue
78
-
79
-        project_name = '/'.join(project_path.split('/')[-2:])
80
-
81
-        # Use a separate parser for each configuration file.
82
-        pcfg = cfg.ConfigOpts()
83
-        pcfg.register_opts(update.opts)
84
-        pcfg(['--config-file', conf_file])
85
-
86
-        # The list of modules can come in a couple of different
87
-        # options, so combine the results.
88
-        modules = pcfg.module + pcfg.modules
89
-        for mod in modules:
90
-            # Build a few filenames and patterns for looking for
91
-            # versions of the module being used by the project before
92
-            # testing them all.
93
-            mod_path = os.path.join(
94
-                base_dir,
95
-                mod.replace('.', os.sep),
96
-            )
97
-            mod_file = '%s.py' % mod_path
98
-            tool_pattern = os.path.join(tools_dir, mod + '*')
99
-            tool_subdir_pattern = os.path.join(tools_dir, mod, '*.sh')
100
-            if (os.path.isfile(mod_file)
101
-                    or
102
-                    os.path.isdir(mod_path)
103
-                    or
104
-                    glob.glob(tool_pattern)
105
-                    or
106
-                    glob.glob(tool_subdir_pattern)):
107
-                # Found something we would have copied in update.py.
108
-                continue
109
-            else:
110
-                if project_name != previous_project:
111
-                    previous_project = project_name
112
-                    print()
113
-                print('%s: %s' % (project_name, mod))
114
-
115
-if __name__ == '__main__':
116
-    main()

+ 0
- 70
install_venv.py View File

@@ -1,70 +0,0 @@
1
-# Copyright 2010 United States Government as represented by the
2
-# Administrator of the National Aeronautics and Space Administration.
3
-# All Rights Reserved.
4
-#
5
-# Copyright 2010 OpenStack Foundation
6
-# Copyright 2013 IBM Corp.
7
-#
8
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
9
-#    not use this file except in compliance with the License. You may obtain
10
-#    a copy of the License at
11
-#
12
-#         http://www.apache.org/licenses/LICENSE-2.0
13
-#
14
-#    Unless required by applicable law or agreed to in writing, software
15
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
17
-#    License for the specific language governing permissions and limitations
18
-#    under the License.
19
-
20
-import os
21
-import sys
22
-
23
-import install_venv_common as install_venv  # noqa
24
-
25
-
26
-def print_help(venv, root):
27
-    help = """
28
-    OpenStack development environment setup is complete.
29
-
30
-    OpenStack development uses virtualenv to track and manage Python
31
-    dependencies while in development and testing.
32
-
33
-    To activate the OpenStack virtualenv for the extent of your current shell
34
-    session you can run:
35
-
36
-    $ source %s/bin/activate
37
-
38
-    Or, if you prefer, you can run commands in the virtualenv on a case by case
39
-    basis by running:
40
-
41
-    $ %s/tools/with_venv.sh <your command>
42
-
43
-    Also, make test will automatically use the virtualenv.
44
-    """
45
-    print(help % (venv, root))
46
-
47
-
48
-def main(argv):
49
-    root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
50
-
51
-    if os.environ.get('TOOLS_PATH'):
52
-        root = os.environ['TOOLS_PATH']
53
-    venv = os.path.join(root, '.venv')
54
-    if os.environ.get('VENV'):
55
-        venv = os.environ['VENV']
56
-
57
-    pip_requires = os.path.join(root, 'requirements.txt')
58
-    test_requires = os.path.join(root, 'test-requirements.txt')
59
-    py_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1])
60
-    project = 'OpenStack'
61
-    install = install_venv.InstallVenv(root, venv, pip_requires, test_requires,
62
-                                       py_version, project)
63
-    options = install.parse_args(argv)
64
-    install.check_dependencies()
65
-    install.create_virtualenv(no_site_packages=options.no_site_packages)
66
-    install.install_dependencies()
67
-    print_help(venv, root)
68
-
69
-if __name__ == '__main__':
70
-    main(sys.argv)

+ 0
- 165
install_venv_common.py View File

@@ -1,165 +0,0 @@
1
-# Copyright 2013 OpenStack Foundation
2
-# Copyright 2013 IBM Corp.
3
-#
4
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
5
-#    not use this file except in compliance with the License. You may obtain
6
-#    a copy of the License at
7
-#
8
-#         http://www.apache.org/licenses/LICENSE-2.0
9
-#
10
-#    Unless required by applicable law or agreed to in writing, software
11
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
-#    License for the specific language governing permissions and limitations
14
-#    under the License.
15
-
16
-"""Provides methods needed by installation script for OpenStack development
17
-virtual environments.
18
-
19
-Synced in from openstack-common
20
-"""
21
-
22
-from __future__ import print_function
23
-
24
-import optparse
25
-import os
26
-import subprocess
27
-import sys
28
-
29
-
30
-class InstallVenv(object):
31
-
32
-    def __init__(self, root, venv, requirements,
33
-                 test_requirements, py_version,
34
-                 project):
35
-        self.root = root
36
-        self.venv = venv
37
-        self.requirements = requirements
38
-        self.test_requirements = test_requirements
39
-        self.py_version = py_version
40
-        self.project = project
41
-
42
-    def die(self, message, *args):
43
-        print(message % args, file=sys.stderr)
44
-        sys.exit(1)
45
-
46
-    def run_command_with_code(self, cmd, redirect_output=True,
47
-                              check_exit_code=True):
48
-        """Runs a command in an out-of-process shell.
49
-
50
-        Returns the output of that command. Working directory is self.root.
51
-        """
52
-        if redirect_output:
53
-            stdout = subprocess.PIPE
54
-        else:
55
-            stdout = None
56
-
57
-        proc = subprocess.Popen(cmd, cwd=self.root, stdout=stdout)
58
-        output = proc.communicate()[0]
59
-        if check_exit_code and proc.returncode != 0:
60
-            self.die('Command "%s" failed.\n%s', ' '.join(cmd), output)
61
-        return (output, proc.returncode)
62
-
63
-    def run_command(self, cmd, redirect_output=True, check_exit_code=True):
64
-        return self.run_command_with_code(cmd, redirect_output,
65
-                                          check_exit_code)[0]
66
-
67
-    def get_distro(self):
68
-        if (os.path.exists('/etc/fedora-release') or
69
-                os.path.exists('/etc/redhat-release')):
70
-            return Fedora(
71
-                self.root, self.venv, self.requirements,
72
-                self.test_requirements, self.py_version, self.project)
73
-        else:
74
-            return Distro(
75
-                self.root, self.venv, self.requirements,
76
-                self.test_requirements, self.py_version, self.project)
77
-
78
-    def check_dependencies(self):
79
-        self.get_distro().install_virtualenv()
80
-
81
-    def create_virtualenv(self, no_site_packages=True):
82
-        """Creates the virtual environment and installs PIP.
83
-
84
-        Creates the virtual environment and installs PIP only into the
85
-        virtual environment.
86
-        """
87
-        if not os.path.isdir(self.venv):
88
-            print('Creating venv...', end=' ')
89
-            if no_site_packages:
90
-                self.run_command(['virtualenv', '-q', '--no-site-packages',
91
-                                 self.venv])
92
-            else:
93
-                self.run_command(['virtualenv', '-q', self.venv])
94
-            print('done.')
95
-        else:
96
-            print("venv already exists...")
97
-            pass
98
-
99
-    def pip_install(self, *args):
100
-        self.run_command(['tools/with_venv.sh',
101
-                         'pip', 'install', '--upgrade'] + list(args),
102
-                         redirect_output=False)
103
-
104
-    def install_dependencies(self):
105
-        print('Installing dependencies with pip (this can take a while)...')
106
-
107
-        # First things first, make sure our venv has the latest pip and
108
-        # setuptools and pbr
109
-        self.pip_install('pip>=1.4')
110
-        self.pip_install('setuptools')
111
-        self.pip_install('pbr')
112
-
113
-        self.pip_install('-r', self.requirements, '-r', self.test_requirements)
114
-
115
-    def parse_args(self, argv):
116
-        """Parses command-line arguments."""
117
-        parser = optparse.OptionParser()
118
-        parser.add_option('-n', '--no-site-packages',
119
-                          action='store_true',
120
-                          help="Do not inherit packages from global Python "
121
-                               "install.")
122
-        return parser.parse_args(argv[1:])[0]
123
-
124
-
125
-class Distro(InstallVenv):
126
-
127
-    def check_cmd(self, cmd):
128
-        return bool(self.run_command(['which', cmd],
129
-                    check_exit_code=False).strip())
130
-
131
-    def install_virtualenv(self):
132
-        if self.check_cmd('virtualenv'):
133
-            return
134
-
135
-        if self.check_cmd('easy_install'):
136
-            print('Installing virtualenv via easy_install...', end=' ')
137
-            if self.run_command(['easy_install', 'virtualenv']):
138
-                print('Succeeded')
139
-                return
140
-            else:
141
-                print('Failed')
142
-
143
-        self.die('ERROR: virtualenv not found.\n\n%s development'
144
-                 ' requires virtualenv, please install it using your'
145
-                 ' favorite package management tool' % self.project)
146
-
147
-
148
-class Fedora(Distro):
149
-    """This covers all Fedora-based distributions.
150
-
151
-    Includes: Fedora, RHEL, CentOS, Scientific Linux
152
-    """
153
-
154
-    def check_pkg(self, pkg):
155
-        return self.run_command_with_code(['rpm', '-q', pkg],
156
-                                          check_exit_code=False)[1] == 0
157
-
158
-    def install_virtualenv(self):
159
-        if self.check_cmd('virtualenv'):
160
-            return
161
-
162
-        if not self.check_pkg('python-virtualenv'):
163
-            self.die("Please install 'python-virtualenv'.")
164
-
165
-        super(Fedora, self).install_virtualenv()

+ 0
- 30
lint.py View File

@@ -1,30 +0,0 @@
1
-# Copyright (c) 2013 Intel Corporation.
2
-# All Rights Reserved.
3
-#
4
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
5
-#    not use this file except in compliance with the License. You may obtain
6
-#    a copy of the License at
7
-#
8
-#         http://www.apache.org/licenses/LICENSE-2.0
9
-#
10
-#    Unless required by applicable law or agreed to in writing, software
11
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
-#    License for the specific language governing permissions and limitations
14
-#    under the License.
15
-#
16
-
17
-import sys
18
-
19
-from pylint import lint
20
-
21
-
22
-ENABLED_PYLINT_MSGS = ['W0611']
23
-
24
-
25
-def main(dirpath):
26
-    enable_opt = '--enable=%s' % ','.join(ENABLED_PYLINT_MSGS)
27
-    lint.Run(['--reports=n', '--disable=all', enable_opt, dirpath])
28
-
29
-if __name__ == '__main__':
30
-    main(sys.argv[1])

+ 0
- 96
new_core.py View File

@@ -1,96 +0,0 @@
1
-#!/usr/bin/env python
2
-#
3
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
4
-#    not use this file except in compliance with the License. You may obtain
5
-#    a copy of the License at
6
-#
7
-#         http://www.apache.org/licenses/LICENSE-2.0
8
-#
9
-#    Unless required by applicable law or agreed to in writing, software
10
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
-#    License for the specific language governing permissions and limitations
13
-#    under the License.
14
-
15
-"""
16
-New core email content generator.
17
-"""
18
-
19
-import argparse
20
-
21
-import jinja2
22
-import parawrap
23
-
24
-
25
-CORE_TPL = """
26
-Greetings all stackers,
27
-
28
-I propose that we add {{FULL_NAME}}[1] to the {{TEAM_CORE}}[2] team.
29
-
30
-{{FIRST_NAME}} has been actively contributing to {{TEAM}} for a while now, both
31
-in helping make {{TEAM}} better via code contribution(s) and by helping with
32
-the review load when {{HE_SHE_LOWER}} can. {{HE_SHE}} has provided quality
33
-reviews and is doing an awesome job with the various {{TEAM}} concepts and
34
-helping make {{TEAM}} the best it can be!
35
-
36
-Overall I think {{HE_SHE_LOWER}} would make a great addition to the core
37
-review team.
38
-
39
-Please respond with +1/-1.
40
-
41
-Thanks much!
42
-
43
-- {{ME}}
44
-"""
45
-CORE_TPL = CORE_TPL.strip()
46
-
47
-
48
-def expand_template(contents, params):
49
-    if not params:
50
-        params = {}
51
-    tpl = jinja2.Template(source=contents, undefined=jinja2.StrictUndefined)
52
-    return tpl.render(**params)
53
-
54
-
55
-def generate_email(args):
56
-    params = {
57
-        'FULL_NAME': args.who,
58
-        'HE_SHE': args.gender.title(),
59
-        'TEAM_CORE': '%s-core' % args.team,
60
-        'ME': args.sender,
61
-    }
62
-    params['TEAM'] = args.team.strip().lower()
63
-    params['HE_SHE_LOWER'] = params['HE_SHE'].lower()
64
-    params['FIRST_NAME'] = params['FULL_NAME'].split()[0]
65
-    contents = expand_template(CORE_TPL, params)
66
-    contents = parawrap.fill(contents.strip(), width=75)
67
-    # Put the links on after so they are not affected by the wrapping...
68
-    links = [
69
-        'https://launchpad.net/~%s' % args.who_launchpad_id,
70
-        'https://launchpad.net/%s' % params['TEAM'],
71
-    ]
72
-    contents += "\n\n"
73
-    for i, link in enumerate(links, 1):
74
-        contents += "[%s] %s\n" % (i, link)
75
-    return contents.rstrip()
76
-
77
-
78
-def main():
79
-    parser = argparse.ArgumentParser(description=__doc__)
80
-    parser.add_argument('--adding-who', action="store", dest="who",
81
-                        required=True, metavar="<full-name>")
82
-    parser.add_argument('--adding-who-launchpad-id', action="store",
83
-                        dest="who_launchpad_id",
84
-                        required=True, metavar="<launchpad-id>")
85
-    parser.add_argument('--from-who', action="store", dest="sender",
86
-                        metavar="<full-name>", required=True)
87
-    parser.add_argument('--team', action="store", dest="team",
88
-                        metavar="<team>", required=True)
89
-    parser.add_argument('--gender', action="store", dest="gender",
90
-                        metavar="<he/she>", required=True)
91
-    args = parser.parse_args()
92
-    print(generate_email(args))
93
-
94
-
95
-if __name__ == '__main__':
96
-    main()

+ 0
- 177
new_core_analyzer.py View File

@@ -1,177 +0,0 @@
1
-#  Licensed under the Apache License, Version 2.0 (the "License"); you may
2
-#  not use this file except in compliance with the License. You may obtain
3
-#  a copy of the License at
4
-#
5
-#       http://www.apache.org/licenses/LICENSE-2.0
6
-#
7
-#  Unless required by applicable law or agreed to in writing, software
8
-#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
-#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
-#  License for the specific language governing permissions and limitations
11
-#  under the License.
12
-
13
-import collections
14
-import contextlib
15
-import datetime
16
-import os
17
-import sys
18
-
19
-import tabulate
20
-
21
-from gitinspector.changes import Changes
22
-from gitinspector.metrics import MetricsLogic
23
-
24
-Repository = collections.namedtuple('Repository', 'name,location')
25
-
26
-CORE_SKIPS = frozenset([
27
-    u'Julien Danjou',
28
-    u'Davanum Srinivas',
29
-    u'Ben Nemec',
30
-    u'Joshua Harlow',
31
-    u'Brant Knudson',
32
-    u'Doug Hellmann',
33
-    u'Victor Stinner',
34
-    u'Michael Still',
35
-    u'Flavio Percoco',
36
-    u'Mehdi Abaakouk',
37
-    u'Robert Collins',
38
-])
39
-EMAIL_SKIPS = frozenset([
40
-    'openstack-infra@lists.openstack.org',
41
-    'flaper87@gmail.com',
42
-    'fpercoco@redhat.com',
43
-])
44
-OLDEST_COMMIT_YEAR = 2014
45
-
46
-
47
-@contextlib.contextmanager
48
-def auto_cwd(target_dir):
49
-    old_dir = os.getcwd()
50
-    if old_dir == target_dir:
51
-        yield
52
-    else:
53
-        os.chdir(target_dir)
54
-        try:
55
-            yield
56
-        finally:
57
-            os.chdir(old_dir)
58
-
59
-
60
-def new_core_compare(c1, c2):
61
-    # Sort by insertions, deletions...
62
-    c1_info = (c1[3], c1[4], c1[5])
63
-    c2_info = (c2[3], c2[4], c2[5])
64
-    if c1_info == c2_info:
65
-        return 0
66
-    if c1_info < c2_info:
67
-        return -1
68
-    else:
69
-        return 1
70
-
71
-
72
-def should_discard(change_date, author_name, author_email, author_info):
73
-    if author_name in CORE_SKIPS:
74
-        return True
75
-    if author_email in EMAIL_SKIPS:
76
-        return True
77
-    if change_date is not None:
78
-        if change_date.year < OLDEST_COMMIT_YEAR:
79
-            return True
80
-    return False
81
-
82
-
83
-def dump_changes(repo):
84
-    with auto_cwd(repo.location):
85
-        print("Analyzing repo %s (%s):" % (repo.name, repo.location))
86
-        print("Please wait...")
87
-        Changes.authors.clear()
88
-        Changes.authors_dateinfo.clear()
89
-        Changes.authors_by_email.clear()
90
-        Changes.emails_by_author.clear()
91
-
92
-        changes = Changes(repo)
93
-        # This is needed to flush out changes progress message...
94
-        sys.stdout.write("\n")
95
-        # Force population of this info...
96
-        changes_per_author = changes.get_authordateinfo_list()
97
-        just_authors = changes.get_authorinfo_list()
98
-        better_changes_per_author = {}
99
-        maybe_new_cores = {}
100
-        for c in changes.get_commits():
101
-            change_date = c.timestamp
102
-            author_name = c.author
103
-            author_email = c.email
104
-            change_date = datetime.datetime.fromtimestamp(int(change_date))
105
-            try:
106
-                author_info = changes.authors[author_name]
107
-                better_changes_per_author[(change_date, author_name)] = author_info
108
-            except KeyError:
109
-                pass
110
-        for (change_date, author_name) in better_changes_per_author.keys():
111
-            author_email = changes.get_latest_email_by_author(author_name)
112
-            author_info = better_changes_per_author[(change_date, author_name)]
113
-            author_info.email = author_email
114
-            if not should_discard(change_date, author_name, author_email, author_info):
115
-                if author_name in maybe_new_cores:
116
-                    existing_info = maybe_new_cores[author_name]
117
-                    if existing_info[2] < change_date:
118
-                        existing_info[2] = change_date
119
-                else:
120
-                    maybe_core = [
121
-                        author_name.encode("ascii", errors='replace'),
122
-                        author_email,
123
-                        change_date,
124
-                        author_info.insertions,
125
-                        author_info.deletions,
126
-                        author_info.commits,
127
-                    ]
128
-                    maybe_new_cores[author_name] = maybe_core
129
-        if maybe_new_cores:
130
-            print("%s potential new cores found!!" % len(maybe_new_cores))
131
-            tmp_maybe_new_cores = sorted(list(maybe_new_cores.values()),
132
-                                              cmp=new_core_compare, reverse=True)
133
-            headers = ['Name', 'Email', 'Last change made', 'Insertions', 'Deletions', 'Commits']
134
-            print(tabulate.tabulate(tmp_maybe_new_cores, headers=headers,
135
-                                    tablefmt="grid"))
136
-        else:
137
-            print("No new cores found!!")
138
-        return changes.authors.copy()
139
-
140
-
141
-def main(repos):
142
-    raw_repos = [os.path.abspath(p) for p in repos]
143
-    parsed_repos = []
144
-    for repo in raw_repos:
145
-        parsed_repos.append(Repository(os.path.basename(repo), repo))
146
-    all_authors = []
147
-    for repo in parsed_repos:
148
-        all_authors.append(dump_changes(repo))
149
-    if all_authors:
150
-        print("Combined changes of %s repos:" % len(parsed_repos))
151
-        maybe_new_cores = {}
152
-        for repo_authors in all_authors:
153
-            for author_name, author_info in repo_authors.items():
154
-                change_date = datetime.datetime.now()
155
-                if not should_discard(None, author_name, author_info.email, author_info):
156
-                    if author_name in maybe_new_cores:
157
-                        prior_author_info = maybe_new_cores[author_name]
158
-                        prior_author_info[3] = prior_author_info[3] + author_info.insertions
159
-                        prior_author_info[4] = prior_author_info[4] + author_info.deletions
160
-                        prior_author_info[5] = prior_author_info[5] + author_info.commits
161
-                    else:
162
-                        maybe_new_cores[author_name] = [
163
-                            author_name.encode("ascii", errors='replace'),
164
-                            author_info.email,
165
-                            u"N/A",
166
-                            author_info.insertions,
167
-                            author_info.deletions,
168
-                            author_info.commits,
169
-                        ]
170
-        tmp_maybe_new_cores = sorted(list(maybe_new_cores.values()),
171
-                                          cmp=new_core_compare, reverse=True)
172
-        headers = ['Name', 'Email', 'Last change made', 'Insertions', 'Deletions', 'Commits']
173
-        print(tabulate.tabulate(tmp_maybe_new_cores, headers=headers,
174
-                                tablefmt="grid"))
175
-
176
-if __name__ == '__main__':
177
-    main(sys.argv[1:])

+ 0
- 70
new_core_recruit.py View File

@@ -1,70 +0,0 @@
1
-#!/usr/bin/env python
2
-#
3
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
4
-#    not use this file except in compliance with the License. You may obtain
5
-#    a copy of the License at
6
-#
7
-#         http://www.apache.org/licenses/LICENSE-2.0
8
-#
9
-#    Unless required by applicable law or agreed to in writing, software
10
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
-#    License for the specific language governing permissions and limitations
13
-#    under the License.
14
-
15
-import random
16
-import sys
17
-
18
-import jinja2
19
-import parawrap
20
-
21
-
22
-def expand_template(contents, params):
23
-    if not params:
24
-        params = {}
25
-    tpl = jinja2.Template(source=contents, undefined=jinja2.StrictUndefined)
26
-    return tpl.render(**params)
27
-
28
-
29
-chosen_how = [
30
-    'selected',
31
-    'picked',
32
-    'targeted',
33
-]
34
-new_oslo_core_tpl = """
35
-Hi {{firstname}} {{lastname}},
36
-
37
-You have been {{chosen_how}} to be a new {{project}} core (if you are
38
-willing to accept this mission). We have been watching your commits and
39
-reviews and have noticed that you may be interested in a core position
40
-that would be granted to you (if you are willing to accept the
41
-responsibility of being a new core member[1] in project {{project}}).
42
-
43
-What do you think, are you able (and willing) to accept?
44
-
45
-If you have any questions, please feel free to respond or jump on
46
-freenode and chat with the team on channel #openstack-oslo (one of the
47
-other cores in oslo usually around).
48
-
49
-This message will self-destruct in 5 seconds.
50
-
51
-Sincerely,
52
-
53
-The Oslo Team
54
-
55
-[1] http://docs.openstack.org/infra/manual/core.html
56
-"""
57
-firstname = sys.argv[1]
58
-lastname = sys.argv[2]
59
-tpl_args = {
60
-    'firstname': firstname,
61
-    'project': sys.argv[3],
62
-    'lastname': lastname,
63
-    'firstname_title': firstname.title(),
64
-    'lastname_title': lastname.title(),
65
-    'chosen_how': random.choice(chosen_how),
66
-}
67
-
68
-tpl_value = expand_template(new_oslo_core_tpl.lstrip(), tpl_args)
69
-tpl_value = parawrap.fill(tpl_value)
70
-print(tpl_value)

+ 0
- 18
remove-namespace-packages-project.txt View File

@@ -1,18 +0,0 @@
1
-Drop use of 'oslo' namespace package
2
-
3
-The Oslo libraries have moved all of their code out of the 'oslo'
4
-namespace package into per-library packages. The namespace package was
5
-retained during kilo for backwards compatibility, but will be removed by
6
-the liberty-2 milestone. This change removes the use of the namespace
7
-package, replacing it with the new package names.
8
-
9
-The patches in the libraries will be put on hold until application
10
-patches have landed, or L2, whichever comes first. At that point, new
11
-versions of the libraries without namespace packages will be released as
12
-a major version update.
13
-
14
-Please merge this patch, or an equivalent, before L2 to avoid problems
15
-with those library releases.
16
-
17
-Blueprint: remove-namespace-packages
18
-https://blueprints.launchpad.net/oslo-incubator/+spec/remove-namespace-packages

+ 0
- 248
run_tests_common.sh View File

@@ -1,248 +0,0 @@
1
-#!/bin/bash
2
-
3
-set -eu
4
-
5
-function usage {
6
-  echo "Usage: $0 [OPTION]..."
7
-  echo "Run project's test suite(s)"
8
-  echo ""
9
-  echo "  -V, --virtual-env           Always use virtualenv. Install automatically if not present."
10
-  echo "  -N, --no-virtual-env        Don't use virtualenv. Run tests in local environment."
11
-  echo "  -s, --no-site-packages      Isolate the virtualenv from the global Python environment."
12
-  echo "  -r, --recreate-db           Recreate the test database (deprecated, as this is now the default)."
13
-  echo "  -n, --no-recreate-db        Don't recreate the test database."
14
-  echo "  -f, --force                 Force a clean re-build of the virtual environment."
15
-  echo "                              Useful when dependencies have been added."
16
-  echo "  -u, --update                Update the virtual environment with any newer package versions."
17
-  echo "  -p, --pep8                  Just run PEP8 and HACKING compliance check."
18
-  echo "  -P, --no-pep8               Don't run static code checks."
19
-  echo "  -c, --coverage              Generate coverage report."
20
-  echo "  -d, --debug                 Run tests with testtools instead of testr."
21
-  echo "                              This allows you to use the debugger."
22
-  echo "  -h, --help                  Print this usage message."
23
-  echo "  --hide-elapsed              Don't print the elapsed time for each test along with slow test list."
24
-  echo "  --virtual-env-path <path>   Location of the virtualenv directory."
25
-  echo "                               Default: \$(pwd)"
26
-  echo "  --virtual-env-name <name>   Name of the virtualenv directory."
27
-  echo "                               Default: .venv"
28
-  echo "  --tools-path <dir>          Location of the tools directory."
29
-  echo "                               Default: \$(pwd)"
30
-  echo ""
31
-  echo "Note: with no options specified, the script will try to run the tests in a virtual environment,"
32
-  echo "      If no virtualenv is found, the script will ask if you would like to create one.  If you "
33
-  echo "      prefer to run tests NOT in a virtual environment, simply pass the -N option."
34
-  exit
35
-}
36
-
37
-function process_options {
38
-  i=1
39
-  while [ $i -le $# ]; do
40
-    case "${!i}" in
41
-      -h|--help) usage;;
42
-      -V|--virtual-env) ALWAYS_VENV=1; NEVER_VENV=0;;
43
-      -N|--no-virtual-env) ALWAYS_VENV=0; NEVER_VENV=1;;
44
-      -s|--no-site-packages) NO_SITE_PACKAGES=1;;
45
-      -r|--recreate-db) RECREATE_DB=1;;
46
-      -n|--no-recreate-db) RECREATE_DB=0;;
47
-      -f|--force) FORCE=1;;
48
-      -u|--update) UPDATE=1;;
49
-      -p|--pep8) JUST_PEP8=1;;
50
-      -P|--no-pep8) NO_PEP8=1;;
51
-      -c|--coverage) COVERAGE=1;;
52
-      -d|--debug) DEBUG=1;;
53
-      --virtual-env-path)
54
-        (( i++ ))
55
-        VENV_PATH=${!i}
56
-        ;;
57
-      --virtual-env-name)
58
-        (( i++ ))
59
-        VENV_DIR=${!i}
60
-        ;;
61
-      --tools-path)
62
-        (( i++ ))
63
-        TOOLS_PATH=${!i}
64
-        ;;
65
-      -*) TESTOPTS="$TESTOPTS ${!i}";;
66
-      *) TESTRARGS="$TESTRARGS ${!i}"
67
-    esac
68
-    (( i++ ))
69
-  done
70
-}
71
-
72
-
73
-TOOLS_PATH=${TOOLS_PATH:-${PWD}}
74
-VENV_PATH=${VENV_PATH:-${PWD}}
75
-VENV_DIR=${VENV_DIR:-.venv}
76
-WITH_VENV=${TOOLS_PATH}/tools/with_venv.sh
77
-
78
-ALWAYS_VENV=0
79
-NEVER_VENV=0
80
-FORCE=0
81
-NO_SITE_PACKAGES=1
82
-INSTALLVENVOPTS=
83
-TESTRARGS=
84
-TESTOPTS=
85
-WRAPPER=""
86
-JUST_PEP8=0
87
-NO_PEP8=0
88
-COVERAGE=0
89
-DEBUG=0
90
-RECREATE_DB=1
91
-UPDATE=0
92
-
93
-LANG=en_US.UTF-8
94
-LANGUAGE=en_US:en
95
-LC_ALL=C
96
-
97
-process_options $@
98
-# Make our paths available to other scripts we call
99
-export VENV_PATH
100
-export TOOLS_PATH
101
-export VENV_DIR
102
-export WITH_VENV
103
-export VENV=${VENV_PATH}/${VENV_DIR}
104
-
105
-
106
-function run_tests {
107
-  # Cleanup *pyc
108
-  ${WRAPPER} find . -type f -name "*.pyc" -delete
109
-
110
-  if [ ${DEBUG} -eq 1 ]; then
111
-    if [ "${TESTOPTS}" = "" ] && [ "${TESTRARGS}" = "" ]; then
112
-      # Default to running all tests if specific test is not
113
-      # provided.
114
-      TESTRARGS="discover ./${TESTS_DIR}"
115
-    fi
116
-    ${WRAPPER} python -m testtools.run ${TESTOPTS} ${TESTRARGS}
117
-
118
-    # Short circuit because all of the testr and coverage stuff
119
-    # below does not make sense when running testtools.run for
120
-    # debugging purposes.
121
-    return $?
122
-  fi
123
-
124
-  if [ ${COVERAGE} -eq 1 ]; then
125
-    TESTRTESTS="${TESTRTESTS} --coverage"
126
-  else
127
-    TESTRTESTS="${TESTRTESTS}"
128
-  fi
129
-
130
-  # Just run the test suites in current environment
131
-  set +e
132
-  TESTRARGS=`echo "${TESTRARGS}" | sed -e's/^\s*\(.*\)\s*$/\1/'`
133
-
134
-  if [ ${WORKERS_COUNT} -ne 0 ]; then
135
-    TESTRTESTS="${TESTRTESTS} --testr-args='--concurrency=${WORKERS_COUNT} --subunit ${TESTOPTS} ${TESTRARGS}'"
136
-  else
137
-    TESTRTESTS="${TESTRTESTS} --testr-args='--subunit ${TESTOPTS} ${TESTRARGS}'"
138
-  fi
139
-
140
-  if [ setup.cfg -nt ${EGG_INFO_FILE} ]; then
141
-    ${WRAPPER} python setup.py egg_info
142
-  fi
143
-
144
-  echo "Running \`${WRAPPER} ${TESTRTESTS}\`"
145
-  if ${WRAPPER} which subunit-2to1 2>&1 > /dev/null; then
146
-    # subunit-2to1 is present, testr subunit stream should be in version 2
147
-    # format. Convert to version one before colorizing.
148
-    bash -c "${WRAPPER} ${TESTRTESTS} | ${WRAPPER} subunit-2to1 | ${WRAPPER} ${TOOLS_PATH}/tools/colorizer.py"
149
-  else
150
-    bash -c "${WRAPPER} ${TESTRTESTS} | ${WRAPPER} ${TOOLS_PATH}/tools/colorizer.py"
151
-  fi
152
-  RESULT=$?
153
-  set -e
154
-
155
-  copy_subunit_log
156
-
157
-  if [ $COVERAGE -eq 1 ]; then
158
-    echo "Generating coverage report in covhtml/"
159
-    ${WRAPPER} coverage combine
160
-    # Don't compute coverage for common code, which is tested elsewhere
161
-    # if we are not in `oslo-incubator` project
162
-    if [ ${OMIT_OSLO_FROM_COVERAGE} -eq 0 ]; then
163
-        OMIT_OSLO=""
164
-    else
165
-        OMIT_OSLO="--omit='${PROJECT_NAME}/openstack/common/*'"
166
-    fi
167
-    ${WRAPPER} coverage html --include='${PROJECT_NAME}/*' ${OMIT_OSLO} -d covhtml -i
168
-  fi
169
-
170
-  return ${RESULT}
171
-}
172
-
173
-function copy_subunit_log {
174
-  LOGNAME=`cat .testrepository/next-stream`
175
-  LOGNAME=$((${LOGNAME} - 1))
176
-  LOGNAME=".testrepository/${LOGNAME}"
177
-  cp ${LOGNAME} subunit.log
178
-}
179
-
180
-function run_pep8 {
181
-  echo "Running flake8 ..."
182
-  bash -c "${WRAPPER} flake8"
183
-}
184
-
185
-
186
-TESTRTESTS="lockutils-wrapper stestr"
187
-
188
-if [ ${NO_SITE_PACKAGES} -eq 1 ]; then
189
-  INSTALLVENVOPTS="--no-site-packages"
190
-fi
191
-
192
-if [ ${NEVER_VENV} -eq 0 ]; then
193
-  # Remove the virtual environment if -f or --force used
194
-  if [ ${FORCE} -eq 1 ]; then
195
-    echo "Cleaning virtualenv..."
196
-    rm -rf ${VENV}
197
-  fi
198
-
199
-  # Update the virtual environment if -u or --update used
200
-  if [ ${UPDATE} -eq 1 ]; then
201
-      echo "Updating virtualenv..."
202
-      python ${TOOLS_PATH}/tools/install_venv.py ${INSTALLVENVOPTS}
203
-  fi
204
-
205
-  if [ -e ${VENV} ]; then
206
-    WRAPPER="${WITH_VENV}"
207
-  else
208
-    if [ ${ALWAYS_VENV} -eq 1 ]; then
209
-      # Automatically install the virtualenv
210
-      python ${TOOLS_PATH}/tools/install_venv.py ${INSTALLVENVOPTS}
211
-      WRAPPER="${WITH_VENV}"
212
-    else
213
-      echo -e "No virtual environment found...create one? (Y/n) \c"
214
-      read USE_VENV
215
-      if [ "x${USE_VENV}" = "xY" -o "x${USE_VENV}" = "x" -o "x${USE_VENV}" = "xy" ]; then
216
-        # Install the virtualenv and run the test suite in it
217
-        python ${TOOLS_PATH}/tools/install_venv.py ${INSTALLVENVOPTS}
218
-        WRAPPER=${WITH_VENV}
219
-      fi
220
-    fi
221
-  fi
222
-fi
223
-
224
-# Delete old coverage data from previous runs
225
-if [ ${COVERAGE} -eq 1 ]; then
226
-    ${WRAPPER} coverage erase
227
-fi
228
-
229
-if [ ${JUST_PEP8} -eq 1 ]; then
230
-    run_pep8
231
-    exit
232
-fi
233
-
234
-if [ ${RECREATE_DB} -eq 1 ]; then
235
-    rm -f tests.sqlite
236
-fi
237
-
238
-run_tests
239
-
240
-# NOTE(sirp): we only want to run pep8 when we're running the full-test suite,
241
-# not when we're running tests individually. To handle this, we need to
242
-# distinguish between options (testropts), which begin with a '-', and
243
-# arguments (testrargs).
244
-if [ -z "${TESTRARGS}" ]; then
245
-  if [ ${NO_PEP8} -eq 0 ]; then
246
-    run_pep8
247
-  fi
248
-fi

+ 0
- 80
virtual_sprint.py View File

@@ -1,80 +0,0 @@
1
-#!/usr/bin/env python
2
-#
3
-#    Licensed under the Apache License, Version 2.0 (the "License"); you may
4
-#    not use this file except in compliance with the License. You may obtain
5
-#    a copy of the License at
6
-#
7
-#         http://www.apache.org/licenses/LICENSE-2.0
8
-#
9
-#    Unless required by applicable law or agreed to in writing, software
10
-#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
-#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
-#    License for the specific language governing permissions and limitations
13
-#    under the License.
14
-
15
-import sys
16
-
17
-import delorean
18
-import jinja2
19
-import parawrap
20
-
21
-
22
-def expand_template(contents, params):
23
-    if not params:
24
-        params = {}
25
-    tpl = jinja2.Template(source=contents, undefined=jinja2.StrictUndefined)
26
-    return tpl.render(**params)
27
-
28
-
29
-TPL = """
30
-Hi everyone,
31
-
32
-The OpenStack {{ team }} team will be hosting a virtual sprint in
33
-the Freenode IRC channel #{{ channel }} for the {{ for }}
34
-on {{ when }} starting at {{ starts_at }} and going for ~{{ duration }} hours.
35
-
36
-The goal of this sprint is to work on any open reviews, documentation or
37
-any other integration questions, development and so-on, so that we can help
38
-progress the {{ for }} forward at a good rate.
39
-
40
-Live version of the current documentation is available here:
41
-
42
-{{ docs }}
43
-
44
-The code itself lives in the openstack/{{ project }} respository.
45
-
46
-{{ git_tree }}
47
-
48
-Please feel free to join if interested, curious, or able.
49
-
50
-Much appreciated,
51
-
52
-{{ author }}
53
-"""
54
-
55
-# Example:
56
-#
57
-# python tools/virtual_sprint.py  "taskflow" "next tuesday" "Joshua Harlow"
58
-if len(sys.argv) != 4:
59
-    print("%s project when author" % sys.argv[0])
60
-    sys.exit(1)
61
-
62
-# Something like 'next tuesday' is expected...
63
-d = delorean.Delorean()
64
-when = getattr(d, sys.argv[2].replace(" ", "_"))
65
-project = sys.argv[1]
66
-author = sys.argv[3]
67
-params = {
68
-    'team': 'oslo',
69
-    'project': project,
70
-    'channel': 'openstack-oslo',
71
-    'docs': 'http://docs.openstack.org/developer/%s/' % project,
72
-    'when': when().datetime.strftime('%A %m-%d-%Y'),
73
-    'starts_at': '16:00 UTC',
74
-    'duration': 8,
75
-    'author': author,
76
-    'git_tree': 'http://git.openstack.org/cgit/openstack/%s/tree' % project,
77
-}
78
-params['for'] = params['project'] + ' ' + 'subproject'
79
-for line in parawrap.wrap(expand_template(TPL.strip(), params)):
80
-    print(line)

+ 0
- 6
with_venv.sh View File

@@ -1,6 +0,0 @@
1
-#!/bin/bash
2
-TOOLS_PATH=${TOOLS_PATH:-$(dirname $0)/../}
3
-VENV_PATH=${VENV_PATH:-${TOOLS_PATH}}
4
-VENV_DIR=${VENV_DIR:-/.venv}
5
-VENV=${VENV:-${VENV_PATH}/${VENV_DIR}}
6
-source ${VENV}/bin/activate && "$@"

Loading…
Cancel
Save