Changeset c09fee64 in trunk
- Timestamp:
- 2021-07-25T14:03:11Z (4 years ago)
- Branches:
- master
- Children:
- 0e58f0c
- Parents:
- 0f7e37d (diff), 6a91a10 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Files:
-
- 25 added
- 5 deleted
- 20 edited
- 3 moved
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified .github/workflows/ci.yml ¶
r0f7e37d rc09fee64 20 20 os: 21 21 - windows-latest 22 - macos-latest23 22 - ubuntu-latest 24 23 python-version: … … 28 27 - 3.8 29 28 - 3.9 29 include: 30 # On macOS don't bother with 3.6-3.8, just to get faster builds. 31 - os: macos-latest 32 python-version: 2.7 33 - os: macos-latest 34 python-version: 3.9 30 35 31 36 steps: … … 38 43 39 44 - name: Set up Python ${{ matrix.python-version }} 40 if: ${{ matrix.os != 'windows-latest' }}41 45 uses: actions/setup-python@v2 42 46 with: 43 47 python-version: ${{ matrix.python-version }} 44 45 # See note below about need for using 32-bit Python 2.7 on46 # Windows.47 - name: Set up Python ${{ matrix.python-version }} [Windows x64]48 if: ${{ ( matrix.os == 'windows-latest' ) && ( matrix.python-version != '2.7' ) }}49 uses: actions/setup-python@v250 with:51 python-version: ${{ matrix.python-version }}52 architecture: 'x64'53 54 # We use netifaces, which does not ship a 64-bit wheel for the55 # Python 2.7 + Windows combination, but it ships a 32-bit wheel.56 # Since MS has removed vcpython27 compiler downloads from their57 # usual download site, building a netifaces wheel locally is not58 # an option anymore. So let us just test with 32-bit Python on59 # Windows.60 - name: Set up Python ${{ matrix.python-version }} [Windows x86]61 if: ${{ ( matrix.os == 'windows-latest' ) && ( matrix.python-version == '2.7' ) }}62 uses: actions/setup-python@v163 with:64 python-version: ${{ matrix.python-version }}65 architecture: 'x86'66 48 67 49 # To use pip caching with GitHub Actions in an OS-independent … … 174 156 matrix: 175 157 os: 176 - macos-latest177 158 - windows-latest 159 - ubuntu-latest 178 160 python-version: 179 161 - 2.7 162 - 3.6 163 - 3.9 180 164 include: 181 - os: ubuntu-latest 182 python-version: 3.6 165 # On macOS don't bother with 3.6, just to get faster builds. 166 - os: macos-latest 167 python-version: 2.7 168 - os: macos-latest 169 python-version: 3.9 183 170 184 171 steps: … … 187 174 if: matrix.os == 'ubuntu-latest' 188 175 run: sudo apt install tor 189 190 - name: Install Tor [macOS] 191 if: matrix.os == 'macos-latest' 192 run: brew install tor 176 177 # TODO: See https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3744. 178 # We have to use an older version of Tor for running integration 179 # tests on macOS. 180 - name: Install Tor [macOS, ${{ matrix.python-version }} ] 181 if: ${{ matrix.os == 'macos-latest' }} 182 run: | 183 brew extract --version 0.4.5.8 tor homebrew/cask 184 brew install tor@0.4.5.8 185 brew link --overwrite tor@0.4.5.8 193 186 194 187 - name: Install Tor [Windows] … … 204 197 205 198 - name: Set up Python ${{ matrix.python-version }} 206 if: ${{ matrix.os != 'windows-latest' }}207 199 uses: actions/setup-python@v1 208 200 with: 209 201 python-version: ${{ matrix.python-version }} 210 211 # See this step under coverage job.212 - name: Set up Python ${{ matrix.python-version }} [Windows x86]213 if: ${{ matrix.os == 'windows-latest' }}214 uses: actions/setup-python@v1215 with:216 python-version: ${{ matrix.python-version }}217 architecture: 'x86'218 202 219 203 - name: Get pip cache directory … … 273 257 274 258 - name: Set up Python ${{ matrix.python-version }} 275 if: ${{ matrix.os != 'windows-latest' }}276 259 uses: actions/setup-python@v1 277 260 with: 278 261 python-version: ${{ matrix.python-version }} 279 280 # See this step under coverage job.281 - name: Set up Python ${{ matrix.python-version }} [Windows x86]282 if: ${{ matrix.os == 'windows-latest' }}283 uses: actions/setup-python@v1284 with:285 python-version: ${{ matrix.python-version }}286 architecture: 'x86'287 262 288 263 - name: Get pip cache directory -
TabularUnified docs/Installation/install-on-desert-island.rst ¶
r0f7e37d rc09fee64 1 *************************************** ***2 How To BuildTahoe-LAFS On A Desert Island3 *************************************** ***1 *************************************** 2 Building Tahoe-LAFS On A Desert Island 3 *************************************** 4 4 5 5 (or an airplane, or anywhere else without internet connectivity) -
TabularUnified docs/about-tahoe.rst ¶
r0f7e37d rc09fee64 128 128 =========== 129 129 130 To use Tahoe-LAFS, please see :doc:`I NSTALL`.130 To use Tahoe-LAFS, please see :doc:`Installing Tahoe-LAFS <../Installation/install-tahoe>`. 131 131 132 132 License -
TabularUnified docs/index.rst ¶
r0f7e37d rc09fee64 23 23 24 24 INSTALL 25 26 about-tahoe 27 Installation/install-tahoe 28 Installation/install-on-windows 29 Installation/install-on-linux 30 Installation/install-on-desert-island 31 25 32 running 26 33 configuration … … 51 58 logging 52 59 stats 60 debian 61 build/build-pyOpenSSL 53 62 54 63 .. toctree:: -
TabularUnified docs/release-checklist.rst ¶
r0f7e37d rc09fee64 71 71 72 72 - update "docs/known_issues.rst" if appropriate 73 - update "docs/I NSTALL.rst" references to the new release73 - update "docs/Installation/install-tahoe.rst" references to the new release 74 74 - Push the branch to github 75 75 - Create a (draft) PR; this should trigger CI (note that github -
TabularUnified docs/running.rst ¶
r0f7e37d rc09fee64 11 11 This is how to run a Tahoe-LAFS client or a complete Tahoe-LAFS grid. 12 12 First you have to install the Tahoe-LAFS software, as documented in 13 :doc:`I NSTALL`.13 :doc:`Installing Tahoe-LAFS <../Installation/install-tahoe>`. 14 14 15 15 The ``tahoe`` program in your virtualenv's ``bin`` directory is used to -
TabularUnified misc/coding_tools/check-debugging.py ¶
r0f7e37d rc09fee64 1 1 #! /usr/bin/python 2 2 3 # ./check-debugging.py src 3 """ 4 Checks for defer.setDebugging(). 5 6 Runs on Python 3. 7 8 Usage: ./check-debugging.py src 9 """ 4 10 5 11 from __future__ import print_function … … 8 14 9 15 ok = True 10 umids = {}11 16 12 17 for starting_point in sys.argv[1:]: -
TabularUnified misc/coding_tools/check-umids.py ¶
r0f7e37d rc09fee64 1 #! /usr/bin/python 1 #! /usr/bin/python3 2 3 """ 4 Ensure UMIDS are unique. 5 6 This runs on Python 3. 7 """ 2 8 3 9 # ./check-umids.py src -
TabularUnified misc/operations_helpers/cpu-watcher.tac ¶
r0f7e37d rc09fee64 202 202 log.err() 203 203 try: 204 pickle.dump(self.history, open("history.pickle.tmp", "wb")) 204 # Newer protocols won't work in Python 2; when it is dropped, 205 # protocol v4 can be used (added in Python 3.4). 206 pickle.dump(self.history, open("history.pickle.tmp", "wb"), protocol=2) 205 207 os.rename("history.pickle.tmp", "history.pickle") 206 208 except: -
TabularUnified setup.py ¶
r0f7e37d rc09fee64 55 55 # * foolscap >= 0.12.6 has an i2p.sam_endpoint() that takes kwargs 56 56 # * foolscap 0.13.2 drops i2p support completely 57 # * foolscap >= 2 0.4 is necessary for Python 357 # * foolscap >= 21.7 is necessary for Python 3 with i2p support. 58 58 "foolscap == 0.13.1 ; python_version < '3.0'", 59 "foolscap >= 2 0.4.0 ; python_version > '3.0'",59 "foolscap >= 21.7.0 ; python_version > '3.0'", 60 60 61 61 # * cryptography 2.6 introduced some ed25519 APIs we rely on. Note that … … 115 115 # Pyrsistent 0.17.0 (which we use by way of Eliot) has dropped 116 116 # Python 2 entirely; stick to the version known to work for us. 117 # XXX: drop this bound: https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3404118 "pyrsistent < 0.17.0",117 "pyrsistent < 0.17.0 ; python_version < '3.0'", 118 "pyrsistent ; python_version > '3.0'", 119 119 120 120 # A great way to define types of values. 121 # XXX: drop the upper bound: https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3390 122 "attrs >= 18.2.0, < 20", 121 "attrs >= 18.2.0", 123 122 124 123 # WebSocket library for twisted and asyncio -
TabularUnified src/allmydata/frontends/auth.py ¶
r0f7e37d rc09fee64 1 """ 2 Authentication for frontends. 3 """ 4 from __future__ import unicode_literals 5 from __future__ import absolute_import 6 from __future__ import division 7 from __future__ import print_function 8 9 from future.utils import PY2 10 if PY2: 11 from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401 12 1 13 from zope.interface import implementer 2 14 from twisted.internet import defer -
TabularUnified src/allmydata/scripts/common_http.py ¶
r0f7e37d rc09fee64 95 95 96 96 def format_http_success(resp): 97 return "%s %s" % (resp.status, quote_output(resp.reason, quotemarks=False)) 97 # ensure_text() shouldn't be necessary when Python 2 is dropped. 98 return quote_output( 99 "%s %s" % (resp.status, six.ensure_text(resp.reason)), 100 quotemarks=False) 98 101 99 102 def format_http_error(msg, resp): 100 return "%s: %s %s\n%s" % (msg, resp.status, quote_output(resp.reason, quotemarks=False), 101 quote_output(resp.read(), quotemarks=False)) 103 # ensure_text() shouldn't be necessary when Python 2 is dropped. 104 return quote_output( 105 "%s: %s %s\n%s" % (msg, resp.status, six.ensure_text(resp.reason), 106 six.ensure_text(resp.read())), 107 quotemarks=False) 102 108 103 109 def check_http_error(resp, stderr): -
TabularUnified src/allmydata/scripts/runner.py ¶
r0f7e37d rc09fee64 205 205 # can we put this _setup_coverage call after we hit 206 206 # argument-parsing? 207 if '--coverage' not in sys.argv: 207 # ensure_str() only necessary on Python 2. 208 if six.ensure_str('--coverage') not in sys.argv: 208 209 return 209 210 sys.argv.remove('--coverage') -
TabularUnified src/allmydata/storage/crawler.py ¶
r0f7e37d rc09fee64 253 253 tmpfile = self.statefile + ".tmp" 254 254 with open(tmpfile, "wb") as f: 255 pickle.dump(self.state, f) 255 # Newer protocols won't work in Python 2; when it is dropped, 256 # protocol v4 can be used (added in Python 3.4). 257 pickle.dump(self.state, f, protocol=2) 256 258 fileutil.move_into_place(tmpfile, self.statefile) 257 259 -
TabularUnified src/allmydata/storage/expirer.py ¶
r0f7e37d rc09fee64 96 96 history = {} # cyclenum -> dict 97 97 with open(self.historyfile, "wb") as f: 98 pickle.dump(history, f) 98 # Newer protocols won't work in Python 2; when it is dropped, 99 # protocol v4 can be used (added in Python 3.4). 100 pickle.dump(history, f, protocol=2) 99 101 100 102 def create_empty_cycle_dict(self): … … 320 322 del history[oldcycles[0]] 321 323 with open(self.historyfile, "wb") as f: 322 pickle.dump(history, f) 324 # Newer protocols won't work in Python 2; when it is dropped, 325 # protocol v4 can be used (added in Python 3.4). 326 pickle.dump(history, f, protocol=2) 323 327 324 328 def get_state(self): -
TabularUnified src/allmydata/test/cli/test_cp.py ¶
r0f7e37d rc09fee64 54 54 55 55 d.addCallback(lambda res: self.do_cli("get", "tahoe:" + artonwall_arg)) 56 d.addCallback(lambda rc_out_err: self.assertEqual(rc_out_err[1], DATA1)) 57 58 # Version where destination filename is explicitly Unicode too. 59 d.addCallback(lambda res: self.do_cli("cp", fn1, "tahoe:" + artonwall_arg + "-2")) 60 d.addCallback(lambda res: self.do_cli("get", "tahoe:" + artonwall_arg + "-2")) 56 61 d.addCallback(lambda rc_out_err: self.assertEqual(rc_out_err[1], DATA1)) 57 62 … … 75 80 if PY2: 76 81 out = out.decode(get_io_encoding()) 77 self.failUnlessReallyEqual(out, u"Metallica\n\u00C4rtonwall\n ")82 self.failUnlessReallyEqual(out, u"Metallica\n\u00C4rtonwall\n\u00C4rtonwall-2\n") 78 83 self.assertEqual(len(err), 0, err) 79 84 d.addCallback(_check) -
TabularUnified src/allmydata/test/test_auth.py ¶
r0f7e37d rc09fee64 40 40 41 41 DUMMY_ACCOUNTS = u"""\ 42 alice password URI:DIR2:aaaaaaaaaaaaaaaaaaaaaaaaaa:111111111111111111111111111111111111111111111111111142 alice herpassword URI:DIR2:aaaaaaaaaaaaaaaaaaaaaaaaaa:1111111111111111111111111111111111111111111111111111 43 43 bob sekrit URI:DIR2:bbbbbbbbbbbbbbbbbbbbbbbbbb:2222222222222222222222222222222222222222222222222222 44 45 # dennis password URI:DIR2:aaaaaaaaaaaaaaaaaaaaaaaaaa:1111111111111111111111111111111111111111111111111111 44 46 carol {key} URI:DIR2:cccccccccccccccccccccccccc:3333333333333333333333333333333333333333333333333333 45 47 """.format(key=str(DUMMY_KEY.public().toString("openssh"), "ascii")).encode("ascii") … … 55 57 self.checker = auth.AccountFileChecker(None, abspath) 56 58 57 def test_unknown_user (self):59 def test_unknown_user_ssh(self): 58 60 """ 59 61 AccountFileChecker.requestAvatarId returns a Deferred that fires with … … 65 67 avatarId = self.checker.requestAvatarId(key_credentials) 66 68 return self.assertFailure(avatarId, error.UnauthorizedLogin) 69 70 def test_unknown_user_password(self): 71 """ 72 AccountFileChecker.requestAvatarId returns a Deferred that fires with 73 UnauthorizedLogin if called with an SSHPrivateKey object with a 74 username not present in the account file. 75 76 We use a commented out user, so we're also checking that comments are 77 skipped. 78 """ 79 key_credentials = credentials.UsernamePassword(b"dennis", b"password") 80 d = self.checker.requestAvatarId(key_credentials) 81 return self.assertFailure(d, error.UnauthorizedLogin) 67 82 68 83 def test_password_auth_user_with_ssh_key(self): … … 82 97 the user if the correct password is given. 83 98 """ 84 key_credentials = credentials.UsernamePassword(b"alice", b"password") 99 key_credentials = credentials.UsernamePassword(b"alice", b"herpassword") 100 d = self.checker.requestAvatarId(key_credentials) 101 def authenticated(avatarId): 102 self.assertEqual( 103 (b"alice", 104 b"URI:DIR2:aaaaaaaaaaaaaaaaaaaaaaaaaa:1111111111111111111111111111111111111111111111111111"), 105 (avatarId.username, avatarId.rootcap)) 106 return d 107 108 def test_password_auth_user_with_correct_hashed_password(self): 109 """ 110 AccountFileChecker.requestAvatarId returns a Deferred that fires with 111 the user if the correct password is given in hashed form. 112 """ 113 key_credentials = credentials.UsernameHashedPassword(b"alice", b"herpassword") 85 114 d = self.checker.requestAvatarId(key_credentials) 86 115 def authenticated(avatarId): -
TabularUnified src/allmydata/util/_python3.py ¶
r0f7e37d rc09fee64 53 53 "allmydata.dirnode", 54 54 "allmydata.frontends", 55 "allmydata.frontends.auth", 55 56 "allmydata.frontends.sftpd", 56 57 "allmydata.hashtree", -
TabularUnified src/allmydata/util/jsonbytes.py ¶
r0f7e37d rc09fee64 29 29 30 30 31 def _bytes_to_unicode(any_bytes, obj):32 """C reate a function that recursively convertsbytes to unicode.31 def bytes_to_unicode(any_bytes, obj): 32 """Convert bytes to unicode. 33 33 34 34 :param any_bytes: If True, also support non-UTF-8-encoded bytes. … … 64 64 def encode(self, o, **kwargs): 65 65 return json.JSONEncoder.encode( 66 self, _bytes_to_unicode(False, o), **kwargs)66 self, bytes_to_unicode(False, o), **kwargs) 67 67 68 68 def iterencode(self, o, **kwargs): 69 69 return json.JSONEncoder.iterencode( 70 self, _bytes_to_unicode(False, o), **kwargs)70 self, bytes_to_unicode(False, o), **kwargs) 71 71 72 72 … … 80 80 def encode(self, o, **kwargs): 81 81 return json.JSONEncoder.encode( 82 self, _bytes_to_unicode(True, o), **kwargs)82 self, bytes_to_unicode(True, o), **kwargs) 83 83 84 84 def iterencode(self, o, **kwargs): 85 85 return json.JSONEncoder.iterencode( 86 self, _bytes_to_unicode(True, o), **kwargs)86 self, bytes_to_unicode(True, o), **kwargs) 87 87 88 88 -
TabularUnified src/allmydata/util/log.py ¶
r0f7e37d rc09fee64 19 19 from twisted.python import log as tw_log 20 20 21 if PY2: 22 def bytes_to_unicode(ign, obj): 23 return obj 24 else: 25 # We want to convert bytes keys to Unicode, otherwise JSON serialization 26 # inside foolscap will fail (for details see 27 # https://github.com/warner/foolscap/issues/88) 28 from .jsonbytes import bytes_to_unicode 29 30 21 31 NOISY = log.NOISY # 10 22 32 OPERATIONAL = log.OPERATIONAL # 20 … … 29 39 30 40 31 msg = log.msg 41 def msg(*args, **kwargs): 42 return log.msg(*args, **bytes_to_unicode(True, kwargs)) 32 43 33 44 # If log.err() happens during a unit test, the unit test should fail. We … … 40 51 if 'level' not in kwargs: 41 52 kwargs['level'] = log.UNUSUAL 42 return log.err(failure, _why, ** kwargs)53 return log.err(failure, _why, **bytes_to_unicode(True, kwargs)) 43 54 44 55 class LogMixin(object): … … 58 69 pmsgid = self._grandparentmsgid 59 70 kwargs = {ensure_str(k): v for (k, v) in kwargs.items()} 60 msgid = log.msg(msg, facility=facility, parent=pmsgid, *args, **kwargs) 71 msgid = log.msg(msg, facility=facility, parent=pmsgid, *args, 72 **bytes_to_unicode(True, kwargs)) 61 73 if self._parentmsgid is None: 62 74 self._parentmsgid = msgid -
TabularUnified src/allmydata/web/common.py ¶
r0f7e37d rc09fee64 91 91 from allmydata.util.encodingutil import ( 92 92 quote_output, 93 quote_output_u, 93 94 to_bytes, 94 95 ) … … 325 326 "to not replace it.", http.CONFLICT) 326 327 if isinstance(exc, NoSuchChildError): 327 quoted_name = quote_output (exc.args[0], encoding="utf-8", quotemarks=False)328 quoted_name = quote_output_u(exc.args[0], quotemarks=False) 328 329 return ("No such child: %s" % quoted_name, http.NOT_FOUND) 329 330 if isinstance(exc, NotEnoughSharesError): -
TabularUnified tox.ini ¶
r0f7e37d rc09fee64 105 105 python --version 106 106 # NOTE: 'run with "py.test --keep-tempdir -s -v integration/" to debug failures' 107 py thon3 -b -m pytest --timeout=1800 --coverage -v {posargs:integration}107 py.test --timeout=1800 --coverage -v {posargs:integration} 108 108 coverage combine 109 109 coverage report 110 110 111 111 112 # Once 2.7 is dropped, this can be removed. It just does flake8 with Python 2 113 # since that can give different results than flake8 on Python 3. 112 114 [testenv:codechecks] 113 115 basepython = python2.7 114 # On macOS, git inside of towncrier needs $HOME.115 passenv = HOME116 whitelist_externals =117 /bin/mv118 116 setenv = 119 117 # Workaround an error when towncrier is run under the VCS hook, … … 129 127 commands = 130 128 flake8 {posargs:{env:DEFAULT_FILES}} 129 130 131 [testenv:codechecks3] 132 basepython = python3 133 deps = 134 # Newer versions of PyLint have buggy configuration 135 # (https://github.com/PyCQA/pylint/issues/4574), so stick to old version 136 # for now. 137 pylint < 2.5 138 # On macOS, git inside of towncrier needs $HOME. 139 passenv = HOME 140 setenv = 141 # If no positional arguments are given, try to run the checks on the 142 # entire codebase, including various pieces of supporting code. 143 DEFAULT_FILES=src integration static misc setup.py 144 commands = 145 flake8 {posargs:{env:DEFAULT_FILES}} 131 146 python misc/coding_tools/check-umids.py {posargs:{env:DEFAULT_FILES}} 132 147 python misc/coding_tools/check-debugging.py {posargs:{env:DEFAULT_FILES}} 133 148 python misc/coding_tools/find-trailing-spaces.py -r {posargs:{env:DEFAULT_FILES}} 134 python misc/coding_tools/check-miscaptures.py {posargs:{env:DEFAULT_FILES}} 149 # PyLint has other useful checks, might want to enable them: 150 # http://pylint.pycqa.org/en/latest/technical_reference/features.html 151 pylint --disable=all --enable=cell-var-from-loop {posargs:{env:DEFAULT_FILES}} 135 152 136 153 # If towncrier.check fails, you forgot to add a towncrier news 137 154 # fragment explaining the change in this branch. Create one at 138 155 # `newsfragments/<ticket>.<change type>` with some text for the news 139 # file. See towncrier.pyproject.toml for legal <change type> values. 140 python -m towncrier.check --config towncrier.pyproject.toml 141 142 143 [testenv:codechecks3] 144 basepython = python3 145 setenv = 146 # If no positional arguments are given, try to run the checks on the 147 # entire codebase, including various pieces of supporting code. 148 DEFAULT_FILES=src integration static misc setup.py 149 commands = 150 flake8 {posargs:{env:DEFAULT_FILES}} 156 # file. See towncrier.toml for legal <change type> values. 157 python -m towncrier.check --config towncrier.toml 151 158 152 159 … … 156 163 deps = 157 164 mypy 158 git+https://github.com/Shoobx/mypy-zope 165 mypy-zope 166 types-mock 167 types-six 168 types-PyYAML 169 types-pkg_resources 159 170 git+https://github.com/warner/foolscap 160 171 # Twisted 21.2.0 introduces some type hints which we are not yet … … 167 178 [testenv:draftnews] 168 179 passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH 169 # see comment in [testenv] about "certifi" 170 whitelist_externals = mv 171 deps = 172 certifi 173 towncrier >= 19.2 174 commands = 175 # With pip >= 10 the existence of pyproject.toml (which we are 176 # required to have to configure towncrier) triggers a "build 177 # isolation" mode which prevents anything from working. Avoid 178 # triggering that pip behavior by keeping the towncrier configuration 179 # somewhere else and only bringing it in when it's actually needed 180 # (after pip is done). 181 # 182 # Some discussion is available at 183 # https://github.com/pypa/pip/issues/5696 184 # 185 # towncrier post 19.2 (unreleased as of this writing) adds a --config 186 # option that can be used instead of this file shuffling. 187 mv towncrier.pyproject.toml pyproject.toml 188 189 # towncrier 19.2 + works with python2.7 190 python -m towncrier --draft 191 192 # put it back 193 mv pyproject.toml towncrier.pyproject.toml 180 deps = 181 # see comment in [testenv] about "certifi" 182 certifi 183 towncrier==21.3.0 184 commands = 185 python -m towncrier --draft --config towncrier.toml 194 186 195 187 [testenv:news] 196 passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH 197 # see comment in [testenv] about "certifi" 198 whitelist_externals = mv 199 deps = 200 certifi 201 towncrier >= 19.2 202 commands = 203 # With pip >= 10 the existence of pyproject.toml (which we are 204 # required to have to configure towncrier) triggers a "build 205 # isolation" mode which prevents anything from working. Avoid 206 # triggering that pip behavior by keeping the towncrier configuration 207 # somewhere else and only bringing it in when it's actually needed 208 # (after pip is done). 209 # 210 # Some discussion is available at 211 # https://github.com/pypa/pip/issues/5696 212 # 213 # towncrier post 19.2 (unreleased as of this writing) adds a --config 214 # option that can be used instead of this file shuffling. 215 mv towncrier.pyproject.toml pyproject.toml 216 217 # towncrier 19.2 + works with python2.7 218 python -m towncrier --yes 219 220 # put it back 221 mv pyproject.toml towncrier.pyproject.toml 222 223 # commit the changes 224 git commit -m "update NEWS.txt for release" 188 # On macOS, git invoked from Tox needs $HOME. 189 passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH HOME 190 whitelist_externals = 191 git 192 deps = 193 # see comment in [testenv] about "certifi" 194 certifi 195 towncrier==21.3.0 196 commands = 197 python -m towncrier --yes --config towncrier.toml 198 # commit the changes 199 git commit -m "update NEWS.txt for release" 225 200 226 201 [testenv:deprecations] … … 282 257 # Python 3 we can reconsider this constraint. 283 258 pyinstaller < 4.0 284 # 2021.5.13 broke on Windows. See https://github.com/erocarrera/pefile/issues/318 285 pefile < 2021.5.13 ; platform_system == "Windows" 259 pefile ; platform_system == "Windows" 286 260 # Setting PYTHONHASHSEED to a known value assists with reproducible builds. 287 261 # See https://pyinstaller.readthedocs.io/en/stable/advanced-topics.html#creating-a-reproducible-build
Note: See TracChangeset
for help on using the changeset viewer.