From 70b2340909d8d917f71d20181614fd7392d3f7f0 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Fri, 29 Jul 2022 20:33:01 +0530 Subject: [PATCH] [build, devscripts] Add devscript to set a build variant Closes #4471 --- .github/workflows/build.yml | 1 + README.md | 7 ++++--- devscripts/make_readme.py | 4 ++++ devscripts/set-variant.py | 36 ++++++++++++++++++++++++++++++++++++ devscripts/update-version.py | 4 ++++ yt_dlp/YoutubeDL.py | 4 +++- yt_dlp/options.py | 9 ++++++--- yt_dlp/update.py | 13 ++++++++----- yt_dlp/version.py | 4 ++++ 9 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 devscripts/set-variant.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f3cc9930d5..bd343d95d3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -89,6 +89,7 @@ jobs: if: "env.TWINE_PASSWORD != ''" run: | 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 twine upload dist/* diff --git a/README.md b/README.md index 0a6dd53d73..e38c6981a9 100644 --- a/README.md +++ b/README.md @@ -343,7 +343,8 @@ If you wish to build it anyway, install Python and py2exe, and then simply run ` ### 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. 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 @@ You can also fork the project on github and run your fork's [build workflow](.gi ## General Options: -h, --help Print this help text and exit --version Print program version and exit - -U, --update Update this program to latest version - --no-update Do not update (default) + -U, --update Update this program to the latest version + --no-update Do not check for updates (default) -i, --ignore-errors Ignore download and postprocessing errors. The download will be considered successful even if the postprocessing fails diff --git a/devscripts/make_readme.py b/devscripts/make_readme.py index 767ea5409f..fad993a199 100755 --- a/devscripts/make_readme.py +++ b/devscripts/make_readme.py @@ -45,6 +45,10 @@ switch_col_width = len(re.search(r'(?m)^\s{5,}', options).group()) delim = f'\n{" " * switch_col_width}' PATCHES = ( + ( # Standardize update message + r'(?m)^( -U, --update\s+).+(\n \s.+)*$', + r'\1Update this program to the latest version', + ), ( # Headings r'(?m)^ (\w.+\n)( (?=\w))?', r'## \1' diff --git a/devscripts/set-variant.py b/devscripts/set-variant.py new file mode 100644 index 0000000000..10341e7444 --- /dev/null +++ b/devscripts/set-variant.py @@ -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))) diff --git a/devscripts/update-version.py b/devscripts/update-version.py index c55dd371c5..caebf42414 100644 --- a/devscripts/update-version.py +++ b/devscripts/update-version.py @@ -43,6 +43,10 @@ VERSION_FILE = f'''\ __version__ = {VERSION!r} RELEASE_GIT_HEAD = {GIT_HEAD!r} + +VARIANT = None + +UPDATE_HINT = None ''' write_file('yt_dlp/version.py', VERSION_FILE) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index ded34b8edc..228aa7bf5e 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -144,7 +144,7 @@ from .utils import ( write_json_file, write_string, ) -from .version import RELEASE_GIT_HEAD, __version__ +from .version import RELEASE_GIT_HEAD, VARIANT, __version__ if compat_os_name == 'nt': import ctypes @@ -3676,6 +3676,8 @@ class YoutubeDL: write_debug = lambda msg: self._write_string(f'[debug] {msg}\n') source = detect_variant() + if VARIANT not in (None, 'pip'): + source += '*' write_debug(join_nonempty( 'yt-dlp version', __version__, f'[{RELEASE_GIT_HEAD}]' if RELEASE_GIT_HEAD else '', diff --git a/yt_dlp/options.py b/yt_dlp/options.py index b70f5798e3..2c7f686dde 100644 --- a/yt_dlp/options.py +++ b/yt_dlp/options.py @@ -20,12 +20,13 @@ from .postprocessor import ( SponsorBlockPP, ) 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 ( OUTTMPL_TYPES, POSTPROCESS_WHEN, Config, expand_path, + format_field, get_executable_path, join_nonempty, remove_end, @@ -333,11 +334,13 @@ def create_parser(): general.add_option( '-U', '--update', 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( '--no-update', action='store_false', dest='update_self', - help='Do not update (default)') + help='Do not check for updates (default)') general.add_option( '-i', '--ignore-errors', action='store_true', dest='ignoreerrors', diff --git a/yt_dlp/update.py b/yt_dlp/update.py index 92c07acc14..a04518c9b6 100644 --- a/yt_dlp/update.py +++ b/yt_dlp/update.py @@ -18,7 +18,7 @@ from .utils import ( traverse_obj, version_tuple, ) -from .version import __version__ +from .version import UPDATE_HINT, VARIANT, __version__ REPOSITORY = 'yt-dlp/yt-dlp' API_URL = f'https://api.github.com/repos/{REPOSITORY}/releases' @@ -47,7 +47,7 @@ def _get_variant_and_executable_path(): def detect_variant(): - return _get_variant_and_executable_path()[0] + return VARIANT or _get_variant_and_executable_path()[0] _FILE_SUFFIXES = { @@ -64,13 +64,16 @@ _NON_UPDATEABLE_REASONS = { **{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()}, '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', - 'other': 'It looks like you are using an unofficial build of yt-dlp; Build the executable again', + 'unknown': 'You installed yt-dlp with a package manager or setup.py; Use that to update', + 'other': 'You are using an unofficial build of yt-dlp; Build the executable again', } 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): diff --git a/yt_dlp/version.py b/yt_dlp/version.py index a1a5880e95..75ede4973c 100644 --- a/yt_dlp/version.py +++ b/yt_dlp/version.py @@ -3,3 +3,7 @@ __version__ = '2022.07.18' RELEASE_GIT_HEAD = '135f05ef6' + +VARIANT = None + +UPDATE_HINT = None