[build, devscripts] Add devscript to set a build variant

Closes #4471
This commit is contained in:
pukkandan 2022-07-29 20:33:01 +05:30
parent 115add4387
commit 70b2340909
No known key found for this signature in database
GPG Key ID: 7EEE9E1E817D0A39
9 changed files with 70 additions and 12 deletions

View File

@ -89,6 +89,7 @@ jobs:
if: "env.TWINE_PASSWORD != ''" if: "env.TWINE_PASSWORD != ''"
run: | run: |
rm -rf dist/* rm -rf dist/*
python devscripts/set-variant.py pip -M "You installed yt-dlp with pip or using the wheel from PyPi; Use that to update"
python setup.py sdist bdist_wheel python setup.py sdist bdist_wheel
twine upload dist/* twine upload dist/*

View File

@ -343,7 +343,8 @@ ### Standalone Py2Exe Builds (Windows)
### Related scripts ### Related scripts
* **`devscripts/update-version.py`** - Update the version number based on current timestamp * **`devscripts/update-version.py [revision]`** - Update the version number based on current date
* **`devscripts/set-variant.py variant [-M update_message]`** - Set the build variant of the executable
* **`devscripts/make_lazy_extractors.py`** - Create lazy extractors. Running this before building the binaries (any variant) will improve their startup performance. Set the environment variable `YTDLP_NO_LAZY_EXTRACTORS=1` if you wish to forcefully disable lazy extractor loading. * **`devscripts/make_lazy_extractors.py`** - Create lazy extractors. Running this before building the binaries (any variant) will improve their startup performance. Set the environment variable `YTDLP_NO_LAZY_EXTRACTORS=1` if you wish to forcefully disable lazy extractor loading.
You can also fork the project on github and run your fork's [build workflow](.github/workflows/build.yml) to automatically build a full release You can also fork the project on github and run your fork's [build workflow](.github/workflows/build.yml) to automatically build a full release
@ -360,8 +361,8 @@ # USAGE AND OPTIONS
## General Options: ## General Options:
-h, --help Print this help text and exit -h, --help Print this help text and exit
--version Print program version and exit --version Print program version and exit
-U, --update Update this program to latest version -U, --update Update this program to the latest version
--no-update Do not update (default) --no-update Do not check for updates (default)
-i, --ignore-errors Ignore download and postprocessing errors. -i, --ignore-errors Ignore download and postprocessing errors.
The download will be considered successful The download will be considered successful
even if the postprocessing fails even if the postprocessing fails

View File

@ -45,6 +45,10 @@ def apply_patch(text, patch):
delim = f'\n{" " * switch_col_width}' delim = f'\n{" " * switch_col_width}'
PATCHES = ( PATCHES = (
( # Standardize update message
r'(?m)^( -U, --update\s+).+(\n \s.+)*$',
r'\1Update this program to the latest version',
),
( # Headings ( # Headings
r'(?m)^ (\w.+\n)( (?=\w))?', r'(?m)^ (\w.+\n)( (?=\w))?',
r'## \1' r'## \1'

36
devscripts/set-variant.py Normal file
View File

@ -0,0 +1,36 @@
#!/usr/bin/env python3
# Allow direct execution
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import argparse
import functools
import re
from devscripts.utils import compose_functions, read_file, write_file
VERSION_FILE = 'yt_dlp/version.py'
def parse_options():
parser = argparse.ArgumentParser(description='Set the build variant of the package')
parser.add_argument('variant', help='Name of the variant')
parser.add_argument('-M', '--update-message', default=None, help='Message to show in -U')
return parser.parse_args()
def property_setter(name, value):
return functools.partial(re.sub, rf'(?m)^{name}\s*=\s*.+$', f'{name} = {value!r}')
opts = parse_options()
transform = compose_functions(
property_setter('VARIANT', opts.variant),
property_setter('UPDATE_HINT', opts.update_message)
)
write_file(VERSION_FILE, transform(read_file(VERSION_FILE)))

View File

@ -43,6 +43,10 @@ def get_git_head():
__version__ = {VERSION!r} __version__ = {VERSION!r}
RELEASE_GIT_HEAD = {GIT_HEAD!r} RELEASE_GIT_HEAD = {GIT_HEAD!r}
VARIANT = None
UPDATE_HINT = None
''' '''
write_file('yt_dlp/version.py', VERSION_FILE) write_file('yt_dlp/version.py', VERSION_FILE)

View File

@ -144,7 +144,7 @@
write_json_file, write_json_file,
write_string, write_string,
) )
from .version import RELEASE_GIT_HEAD, __version__ from .version import RELEASE_GIT_HEAD, VARIANT, __version__
if compat_os_name == 'nt': if compat_os_name == 'nt':
import ctypes import ctypes
@ -3676,6 +3676,8 @@ def get_encoding(stream):
write_debug = lambda msg: self._write_string(f'[debug] {msg}\n') write_debug = lambda msg: self._write_string(f'[debug] {msg}\n')
source = detect_variant() source = detect_variant()
if VARIANT not in (None, 'pip'):
source += '*'
write_debug(join_nonempty( write_debug(join_nonempty(
'yt-dlp version', __version__, 'yt-dlp version', __version__,
f'[{RELEASE_GIT_HEAD}]' if RELEASE_GIT_HEAD else '', f'[{RELEASE_GIT_HEAD}]' if RELEASE_GIT_HEAD else '',

View File

@ -20,12 +20,13 @@
SponsorBlockPP, SponsorBlockPP,
) )
from .postprocessor.modify_chapters import DEFAULT_SPONSORBLOCK_CHAPTER_TITLE from .postprocessor.modify_chapters import DEFAULT_SPONSORBLOCK_CHAPTER_TITLE
from .update import detect_variant from .update import detect_variant, is_non_updateable
from .utils import ( from .utils import (
OUTTMPL_TYPES, OUTTMPL_TYPES,
POSTPROCESS_WHEN, POSTPROCESS_WHEN,
Config, Config,
expand_path, expand_path,
format_field,
get_executable_path, get_executable_path,
join_nonempty, join_nonempty,
remove_end, remove_end,
@ -333,11 +334,13 @@ def _alias_callback(option, opt_str, value, parser, opts, nargs):
general.add_option( general.add_option(
'-U', '--update', '-U', '--update',
action='store_true', dest='update_self', action='store_true', dest='update_self',
help='Update this program to latest version') help=format_field(
is_non_updateable(), None, 'Check if updates are available. %s',
default='Update this program to the latest version'))
general.add_option( general.add_option(
'--no-update', '--no-update',
action='store_false', dest='update_self', action='store_false', dest='update_self',
help='Do not update (default)') help='Do not check for updates (default)')
general.add_option( general.add_option(
'-i', '--ignore-errors', '-i', '--ignore-errors',
action='store_true', dest='ignoreerrors', action='store_true', dest='ignoreerrors',

View File

@ -18,7 +18,7 @@
traverse_obj, traverse_obj,
version_tuple, version_tuple,
) )
from .version import __version__ from .version import UPDATE_HINT, VARIANT, __version__
REPOSITORY = 'yt-dlp/yt-dlp' REPOSITORY = 'yt-dlp/yt-dlp'
API_URL = f'https://api.github.com/repos/{REPOSITORY}/releases' API_URL = f'https://api.github.com/repos/{REPOSITORY}/releases'
@ -47,7 +47,7 @@ def _get_variant_and_executable_path():
def detect_variant(): def detect_variant():
return _get_variant_and_executable_path()[0] return VARIANT or _get_variant_and_executable_path()[0]
_FILE_SUFFIXES = { _FILE_SUFFIXES = {
@ -64,13 +64,16 @@ def detect_variant():
**{variant: f'Auto-update is not supported for unpackaged {name} executable; Re-download the latest release' **{variant: f'Auto-update is not supported for unpackaged {name} executable; Re-download the latest release'
for variant, name in {'win32_dir': 'Windows', 'darwin_dir': 'MacOS', 'linux_dir': 'Linux'}.items()}, for variant, name in {'win32_dir': 'Windows', 'darwin_dir': 'MacOS', 'linux_dir': 'Linux'}.items()},
'source': 'You cannot update when running from source code; Use git to pull the latest changes', 'source': 'You cannot update when running from source code; Use git to pull the latest changes',
'unknown': 'It looks like you installed yt-dlp with a package manager, pip or setup.py; Use that to update', 'unknown': 'You installed yt-dlp with a package manager or setup.py; Use that to update',
'other': 'It looks like you are using an unofficial build of yt-dlp; Build the executable again', 'other': 'You are using an unofficial build of yt-dlp; Build the executable again',
} }
def is_non_updateable(): def is_non_updateable():
return _NON_UPDATEABLE_REASONS.get(detect_variant(), _NON_UPDATEABLE_REASONS['other']) if UPDATE_HINT:
return UPDATE_HINT
return _NON_UPDATEABLE_REASONS.get(
detect_variant(), _NON_UPDATEABLE_REASONS['unknown' if VARIANT else 'other'])
def _sha256_file(path): def _sha256_file(path):

View File

@ -3,3 +3,7 @@
__version__ = '2022.07.18' __version__ = '2022.07.18'
RELEASE_GIT_HEAD = '135f05ef6' RELEASE_GIT_HEAD = '135f05ef6'
VARIANT = None
UPDATE_HINT = None