autohelp: support reading options from multiple repos
This change modifies the -i option behavior of autohelp.py to add the possibility to find configuration options in multiple repositories. The change implies a few related modifications: - do not check if the source repository is a git repository - update autohelp-wrapper to clone and use the additional repositories (only for neutron at the moment) Note: diff_branches.py will not work with this change, it'll be fixed in another patch. Closes-Bug: #1448107 Change-Id: I4999aca4f7926e19513acdf38f1e2828b52cee13
This commit is contained in:
parent
a92753f4cb
commit
2e63aba8ac
@ -6,7 +6,9 @@ Release notes
|
||||
|
||||
* ``openstack-doc-test``: Always built index page in checkbuild.
|
||||
* ``openstack-auto-commands``: Add support for murano.
|
||||
* Remove ``dn2osdbk`` and the ``hotref`` sphinx extension
|
||||
* Remove ``dn2osdbk`` and the ``hotref`` sphinx extension.
|
||||
* ``autohelp.py``: Can now find options for a project in multiple python
|
||||
packages.
|
||||
|
||||
0.29.1
|
||||
------
|
||||
|
@ -52,6 +52,7 @@ setup_venv() {
|
||||
if [ ! -e $VENVDIR/$project/bin/activate ]; then
|
||||
mkdir -p $VENVDIR/$project
|
||||
virtualenv $VENVDIR/$project
|
||||
pip install --upgrade pip
|
||||
fi
|
||||
activate_venv $project
|
||||
}
|
||||
@ -71,10 +72,23 @@ get_project() {
|
||||
git_url=$GITBASE
|
||||
fi
|
||||
git clone $git_url/$project $SOURCESDIR/$project
|
||||
|
||||
if [ -e extra_repos/$project-$RELEASE ]; then
|
||||
while read extra; do
|
||||
git clone $git_url/$extra $SOURCESDIR/$extra
|
||||
done < extra_repos/$project-$RELEASE
|
||||
fi
|
||||
|
||||
else
|
||||
if [ $project != openstack-manuals ]; then
|
||||
(cd $SOURCESDIR/$project && git pull)
|
||||
fi
|
||||
|
||||
if [ -e extra_repos/$project-$RELEASE ]; then
|
||||
while read extra; do
|
||||
(cd $SOURCESDIR/$extra && git pull)
|
||||
done < extra_repos/$project-$RELEASE
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
@ -134,16 +148,17 @@ fi
|
||||
|
||||
[ $# != 0 ] && PROJECTS="$*"
|
||||
|
||||
RELEASE=$(echo $BRANCH | sed 's,^stable.,,')
|
||||
|
||||
if [ "$FAST" -eq 0 ] ; then
|
||||
get_project oslo-incubator
|
||||
get_project openstack-manuals
|
||||
|
||||
release=$(echo $BRANCH | sed 's,^stable.,,')
|
||||
for project in $PROJECTS; do
|
||||
setup_venv $project
|
||||
setup_tools
|
||||
if [ -e requirements/$project-$release.txt ]; then
|
||||
pip install -r requirements/$project-$release.txt \
|
||||
if [ -e requirements/$project-$RELEASE.txt ]; then
|
||||
pip install -r requirements/$project-$RELEASE.txt \
|
||||
--allow-all-external
|
||||
fi
|
||||
get_project $project
|
||||
@ -159,6 +174,17 @@ if [ "$FAST" -eq 0 ] ; then
|
||||
fi
|
||||
pip install -rrequirements.txt -rtest-requirements.txt
|
||||
python setup.py install
|
||||
|
||||
if [ -e extra_repos/$project-$RELEASE ]; then
|
||||
while read extra; do
|
||||
(
|
||||
cd $SOURCESDIR/$extra
|
||||
pip install -rrequirements.txt \
|
||||
-rtest-requirements.txt
|
||||
python setup.py install
|
||||
)
|
||||
done < extra_repos/$project-$RELEASE
|
||||
fi
|
||||
)
|
||||
done
|
||||
fi
|
||||
@ -170,13 +196,16 @@ for project in $PROJECTS; do
|
||||
break
|
||||
fi
|
||||
|
||||
if [ -d $MANUALSREPO/tools/autogenerate-config-flagmappings ]; then
|
||||
cd $MANUALSREPO/tools/autogenerate-config-flagmappings
|
||||
else
|
||||
# for havana
|
||||
$MANUALSREPO/tools/autogenerate-config-docs
|
||||
if [ -e extra_repos/$project-$RELEASE ]; then
|
||||
extra_flags=
|
||||
while read extra; do
|
||||
package=$(echo $extra | tr - _)
|
||||
extra_flags="$extra_flags -i $SOURCESDIR/$extra/$package"
|
||||
done < extra_repos/$project-$RELEASE
|
||||
fi
|
||||
|
||||
cd $MANUALSREPO/tools/autogenerate-config-flagmappings
|
||||
|
||||
case $ACTION in
|
||||
create)
|
||||
[ "$project" = "swift" ] && continue
|
||||
@ -185,18 +214,18 @@ for project in $PROJECTS; do
|
||||
echo "$project.flagmappings already exists, ignoring."
|
||||
continue
|
||||
fi
|
||||
$AUTOHELP create $project -i $SOURCESDIR/$project
|
||||
$AUTOHELP create $project -i $SOURCESDIR/$project/$project
|
||||
;;
|
||||
update)
|
||||
[ "$project" = "swift" ] && continue
|
||||
$AUTOHELP update $project -i $SOURCESDIR/$project
|
||||
$AUTOHELP update $project -i $SOURCESDIR/$project/$project $extra_flags
|
||||
mv $project.flagmappings.new $project.flagmappings
|
||||
;;
|
||||
docbook)
|
||||
if [ "$project" = "swift" ]; then
|
||||
$EXTRACT_SWIFT docbook -m $MANUALSREPO -s $SOURCESDIR/swift
|
||||
else
|
||||
$AUTOHELP docbook $project -i $SOURCESDIR/$project
|
||||
$AUTOHELP docbook $project -i $SOURCESDIR/$project/$project $extra_flags
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
@ -27,7 +27,6 @@ import pickle
|
||||
import re
|
||||
import sys
|
||||
|
||||
import git
|
||||
from lxml import etree
|
||||
import oslo_i18n as i18n
|
||||
import stevedore
|
||||
@ -99,21 +98,6 @@ register_re = re.compile(r'''^ +.*\.register_opts\((?P<opts>[^,)]+)'''
|
||||
r'''(, (group=)?["'](?P<group>.*)["'])?\)''')
|
||||
|
||||
|
||||
def git_check(repo_path):
|
||||
"""Check a passed directory to verify it is a valid git repository."""
|
||||
|
||||
try:
|
||||
repo = git.Repo(repo_path)
|
||||
assert repo.bare is False
|
||||
package_name = os.path.basename(repo.remotes.origin.url)
|
||||
package_name = package_name.replace('.git', '')
|
||||
except Exception:
|
||||
print("\n%s doesn't seem to be a valid git repository." % repo_path)
|
||||
print("Use the -i flag to specify the repository path.\n")
|
||||
sys.exit(1)
|
||||
return package_name
|
||||
|
||||
|
||||
def import_modules(repo_location, package_name, verbose=0):
|
||||
"""Import modules.
|
||||
|
||||
@ -345,14 +329,20 @@ class OptionsCache(object):
|
||||
|
||||
self._opt_names.sort(OptionsCache._cmpopts)
|
||||
|
||||
def maybe_load_extensions(self, repo):
|
||||
def maybe_load_extensions(self, repositories):
|
||||
# Use the requirements.txt of the project to guess if an oslo module
|
||||
# needs to be imported
|
||||
needed_exts = set()
|
||||
for repo in repositories:
|
||||
base_path = os.path.dirname(repo)
|
||||
for ext in EXTENSIONS:
|
||||
requirements = os.path.join(repo, 'requirements.txt')
|
||||
requirements = os.path.join(base_path, 'requirements.txt')
|
||||
with open(requirements) as fd:
|
||||
for line in fd:
|
||||
if line.startswith(ext):
|
||||
needed_exts.add(ext)
|
||||
|
||||
for ext in needed_exts:
|
||||
self.load_extension_options(ext)
|
||||
|
||||
def get_option_names(self):
|
||||
@ -613,10 +603,13 @@ def main():
|
||||
dest='verbose',
|
||||
required=False,)
|
||||
parser.add_argument('-i', '--input',
|
||||
dest='repo',
|
||||
help='Path to a valid git repository.',
|
||||
dest='repos',
|
||||
help='Path to a python package in which options '
|
||||
'should be discoverd. Can be used multiple '
|
||||
'times.',
|
||||
required=False,
|
||||
type=str,)
|
||||
type=str,
|
||||
action='append')
|
||||
parser.add_argument('-o', '--output',
|
||||
dest='target',
|
||||
help='Directory or file in which data will be saved.\n'
|
||||
@ -627,12 +620,14 @@ def main():
|
||||
type=str,)
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.repo is None:
|
||||
args.repo = './sources/%s' % args.package
|
||||
if args.repos is None:
|
||||
args.repos = ['./sources/%s/%s' % args.package]
|
||||
|
||||
package_name = git_check(args.repo)
|
||||
for repository in args.repos:
|
||||
package_name = os.path.basename(repository)
|
||||
base_path = os.path.dirname(repository)
|
||||
|
||||
sys.path.insert(0, args.repo)
|
||||
sys.path.insert(0, base_path)
|
||||
try:
|
||||
__import__(package_name)
|
||||
except ImportError as e:
|
||||
@ -640,25 +635,27 @@ def main():
|
||||
print(str(e))
|
||||
print("Failed to import: %s (%s)" % (package_name, e))
|
||||
|
||||
import_modules(args.repo, package_name, verbose=args.verbose)
|
||||
import_modules(base_path, package_name, verbose=args.verbose)
|
||||
sys.path.pop(0)
|
||||
|
||||
options = OptionsCache(verbose=args.verbose)
|
||||
options.maybe_load_extensions(args.repo)
|
||||
options.maybe_load_extensions(args.repos)
|
||||
|
||||
if args.verbose > 0:
|
||||
print("%s options imported from package %s." % (len(options),
|
||||
str(package_name)))
|
||||
|
||||
if args.subcommand == 'create':
|
||||
create_flagmappings(package_name, options, verbose=args.verbose)
|
||||
create_flagmappings(args.package, options, verbose=args.verbose)
|
||||
|
||||
elif args.subcommand == 'update':
|
||||
update_flagmappings(package_name, options, verbose=args.verbose)
|
||||
update_flagmappings(args.package, options, verbose=args.verbose)
|
||||
|
||||
elif args.subcommand == 'docbook':
|
||||
write_docbook(package_name, options, args.target, verbose=args.verbose)
|
||||
write_docbook(args.package, options, args.target, verbose=args.verbose)
|
||||
|
||||
elif args.subcommand == 'rst':
|
||||
write_rst(package_name, options, args.target, verbose=args.verbose)
|
||||
write_rst(args.package, options, args.target, verbose=args.verbose)
|
||||
|
||||
elif args.subcommand == 'dump':
|
||||
options.dump()
|
||||
|
3
autogenerate_config_docs/extra_repos/neutron-master
Normal file
3
autogenerate_config_docs/extra_repos/neutron-master
Normal file
@ -0,0 +1,3 @@
|
||||
neutron-fwaas
|
||||
neutron-lbaas
|
||||
neutron-vpnaas
|
Loading…
Reference in New Issue
Block a user