diff --git a/docs/development.rst b/docs/development.rst index 280349a6b..50a1656a5 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -220,8 +220,8 @@ for easier use by packagers downstream. When a command is added, a command line flag changed, added or removed, the usage docs need to be rebuilt as well:: - python setup.py build_usage - python setup.py build_man + python scripts/gendocs.py build_usage + python scripts/gendocs.py build_man However, we prefer to do this as part of our :ref:`releasing` preparations, so it is generally not necessary to update these when @@ -311,7 +311,11 @@ Checklist: - Check version number of upcoming release in ``CHANGES.rst``. - Render ``CHANGES.rst`` via ``make html`` and check for markup errors. - Verify that ``MANIFEST.in``, ``pyproject.toml`` and ``setup.py`` are complete. -- ``python setup.py build_usage ; python setup.py build_man`` and commit. +- Run these commands and commit:: + + python scripts/gendocs.py build_usage + python scripts/gendocs.py build_man + - Tag the release:: git tag -s -m "tagged/signed release X.Y.Z" X.Y.Z diff --git a/docs/installation.rst b/docs/installation.rst index fd5cb6809..3546f2739 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -180,7 +180,7 @@ following dependencies first: - Either pyfuse3_ (preferably, newer and maintained) or llfuse_ (older, unmaintained now). See also the BORG_FUSE_IMPL env variable. - - See setup.py about the version requirements. + - See pyproject.toml about the version requirements. If you have troubles finding the right package names, have a look at the distribution specific sections below or the Vagrantfile in the git repository, diff --git a/docs/usage/mount.rst b/docs/usage/mount.rst index dcc57f494..c4bce0b47 100644 --- a/docs/usage/mount.rst +++ b/docs/usage/mount.rst @@ -59,6 +59,5 @@ borgfs .. Note:: ``borgfs`` will be automatically provided if you used a distribution - package, ``pip`` or ``setup.py`` to install Borg. Users of the - standalone binary will have to manually create a symlink (see - :ref:`pyinstaller-binary`). + package or ``pip`` to install Borg. Users of the standalone binary will have + to manually create a symlink (see :ref:`pyinstaller-binary`). diff --git a/pyproject.toml b/pyproject.toml index 1fc3441e5..cdfd0b6dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -127,7 +127,7 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" # ruff failures that appear with your change. [tool.ruff.per-file-ignores] "setup.py" = ["E501"] -"setup_docs.py" = ["E501"] +"scripts/gendocs.py" = ["E501"] "src/borg/archive.py" = ["E501", "F401"] "src/borg/archiver.py" = ["E501", "F401", "E722", "E741"] "src/borg/cache.py" = ["E501", "E722"] diff --git a/setup_docs.py b/scripts/gendocs.py similarity index 94% rename from setup_docs.py rename to scripts/gendocs.py index 5a07c95f4..d8ee3b4b7 100644 --- a/setup_docs.py +++ b/scripts/gendocs.py @@ -9,22 +9,6 @@ from collections import OrderedDict from datetime import datetime, timezone import time -from setuptools import Command - - -def long_desc_from_readme(): - with open('README.rst') as fd: - long_description = fd.read() - # remove header, but have one \n before first headline - start = long_description.find('What is BorgBackup?') - assert start >= 0 - long_description = '\n' + long_description[start:] - # remove badges - long_description = re.compile(r'^\.\. start-badges.*^\.\. end-badges', re.M | re.S).sub('', long_description) - # remove unknown directives - long_description = re.compile(r'^\.\. highlight:: \w+$', re.M).sub('', long_description) - return long_description - def format_metavar(option): if option.nargs in ('*', '...'): @@ -37,18 +21,8 @@ def format_metavar(option): raise ValueError(f'Can\'t format metavar {option.metavar}, unknown nargs {option.nargs}!') -class build_usage(Command): - description = "generate usage for each command" - - user_options = [ - ('output=', 'O', 'output directory'), - ] - - def initialize_options(self): - pass - - def finalize_options(self): - pass +class BuildUsage: + """generate usage docs for each command""" def run(self): print('generating usage docs') @@ -64,6 +38,7 @@ class build_usage(Command): #borgfs_parser = Archiver(prog='borgfs').build_parser() self.generate_level("", parser, Archiver) + return 0 def generate_level(self, prefix, parser, Archiver, extra_choices=None): is_subcommand = False @@ -133,10 +108,6 @@ class build_usage(Command): # HTML output: # A table using some column-spans - def html_write(s): - for line in s.splitlines(): - fp.write(' ' + line + '\n') - rows = [] for group in parser._action_groups: if group.title == 'Common options': @@ -271,10 +242,8 @@ class build_usage(Command): fp.write(indent + option.ljust(padding) + desc + '\n') -class build_man(Command): - description = 'build man pages' - - user_options = [] +class BuildMan: + """build man pages""" see_also = { 'create': ('delete', 'prune', 'check', 'patterns', 'placeholders', 'compression'), @@ -315,12 +284,6 @@ class build_man(Command): 'umount': 'mount', } - def initialize_options(self): - pass - - def finalize_options(self): - pass - def run(self): print('building man pages (in docs/man)', file=sys.stderr) import borg @@ -334,6 +297,7 @@ class build_man(Command): self.generate_level('', parser, Archiver, {'borgfs': borgfs_parser}) self.build_topic_pages(Archiver) self.build_intro_page() + return 0 def generate_level(self, prefix, parser, Archiver, extra_choices=None): is_subcommand = False @@ -552,3 +516,29 @@ class build_man(Command): for option, desc in opts.items(): write(option.ljust(padding), desc) + + +def usage(): + print(textwrap.dedent(""" + Usage: + python scripts/gendocs.py build_usage # build usage documentation + python scripts/gendocs.py build_man # build man pages + """)) + + +def main(argv): + if len(argv) < 2 or len(argv) == 2 and argv[1] in ("-h", "--help"): + usage() + return 0 + command = argv[1] + if command == "build_usage": + return BuildUsage().run() + if command == "build_man": + return BuildMan().run() + usage() + return 1 + + +if __name__ == '__main__': + rc = main(sys.argv) + sys.exit(rc) diff --git a/setup.py b/setup.py index 0d16f943c..697f0fea9 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ # borgbackup - main setup code (see also pyproject.toml and other setup_*.py files) import os +import re import sys from collections import defaultdict from glob import glob @@ -23,7 +24,6 @@ sys.path += [os.path.dirname(__file__)] import setup_checksums import setup_compress import setup_crypto -import setup_docs is_win32 = sys.platform.startswith('win32') @@ -141,8 +141,6 @@ class Clean(Command): cmdclass = { 'build_ext': build_ext, - 'build_usage': setup_docs.build_usage, - 'build_man': setup_docs.build_man, 'sdist': Sdist, 'clean2': Clean, } @@ -233,4 +231,19 @@ if not on_rtd: # generate C code from Cython for THIS platform (and for all platform-independent Cython parts). ext_modules = cythonize(ext_modules, **cython_opts) -setup(cmdclass=cmdclass, ext_modules=ext_modules, long_description=setup_docs.long_desc_from_readme()) + +def long_desc_from_readme(): + with open('README.rst') as fd: + long_description = fd.read() + # remove header, but have one \n before first headline + start = long_description.find('What is BorgBackup?') + assert start >= 0 + long_description = '\n' + long_description[start:] + # remove badges + long_description = re.compile(r'^\.\. start-badges.*^\.\. end-badges', re.M | re.S).sub('', long_description) + # remove unknown directives + long_description = re.compile(r'^\.\. highlight:: \w+$', re.M).sub('', long_description) + return long_description + + +setup(cmdclass=cmdclass, ext_modules=ext_modules, long_description=long_desc_from_readme()) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 6096a651f..e670df0fd 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -5198,7 +5198,7 @@ class Archiver: self.prerun_checks(logger, is_serve) if not is_supported_msgpack(): logger.error("You do not have a supported version of the msgpack python package installed. Terminating.") - logger.error("This should never happen as specific, supported versions are required by our setup.py.") + logger.error("This should never happen as specific, supported versions are required by our pyproject.toml.") logger.error("Do not contact borgbackup support about this.") raise Error("unsupported msgpack version") if is_slow_msgpack(): diff --git a/src/borg/helpers/msgpack.py b/src/borg/helpers/msgpack.py index ee3f47685..84d738168 100644 --- a/src/borg/helpers/msgpack.py +++ b/src/borg/helpers/msgpack.py @@ -135,7 +135,7 @@ def is_slow_msgpack(): def is_supported_msgpack(): - # DO NOT CHANGE OR REMOVE! See also requirements and comments in setup.py. + # DO NOT CHANGE OR REMOVE! See also requirements and comments in pyproject.toml. import msgpack return (1, 0, 3) <= msgpack.version <= (1, 0, 7) and \ msgpack.version not in [] # < add bad releases here to deny list