Prepare migration to monorepo

This commit is contained in:
Cédric Krier
2022-12-16 23:16:08 +01:00
parent 1c143a3b84
commit 5d3e4a39f2
1207 changed files with 11522 additions and 20819 deletions
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
echo '{ "allow_root": true }' > ~/.bowerrc
+169
View File
@@ -0,0 +1,169 @@
#!/bin/env python
import glob
import os
import subprocess
import sys
from itertools import chain
from string import Template
BASE_DIR = os.path.dirname(__file__)
TEMPLATE_DOC = Template("""
check-doc-${name}:
extends: .check-doc
variables:
PACKAGE: ${package}
trigger-doc-build-${name}:
extends: .trigger-doc-build
variables:
PACKAGE: ${package}
""")
TEMPLATE = Template("""
test-${name}:
extends: .test-tox
variables:
PACKAGE: ${package}
${stage}
${when}
""")
TEMPLATE_IMAGE = Template("""
test-${name}:
extends: .test-tox
image: $${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/tryton/${package}-test:$${PYTHON_VERSION}
variables:
PACKAGE: ${package}
${stage}
${when}
""") # noqa: E501
TEMPLATE_DB = Template("""
test-${name}-sqlite:
extends: .test-sqlite
variables:
PACKAGE: ${package}
${stage}
${when}
test-${name}-postgresql:
extends: .test-postgresql
variables:
PACKAGE: ${package}
${stage}
${when}
""")
TEMPLATE_GIS = Template("""
test-${name}-postgis:
extends: .test-postgis
variables:
PACKAGE: ${package}
${stage}
${when}
""")
TEMPLATE_NPM_IMAGE = Template("""
test-${name}:
extends: .test-npm
image: $${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/tryton/${package}-test
variables:
PACKAGE: ${package}
${stage}
${when}
""")
STAGE_MANUAL = "stage: manual"
WHEN_MANUAL = """
allow_failure: true
rules:
- when: manual
"""
NO_DB = {'proteus'}
CUSTOM_IMAGE = {'tryton'}
CUSTOM_NPM_IMAGE = {'sao'}
GIS = {'trytond-gis'}
def main(filename):
if filename == '-':
render(sys.stdout)
else:
with open(filename, 'w') as file:
render(file)
def render(file):
file.write(open(os.path.join(BASE_DIR, 'gitlab-ci.yml'), 'r').read())
packages = list(all_packages())
modified = set(modified_packages(packages))
for package in packages:
mapping = {
'name': package.replace('/', '-'),
'package': package,
'stage': STAGE_MANUAL if package not in modified else '',
'when': WHEN_MANUAL if package not in modified else '',
}
if os.path.exists(os.path.join(package, 'doc')):
file.write(TEMPLATE_DOC.substitute(mapping))
if package in NO_DB:
file.write(TEMPLATE.substitute(mapping))
elif package in CUSTOM_IMAGE:
file.write(TEMPLATE_IMAGE.substitute(mapping))
elif package in CUSTOM_NPM_IMAGE:
file.write(TEMPLATE_NPM_IMAGE.substitute(mapping))
elif package in GIS:
file.write(TEMPLATE_GIS.substitute(mapping))
else:
file.write(TEMPLATE_DB.substitute(mapping))
def all_packages():
root_dir = os.path.dirname(BASE_DIR)
for filename in chain(
glob.glob('**/setup.py', recursive=True, root_dir=root_dir),
glob.glob('**/package.json', recursive=True, root_dir=root_dir)):
yield os.path.dirname(filename)
def modified_packages(packages):
env = os.environ.copy()
env['HGPLAIN'] = '1'
if env.get('CI_COMMIT_TAG'):
tagged = env['CI_COMMIT_TAG'].split('-')[0]
for package in packages:
if tagged in package:
yield package
else:
if not subprocess.run(
['hg', 'topic', '--current'],
env=env, stdout=subprocess.DEVNULL).returncode:
cmd = ['hg', 'status', '--rev', 's0', '--no-status']
else:
cmd = ['hg', 'status', '--change', '.', '--no-status']
proc = subprocess.run(cmd, env=env, stdout=subprocess.PIPE, text=True)
proc.check_returncode()
modified_files = proc.stdout.splitlines()
modified = set()
for filename in modified_files:
parts = filename.split(os.sep)
modified.add(parts[0])
modified.add(os.sep.join(parts[:2]))
for package in packages:
if package in modified:
yield package
if __name__ == '__main__':
try:
filename = sys.argv[1]
except IndexError:
filename = '-'
main(filename)
+24
View File
@@ -0,0 +1,24 @@
#!/bin/sh
set -eu
OUTPUTDIR=`realpath "${1}"`
mkdir -p "${OUTPUTDIR}"
find . -path '*/doc/conf.py' | while read path; do
path=`dirname "${path}"`
path=`dirname "${path}"`
package=`basename "${path}"`
package=$(echo ${package} | sed "s/_/-/g")
if [ "${package}" = "trytond" ]; then
package="server"
elif [ "${package}" = "tryton" ]; then
package="client-desktop"
elif [ "${package}" = "proteus" ]; then
package="client-library"
elif [ "${package}" = "trytond-gis" ]; then
package="backend-gis"
else
package="modules-${package}"
fi
(cd "${path}" && python -m sphinx -T -E -b html doc "${OUTPUTDIR}/${package}")
done
+9
View File
@@ -0,0 +1,9 @@
#!/bin/sh
set -eu
PACKAGES=`realpath "${1}"`
mkdir -p "${PACKAGES}"
find . -name setup.py | while read path; do
(cd "`dirname ${path}`" && python setup.py sdist && cp dist/* "${PACKAGES}")
done
+174
View File
@@ -0,0 +1,174 @@
stages:
- preparation
- check
- test
- build
- manual
packages:
stage: preparation
rules:
- when: always
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/tryton/ci
variables:
DOC_BASE_URL: ${CI_PROJECT_DIR}/docs
script:
- .gitlab-scripts/generate-packages.sh packages
artifacts:
paths:
- packages/
expire_in: 1 week
documentation:
stage: preparation
rules:
- when: always
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/sphinxdoc/sphinx
script:
- .gitlab-scripts/generate-doc.sh docs
artifacts:
paths:
- docs/
expire_in: 1 week
.check:
stage: check
rules:
- if: $CI_MERGE_REQUEST_ID != null
when: always
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/tryton/ci
.check-doc:
extends: .check
needs:
- documentation
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/sphinxdoc/sphinx
variables:
DOC_BASE_URL: ${CI_PROJECT_DIR}/docs
DOC_DIR: doc
script:
- cd "${PACKAGE}"
- python -m sphinx -T -E -W -n -b html ${DOC_DIR} _build/html
- python -m sphinx -T -E -W -n -b linkcheck ${DOC_DIR} _build
rules:
- changes:
- ${PACKAGE}/${DOC_DIR}/**/*
- ${PACKAGE}/tryton.cfg
- ${PACKAGE}/CHANGELOG
check-doc-readthedocs:
extends: .check-doc
variables:
PACKAGE: readthedocs
DOC_DIR: .
rules:
- changes:
- ${PACKAGE}/**/*
check-flake8:
extends: .check
script:
- hg diff --rev s0 | flake8 --diff
check-isort:
extends: .check
script:
- isort -m VERTICAL_GRID -p trytond -c `hg status --no-status --added --modified --rev s0`
check-dist:
stage: check
needs:
- packages
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/tryton/ci
script:
- twine check packages/*
.test:
stage: test
rules:
- when: always
.test-tox:
extends: .test
needs:
- packages
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/python:${PYTHON_VERSION}
variables:
CFLAGS: -O0
PIP_FIND_LINKS: file://${CI_PROJECT_DIR}/packages/
before_script:
- pip install tox
script:
- tox -e "py${PYTHON_VERSION/./}" -c "${PACKAGE}"
parallel:
matrix:
- PYTHON_VERSION: ["3.7", "3.8", "3.9", "3.10"]
.test-db:
extends: .test-tox
variables:
DB_CACHE: /tmp/cache
script:
- tox -e "py${PYTHON_VERSION/./}-${DATABASE}" -c "${PACKAGE}"
.test-sqlite:
extends: .test-db
variables:
DATABASE: sqlite
.test-postgresql:
extends: .test-db
variables:
DATABASE: postgresql
POSTGRESQL_URI: postgresql://postgres@postgresql:5432/
POSTGRES_HOST_AUTH_METHOD: trust
services:
- name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/postgres
alias: postgresql
command: ["-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
.test-postgis:
extends: .test-db
variables:
DATABASE: postgis
POSTGIS_URI: postgis://postgres@postgis:5432/
POSTGRES_HOST_AUTH_METHOD: trust
script:
- tox -e "py${PYTHON_VERSION/./}" -c "${PACKAGE}"
services:
- name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/postgis/postgis
alias: postgis
command: ["-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
.test-npm:
extends: .test
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/node
before_script:
- sh .gitlab-scripts/bower_allow_root.sh
script:
- cd "${PACKAGE}"
- npm -s install --unsafe-perm --legacy-peer-deps
- npm test
.trigger-doc-build:
stage: build
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/tryton/ci
script:
- .gitlab-scripts/trigger-readthedocs.py -c "${RTD_CONFIG}" -p "${PACKAGE}" -b "${CI_COMMIT_BRANCH#branch/}"
rules:
- if: $CI_COMMIT_BRANCH =~ /^branch\/.*/
changes:
- ${PACKAGE}/doc/**/*
- ${PACKAGE}/tryton.cfg
- ${PACKAGE}/CHANGELOG
allow_failure: true
trigger-doc-build-readthedocs:
extends: .trigger-doc-build
variables:
PACKAGE: readthedocs
rules:
- if: $CI_COMMIT_BRANCH =~ /^branch\/.*/
changes:
- ${PACKAGE}/**/*
allow_failure: true
+45
View File
@@ -0,0 +1,45 @@
#!/usr/bin/env python
#
# Requires $RTD_CONFIG to point to a file providing the webhook data for each
# package. The file is in Python cfg file format.
# Each section defines on package. Example::
#
# [modules/party]
# url: https://readthedocs.org/api/v2/webhook/modules-party/12345/
# token: 93afe1ce2d1107597f69774009964990c0643dad
import configparser
import sys
from argparse import ArgumentParser
from urllib import request
from urllib.parse import urlencode
parser = ArgumentParser()
parser.add_argument('--config', '-c', required=True)
parser.add_argument('--package', '-p', required=True)
parser.add_argument('--branches', '-b', nargs='*')
args = parser.parse_args()
cfg = configparser.ConfigParser()
cfg.read(args.config)
url = cfg.get(args.package, 'url')
token = cfg.get(args.package, 'token')
if not url:
sys.exit(f"Missing url for {args.package!r}")
elif not token:
sys.exit(f"Missing token for {args.package!r}")
data = [
('token', token),
*(('branches', branch) for branch in args.branches),
]
req = request.Request(
url,
data=urlencode(data).encode(),
headers={
'User-Agent': 'python-urllib/%s' % request.__version__,
})
with request.urlopen(req) as resp:
print(resp.read())