Few small cleanups to align with Nova
* Adds HACKING.rst -- with some modifications that do not apply to Glance * Renames README to README.rst * Remove old cruft with rfc.sh and BZR stuff Change-Id: I1ff640fcee71e4d9bafa28ddd83c779ac4d702d2
This commit is contained in:
parent
180ae8964d
commit
c713c22a25
10
.bzrignore
10
.bzrignore
@ -1,10 +0,0 @@
|
|||||||
*.pyc
|
|
||||||
glance.egg-info
|
|
||||||
tests.sqlite
|
|
||||||
*.glance-venv
|
|
||||||
.venv/
|
|
||||||
dist/
|
|
||||||
ChangeLog
|
|
||||||
*.pid
|
|
||||||
*.log
|
|
||||||
glance/vcsversion.py
|
|
186
HACKING.rst
Normal file
186
HACKING.rst
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
Glance Style Commandments
|
||||||
|
=======================
|
||||||
|
|
||||||
|
- Step 1: Read http://www.python.org/dev/peps/pep-0008/
|
||||||
|
- Step 2: Read http://www.python.org/dev/peps/pep-0008/ again
|
||||||
|
- Step 3: Read on
|
||||||
|
|
||||||
|
|
||||||
|
General
|
||||||
|
-------
|
||||||
|
- Put two newlines between top-level code (funcs, classes, etc)
|
||||||
|
- Put one newline between methods in classes and anywhere else
|
||||||
|
- Do not write "except:", use "except Exception:" at the very least
|
||||||
|
- Include your name with TODOs as in "#TODO(termie)"
|
||||||
|
- Do not name anything the same name as a built-in or reserved word
|
||||||
|
|
||||||
|
|
||||||
|
Imports
|
||||||
|
-------
|
||||||
|
- Do not make relative imports
|
||||||
|
- Order your imports by the full module path
|
||||||
|
- Organize your imports according to the following template
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||||
|
{{stdlib imports in human alphabetical order}}
|
||||||
|
\n
|
||||||
|
{{third-party lib imports in human alphabetical order}}
|
||||||
|
\n
|
||||||
|
{{glance imports in human alphabetical order}}
|
||||||
|
\n
|
||||||
|
\n
|
||||||
|
{{begin your code}}
|
||||||
|
|
||||||
|
|
||||||
|
Human Alphabetical Order Examples
|
||||||
|
---------------------------------
|
||||||
|
Example::
|
||||||
|
|
||||||
|
import httplib
|
||||||
|
import logging
|
||||||
|
import random
|
||||||
|
import StringIO
|
||||||
|
import time
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import eventlet
|
||||||
|
import webob.exc
|
||||||
|
|
||||||
|
import glance.api.middleware
|
||||||
|
from glance.api import images
|
||||||
|
from glance.auth import users
|
||||||
|
import glance.common
|
||||||
|
from glance.endpoint import cloud
|
||||||
|
from glance import test
|
||||||
|
|
||||||
|
|
||||||
|
Docstrings
|
||||||
|
----------
|
||||||
|
|
||||||
|
Docstrings are required for all functions and methods.
|
||||||
|
|
||||||
|
Docstrings should ONLY use triple-double-quotes (``"""``)
|
||||||
|
|
||||||
|
Single-line docstrings should NEVER have extraneous whitespace
|
||||||
|
between enclosing triple-double-quotes.
|
||||||
|
|
||||||
|
**INCORRECT** ::
|
||||||
|
|
||||||
|
""" There is some whitespace between the enclosing quotes :( """
|
||||||
|
|
||||||
|
**CORRECT** ::
|
||||||
|
|
||||||
|
"""There is no whitespace between the enclosing quotes :)"""
|
||||||
|
|
||||||
|
Docstrings that span more than one line should look like this:
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
"""
|
||||||
|
Start the docstring on the line following the opening triple-double-quote
|
||||||
|
|
||||||
|
If you are going to describe parameters and return values, use Sphinx, the
|
||||||
|
appropriate syntax is as follows.
|
||||||
|
|
||||||
|
:param foo: the foo parameter
|
||||||
|
:param bar: the bar parameter
|
||||||
|
:returns: return_type -- description of the return value
|
||||||
|
:returns: description of the return value
|
||||||
|
:raises: AttributeError, KeyError
|
||||||
|
"""
|
||||||
|
|
||||||
|
**DO NOT** leave an extra newline before the closing triple-double-quote.
|
||||||
|
|
||||||
|
|
||||||
|
Dictionaries/Lists
|
||||||
|
------------------
|
||||||
|
If a dictionary (dict) or list object is longer than 80 characters, its items
|
||||||
|
should be split with newlines. Embedded iterables should have their items
|
||||||
|
indented. Additionally, the last item in the dictionary should have a trailing
|
||||||
|
comma. This increases readability and simplifies future diffs.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
my_dictionary = {
|
||||||
|
"image": {
|
||||||
|
"name": "Just a Snapshot",
|
||||||
|
"size": 2749573,
|
||||||
|
"properties": {
|
||||||
|
"user_id": 12,
|
||||||
|
"arch": "x86_64",
|
||||||
|
},
|
||||||
|
"things": [
|
||||||
|
"thing_one",
|
||||||
|
"thing_two",
|
||||||
|
],
|
||||||
|
"status": "ACTIVE",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Calling Methods
|
||||||
|
---------------
|
||||||
|
Calls to methods 80 characters or longer should format each argument with
|
||||||
|
newlines. This is not a requirement, but a guideline::
|
||||||
|
|
||||||
|
unnecessarily_long_function_name('string one',
|
||||||
|
'string two',
|
||||||
|
kwarg1=constants.ACTIVE,
|
||||||
|
kwarg2=['a', 'b', 'c'])
|
||||||
|
|
||||||
|
|
||||||
|
Rather than constructing parameters inline, it is better to break things up::
|
||||||
|
|
||||||
|
list_of_strings = [
|
||||||
|
'what_a_long_string',
|
||||||
|
'not as long',
|
||||||
|
]
|
||||||
|
|
||||||
|
dict_of_numbers = {
|
||||||
|
'one': 1,
|
||||||
|
'two': 2,
|
||||||
|
'twenty four': 24,
|
||||||
|
}
|
||||||
|
|
||||||
|
object_one.call_a_method('string three',
|
||||||
|
'string four',
|
||||||
|
kwarg1=list_of_strings,
|
||||||
|
kwarg2=dict_of_numbers)
|
||||||
|
|
||||||
|
|
||||||
|
Internationalization (i18n) Strings
|
||||||
|
-----------------------------------
|
||||||
|
In order to support multiple languages, we have a mechanism to support
|
||||||
|
automatic translations of exception and log strings.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
msg = _("An error occurred")
|
||||||
|
raise HTTPBadRequest(explanation=msg)
|
||||||
|
|
||||||
|
If you have a variable to place within the string, first internationalize the
|
||||||
|
template string then do the replacement.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
msg = _("Missing parameter: %s") % ("flavor",)
|
||||||
|
LOG.error(msg)
|
||||||
|
|
||||||
|
If you have multiple variables to place in the string, use keyword parameters.
|
||||||
|
This helps our translators reorder parameters when needed.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
msg = _("The server with id %(s_id)s has no key %(m_key)s")
|
||||||
|
LOG.error(msg % {"s_id": "1234", "m_key": "imageId"})
|
||||||
|
|
||||||
|
|
||||||
|
Creating Unit Tests
|
||||||
|
-------------------
|
||||||
|
For every new feature, unit tests should be created that both test and
|
||||||
|
(implicitly) document the usage of said feature. If submitting a patch for a
|
||||||
|
bug that had no unit test, a new passing unit test should be added. If a
|
||||||
|
submitted bug fix does have a unit test, be sure to add a new one that fails
|
||||||
|
without the patch and passes with the patch.
|
136
tools/rfc.sh
136
tools/rfc.sh
@ -1,136 +0,0 @@
|
|||||||
#!/bin/sh -e
|
|
||||||
# Copyright (c) 2010-2011 Gluster, Inc. <http://www.gluster.com>
|
|
||||||
# This initial version of this file was taken from the source tree
|
|
||||||
# of GlusterFS. It was not directly attributed, but is assumed to be
|
|
||||||
# Copyright (c) 2010-2011 Gluster, Inc and release GPLv3
|
|
||||||
# Subsequent modifications are Copyright (c) 2011 OpenStack, LLC.
|
|
||||||
#
|
|
||||||
# GlusterFS is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published
|
|
||||||
# by the Free Software Foundation; either version 3 of the License,
|
|
||||||
# or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# GlusterFS is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
# General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see
|
|
||||||
# <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
branch="master";
|
|
||||||
|
|
||||||
set_hooks_commit_msg()
|
|
||||||
{
|
|
||||||
top_dir=`git rev-parse --show-toplevel`
|
|
||||||
f="${top_dir}/.git/hooks/commit-msg";
|
|
||||||
u="https://review.openstack.org/tools/hooks/commit-msg";
|
|
||||||
|
|
||||||
if [ -x "$f" ]; then
|
|
||||||
return;
|
|
||||||
fi
|
|
||||||
|
|
||||||
curl -o $f $u || wget -O $f $u;
|
|
||||||
|
|
||||||
chmod +x $f;
|
|
||||||
|
|
||||||
GIT_EDITOR=true git commit --amend
|
|
||||||
}
|
|
||||||
|
|
||||||
add_remote()
|
|
||||||
{
|
|
||||||
username=$1
|
|
||||||
project=$2
|
|
||||||
|
|
||||||
echo "No remote set, testing ssh://$username@review.openstack.org:29418"
|
|
||||||
if ssh -p29418 -o StrictHostKeyChecking=no $username@review.openstack.org gerrit ls-projects >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
echo "$username@review.openstack.org:29418 worked."
|
|
||||||
echo "Creating a git remote called gerrit that maps to:"
|
|
||||||
echo " ssh://$username@review.openstack.org:29418/$project"
|
|
||||||
git remote add gerrit ssh://$username@review.openstack.org:29418/$project
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
check_remote()
|
|
||||||
{
|
|
||||||
if ! git remote | grep gerrit >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
origin_project=`git remote show origin | grep 'Fetch URL' | perl -nle '@fields = split(m|[:/]|); $len = $#fields; print $fields[$len-1], "/", $fields[$len];'`
|
|
||||||
if add_remote $USERNAME $origin_project
|
|
||||||
then
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
echo "Your local name doesn't work on Gerrit."
|
|
||||||
echo -n "Enter Gerrit username (same as launchpad): "
|
|
||||||
read gerrit_user
|
|
||||||
if add_remote $gerrit_user $origin_project
|
|
||||||
then
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
echo "Can't infer where gerrit is - please set a remote named"
|
|
||||||
echo "gerrit manually and then try again."
|
|
||||||
echo
|
|
||||||
echo "For more information, please see:"
|
|
||||||
echo "\thttp://wiki.openstack.org/GerritWorkflow"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
rebase_changes()
|
|
||||||
{
|
|
||||||
git fetch;
|
|
||||||
|
|
||||||
GIT_EDITOR=true git rebase -i origin/$branch || exit $?;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
assert_diverge()
|
|
||||||
{
|
|
||||||
if ! git diff origin/$branch..HEAD | grep -q .
|
|
||||||
then
|
|
||||||
echo "No changes between the current branch and origin/$branch."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
main()
|
|
||||||
{
|
|
||||||
set_hooks_commit_msg;
|
|
||||||
|
|
||||||
check_remote;
|
|
||||||
|
|
||||||
rebase_changes;
|
|
||||||
|
|
||||||
assert_diverge;
|
|
||||||
|
|
||||||
bug=$(git show --format='%s %b' | perl -nle 'if (/\b([Bb]ug|[Ll][Pp])\s*[#:]?\s*(\d+)/) {print "$2"; exit}')
|
|
||||||
|
|
||||||
bp=$(git show --format='%s %b' | perl -nle 'if (/\b([Bb]lue[Pp]rint|[Bb][Pp])\s*[#:]?\s*([0-9a-zA-Z-_]+)/) {print "$2"; exit}')
|
|
||||||
|
|
||||||
if [ "$DRY_RUN" = 1 ]; then
|
|
||||||
drier='echo -e Please use the following command to send your commits to review:\n\n'
|
|
||||||
else
|
|
||||||
drier=
|
|
||||||
fi
|
|
||||||
|
|
||||||
local_branch=`git branch | grep -Ei "\* (.*)" | cut -f2 -d' '`
|
|
||||||
if [ -z "$bug" ]; then
|
|
||||||
if [ -z "$bp" ]; then
|
|
||||||
$drier git push gerrit HEAD:refs/for/$branch/$local_branch;
|
|
||||||
else
|
|
||||||
$drier git push gerrit HEAD:refs/for/$branch/bp/$bp;
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
$drier git push gerrit HEAD:refs/for/$branch/bug/$bug;
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
Loading…
Reference in New Issue
Block a user