default
4 years ago
committed by
Valentin Lab
3 changed files with 157 additions and 0 deletions
@ -0,0 +1,144 @@ |
|||
#!/usr/bin/env python |
|||
# -*- coding: utf-8 -*- |
|||
from __future__ import print_function |
|||
|
|||
import ast |
|||
import os |
|||
import sys |
|||
from argparse import ArgumentParser |
|||
from subprocess import check_call |
|||
|
|||
from doodbalib import ( |
|||
CORE, |
|||
ENTERPRISE, |
|||
MANIFESTS, |
|||
PRIVATE, |
|||
SRC_DIR, |
|||
AddonsConfigError, |
|||
addons_config, |
|||
logger, |
|||
) |
|||
|
|||
# Exit codes |
|||
EXIT_NO_ADDONS = 0x4 |
|||
|
|||
# Define CLI options |
|||
parser = ArgumentParser(description="Install addons in current environment") |
|||
parser.add_argument( |
|||
"action", |
|||
choices=("init", "update", "list"), |
|||
help="What to do with the matched addons.", |
|||
) |
|||
parser.add_argument( |
|||
"-c", "--core", action="store_true", help="Use all Odoo core addons" |
|||
) |
|||
parser.add_argument( |
|||
"-d", |
|||
"--dependencies", |
|||
action="store_true", |
|||
help="Use only dependencies of selected addons", |
|||
) |
|||
parser.add_argument("-e", "--extra", action="store_true", help="Use all extra addons") |
|||
parser.add_argument( |
|||
"-f", |
|||
"--fullpath", |
|||
action="store_true", |
|||
help="Print addon's full path, only useful with list mode", |
|||
) |
|||
parser.add_argument( |
|||
"-i", "--installable", action="store_true", help="Include only installable addons" |
|||
) |
|||
parser.add_argument( |
|||
"-n", "--enterprise", action="store_true", help="Use all enterprise addons" |
|||
) |
|||
parser.add_argument( |
|||
"-p", "--private", action="store_true", help="Use all private addons" |
|||
) |
|||
parser.add_argument( |
|||
"-s", |
|||
"--separator", |
|||
type=str, |
|||
default=",", |
|||
help="String that separates addons only useful with list mode", |
|||
) |
|||
parser.add_argument( |
|||
"-t", |
|||
"--test", |
|||
action="store_true", |
|||
help="Run unit tests for these addons, usually combined with update", |
|||
) |
|||
parser.add_argument( |
|||
"-x", |
|||
"--explicit", |
|||
action="store_true", |
|||
help="Fail if any addon is explicitly declared but not found", |
|||
) |
|||
parser.add_argument( |
|||
"-w", |
|||
"--with", |
|||
action="append", |
|||
dest="with_", |
|||
default=[], |
|||
help="Addons to include always.", |
|||
) |
|||
parser.add_argument( |
|||
"-W", "--without", action="append", default=[], help="Addons to exclude always." |
|||
) |
|||
|
|||
# Generate the matching addons set |
|||
args = parser.parse_args() |
|||
dependencies = {"base"} |
|||
addons = set(args.with_) |
|||
without = set(args.without) |
|||
if addons & without: |
|||
sys.exit("Cannot include and exclude the same addon!") |
|||
if args.dependencies and args.fullpath: |
|||
sys.exit("Unsupported combination of --dependencies and --fullpath") |
|||
try: |
|||
for addon, repo in addons_config(strict=args.explicit): |
|||
if addon in without: |
|||
continue |
|||
core_ok = args.core and repo == CORE |
|||
enterprise_ok = args.enterprise and repo == ENTERPRISE |
|||
extra_ok = args.extra and repo not in {CORE, ENTERPRISE, PRIVATE} |
|||
private_ok = args.private and repo == PRIVATE |
|||
manual_ok = addon in addons |
|||
if private_ok or core_ok or extra_ok or enterprise_ok or manual_ok: |
|||
addon_path = os.path.join(SRC_DIR, repo, addon) |
|||
manifest = {} |
|||
for manifest_name in MANIFESTS: |
|||
try: |
|||
manifest_path = os.path.join(addon_path, manifest_name) |
|||
with open(manifest_path, "r") as code: |
|||
manifest = ast.literal_eval(code.read()) |
|||
break |
|||
except IOError: |
|||
continue |
|||
if args.installable and not manifest.get("installable", True): |
|||
continue |
|||
dependencies.update(manifest.get("depends", [])) |
|||
if args.fullpath and args.action == "list": |
|||
addon = addon_path |
|||
addons.add(addon) |
|||
except AddonsConfigError as error: |
|||
sys.exit(error.message) |
|||
# Use dependencies instead, if requested |
|||
if args.dependencies: |
|||
addons = dependencies - addons |
|||
addons -= without |
|||
|
|||
# Do the required action |
|||
if not addons: |
|||
print("No addons found", file=sys.stderr) |
|||
sys.exit(EXIT_NO_ADDONS) |
|||
addons = args.separator.join(sorted(addons)) |
|||
if args.action == "list": |
|||
print(addons) |
|||
else: |
|||
command = ["odoo", "--stop-after-init", "--{}".format(args.action), addons] |
|||
if args.test: |
|||
command += ["--test-enable", "--workers", "0"] |
|||
if os.environ.get("PGDATABASE"): |
|||
command += ["--db-filter", u"^{}$".format(os.environ.get("PGDATABASE"))] |
|||
logger.info("Executing %s", " ".join(command)) |
|||
check_call(command) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue