Skip to content

Commit

Permalink
Merge pull request #8065 from ThomasWaldmann/less-setuppy-1.4
Browse files Browse the repository at this point in the history
Use less setup.py (1.4-maint)
  • Loading branch information
ThomasWaldmann committed Jan 29, 2024
2 parents bb473e2 + e80d922 commit 206f90f
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 56 deletions.
10 changes: 7 additions & 3 deletions docs/development.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion docs/installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
5 changes: 2 additions & 3 deletions docs/usage/mount.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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`).
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
Expand Down
74 changes: 32 additions & 42 deletions setup_docs.py → scripts/gendocs.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,6 @@
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 ('*', '...'):
Expand All @@ -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')
Expand All @@ -64,6 +38,7 @@ def run(self):
#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
Expand Down Expand Up @@ -133,10 +108,6 @@ def is_positional_group(group):
# 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':
Expand Down Expand Up @@ -271,10 +242,8 @@ def is_positional_group(group):
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'),
Expand Down Expand Up @@ -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
Expand All @@ -334,6 +297,7 @@ def run(self):
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
Expand Down Expand Up @@ -552,3 +516,29 @@ def is_positional_group(group):

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)
21 changes: 17 additions & 4 deletions setup.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -23,7 +24,6 @@
import setup_checksums
import setup_compress
import setup_crypto
import setup_docs

is_win32 = sys.platform.startswith('win32')

Expand Down Expand Up @@ -141,8 +141,6 @@ def run(self):

cmdclass = {
'build_ext': build_ext,
'build_usage': setup_docs.build_usage,
'build_man': setup_docs.build_man,
'sdist': Sdist,
'clean2': Clean,
}
Expand Down Expand Up @@ -233,4 +231,19 @@ def members_appended(*ds):
# 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())
2 changes: 1 addition & 1 deletion src/borg/archiver.py
Original file line number Diff line number Diff line change
Expand Up @@ -5198,7 +5198,7 @@ def run(self, args):
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():
Expand Down
2 changes: 1 addition & 1 deletion src/borg/helpers/msgpack.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 206f90f

Please sign in to comment.