mirror of https://github.com/yt-dlp/yt-dlp
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
5.3 KiB
Python
158 lines
5.3 KiB
Python
# Allow direct execution
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
import datetime as dt
|
|
import json
|
|
|
|
from devscripts.utils import calculate_version
|
|
|
|
|
|
STABLE_REPOSITORY = 'yt-dlp/yt-dlp'
|
|
|
|
|
|
def setup_variables(environment):
|
|
"""
|
|
`environment` must contain these keys:
|
|
REPOSITORY, INPUTS, PROCESSED,
|
|
PUSH_VERSION_COMMIT, PYPI_PROJECT,
|
|
SOURCE_PYPI_PROJECT, SOURCE_PYPI_SUFFIX,
|
|
TARGET_PYPI_PROJECT, TARGET_PYPI_SUFFIX,
|
|
SOURCE_ARCHIVE_REPO, TARGET_ARCHIVE_REPO,
|
|
HAS_SOURCE_ARCHIVE_REPO_TOKEN,
|
|
HAS_TARGET_ARCHIVE_REPO_TOKEN,
|
|
HAS_ARCHIVE_REPO_TOKEN
|
|
|
|
`INPUTS` must contain these keys:
|
|
prerelease
|
|
|
|
`PROCESSED` must contain these keys:
|
|
source_repo, source_tag,
|
|
target_repo, target_tag
|
|
"""
|
|
REPOSITORY = environment['REPOSITORY']
|
|
INPUTS = json.loads(environment['INPUTS'])
|
|
PROCESSED = json.loads(environment['PROCESSED'])
|
|
|
|
source_channel = None
|
|
does_not_have_needed_token = False
|
|
target_repo_token = None
|
|
pypi_project = None
|
|
pypi_suffix = None
|
|
|
|
source_repo = PROCESSED['source_repo']
|
|
source_tag = PROCESSED['source_tag']
|
|
if source_repo == 'stable':
|
|
source_repo = STABLE_REPOSITORY
|
|
if not source_repo:
|
|
source_repo = REPOSITORY
|
|
elif environment['SOURCE_ARCHIVE_REPO']:
|
|
source_channel = environment['SOURCE_ARCHIVE_REPO']
|
|
elif not source_tag and '/' not in source_repo:
|
|
source_tag = source_repo
|
|
source_repo = REPOSITORY
|
|
|
|
resolved_source = source_repo
|
|
if source_tag:
|
|
resolved_source = f'{resolved_source}@{source_tag}'
|
|
elif source_repo == STABLE_REPOSITORY:
|
|
resolved_source = 'stable'
|
|
|
|
revision = None
|
|
if INPUTS['prerelease'] or not environment['PUSH_VERSION_COMMIT']:
|
|
revision = dt.datetime.now(tz=dt.timezone.utc).strftime('%H%M%S')
|
|
|
|
version = calculate_version(INPUTS.get('version') or revision)
|
|
|
|
target_repo = PROCESSED['target_repo']
|
|
target_tag = PROCESSED['target_tag']
|
|
if target_repo:
|
|
if target_repo == 'stable':
|
|
target_repo = STABLE_REPOSITORY
|
|
if not target_tag:
|
|
if target_repo == STABLE_REPOSITORY:
|
|
target_tag = version
|
|
elif environment['TARGET_ARCHIVE_REPO']:
|
|
target_tag = source_tag or version
|
|
else:
|
|
target_tag = target_repo
|
|
target_repo = REPOSITORY
|
|
if target_repo != REPOSITORY:
|
|
target_repo = environment['TARGET_ARCHIVE_REPO']
|
|
target_repo_token = f'{PROCESSED["target_repo"].upper()}_ARCHIVE_REPO_TOKEN'
|
|
if not json.loads(environment['HAS_TARGET_ARCHIVE_REPO_TOKEN']):
|
|
does_not_have_needed_token = True
|
|
pypi_project = environment['TARGET_PYPI_PROJECT'] or None
|
|
pypi_suffix = environment['TARGET_PYPI_SUFFIX'] or None
|
|
else:
|
|
target_tag = source_tag or version
|
|
if source_channel:
|
|
target_repo = source_channel
|
|
target_repo_token = f'{PROCESSED["source_repo"].upper()}_ARCHIVE_REPO_TOKEN'
|
|
if not json.loads(environment['HAS_SOURCE_ARCHIVE_REPO_TOKEN']):
|
|
does_not_have_needed_token = True
|
|
pypi_project = environment['SOURCE_PYPI_PROJECT'] or None
|
|
pypi_suffix = environment['SOURCE_PYPI_SUFFIX'] or None
|
|
else:
|
|
target_repo = REPOSITORY
|
|
|
|
if does_not_have_needed_token:
|
|
if not json.loads(environment['HAS_ARCHIVE_REPO_TOKEN']):
|
|
print(f'::error::Repository access secret {target_repo_token} not found')
|
|
return None
|
|
target_repo_token = 'ARCHIVE_REPO_TOKEN'
|
|
|
|
if target_repo == REPOSITORY and not INPUTS['prerelease']:
|
|
pypi_project = environment['PYPI_PROJECT'] or None
|
|
|
|
return {
|
|
'channel': resolved_source,
|
|
'version': version,
|
|
'target_repo': target_repo,
|
|
'target_repo_token': target_repo_token,
|
|
'target_tag': target_tag,
|
|
'pypi_project': pypi_project,
|
|
'pypi_suffix': pypi_suffix,
|
|
}
|
|
|
|
|
|
def process_inputs(inputs):
|
|
outputs = {}
|
|
for key in ('source', 'target'):
|
|
repo, _, tag = inputs.get(key, '').partition('@')
|
|
outputs[f'{key}_repo'] = repo
|
|
outputs[f'{key}_tag'] = tag
|
|
return outputs
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if not os.getenv('GITHUB_OUTPUT'):
|
|
print('This script is only intended for use with GitHub Actions', file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
if 'process_inputs' in sys.argv:
|
|
inputs = json.loads(os.environ['INPUTS'])
|
|
print('::group::Inputs')
|
|
print(json.dumps(inputs, indent=2))
|
|
print('::endgroup::')
|
|
outputs = process_inputs(inputs)
|
|
print('::group::Processed')
|
|
print(json.dumps(outputs, indent=2))
|
|
print('::endgroup::')
|
|
with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
|
|
f.write('\n'.join(f'{key}={value}' for key, value in outputs.items()))
|
|
sys.exit(0)
|
|
|
|
outputs = setup_variables(dict(os.environ))
|
|
if not outputs:
|
|
sys.exit(1)
|
|
|
|
print('::group::Output variables')
|
|
print(json.dumps(outputs, indent=2))
|
|
print('::endgroup::')
|
|
|
|
with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
|
|
f.write('\n'.join(f'{key}={value or ""}' for key, value in outputs.items()))
|