diff --git a/RELEASE_NOTES.rst b/RELEASE_NOTES.rst index 1d742713..7266e652 100644 --- a/RELEASE_NOTES.rst +++ b/RELEASE_NOTES.rst @@ -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 ------ diff --git a/autogenerate_config_docs/autohelp-wrapper b/autogenerate_config_docs/autohelp-wrapper index 8641ebe8..659103f7 100755 --- a/autogenerate_config_docs/autohelp-wrapper +++ b/autogenerate_config_docs/autohelp-wrapper @@ -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 diff --git a/autogenerate_config_docs/autohelp.py b/autogenerate_config_docs/autohelp.py index 355dc2c8..571daaed 100755 --- a/autogenerate_config_docs/autohelp.py +++ b/autogenerate_config_docs/autohelp.py @@ -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[^,)]+)''' r'''(, (group=)?["'](?P.*)["'])?\)''') -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,15 +329,21 @@ 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 - for ext in EXTENSIONS: - requirements = os.path.join(repo, 'requirements.txt') - with open(requirements) as fd: - for line in fd: - if line.startswith(ext): - self.load_extension_options(ext) + needed_exts = set() + for repo in repositories: + base_path = os.path.dirname(repo) + for ext in EXTENSIONS: + 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): return self._opt_names @@ -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,38 +620,42 @@ 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) - try: - __import__(package_name) - except ImportError as e: - if args.verbose >= 1: - print(str(e)) - print("Failed to import: %s (%s)" % (package_name, e)) + sys.path.insert(0, base_path) + try: + __import__(package_name) + except ImportError as e: + if args.verbose >= 1: + print(str(e)) + print("Failed to import: %s (%s)" % (package_name, e)) + + import_modules(base_path, package_name, verbose=args.verbose) + sys.path.pop(0) - import_modules(args.repo, package_name, verbose=args.verbose) 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() diff --git a/autogenerate_config_docs/extra_repos/neutron-master b/autogenerate_config_docs/extra_repos/neutron-master new file mode 100644 index 00000000..38a2ceb4 --- /dev/null +++ b/autogenerate_config_docs/extra_repos/neutron-master @@ -0,0 +1,3 @@ +neutron-fwaas +neutron-lbaas +neutron-vpnaas