diff --git a/dev/environment b/dev/environment index e84e552d3220..45a356ac8c35 100644 --- a/dev/environment +++ b/dev/environment @@ -5,6 +5,8 @@ WAREHOUSE_ENV=development WAREHOUSE_TOKEN=insecuretoken WAREHOUSE_IP_SALT="insecure himalayan pink salt" +USERDOCS_DOMAIN="http://localhost:10000" + TERMS_NOTIFICATION_BATCH_SIZE=0 AWS_ACCESS_KEY_ID=foo diff --git a/docs/mkdocs-user-docs.yml b/docs/mkdocs-user-docs.yml index d455ad481ade..2cdb3c0179a0 100644 --- a/docs/mkdocs-user-docs.yml +++ b/docs/mkdocs-user-docs.yml @@ -61,6 +61,9 @@ edit_uri: blob/main/docs/user/ nav: - "index.md" + - "Project Management": + - "project-management/storage-limits.md" + - "project-management/yanking.md" - "Organization Accounts": - "organization-accounts/index.md" - "organization-accounts/org-acc-faq.md" diff --git a/docs/user/assets/project-size-and-limits.png b/docs/user/assets/project-size-and-limits.png new file mode 100644 index 000000000000..a42dc6720131 Binary files /dev/null and b/docs/user/assets/project-size-and-limits.png differ diff --git a/docs/user/assets/release-options-yank.png b/docs/user/assets/release-options-yank.png new file mode 100644 index 000000000000..0c67c27871c3 Binary files /dev/null and b/docs/user/assets/release-options-yank.png differ diff --git a/docs/user/assets/yank-confirm-modal.png b/docs/user/assets/yank-confirm-modal.png new file mode 100644 index 000000000000..cd06bcd01dec Binary files /dev/null and b/docs/user/assets/yank-confirm-modal.png differ diff --git a/docs/user/project-management/storage-limits.md b/docs/user/project-management/storage-limits.md new file mode 100644 index 000000000000..834a5d3137f3 --- /dev/null +++ b/docs/user/project-management/storage-limits.md @@ -0,0 +1,104 @@ +--- +title: Storage Limits +--- + +PyPI imposes storage limits on the size of individually uploaded files, +as well as the total size of all files in a project. + +The current default limits are **100.0 MB** for individual files and **10.0 GB** +for the entire project. + +You can see your project's current size and storage limits on +the project settings page (`https://pypi.org/manage/project/YOUR-PROJECT/settings/`): + + + +## File size limits + +By default, PyPI limits the size of individual files to **100.0 MB**. +If you attempt to upload a file that exceeds this limit, you'll receive +an error like the following: + +```console +Uploading sampleproject-1.2.3.tar.gz +HTTPError: 400 Client Error: File too large. Limit for project 'sampleproject' is 100 MB. +``` + +### Requesting a file size limit increase + +!!! note + + Note: All users submitting feedback, reporting issues or contributing to + PyPI are expected to follow the + [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md). + +If you can't upload your project's release to PyPI because you're hitting the +upload file size limit, we can sometimes increase your limit. Make sure you've +uploaded at least one release for the project that's under the limit +(a [developmental release version number](https://packaging.python.org/en/latest/specifications/version-specifiers/#developmental-releases) is fine). Then, +[file an issue](https://github.com/pypi/support/issues/new?assignees=&labels=limit+request&template=limit-request-file.yml&title=File+Limit+Request%3A+PROJECT_NAME+-+000+MB) and tell +us: + +- A link to your project on PyPI (or TestPyPI) +- The size of your release, in megabytes +- Which index/indexes you need the increase for (PyPI, TestPyPI, or both) +- A brief description of your project, including the reason for the additional size. + +## Project size limits + +By default, PyPI limits the total size of all files in a project to **10.0 GB**. +If you attempt to upload a file that would exceed this limit, you'll receive +an error like the following: + +```console +Uploading sampleproject-1.2.3.tar.gz +HTTPError: 400 Client Error: Project size too large. Limit for project 'sampleproject' total size is 10 GB. +``` + +### Freeing up storage on an existing project + +!!! important + + Deleting and [yanking](./yanking.md) are two different actions. Yanking a release or file + does **not** free up storage space. + +!!! warning + + Deleting releases and files from your project is permanent and cannot be undone + without administrative intervention. + +!!! warning + + Deletion can be very disruptive for downstream dependencies of your project, + since it breaks installation for + [pinned versions](https://pip.pypa.io/en/stable/topics/repeatable-installs/). + + Before performing a deletion, we **strongly** recommend that you + consider the potential impact on your downstreams. + +If you're hitting the project size limit, you can free up storage by removing +old releases or individual files from your project. To do this: + +1. Navigate to the release management for your project: `https://pypi.org/manage/project/YOUR-PROJECT/releases/`; +2. Click on `Options` next to the release you wish to delete from; + - If you wish to delete the entire release, click `Delete`; + - If you wish to delete individual files from the release, click `Manage`, + then use each file's `Options` menu to delete it. + +### Requesting a project size limit increase + +!!! note + + Note: All users submitting feedback, reporting issues or contributing to + PyPI are expected to follow the + [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md). + +If you can't upload your project's release to PyPI because you're hitting the project size limit, +first [remove any unnecessary releases or individual files](#freeing-up-storage-on-an-existing-project) +to lower your overall project size. + +If that is not possible, we can sometimes increase your limit. [File an issue](https://github.com/pypi/support/issues/new?assignees=&labels=limit+request&template=limit-request-project.yml&title=Project+Limit+Request%3A+PROJECT_NAME+-+00+GB) and tell us: + +- A link to your project on PyPI (or TestPyPI) +- The total size of your project, in gigabytes +- A brief description of your project, including the reason for the additional size. diff --git a/docs/user/project-management/yanking.md b/docs/user/project-management/yanking.md new file mode 100644 index 000000000000..2c491e9163da --- /dev/null +++ b/docs/user/project-management/yanking.md @@ -0,0 +1,51 @@ +--- +title: Yanking +--- + +!!! note + + PyPI currently only supports yanking of *entire releases*, not individual files. + +PyPI supports *yanking* as a non-destructive alternative to deletion. + +A *yanked release* is a release that is always ignored by an installer, unless it +is the only release that matches a [version specifier] (using either `==` or `===`). +See [PEP 592] for more information. + +[version specifier]: https://packaging.python.org/en/latest/specifications/version-specifiers/ + +[PEP 592]: https://peps.python.org/pep-0592/ + +## When should I yank a release? + +Like deletion, yanking should be done sparingly since it can be disruptive to +downstream users of a package. + +Maintainers should consider yanking a release when: + +- The release is broken or uninstallable. +- The release violates its own compatibility guarantees. For example, `sampleproject 1.0.1` + might be yanked if it's *unintentionally* incompatible with `sampleproject 1.0.0`. +- The release contains a security vulnerability. + +## How do I yank a release? + +To yank a release, go to the release management page for your project: +`https://pypi.org/manage/project/YOUR-PROJECT/releases/`. + +Click on the `Options` button next to the release you wish to yank, then click `Yank`: + + + +A modal dialogue will appear, asking you to confirm the yank and provide an +optional reason for yanking: + + + +The reason, if provided, will be displayed on the release page as well +as in the [index APIs](../api/index-api.md) used by installers. + +!!! tip + + Providing a reason for yanking is **strongly encouraged**, as it can + help downstream users determine how to respond to the yank. diff --git a/tests/unit/forklift/test_init.py b/tests/unit/forklift/test_init.py index 280a7d65baae..24805d9f3bd6 100644 --- a/tests/unit/forklift/test_init.py +++ b/tests/unit/forklift/test_init.py @@ -25,6 +25,9 @@ def test_includeme(forklift_domain, monkeypatch): _help_url = pretend.stub() monkeypatch.setattr(forklift, "_help_url", _help_url) + _user_docs_url = pretend.stub() + monkeypatch.setattr(forklift, "_user_docs_url", _user_docs_url) + config = pretend.stub( get_settings=lambda: settings, include=pretend.call_recorder(lambda n: None), @@ -56,7 +59,10 @@ def test_includeme(forklift_domain, monkeypatch): ), ] - assert config.add_request_method.calls == [pretend.call(_help_url, name="help_url")] + assert config.add_request_method.calls == [ + pretend.call(_help_url, name="help_url"), + pretend.call(_user_docs_url, name="user_docs_url"), + ] if forklift_domain: assert config.add_template_view.calls == [ pretend.call( @@ -90,3 +96,16 @@ def test_help_url(): assert request.route_url.calls == [ pretend.call("help", _host=warehouse_domain, _anchor="foo") ] + + +def test_user_docs_url(): + docs_domain = "http://example.com" + request = pretend.stub( + registry=pretend.stub(settings={"userdocs.domain": docs_domain}), + ) + + assert forklift._user_docs_url(request, "/foo") == f"{docs_domain}/foo" + assert ( + forklift._user_docs_url(request, "/foo", anchor="bar") + == f"{docs_domain}/foo#bar" + ) diff --git a/tests/unit/forklift/test_legacy.py b/tests/unit/forklift/test_legacy.py index 00701848d5a8..9717f6b89532 100644 --- a/tests/unit/forklift/test_legacy.py +++ b/tests/unit/forklift/test_legacy.py @@ -856,9 +856,7 @@ def test_fails_with_invalid_names(self, pyramid_config, db_request, name): assert resp.status_code == 400 assert resp.status == ( - "400 The name {!r} isn't allowed. " - "See /the/help/url/ " - "for more information." + "400 The name {!r} isn't allowed. See /the/help/url/ for more information." ).format(name) @pytest.mark.parametrize( @@ -1622,29 +1620,25 @@ def test_upload_fails_with_deprecated_classifier( {"md5_digest": "bad"}, { "sha256_digest": ( - "badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbad" - "badbadb" + "badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadb" ) }, { "md5_digest": "bad", "sha256_digest": ( - "badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbad" - "badbadb" + "badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadb" ), }, { "md5_digest": _TAR_GZ_PKG_MD5, "sha256_digest": ( - "badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbad" - "badbadb" + "badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadb" ), }, { "md5_digest": "bad", "sha256_digest": ( - "4a8422abcc484a4086bdaa618c65289f749433b07eb433c51c4e37714" - "3ff5fdb" + "4a8422abcc484a4086bdaa618c65289f749433b07eb433c51c4e377143ff5fdb" ), }, ], @@ -1722,9 +1716,7 @@ def test_upload_fails_with_invalid_file(self, pyramid_config, db_request): resp = excinfo.value assert resp.status_code == 400 - assert resp.status == ( - "400 Invalid distribution file. " "File is not a zipfile" - ) + assert resp.status == ("400 Invalid distribution file. File is not a zipfile") def test_upload_fails_end_of_file_error( self, pyramid_config, db_request, project_service @@ -1769,9 +1761,7 @@ def test_upload_fails_end_of_file_error( resp = excinfo.value assert resp.status_code == 400 - assert resp.status == ( - "400 Invalid distribution file. " "File is not a tarfile" - ) + assert resp.status == ("400 Invalid distribution file. File is not a tarfile") def test_upload_fails_with_too_large_file(self, pyramid_config, db_request): user = UserFactory.create() @@ -1800,14 +1790,21 @@ def test_upload_fails_with_too_large_file(self, pyramid_config, db_request): ), } ) - db_request.help_url = pretend.call_recorder(lambda **kw: "/the/help/url/") + db_request.user_docs_url = pretend.call_recorder( + lambda *a, **kw: "/the/help/url/" + ) with pytest.raises(HTTPBadRequest) as excinfo: legacy.file_upload(db_request) resp = excinfo.value - assert db_request.help_url.calls == [pretend.call(_anchor="file-size-limit")] + assert db_request.user_docs_url.calls == [ + pretend.call( + "/project-management/storage-limits", + anchor="requesting-a-file-size-limit-increase", + ) + ] assert resp.status_code == 400 assert resp.status == ( "400 File too large. Limit for project 'foobar' is 100 MB. " @@ -1847,14 +1844,21 @@ def test_upload_fails_with_too_large_project_size_default_limit( ), } ) - db_request.help_url = pretend.call_recorder(lambda **kw: "/the/help/url/") + db_request.user_docs_url = pretend.call_recorder( + lambda *a, **kw: "/the/help/url/" + ) with pytest.raises(HTTPBadRequest) as excinfo: legacy.file_upload(db_request) resp = excinfo.value - assert db_request.help_url.calls == [pretend.call(_anchor="project-size-limit")] + assert db_request.user_docs_url.calls == [ + pretend.call( + "/project-management/storage-limits", + anchor="requesting-a-project-size-limit-increase", + ) + ] assert resp.status_code == 400 assert resp.status == ( "400 Project size too large." @@ -1901,14 +1905,21 @@ def test_upload_fails_with_too_large_project_size_custom_limit( ), } ) - db_request.help_url = pretend.call_recorder(lambda **kw: "/the/help/url/") + db_request.user_docs_url = pretend.call_recorder( + lambda *a, **kw: "/the/help/url/" + ) with pytest.raises(HTTPBadRequest) as excinfo: legacy.file_upload(db_request) resp = excinfo.value - assert db_request.help_url.calls == [pretend.call(_anchor="project-size-limit")] + assert db_request.user_docs_url.calls == [ + pretend.call( + "/project-management/storage-limits", + anchor="requesting-a-project-size-limit-increase", + ) + ] assert resp.status_code == 400 assert resp.status == ( "400 Project size too large." diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index 4835bb8dec9b..c467800c3348 100644 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -312,6 +312,7 @@ def __init__(self): "terms.revision": "initial", "terms.notification_batch_size": 1000, "warehouse.commit": "null", + "userdocs.domain": "https://docs.pypi.org", "site.name": "Warehouse", "token.two_factor.max_age": 300, "remember_device.days": 30, @@ -355,17 +356,11 @@ def __init__(self): "pyramid_debugtoolbar.panels.versions.VersionDebugPanel", "pyramid_debugtoolbar.panels.settings.SettingsDebugPanel", "pyramid_debugtoolbar.panels.headers.HeaderDebugPanel", - ( - "pyramid_debugtoolbar.panels.request_vars." - "RequestVarsDebugPanel" - ), + ("pyramid_debugtoolbar.panels.request_vars.RequestVarsDebugPanel"), "pyramid_debugtoolbar.panels.renderings.RenderingsDebugPanel", "pyramid_debugtoolbar.panels.session.SessionDebugPanel", "pyramid_debugtoolbar.panels.logger.LoggingPanel", - ( - "pyramid_debugtoolbar.panels.performance." - "PerformanceDebugPanel" - ), + ("pyramid_debugtoolbar.panels.performance.PerformanceDebugPanel"), "pyramid_debugtoolbar.panels.routes.RoutesDebugPanel", "pyramid_debugtoolbar.panels.sqla.SQLADebugPanel", "pyramid_debugtoolbar.panels.tweens.TweensDebugPanel", diff --git a/warehouse/config.py b/warehouse/config.py index 8f486547c8bb..e9926d42929e 100644 --- a/warehouse/config.py +++ b/warehouse/config.py @@ -349,6 +349,9 @@ def configure(settings=None): maybe_set(settings, "warehouse.domain", "WAREHOUSE_DOMAIN") maybe_set(settings, "forklift.domain", "FORKLIFT_DOMAIN") maybe_set(settings, "auth.domain", "AUTH_DOMAIN") + maybe_set( + settings, "userdocs.domain", "USERDOCS_DOMAIN", default="https://docs.pypi.org" + ) maybe_set(settings, "warehouse.legacy_domain", "WAREHOUSE_LEGACY_DOMAIN") maybe_set(settings, "site.name", "SITE_NAME", default="Warehouse") maybe_set(settings, "aws.key_id", "AWS_ACCESS_KEY_ID") diff --git a/warehouse/forklift/__init__.py b/warehouse/forklift/__init__.py index b1b73a653302..ce0f356fb008 100644 --- a/warehouse/forklift/__init__.py +++ b/warehouse/forklift/__init__.py @@ -14,12 +14,26 @@ # will go away eventually, once we split forklift out into it's own # project. +from rfc3986 import builder + def _help_url(request, **kwargs): warehouse_domain = request.registry.settings.get("warehouse.domain") return request.route_url("help", _host=warehouse_domain, **kwargs) +def _user_docs_url(request, path, anchor: str | None = None): + docs_domain = request.registry.settings.get("userdocs.domain") + return ( + builder.URIBuilder() + .from_uri(docs_domain) + .add_path(path) + .add_fragment(anchor) + .finalize() + .unsplit() + ) + + def includeme(config): # We need to get the value of the Warehouse and Forklift domains, we'll use # these to segregate the Warehouse routes from the Forklift routes until @@ -46,6 +60,7 @@ def includeme(config): ) config.add_request_method(_help_url, name="help_url") + config.add_request_method(_user_docs_url, name="user_docs_url") if forklift: config.add_template_view( diff --git a/warehouse/forklift/legacy.py b/warehouse/forklift/legacy.py index b329ccc3d4cf..782a91a6ef77 100644 --- a/warehouse/forklift/legacy.py +++ b/warehouse/forklift/legacy.py @@ -792,8 +792,7 @@ def file_upload(request): if rendered is None: if meta.description_content_type: message = ( - "The description failed to render " - "for '{description_content_type}'." + "The description failed to render for '{description_content_type}'." ).format(description_content_type=description_content_type) else: message = ( @@ -1048,7 +1047,10 @@ def file_upload(request): name=project.name, limit=file_size_limit // ONE_MIB ) + "See " - + request.help_url(_anchor="file-size-limit") + + request.user_docs_url( + "/project-management/storage-limits", + anchor="requesting-a-file-size-limit-increase", + ) + " for more information.", ) if file_size + project.total_size > project_size_limit: @@ -1059,7 +1061,10 @@ def file_upload(request): name=project.name, limit=project_size_limit // ONE_GIB ) + "See " - + request.help_url(_anchor="project-size-limit"), + + request.user_docs_url( + "/project-management/storage-limits", + anchor="requesting-a-project-size-limit-increase", + ), ) fp.write(chunk) for hasher in file_hashes.values(): diff --git a/warehouse/locale/messages.pot b/warehouse/locale/messages.pot index 81584f2f2bbc..e94655773497 100644 --- a/warehouse/locale/messages.pot +++ b/warehouse/locale/messages.pot @@ -973,65 +973,63 @@ msgstr "" #: warehouse/templates/pages/help.html:20 #: warehouse/templates/pages/help.html:230 #: warehouse/templates/pages/help.html:237 -#: warehouse/templates/pages/help.html:251 -#: warehouse/templates/pages/help.html:278 #: warehouse/templates/pages/help.html:282 -#: warehouse/templates/pages/help.html:339 -#: warehouse/templates/pages/help.html:361 -#: warehouse/templates/pages/help.html:366 -#: warehouse/templates/pages/help.html:371 -#: warehouse/templates/pages/help.html:373 -#: warehouse/templates/pages/help.html:378 -#: warehouse/templates/pages/help.html:379 -#: warehouse/templates/pages/help.html:380 +#: warehouse/templates/pages/help.html:286 +#: warehouse/templates/pages/help.html:343 +#: warehouse/templates/pages/help.html:365 +#: warehouse/templates/pages/help.html:370 +#: warehouse/templates/pages/help.html:375 +#: warehouse/templates/pages/help.html:377 +#: warehouse/templates/pages/help.html:382 +#: warehouse/templates/pages/help.html:383 #: warehouse/templates/pages/help.html:384 -#: warehouse/templates/pages/help.html:417 -#: warehouse/templates/pages/help.html:419 -#: warehouse/templates/pages/help.html:422 -#: warehouse/templates/pages/help.html:458 -#: warehouse/templates/pages/help.html:463 -#: warehouse/templates/pages/help.html:469 -#: warehouse/templates/pages/help.html:548 -#: warehouse/templates/pages/help.html:580 -#: warehouse/templates/pages/help.html:586 -#: warehouse/templates/pages/help.html:589 -#: warehouse/templates/pages/help.html:591 -#: warehouse/templates/pages/help.html:600 -#: warehouse/templates/pages/help.html:622 -#: warehouse/templates/pages/help.html:629 -#: warehouse/templates/pages/help.html:647 -#: warehouse/templates/pages/help.html:654 -#: warehouse/templates/pages/help.html:665 -#: warehouse/templates/pages/help.html:691 -#: warehouse/templates/pages/help.html:704 -#: warehouse/templates/pages/help.html:709 -#: warehouse/templates/pages/help.html:731 -#: warehouse/templates/pages/help.html:753 -#: warehouse/templates/pages/help.html:767 -#: warehouse/templates/pages/help.html:776 -#: warehouse/templates/pages/help.html:788 -#: warehouse/templates/pages/help.html:799 -#: warehouse/templates/pages/help.html:804 -#: warehouse/templates/pages/help.html:812 -#: warehouse/templates/pages/help.html:823 -#: warehouse/templates/pages/help.html:868 -#: warehouse/templates/pages/help.html:876 -#: warehouse/templates/pages/help.html:924 -#: warehouse/templates/pages/help.html:929 -#: warehouse/templates/pages/help.html:934 -#: warehouse/templates/pages/help.html:944 -#: warehouse/templates/pages/help.html:953 -#: warehouse/templates/pages/help.html:967 -#: warehouse/templates/pages/help.html:975 -#: warehouse/templates/pages/help.html:983 -#: warehouse/templates/pages/help.html:991 -#: warehouse/templates/pages/help.html:1000 -#: warehouse/templates/pages/help.html:1019 +#: warehouse/templates/pages/help.html:388 +#: warehouse/templates/pages/help.html:421 +#: warehouse/templates/pages/help.html:423 +#: warehouse/templates/pages/help.html:426 +#: warehouse/templates/pages/help.html:462 +#: warehouse/templates/pages/help.html:467 +#: warehouse/templates/pages/help.html:473 +#: warehouse/templates/pages/help.html:552 +#: warehouse/templates/pages/help.html:584 +#: warehouse/templates/pages/help.html:590 +#: warehouse/templates/pages/help.html:593 +#: warehouse/templates/pages/help.html:595 +#: warehouse/templates/pages/help.html:604 +#: warehouse/templates/pages/help.html:626 +#: warehouse/templates/pages/help.html:633 +#: warehouse/templates/pages/help.html:651 +#: warehouse/templates/pages/help.html:658 +#: warehouse/templates/pages/help.html:669 +#: warehouse/templates/pages/help.html:703 +#: warehouse/templates/pages/help.html:708 +#: warehouse/templates/pages/help.html:730 +#: warehouse/templates/pages/help.html:752 +#: warehouse/templates/pages/help.html:766 +#: warehouse/templates/pages/help.html:775 +#: warehouse/templates/pages/help.html:787 +#: warehouse/templates/pages/help.html:798 +#: warehouse/templates/pages/help.html:803 +#: warehouse/templates/pages/help.html:811 +#: warehouse/templates/pages/help.html:822 +#: warehouse/templates/pages/help.html:867 +#: warehouse/templates/pages/help.html:875 +#: warehouse/templates/pages/help.html:923 +#: warehouse/templates/pages/help.html:928 +#: warehouse/templates/pages/help.html:933 +#: warehouse/templates/pages/help.html:943 +#: warehouse/templates/pages/help.html:952 +#: warehouse/templates/pages/help.html:966 +#: warehouse/templates/pages/help.html:974 +#: warehouse/templates/pages/help.html:982 +#: warehouse/templates/pages/help.html:990 +#: warehouse/templates/pages/help.html:999 +#: warehouse/templates/pages/help.html:1018 +#: warehouse/templates/pages/help.html:1033 #: warehouse/templates/pages/help.html:1034 #: warehouse/templates/pages/help.html:1035 #: warehouse/templates/pages/help.html:1036 -#: warehouse/templates/pages/help.html:1037 -#: warehouse/templates/pages/help.html:1042 +#: warehouse/templates/pages/help.html:1041 #: warehouse/templates/pages/sponsors.html:33 #: warehouse/templates/pages/sponsors.html:37 #: warehouse/templates/pages/sponsors.html:41 @@ -3150,7 +3148,7 @@ msgstr "" #: warehouse/templates/includes/packaging/project-data.html:170 #: warehouse/templates/includes/packaging/project-data.html:237 #: warehouse/templates/includes/packaging/project-data.html:243 -#: warehouse/templates/pages/help.html:633 +#: warehouse/templates/pages/help.html:637 msgid "Maintainer:" msgstr "" @@ -6596,7 +6594,7 @@ msgid "Project Roles" msgstr "" #: warehouse/templates/manage/project/roles.html:46 -#: warehouse/templates/pages/help.html:632 +#: warehouse/templates/pages/help.html:636 msgid "There are two possible roles for collaborators:" msgstr "" @@ -7648,22 +7646,22 @@ msgid "My Account" msgstr "" #: warehouse/templates/pages/help.html:158 -#: warehouse/templates/pages/help.html:577 +#: warehouse/templates/pages/help.html:581 msgid "Integrating" msgstr "" #: warehouse/templates/pages/help.html:169 -#: warehouse/templates/pages/help.html:614 +#: warehouse/templates/pages/help.html:618 msgid "Administration of projects on PyPI" msgstr "" #: warehouse/templates/pages/help.html:185 -#: warehouse/templates/pages/help.html:727 +#: warehouse/templates/pages/help.html:726 msgid "Troubleshooting" msgstr "" #: warehouse/templates/pages/help.html:204 -#: warehouse/templates/pages/help.html:920 +#: warehouse/templates/pages/help.html:919 msgid "About" msgstr "" @@ -7721,45 +7719,45 @@ msgid "" "A yanked release is a release that is always ignored by an installer, " "unless it is the only release that matches a version specifier (using " "either <code>==</code> or <code>===</code>). See <a href=\"%(href)s\" " -"title=\"%(title)s\" target=\"_blank\" rel=\"noopener\"><abbr " -"title=\"Python enhancement proposal\">PEP</abbr> 592</a> for more " -"information." +"title=\"%(title)s\">the user documentation</a> for more information, " +"including how to yank a release." msgstr "" -#: warehouse/templates/pages/help.html:258 +#: warehouse/templates/pages/help.html:262 +#, python-format msgid "" "An archived project is a project that is no longer receiving any updates." " A project maintainer can mark a project as archived to signal to users " "that future updates should not be expected. Archived projects are " "publicly visible and can still be resolved from the index by default, " -"unlike deleted or <a href=\"#yanked\">yanked</a> releases." +"unlike deleted or <a href=\"%(href)s\">yanked</a> releases." msgstr "" -#: warehouse/templates/pages/help.html:269 +#: warehouse/templates/pages/help.html:273 msgid "My account" msgstr "" -#: warehouse/templates/pages/help.html:272 +#: warehouse/templates/pages/help.html:276 msgid "" "Currently, PyPI requires a verified email address to perform the " "following operations:" msgstr "" -#: warehouse/templates/pages/help.html:274 +#: warehouse/templates/pages/help.html:278 msgid "Register a new project." msgstr "" -#: warehouse/templates/pages/help.html:275 +#: warehouse/templates/pages/help.html:279 msgid "Upload a new version or file." msgstr "" -#: warehouse/templates/pages/help.html:277 +#: warehouse/templates/pages/help.html:281 msgid "" "The list of activities that require a verified email address is likely to" " grow over time." msgstr "" -#: warehouse/templates/pages/help.html:278 +#: warehouse/templates/pages/help.html:282 #, python-format msgid "" "This policy will allow us to enforce a key policy of <a href=\"%(href)s\"" @@ -7769,7 +7767,7 @@ msgid "" " create many accounts in an automated fashion." msgstr "" -#: warehouse/templates/pages/help.html:279 +#: warehouse/templates/pages/help.html:283 #, python-format msgid "" "You can manage your account's email addresses in your <a " @@ -7778,7 +7776,7 @@ msgid "" "began enforcing this policy." msgstr "" -#: warehouse/templates/pages/help.html:282 +#: warehouse/templates/pages/help.html:286 #, python-format msgid "" "<p> PyPI itself has not suffered a breach. This is a protective measure " @@ -7804,7 +7802,7 @@ msgid "" "href=\"%(reset_pwd_href)s\">reset your password</a>. </p>" msgstr "" -#: warehouse/templates/pages/help.html:317 +#: warehouse/templates/pages/help.html:321 #, python-format msgid "" "<p> All PyPI user events are stored under security history in account " @@ -7814,7 +7812,7 @@ msgid "" "href=\"mailto:%(admin_email)s\">%(admin_email)s</a></li> </ul>" msgstr "" -#: warehouse/templates/pages/help.html:329 +#: warehouse/templates/pages/help.html:333 msgid "" "<p> A PyPI API token linked to your account was posted on a public " "website. It was automatically revoked, but before regenerating a new one," @@ -7823,7 +7821,7 @@ msgid "" "applies too. </p>" msgstr "" -#: warehouse/templates/pages/help.html:339 +#: warehouse/templates/pages/help.html:343 msgid "" "<p> Two-factor authentication (2FA) makes your account more secure by " "requiring two things in order to log in: <em>something you know</em> and " @@ -7836,7 +7834,7 @@ msgid "" "provide their second method of identity verification. </p>" msgstr "" -#: warehouse/templates/pages/help.html:361 +#: warehouse/templates/pages/help.html:365 #, python-format msgid "" "PyPI users can set up two-factor authentication using any authentication " @@ -7845,21 +7843,21 @@ msgid "" "password\">TOTP</abbr> standard</a>." msgstr "" -#: warehouse/templates/pages/help.html:362 +#: warehouse/templates/pages/help.html:366 msgid "" "<abbr title=\"time-based one-time password\">TOTP</abbr> authentication " "applications generate a regularly changing authentication code to use " "when logging into your account." msgstr "" -#: warehouse/templates/pages/help.html:363 +#: warehouse/templates/pages/help.html:367 msgid "" "Because <abbr title=\"time-based one-time password\">TOTP</abbr> is an " "open standard, there are many applications that are compatible with your " "PyPI account. Popular applications include:" msgstr "" -#: warehouse/templates/pages/help.html:366 +#: warehouse/templates/pages/help.html:370 #, python-format msgid "" "Google Authenticator for <a href=\"%(android_href)s\" title=\"%(title)s\"" @@ -7868,14 +7866,14 @@ msgid "" "rel=\"noopener\">iOS</a>" msgstr "" -#: warehouse/templates/pages/help.html:369 -#: warehouse/templates/pages/help.html:371 -#: warehouse/templates/pages/help.html:376 -#: warehouse/templates/pages/help.html:378 +#: warehouse/templates/pages/help.html:373 +#: warehouse/templates/pages/help.html:375 +#: warehouse/templates/pages/help.html:380 +#: warehouse/templates/pages/help.html:382 msgid "(proprietary)" msgstr "" -#: warehouse/templates/pages/help.html:373 +#: warehouse/templates/pages/help.html:377 #, python-format msgid "" "Duo Mobile for <a href=\"%(android_href)s\" title=\"%(title)s\" " @@ -7884,12 +7882,12 @@ msgid "" "rel=\"noopener\">iOS</a>" msgstr "" -#: warehouse/templates/pages/help.html:379 -#: warehouse/templates/pages/help.html:380 +#: warehouse/templates/pages/help.html:383 +#: warehouse/templates/pages/help.html:384 msgid "(open source)" msgstr "" -#: warehouse/templates/pages/help.html:384 +#: warehouse/templates/pages/help.html:388 #, python-format msgid "" "Some password managers (e.g. <a href=\"%(href)s\" title=\"%(title)s\" " @@ -7898,70 +7896,70 @@ msgid "" "up one application per account." msgstr "" -#: warehouse/templates/pages/help.html:392 +#: warehouse/templates/pages/help.html:396 msgid "" "To set up <abbr title=\"two factor authentication\">2FA</abbr> with an " "authentication application:" msgstr "" -#: warehouse/templates/pages/help.html:394 +#: warehouse/templates/pages/help.html:398 msgid "" "Open an authentication (<abbr title=\"time-based one-time " "password\">TOTP</abbr>) application" msgstr "" -#: warehouse/templates/pages/help.html:395 +#: warehouse/templates/pages/help.html:399 msgid "" "Log in to your PyPI account, go to your account settings, and choose " "\"Add <abbr title=\"two factor authentication\">2FA</abbr> with " "authentication application\"" msgstr "" -#: warehouse/templates/pages/help.html:396 +#: warehouse/templates/pages/help.html:400 msgid "" "PyPI will generate a secret key, specific to your account. This is " "displayed as a QR code, and as a text code." msgstr "" -#: warehouse/templates/pages/help.html:397 +#: warehouse/templates/pages/help.html:401 msgid "" "Scan the QR code with your authentication application, or type it in " "manually. The method of input will depend on the application you have " "chosen." msgstr "" -#: warehouse/templates/pages/help.html:398 +#: warehouse/templates/pages/help.html:402 msgid "" "Your application will generate an authentication code - use this to " "verify your set-up on PyPI" msgstr "" -#: warehouse/templates/pages/help.html:401 +#: warehouse/templates/pages/help.html:405 msgid "" "The PyPI server and your application now share your PyPI secret key, " "allowing your application to generate valid authentication codes for your" " PyPI account." msgstr "" -#: warehouse/templates/pages/help.html:403 -#: warehouse/templates/pages/help.html:445 +#: warehouse/templates/pages/help.html:407 +#: warehouse/templates/pages/help.html:449 msgid "Next time you log in to PyPI you'll need to:" msgstr "" -#: warehouse/templates/pages/help.html:405 -#: warehouse/templates/pages/help.html:497 +#: warehouse/templates/pages/help.html:409 +#: warehouse/templates/pages/help.html:501 msgid "Provide your username and password, as normal" msgstr "" -#: warehouse/templates/pages/help.html:406 +#: warehouse/templates/pages/help.html:410 msgid "Open your authentication application to generate an authentication code" msgstr "" -#: warehouse/templates/pages/help.html:407 +#: warehouse/templates/pages/help.html:411 msgid "Use this code to finish logging into PyPI" msgstr "" -#: warehouse/templates/pages/help.html:413 +#: warehouse/templates/pages/help.html:417 msgid "" "A security device is a USB key or <a href=\"#utfdevices\">other " "device</a> that generates a one-time password and sends that password to " @@ -7969,11 +7967,11 @@ msgid "" "user." msgstr "" -#: warehouse/templates/pages/help.html:415 +#: warehouse/templates/pages/help.html:419 msgid "To set up two-factor authentication with a <em>USB key</em>, you'll need:" msgstr "" -#: warehouse/templates/pages/help.html:417 +#: warehouse/templates/pages/help.html:421 #, python-format msgid "" "To use a <a href=\"%(href)s\" title=\"%(title)s\" target=\"_blank\" " @@ -7982,11 +7980,11 @@ msgid "" "the standard implemented by PyPI." msgstr "" -#: warehouse/templates/pages/help.html:418 +#: warehouse/templates/pages/help.html:422 msgid "To be running JavaScript on your browser" msgstr "" -#: warehouse/templates/pages/help.html:419 +#: warehouse/templates/pages/help.html:423 #, python-format msgid "" "To use a USB key that adheres to the <a href=\"%(href)s\" " @@ -7994,7 +7992,7 @@ msgid "" "specification</a>:" msgstr "" -#: warehouse/templates/pages/help.html:422 +#: warehouse/templates/pages/help.html:426 #, python-format msgid "" "Popular keys include <a href=\"%(yubikey_href)s\" title=\"%(title)s\" " @@ -8004,17 +8002,17 @@ msgid "" "title=\"%(title)s\" target=\"_blank\" rel=\"noopener\">Thetis</a>." msgstr "" -#: warehouse/templates/pages/help.html:429 +#: warehouse/templates/pages/help.html:433 msgid "" "Note that some older Yubico USB keys <strong>do not follow the FIDO " "specification</strong>, and will therefore not work with PyPI" msgstr "" -#: warehouse/templates/pages/help.html:434 +#: warehouse/templates/pages/help.html:438 msgid "Follow these steps:" msgstr "" -#: warehouse/templates/pages/help.html:436 +#: warehouse/templates/pages/help.html:440 msgid "" "<li>Log in to your PyPI account, go to your account settings, and choose " "\"Add <abbr title=\"two factor authentication\">2FA</abbr> with security " @@ -8024,19 +8022,19 @@ msgid "" "<li>Insert and touch your USB key, as instructed by your browser</li>" msgstr "" -#: warehouse/templates/pages/help.html:443 +#: warehouse/templates/pages/help.html:447 msgid "" "Once complete, your USB key will be registered to your PyPI account and " "can be used during the log in process." msgstr "" -#: warehouse/templates/pages/help.html:447 +#: warehouse/templates/pages/help.html:451 msgid "" "<li>Provide your username and password, as normal</li> <li>Insert and " "touch your USB key to finish logging into PyPI</li>" msgstr "" -#: warehouse/templates/pages/help.html:458 +#: warehouse/templates/pages/help.html:462 #, python-format msgid "" "There is a growing ecosystem of <a href=\"%(href)s\" title=\"%(title)s\" " @@ -8044,7 +8042,7 @@ msgid "" "and can therefore be used with PyPI." msgstr "" -#: warehouse/templates/pages/help.html:463 +#: warehouse/templates/pages/help.html:467 #, python-format msgid "" "Emerging solutions include biometric (facial and fingerprint) scanners " @@ -8053,7 +8051,7 @@ msgid "" "rel=\"noopener\">mobile phones to act as security devices</a>." msgstr "" -#: warehouse/templates/pages/help.html:469 +#: warehouse/templates/pages/help.html:473 #, python-format msgid "" "As PyPI's two-factor implementation follows the <a href=\"%(href)s\" " @@ -8062,14 +8060,14 @@ msgid "" " take advantage of any future developments in this field." msgstr "" -#: warehouse/templates/pages/help.html:478 +#: warehouse/templates/pages/help.html:482 msgid "" "If you lose access to your <a href=\"#totp\">authentication " "application</a> or <a href=\"#utfkey\">security device</a>, you can use " "these codes to log in to PyPI." msgstr "" -#: warehouse/templates/pages/help.html:481 +#: warehouse/templates/pages/help.html:485 msgid "" "Recovery codes are <strong>one time use</strong>. They are not a " "substitute for an <a href=\"#totp\">authentication application</a> or a " @@ -8077,72 +8075,72 @@ msgid "" "recovery. After using a recovery code to sign in, it becomes inactive." msgstr "" -#: warehouse/templates/pages/help.html:487 +#: warehouse/templates/pages/help.html:491 msgid "To provision recovery codes:" msgstr "" -#: warehouse/templates/pages/help.html:489 +#: warehouse/templates/pages/help.html:493 msgid "" "Log in to your PyPI account, go to your account settings, and choose " "\"Generate recovery codes\"" msgstr "" -#: warehouse/templates/pages/help.html:490 +#: warehouse/templates/pages/help.html:494 msgid "" "Securely store the displayed recovery codes! Consider printing them out " "and storing them in a safe location or saving them in a password manager." msgstr "" -#: warehouse/templates/pages/help.html:493 +#: warehouse/templates/pages/help.html:497 msgid "" "If you lose access to your stored recovery codes or use all of them, you " "can get new ones by selecting \"Regenerate recovery codes\" in your " "account settings." msgstr "" -#: warehouse/templates/pages/help.html:495 +#: warehouse/templates/pages/help.html:499 msgid "To sign in with a recovery code:" msgstr "" -#: warehouse/templates/pages/help.html:498 +#: warehouse/templates/pages/help.html:502 msgid "" "When prompted for two-factor authentication, select \"Login using " "recovery codes\"" msgstr "" -#: warehouse/templates/pages/help.html:499 +#: warehouse/templates/pages/help.html:503 msgid "" "As each code can be used only once, you might want to mark the code as " "used" msgstr "" -#: warehouse/templates/pages/help.html:500 +#: warehouse/templates/pages/help.html:504 msgid "" "If you have few recovery codes remaining, you may also want to generate a" " new set using the \"Regenerate recovery codes\" button in your account " "settings." msgstr "" -#: warehouse/templates/pages/help.html:506 +#: warehouse/templates/pages/help.html:510 msgid "" "API tokens are used to authenticate when <strong>uploading " "packages</strong> to PyPI." msgstr "" -#: warehouse/templates/pages/help.html:511 +#: warehouse/templates/pages/help.html:515 msgid "" "You can create a token for an entire PyPI account, in which case, the " "token will work for all projects associated with that account. " "Alternatively, you can limit a token's scope to a specific project." msgstr "" -#: warehouse/templates/pages/help.html:518 +#: warehouse/templates/pages/help.html:522 msgid "" "When using an API token from a CI provider, we recommend scoping the " "token down to the minimum necessary projects." msgstr "" -#: warehouse/templates/pages/help.html:525 +#: warehouse/templates/pages/help.html:529 #, python-format msgid "" "If you are publishing to PyPI from a CI provider that supports <a " @@ -8150,41 +8148,41 @@ msgid "" "Trusted Publishing instead." msgstr "" -#: warehouse/templates/pages/help.html:533 +#: warehouse/templates/pages/help.html:537 msgid "To make an API token:" msgstr "" -#: warehouse/templates/pages/help.html:536 +#: warehouse/templates/pages/help.html:540 msgid "Verify your email address" msgstr "" -#: warehouse/templates/pages/help.html:536 +#: warehouse/templates/pages/help.html:540 #, python-format msgid "(check your <a href=\"%(href)s\">account settings</a>)" msgstr "" -#: warehouse/templates/pages/help.html:537 +#: warehouse/templates/pages/help.html:541 #, python-format msgid "" "In your <a href=\"%(href)s\">account settings</a>, go to the API tokens " "section and select \"Add API token\"" msgstr "" -#: warehouse/templates/pages/help.html:540 +#: warehouse/templates/pages/help.html:544 msgid "To use an API token:" msgstr "" -#: warehouse/templates/pages/help.html:543 +#: warehouse/templates/pages/help.html:547 msgid "Set your username to <code>__token__</code>" msgstr "" -#: warehouse/templates/pages/help.html:544 +#: warehouse/templates/pages/help.html:548 msgid "" "Set your password to the token value, including the <code>pypi-</code> " "prefix" msgstr "" -#: warehouse/templates/pages/help.html:548 +#: warehouse/templates/pages/help.html:552 #, python-format msgid "" "Where you edit or add these values will depend on your individual use " @@ -8196,14 +8194,14 @@ msgid "" "rel=\"noopener\"><code>.travis.yml</code> if you are using Travis</a>)." msgstr "" -#: warehouse/templates/pages/help.html:552 +#: warehouse/templates/pages/help.html:556 msgid "" "Advanced users may wish to inspect their token by decoding it with " "base64, and checking the output against the unique identifier displayed " "on PyPI." msgstr "" -#: warehouse/templates/pages/help.html:556 +#: warehouse/templates/pages/help.html:560 msgid "" "<p>PyPI asks you to confirm your password before you want to perform a " "<i>sensitive action</i>. Sensitive actions include things like adding or " @@ -8214,18 +8212,18 @@ msgid "" "actions on your personal, password-protected computer.</strong></p>" msgstr "" -#: warehouse/templates/pages/help.html:563 +#: warehouse/templates/pages/help.html:567 msgid "PyPI does not currently support changing a username." msgstr "" -#: warehouse/templates/pages/help.html:564 +#: warehouse/templates/pages/help.html:568 msgid "" "Instead, you can create a new account with the desired username, add the " "new account as a maintainer of all the projects your old account owns, " "and then delete the old account, which will have the same effect." msgstr "" -#: warehouse/templates/pages/help.html:568 +#: warehouse/templates/pages/help.html:572 #, python-format msgid "" "PyPI users and projects can use <a href=\"%(docs)s\">Trusted " @@ -8233,15 +8231,15 @@ msgid "" "trusted third party service, eliminating the need to use API tokens." msgstr "" -#: warehouse/templates/pages/help.html:580 +#: warehouse/templates/pages/help.html:584 msgid "Yes, including RSS feeds of new packages and new releases." msgstr "" -#: warehouse/templates/pages/help.html:580 +#: warehouse/templates/pages/help.html:584 msgid "See the API reference." msgstr "" -#: warehouse/templates/pages/help.html:583 +#: warehouse/templates/pages/help.html:587 #, python-format msgid "" "If you need to run your own mirror of PyPI, the <a " @@ -8250,7 +8248,7 @@ msgid "" "terabyte—and growing!" msgstr "" -#: warehouse/templates/pages/help.html:586 +#: warehouse/templates/pages/help.html:590 #, python-format msgid "" "You can subscribe to the <a href=\"%(rss_href)s\" title=\"%(title)s\" " @@ -8261,7 +8259,7 @@ msgid "" "target=\"_blank\" rel=\"noopener\">GitHub apps</a>." msgstr "" -#: warehouse/templates/pages/help.html:589 +#: warehouse/templates/pages/help.html:593 #, python-format msgid "" "You can analyze PyPI project/package metadata and <a href=\"%(href)s\" " @@ -8269,7 +8267,7 @@ msgid "" "statistics</a> via our public dataset on Google BigQuery." msgstr "" -#: warehouse/templates/pages/help.html:591 +#: warehouse/templates/pages/help.html:595 #, python-format msgid "" "<a href=\"%(libs_io_href)s\" title=\"%(title)s\" target=\"_blank\" " @@ -8284,7 +8282,7 @@ msgid "" "rel=\"noopener\">other relevant factors</a>." msgstr "" -#: warehouse/templates/pages/help.html:600 +#: warehouse/templates/pages/help.html:604 #, python-format msgid "" "For recent statistics on uptime and performance, see <a href=\"%(href)s\"" @@ -8292,7 +8290,7 @@ msgid "" "page</a>." msgstr "" -#: warehouse/templates/pages/help.html:603 +#: warehouse/templates/pages/help.html:607 msgid "" "For each package hosted on PyPI, there are corresponding hashes for that " "file. These hashes can be used to verify that the file you are " @@ -8302,7 +8300,7 @@ msgid "" "from the JSON API. Here is an example of generating the hashes:" msgstr "" -#: warehouse/templates/pages/help.html:610 +#: warehouse/templates/pages/help.html:614 msgid "" "In practice, it would only be necessary to verify one of the hashes. It " "is not recommended to use the MD5 hash because of known security issues " @@ -8310,7 +8308,7 @@ msgid "" " only." msgstr "" -#: warehouse/templates/pages/help.html:617 +#: warehouse/templates/pages/help.html:621 #, python-format msgid "" "PyPI does not support publishing private packages. If you need to publish" @@ -8318,7 +8316,7 @@ msgid "" "run your own deployment of the <a href=\"%(href)s\">devpi project</a>." msgstr "" -#: warehouse/templates/pages/help.html:620 +#: warehouse/templates/pages/help.html:624 msgid "" "Your publishing tool may return an error that your new project can't be " "created with your desired name, despite no evidence of a project or " @@ -8326,7 +8324,7 @@ msgid "" "reasons this may occur:" msgstr "" -#: warehouse/templates/pages/help.html:622 +#: warehouse/templates/pages/help.html:626 #, python-format msgid "" "The project name conflicts with a <a href=\"%(href)s\" " @@ -8334,13 +8332,13 @@ msgid "" "Library</a> module from any major version from 2.5 to present." msgstr "" -#: warehouse/templates/pages/help.html:623 +#: warehouse/templates/pages/help.html:627 msgid "" "The project name is too similar to an existing project and may be " "confusable." msgstr "" -#: warehouse/templates/pages/help.html:624 +#: warehouse/templates/pages/help.html:628 #, python-format msgid "" "The project name has been explicitly prohibited by the PyPI " @@ -8349,18 +8347,18 @@ msgid "" "with a malicious package." msgstr "" -#: warehouse/templates/pages/help.html:625 +#: warehouse/templates/pages/help.html:629 msgid "" "The project name has been registered by another user, but no releases " "have been created." msgstr "" -#: warehouse/templates/pages/help.html:625 +#: warehouse/templates/pages/help.html:629 #, python-format msgid "See <a href=\"%(href)s\">%(anchor_text)s</a>" msgstr "" -#: warehouse/templates/pages/help.html:629 +#: warehouse/templates/pages/help.html:633 #, python-format msgid "" "Follow the <a href=\"%(href)s\" title=\"%(title)s\" target=\"_blank\" " @@ -8368,23 +8366,23 @@ msgid "" "title=\"Python enhancement proposal\">PEP</abbr> 541." msgstr "" -#: warehouse/templates/pages/help.html:633 +#: warehouse/templates/pages/help.html:637 msgid "" "Can upload releases for a package. Cannot add collaborators. Cannot " "delete files, releases, or the project." msgstr "" -#: warehouse/templates/pages/help.html:634 +#: warehouse/templates/pages/help.html:638 msgid "Owner:" msgstr "" -#: warehouse/templates/pages/help.html:634 +#: warehouse/templates/pages/help.html:638 msgid "" "Can upload releases. Can add other collaborators. Can delete files, " "releases, or the entire project." msgstr "" -#: warehouse/templates/pages/help.html:637 +#: warehouse/templates/pages/help.html:641 msgid "" "Only the current owners of a project have the ability to add new owners " "or maintainers. If you need to request ownership, you should contact the " @@ -8393,19 +8391,19 @@ msgid "" "project page." msgstr "" -#: warehouse/templates/pages/help.html:638 +#: warehouse/templates/pages/help.html:642 #, python-format msgid "If the owner is unresponsive, see <a href=\"%(href)s\">%(anchor_text)s</a>" msgstr "" -#: warehouse/templates/pages/help.html:642 +#: warehouse/templates/pages/help.html:646 msgid "" "When using <code>pyproject.toml</code> for project metadata, you can use " "the extension of the <code>readme</code> field value to control how PyPI " "renders your description." msgstr "" -#: warehouse/templates/pages/help.html:647 +#: warehouse/templates/pages/help.html:651 #, python-format msgid "" "For example, <code>readme = \"README.md\"</code> will render the " @@ -8414,7 +8412,7 @@ msgid "" "rel=\"noopener\">reStructuredText</a>" msgstr "" -#: warehouse/templates/pages/help.html:654 +#: warehouse/templates/pages/help.html:658 #, python-format msgid "" "Refer to the <a href=\"%(href)s\" title=\"%(title)s\" target=\"_blank\" " @@ -8422,62 +8420,40 @@ msgid "" "available formats." msgstr "" -#: warehouse/templates/pages/help.html:665 +#: warehouse/templates/pages/help.html:669 #, python-format msgid "" "If you can't upload your project's release to PyPI because you're hitting" " the upload file size limit (%(max_file_size_mb)s MiB by default; " -"individual projects may differ), we can sometimes increase your limit. " -"Make sure you've uploaded at least one release for the project that's " -"<em>under</em> the limit (a <a href=\"%(dev_release_href)s\" " -"title=\"%(title)s\" target=\"_blank\" rel=\"noopener\">developmental " -"release version number</a> is fine). Then, <a " -"href=\"%(file_issue_href)s\" title=\"%(title)s\" target=\"_blank\" " -"rel=\"noopener\">file an issue</a> and tell us:" -msgstr "" - -#: warehouse/templates/pages/help.html:674 -#: warehouse/templates/pages/help.html:696 -msgid "A link to your project on PyPI (or Test PyPI)" -msgstr "" - -#: warehouse/templates/pages/help.html:675 -msgid "The size of your release, in megabytes" +"individual projects may differ), we can sometimes increase your limit." msgstr "" #: warehouse/templates/pages/help.html:676 -msgid "Which index/indexes you need the increase for (PyPI, Test PyPI, or both)" -msgstr "" - -#: warehouse/templates/pages/help.html:677 -#: warehouse/templates/pages/help.html:698 +#, python-format msgid "" -"A brief description of your project, including the reason for the " -"additional size." +"See the <a href=\"%(href)s\">user documentation</a> for more information " +"on requesting a file size limit increase." msgstr "" -#: warehouse/templates/pages/help.html:684 +#: warehouse/templates/pages/help.html:685 #, python-format msgid "" "If you can't upload your project's release to PyPI because you're hitting" " the project size limit (%(max_project_size_gb)s GiB by default; " -"individual projects may differ), first remove any unnecessary releases or" -" individual files to lower your overall project size." +"individual projects may differ), first <a href=\"%(href)s\">remove any " +"unnecessary releases or individual files</a> to lower your overall " +"project size." msgstr "" -#: warehouse/templates/pages/help.html:691 +#: warehouse/templates/pages/help.html:694 #, python-format msgid "" -"If that is not possible, we can sometimes increase your limit. <a " -"href=\"%(file_issue_href)s\" title=\"%(title)s\" target=\"_blank\" " -"rel=\"noopener\">File an issue</a> and tell us:" -msgstr "" - -#: warehouse/templates/pages/help.html:697 -msgid "The total size of your project, in gigabytes" +"If that is not possible, we can sometimes increase your limit. See the <a" +" href=\"%(href)s\">user documentation</a> for more information on " +"requesting a project size limit increase." msgstr "" -#: warehouse/templates/pages/help.html:704 +#: warehouse/templates/pages/help.html:703 #, python-format msgid "" "PyPI receives reports on vulnerabilities in the packages hosted on it " @@ -8488,7 +8464,7 @@ msgid "" "Advisory Database</a>." msgstr "" -#: warehouse/templates/pages/help.html:709 +#: warehouse/templates/pages/help.html:708 #, python-format msgid "" "If you believe vulnerability data for your project is invalid or " @@ -8496,7 +8472,7 @@ msgid "" "target=\"_blank\" rel=\"noopener\">file an issue</a> with details." msgstr "" -#: warehouse/templates/pages/help.html:716 +#: warehouse/templates/pages/help.html:715 msgid "" "Deletion of a project, release or file on PyPI is permanent and " "irreversable, without exception. Deletion of a project makes it " @@ -8506,7 +8482,7 @@ msgid "" "PyPI administrators." msgstr "" -#: warehouse/templates/pages/help.html:731 +#: warehouse/templates/pages/help.html:730 #, python-format msgid "" "PyPI will reject uploads if the package description fails to render. You " @@ -8514,47 +8490,47 @@ msgid "" "command</a> to locally check a description for validity." msgstr "" -#: warehouse/templates/pages/help.html:737 +#: warehouse/templates/pages/help.html:736 msgid "" "If you've forgotten your PyPI password, but you remember your email " "address or username, follow these steps to reset your password:" msgstr "" -#: warehouse/templates/pages/help.html:739 +#: warehouse/templates/pages/help.html:738 #, python-format msgid "Go to <a href=\"%(href)s\">reset your password</a>." msgstr "" -#: warehouse/templates/pages/help.html:740 +#: warehouse/templates/pages/help.html:739 msgid "Enter the email address or username you used for PyPI and submit the form." msgstr "" -#: warehouse/templates/pages/help.html:741 +#: warehouse/templates/pages/help.html:740 msgid "You'll receive an email with a password reset link." msgstr "" -#: warehouse/templates/pages/help.html:746 +#: warehouse/templates/pages/help.html:745 msgid "" "If you've lost access to your PyPI account or can't fully verify it due " "to:" msgstr "" -#: warehouse/templates/pages/help.html:748 +#: warehouse/templates/pages/help.html:747 msgid "Lost access to the email address associated with your account" msgstr "" -#: warehouse/templates/pages/help.html:749 +#: warehouse/templates/pages/help.html:748 msgid "Accidentally registered with an email address you cannot verify" msgstr "" -#: warehouse/templates/pages/help.html:750 +#: warehouse/templates/pages/help.html:749 msgid "" "Lost two-factor authentication <a href=\"#totp\">application</a>, <a " "href=\"#utfkey\">device</a>, and <a href=\"#recoverycodes\">recovery " "codes</a>" msgstr "" -#: warehouse/templates/pages/help.html:753 +#: warehouse/templates/pages/help.html:752 #, python-format msgid "" "You can proceed to <a href=\"%(href)s\" title=\"%(title)s\" " @@ -8562,28 +8538,28 @@ msgid "" "request assistance with account recovery." msgstr "" -#: warehouse/templates/pages/help.html:761 +#: warehouse/templates/pages/help.html:760 msgid "Ensure that your API Token is valid and has not been revoked." msgstr "" -#: warehouse/templates/pages/help.html:762 +#: warehouse/templates/pages/help.html:761 msgid "" "Ensure that your API Token is <a href=\"#apitoken\">properly " "formatted</a> and does not contain any trailing characters such as " "newlines." msgstr "" -#: warehouse/templates/pages/help.html:763 +#: warehouse/templates/pages/help.html:762 msgid "Ensure that the username you are using is <code>__token__</code>." msgstr "" -#: warehouse/templates/pages/help.html:765 +#: warehouse/templates/pages/help.html:764 msgid "" "Remember that PyPI and TestPyPI each require you to create an account, so" " your credentials may be different." msgstr "" -#: warehouse/templates/pages/help.html:767 +#: warehouse/templates/pages/help.html:766 #, python-format msgid "" "If you're using Windows and trying to paste your token in the Command " @@ -8595,7 +8571,7 @@ msgid "" "module." msgstr "" -#: warehouse/templates/pages/help.html:776 +#: warehouse/templates/pages/help.html:775 #, python-format msgid "" "Transport Layer Security, or TLS, is part of how we make sure connections" @@ -8607,7 +8583,7 @@ msgid "" "target=\"_blank\" rel=\"noopener\">Learn why on the PSF blog</a>." msgstr "" -#: warehouse/templates/pages/help.html:783 +#: warehouse/templates/pages/help.html:782 #, python-format msgid "" "If you are having trouble with <code>%(command)s</code> and get a " @@ -8616,7 +8592,7 @@ msgid "" "information:" msgstr "" -#: warehouse/templates/pages/help.html:785 +#: warehouse/templates/pages/help.html:784 msgid "" "If you see an error like <code>There was a problem confirming the ssl " "certificate</code> or <code>tlsv1 alert protocol version</code> or " @@ -8624,7 +8600,7 @@ msgid "" "PyPI with a newer TLS support library." msgstr "" -#: warehouse/templates/pages/help.html:786 +#: warehouse/templates/pages/help.html:785 msgid "" "The specific steps you need to take will depend on your operating system " "version, where your installation of Python originated (python.org, your " @@ -8632,7 +8608,7 @@ msgid "" " Python, <code>setuptools</code>, and <code>pip</code>." msgstr "" -#: warehouse/templates/pages/help.html:788 +#: warehouse/templates/pages/help.html:787 #, python-format msgid "" "For help, go to <a href=\"%(irc_href)s\" title=\"%(title)s\" " @@ -8645,7 +8621,7 @@ msgid "" "of <code>%(command)s</code>." msgstr "" -#: warehouse/templates/pages/help.html:799 +#: warehouse/templates/pages/help.html:798 #, python-format msgid "" "We take <a href=\"%(href)s\" title=\"%(title)s\" target=\"_blank\" " @@ -8653,7 +8629,7 @@ msgid "" "website easy to use for everyone." msgstr "" -#: warehouse/templates/pages/help.html:804 +#: warehouse/templates/pages/help.html:803 #, python-format msgid "" "If you are experiencing an accessibility problem, <a href=\"%(href)s\" " @@ -8661,7 +8637,7 @@ msgid "" " GitHub</a>, so we can try to fix the problem, for you and others." msgstr "" -#: warehouse/templates/pages/help.html:812 +#: warehouse/templates/pages/help.html:811 #, python-format msgid "" "In a previous version of PyPI, it used to be possible for maintainers to " @@ -8671,7 +8647,7 @@ msgid "" "rel=\"noopener\">use twine to upload your project to PyPI</a>." msgstr "" -#: warehouse/templates/pages/help.html:821 +#: warehouse/templates/pages/help.html:820 msgid "" "Spammers return to PyPI with some regularity hoping to place their Search" " Engine Optimized phishing, scam, and click-farming content on the site. " @@ -8680,7 +8656,7 @@ msgid "" "prime target." msgstr "" -#: warehouse/templates/pages/help.html:823 +#: warehouse/templates/pages/help.html:822 #, python-format msgid "" "When the PyPI administrators are overwhelmed by spam <strong>or</strong> " @@ -8691,35 +8667,35 @@ msgid "" "have updated it with reasoning for the intervention." msgstr "" -#: warehouse/templates/pages/help.html:832 +#: warehouse/templates/pages/help.html:831 msgid "PyPI will return these errors for one of these reasons:" msgstr "" -#: warehouse/templates/pages/help.html:834 +#: warehouse/templates/pages/help.html:833 msgid "Filename has been used and file exists" msgstr "" -#: warehouse/templates/pages/help.html:835 +#: warehouse/templates/pages/help.html:834 msgid "Filename has been used but file no longer exists" msgstr "" -#: warehouse/templates/pages/help.html:836 +#: warehouse/templates/pages/help.html:835 msgid "A file with the exact same content exists" msgstr "" -#: warehouse/templates/pages/help.html:839 +#: warehouse/templates/pages/help.html:838 msgid "" "PyPI does not allow for a filename to be reused, even once a project has " "been deleted and recreated." msgstr "" -#: warehouse/templates/pages/help.html:845 +#: warehouse/templates/pages/help.html:844 msgid "" "A distribution filename on PyPI consists of the combination of project " "name, version number, and distribution type." msgstr "" -#: warehouse/templates/pages/help.html:851 +#: warehouse/templates/pages/help.html:850 msgid "" "This ensures that a given distribution for a given release for a given " "project will always resolve to the same file, and cannot be " @@ -8727,14 +8703,14 @@ msgid "" " party (it can only be removed)." msgstr "" -#: warehouse/templates/pages/help.html:859 +#: warehouse/templates/pages/help.html:858 msgid "" "To avoid this situation in most cases, you will need to change the " "version number to one that you haven't previously uploaded to PyPI, " "rebuild the distribution, and then upload the new distribution." msgstr "" -#: warehouse/templates/pages/help.html:868 +#: warehouse/templates/pages/help.html:867 #, python-format msgid "" "If you would like to request a new trove classifier file a pull request " @@ -8743,7 +8719,7 @@ msgid "" " to include a brief justification of why it is important." msgstr "" -#: warehouse/templates/pages/help.html:876 +#: warehouse/templates/pages/help.html:875 #, python-format msgid "" "If you're experiencing an issue with PyPI itself, we welcome " @@ -8754,14 +8730,14 @@ msgid "" " first check that a similar issue does not already exist." msgstr "" -#: warehouse/templates/pages/help.html:883 +#: warehouse/templates/pages/help.html:882 msgid "" "If you are having an issue is with a specific package installed from " "PyPI, you should reach out to the maintainers of that project directly " "instead." msgstr "" -#: warehouse/templates/pages/help.html:888 +#: warehouse/templates/pages/help.html:887 msgid "" "If you are having issues while setting up a <abbr title=\"time-based one-" "time password\">TOTP</abbr> device, it may be because your device time is" @@ -8769,7 +8745,7 @@ msgid "" "automatically, and try setting up the device again." msgstr "" -#: warehouse/templates/pages/help.html:895 +#: warehouse/templates/pages/help.html:894 #, python-format msgid "" "Projects may get placed in quarantine for any number of reasons, such as " @@ -8779,14 +8755,14 @@ msgid "" "Policy</a>." msgstr "" -#: warehouse/templates/pages/help.html:904 +#: warehouse/templates/pages/help.html:903 msgid "" "While in quarantine, the project is not installable by clients, and " "cannot be being modified by its maintainers. PyPI Administrators will " "need to review this project before it can be restored." msgstr "" -#: warehouse/templates/pages/help.html:911 +#: warehouse/templates/pages/help.html:910 #, python-format msgid "" "If you believe your project has mistakenly been flagged for quarantine, " @@ -8794,7 +8770,7 @@ msgid "" "details." msgstr "" -#: warehouse/templates/pages/help.html:924 +#: warehouse/templates/pages/help.html:923 #, python-format msgid "" "PyPI is powered by the Warehouse project; <a href=\"%(href)s\" " @@ -8804,7 +8780,7 @@ msgid "" "Group (PackagingWG)." msgstr "" -#: warehouse/templates/pages/help.html:929 +#: warehouse/templates/pages/help.html:928 #, python-format msgid "" "The <a href=\"%(href)s\" title=\"%(title)s\" target=\"_blank\" " @@ -8813,7 +8789,7 @@ msgid "" "Python packaging." msgstr "" -#: warehouse/templates/pages/help.html:934 +#: warehouse/templates/pages/help.html:933 #, python-format msgid "" "The <a href=\"%(packaging_wg_href)s\" title=\"%(title)s\" " @@ -8826,7 +8802,7 @@ msgid "" "Warehouse's security and accessibility." msgstr "" -#: warehouse/templates/pages/help.html:944 +#: warehouse/templates/pages/help.html:943 #, python-format msgid "" "PyPI is powered by <a href=\"%(warehouse_href)s\" title=\"%(title)s\" " @@ -8835,14 +8811,14 @@ msgid "" " sponsors</a>." msgstr "" -#: warehouse/templates/pages/help.html:951 +#: warehouse/templates/pages/help.html:950 msgid "" "As of April 16, 2018, PyPI.org is at \"production\" status, meaning that " "it has moved out of beta and replaced the old site (pypi.python.org). It " "is now robust, tested, and ready for expected browser and API traffic." msgstr "" -#: warehouse/templates/pages/help.html:953 +#: warehouse/templates/pages/help.html:952 #, python-format msgid "" "PyPI is heavily cached and distributed via <abbr title=\"content delivery" @@ -8859,7 +8835,7 @@ msgid "" "href=\"%(private_index_href)s\">private index</a>." msgstr "" -#: warehouse/templates/pages/help.html:967 +#: warehouse/templates/pages/help.html:966 #, python-format msgid "" "We have a huge amount of work to do to continue to maintain and improve " @@ -8867,22 +8843,22 @@ msgid "" "target=\"_blank\" rel=\"noopener\">the Warehouse project</a>)." msgstr "" -#: warehouse/templates/pages/help.html:972 +#: warehouse/templates/pages/help.html:971 msgid "Financial:" msgstr "" -#: warehouse/templates/pages/help.html:972 +#: warehouse/templates/pages/help.html:971 #, python-format msgid "" "We would deeply appreciate <a href=\"%(href)s\">your donations to fund " "development and maintenance</a>." msgstr "" -#: warehouse/templates/pages/help.html:973 +#: warehouse/templates/pages/help.html:972 msgid "Development:" msgstr "" -#: warehouse/templates/pages/help.html:973 +#: warehouse/templates/pages/help.html:972 msgid "" "Warehouse is open source, and we would love to see some new faces working" " on the project. You <strong>do not</strong> need to be an experienced " @@ -8890,7 +8866,7 @@ msgid "" " you make your first open source pull request!" msgstr "" -#: warehouse/templates/pages/help.html:975 +#: warehouse/templates/pages/help.html:974 #, python-format msgid "" "If you have skills in Python, Full-Text Search, HTML, SCSS, JavaScript, " @@ -8904,7 +8880,7 @@ msgid "" "here." msgstr "" -#: warehouse/templates/pages/help.html:983 +#: warehouse/templates/pages/help.html:982 #, python-format msgid "" "Issues are grouped into <a href=\"%(href)s\" title=\"%(title)s\" " @@ -8914,11 +8890,11 @@ msgid "" " we can guide you through the contribution process." msgstr "" -#: warehouse/templates/pages/help.html:990 +#: warehouse/templates/pages/help.html:989 msgid "Stay updated:" msgstr "" -#: warehouse/templates/pages/help.html:991 +#: warehouse/templates/pages/help.html:990 #, python-format msgid "" "You can also follow the ongoing development of the project on the <a " @@ -8926,7 +8902,7 @@ msgid "" "rel=\"noopener\">Python packaging forum on Discourse</a>." msgstr "" -#: warehouse/templates/pages/help.html:1000 +#: warehouse/templates/pages/help.html:999 #, python-format msgid "" "Changes to PyPI are generally announced on both the <a " @@ -8938,21 +8914,21 @@ msgid "" "rel=\"noopener\">RSS</a> feed." msgstr "" -#: warehouse/templates/pages/help.html:1009 +#: warehouse/templates/pages/help.html:1008 #, python-format msgid "" "All traffic is routed through our global CDN, which lists their public IP" " addresses here: <a href=\"%(href)s\">%(href)s</a>." msgstr "" -#: warehouse/templates/pages/help.html:1010 +#: warehouse/templates/pages/help.html:1009 #, python-format msgid "" "More information about this list can be found here: <a " "href=\"%(href)s\">%(href)s</a>." msgstr "" -#: warehouse/templates/pages/help.html:1014 +#: warehouse/templates/pages/help.html:1013 msgid "" "When Warehouse's maintainers are deploying new features, at first we mark" " them with a small \"beta feature\" symbol to tell you: this should " @@ -8960,11 +8936,11 @@ msgid "" "functionality." msgstr "" -#: warehouse/templates/pages/help.html:1015 +#: warehouse/templates/pages/help.html:1014 msgid "Currently, no features are in beta." msgstr "" -#: warehouse/templates/pages/help.html:1019 +#: warehouse/templates/pages/help.html:1018 #, python-format msgid "" "\"PyPI\" should be pronounced like \"pie pea eye\", specifically with the" @@ -8974,39 +8950,39 @@ msgid "" "implementation of the Python language." msgstr "" -#: warehouse/templates/pages/help.html:1031 +#: warehouse/templates/pages/help.html:1030 msgid "Resources" msgstr "" -#: warehouse/templates/pages/help.html:1032 +#: warehouse/templates/pages/help.html:1031 msgid "Looking for something else? Perhaps these links will help:" msgstr "" -#: warehouse/templates/pages/help.html:1034 +#: warehouse/templates/pages/help.html:1033 msgid "Python Packaging User Guide" msgstr "" -#: warehouse/templates/pages/help.html:1035 +#: warehouse/templates/pages/help.html:1034 msgid "Python documentation" msgstr "" -#: warehouse/templates/pages/help.html:1036 +#: warehouse/templates/pages/help.html:1035 msgid "(main Python website)" msgstr "" -#: warehouse/templates/pages/help.html:1037 +#: warehouse/templates/pages/help.html:1036 msgid "Python community page" msgstr "" -#: warehouse/templates/pages/help.html:1037 +#: warehouse/templates/pages/help.html:1036 msgid "(lists IRC channels, mailing lists, etc.)" msgstr "" -#: warehouse/templates/pages/help.html:1040 +#: warehouse/templates/pages/help.html:1039 msgid "Contact" msgstr "" -#: warehouse/templates/pages/help.html:1042 +#: warehouse/templates/pages/help.html:1041 #, python-format msgid "" "The <a href=\"%(pypa_href)s\" title=\"%(title)s\" target=\"_blank\" " diff --git a/warehouse/templates/manage/project/release.html b/warehouse/templates/manage/project/release.html index a8f94babf79d..c571e51270e0 100644 --- a/warehouse/templates/manage/project/release.html +++ b/warehouse/templates/manage/project/release.html @@ -191,7 +191,7 @@ <h3>{% trans %}Delete release{% endtrans %}</h3> {% endif %} <p>{% trans %}You will not be able to re-upload a new distribution of the same type with the same version number.{% endtrans %}</p> <p>{% trans %}Deletion will break any downstream projects relying on a pinned version of this package. It is intended as a last resort to address legal issues or remove harmful releases.{% endtrans %}</p> - <p>{% trans yank_href=request.help_url(_anchor='yanked'), post_href='https://www.python.org/dev/peps/pep-0440/#post-releases', title=gettext('External link') %}Consider <a href="{{ yank_href }}" title="{{ title }}" target="_blank" rel="noopener">yanking</a> this release, making a new release or a <a href="{{ post_href }}" title="{{ title }}" target="_blank" rel="noopener">post release</a> instead.{% endtrans %}</p> + <p>{% trans yank_href=request.user_docs_url('/project-management/yanking'), post_href='https://www.python.org/dev/peps/pep-0440/#post-releases', title=gettext('External link') %}Consider <a href="{{ yank_href }}" title="{{ title }}" target="_blank" rel="noopener">yanking</a> this release, making a new release or a <a href="{{ post_href }}" title="{{ title }}" target="_blank" rel="noopener">post release</a> instead.{% endtrans %}</p> <ul class="no-bullets"> <li><input type="checkbox" data-action="input->delete-confirm#check" data-delete-confirm-target="input"> {% trans release_version=release.version %}I understand that I am permanently deleting all files for the {{ release_version }} release of this project.{% endtrans %}</li> <li><input type="checkbox" data-action="input->delete-confirm#check" data-delete-confirm-target="input"> {% trans %}I understand that my users will no longer be able to install this release of this project.{% endtrans %}</li> diff --git a/warehouse/templates/manage/project/releases.html b/warehouse/templates/manage/project/releases.html index 2323dced787b..edb92153045b 100644 --- a/warehouse/templates/manage/project/releases.html +++ b/warehouse/templates/manage/project/releases.html @@ -137,7 +137,7 @@ {% set custom_warning_text %} <p>{% trans %}You will not be able to re-upload a new distribution of the same type with the same version number.{% endtrans %}</p> <p>{% trans %}Deletion will break any downstream projects relying on a pinned version of this package. It is intended as a last resort to address legal issues or remove harmful releases.{% endtrans %}</p> - <p>{% trans yank_href=request.help_url(_anchor='yanked'), post_href='https://www.python.org/dev/peps/pep-0440/#post-releases', title=gettext('External link') %}Consider <a href="{{ yank_href }}" title="{{ title }}" target="_blank" rel="noopener">yanking</a> this release, making a new release or a <a href="{{ post_href }}" title="{{ title }}" target="_blank" rel="noopener">post release</a> instead.{% endtrans %}</p> + <p>{% trans yank_href=request.user_docs_url('/project-management/yanking'), post_href='https://www.python.org/dev/peps/pep-0440/#post-releases', title=gettext('External link') %}Consider <a href="{{ yank_href }}" title="{{ title }}" target="_blank" rel="noopener">yanking</a> this release, making a new release or a <a href="{{ post_href }}" title="{{ title }}" target="_blank" rel="noopener">post release</a> instead.{% endtrans %}</p> {% endset %} {{ confirm_modal(title, gettext('Version'), 'delete_version', release.version, slug, custom_warning_text=custom_warning_text, action=action) }} {% endif %} diff --git a/warehouse/templates/manage/project/settings.html b/warehouse/templates/manage/project/settings.html index 940aecc8549a..baf8f12737fe 100644 --- a/warehouse/templates/manage/project/settings.html +++ b/warehouse/templates/manage/project/settings.html @@ -28,7 +28,7 @@ <h2>{% trans %}Project settings{% endtrans %}</h2> {% else %} Default ({{ MAX_FILESIZE|filesizeformat(binary=True) }}) {% endif %} - {% trans help_url=request.help_url(_anchor='file-size-limit') %} + {% trans help_url=request.user_docs_url("/project-management/storage-limits", anchor="requesting-a-file-size-limit-increase") %} <a href="{{ help_url }}"> (request an increase) </a>{% endtrans %}</li> <li>Project total size limit: {% if project.total_size_limit %} @@ -36,7 +36,7 @@ <h2>{% trans %}Project settings{% endtrans %}</h2> {% else %} Default ({{ MAX_PROJECT_SIZE|filesizeformat(binary=True) }}) {% endif %} - {% trans help_url=request.help_url(_anchor='project-size-limit') %} + {% trans help_url=request.user_docs_url("/project-management/storage-limits", anchor="requesting-a-project-size-limit-increase") %} <a href="{{ help_url }}"> (request an increase) </a>{% endtrans %}</li> </ul> diff --git a/warehouse/templates/pages/help.html b/warehouse/templates/pages/help.html index ba11f64550d4..ea0e46667a38 100644 --- a/warehouse/templates/pages/help.html +++ b/warehouse/templates/pages/help.html @@ -248,19 +248,23 @@ <h3 id="trove-classifier">{{ trove_classifier() }}</h3> <h3 id="yanked">{{ yanked() }}</h3> <p> - {% trans href='https://www.python.org/dev/peps/pep-0592/', title=gettext('External link') %} - A yanked release is a release that is always ignored by an installer, unless it is the only release that matches a version specifier (using either <code>==</code> or <code>===</code>). See <a href="{{ href }}" title="{{ title }}" target="_blank" rel="noopener"><abbr title="Python enhancement proposal">PEP</abbr> 592</a> for more information. + {% trans href=request.user_docs_url('/project-management/yanking') %} + A yanked release is a release that is always ignored by an installer, + unless it is the only release that matches a version specifier (using either + <code>==</code> or <code>===</code>). + See <a href="{{ href }}" title="{{ title }}">the user documentation</a> + for more information, including how to yank a release. {% endtrans %} </p> <h3 id="archived-project">{{ archived_project() }}</h3> <p> - {% trans %} + {% trans href=request.user_docs_url('/project-management/yanking') %} An archived project is a project that is no longer receiving any updates. A project maintainer can mark a project as archived to signal to users that future updates should not be expected. Archived projects are publicly visible and can still be resolved from the index by default, unlike deleted or - <a href="#yanked">yanked</a> releases. + <a href="{{ href }}">yanked</a> releases. {% endtrans %} </p> </section> @@ -663,41 +667,36 @@ <h3 id="file-size-limit">{{ file_size_limit() }}</h3> {% set max_file_size_mb = request.registry.settings.get('warehouse.forklift.legacy.MAX_FILESIZE_MIB') %} <p> {% trans dev_release_href='https://www.python.org/dev/peps/pep-0440/#developmental-releases', file_issue_href='https://github.com/pypi/support/issues/new?assignees=&labels=limit+request&template=limit-request-file.yml&title=File+Limit+Request%3A+PROJECT_NAME+-+000+MB', title=gettext('External link') %} - If you can't upload your project's release to PyPI because you're hitting the upload file size limit ({{ max_file_size_mb }} MiB by default; individual projects may differ), - we can sometimes increase your limit. Make sure you've uploaded at least one release - for the project that's <em>under</em> the limit - (a <a href="{{ dev_release_href }}" title="{{ title }}" target="_blank" rel="noopener">developmental release version number</a> is fine). - Then, <a href="{{ file_issue_href }}" title="{{ title }}" target="_blank" rel="noopener">file an issue</a> and tell us: + If you can't upload your project's release to PyPI because you're hitting the upload + file size limit ({{ max_file_size_mb }} MiB by default; individual projects may differ), + we can sometimes increase your limit. + {% endtrans %} + </p> + <p> + {% trans href=request.user_docs_url('/project-management/storage-limits/', anchor="requesting-a-file-size-limit-increase") %} + See the <a href="{{ href }}">user documentation</a> for more information + on requesting a file size limit increase. {% endtrans %} </p> - <ul> - <li>{% trans %}A link to your project on PyPI (or Test PyPI){% endtrans %}</li> - <li>{% trans %}The size of your release, in megabytes{% endtrans %}</li> - <li>{% trans %}Which index/indexes you need the increase for (PyPI, Test PyPI, or both){% endtrans %}</li> - <li>{% trans %}A brief description of your project, including the reason for the additional size.{% endtrans %}</li> - </ul> - {{ code_of_conduct() }} <h3 id="project-size-limit">{{ project_size_limit() }}</h3> <p> {% set max_project_size_gb = request.registry.settings.get('warehouse.forklift.legacy.MAX_PROJECT_SIZE_GIB') %} - {% trans %} + {% trans href=request.user_docs_url('/project-management/storage-limits/', anchor="freeing-up-storage-on-an-existing-project") %} If you can't upload your project's release to PyPI because you're - hitting the project size limit ({{ max_project_size_gb }} GiB by default; individual projects may differ), first remove any unnecessary - releases or individual files to lower your overall project size. + hitting the project size limit ({{ max_project_size_gb }} GiB by default; + individual projects may differ), first + <a href="{{ href }}">remove any unnecessary releases or individual files</a> to lower + your overall project size. {% endtrans %} </p> <p> - {% trans file_issue_href='https://github.com/pypi/support/issues/new?assignees=&labels=limit+request&template=limit-request-project.yml&title=Project+Limit+Request%3A+PROJECT_NAME+-+00+GB', title=gettext('External link') %} - If that is not possible, we can sometimes increase your limit. <a href="{{ file_issue_href }}" title="{{ title }}" target="_blank" rel="noopener">File an issue</a> and tell us: + {% trans href=request.user_docs_url('/project-management/storage-limits/', anchor="requesting-a-project-size-limit-increase") %} + If that is not possible, we can sometimes increase your limit. + See the <a href="{{ href }}">user documentation</a> for more information + on requesting a project size limit increase. {% endtrans %} </p> - <ul> - <li>{% trans %}A link to your project on PyPI (or Test PyPI){% endtrans %}</li> - <li>{% trans %}The total size of your project, in gigabytes{% endtrans %}</li> - <li>{% trans %}A brief description of your project, including the reason for the additional size.{% endtrans %}</li> - </ul> - {{ code_of_conduct() }} <h3 id="vulnerability-data">{{ vulnerability_data() }}</h3> <p>