Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor pkgs/sagemath-*/setup.py through sage_setup.sage_setup #36649

Closed
wants to merge 8 commits into from

Conversation

mkoeppe
Copy link
Member

@mkoeppe mkoeppe commented Nov 5, 2023

Just replacing boilerplate code by a function call.
There should be no change in the contents of sdists and wheels from this PR.

(Cherry picked from #35095, also seen in #36380, #36566, which will be rebased on top of this PR.)

📝 Checklist

  • The title is concise, informative, and self-explanatory.
  • The description explains in detail what this PR is about.
  • I have linked a relevant issue or discussion.
  • I have created tests covering the changes.
  • I have updated the documentation accordingly.

⌛ Dependencies

@mkoeppe mkoeppe self-assigned this Nov 5, 2023
@mkoeppe mkoeppe marked this pull request as ready for review November 5, 2023 05:16
@kwankyu
Copy link
Collaborator

kwankyu commented Nov 5, 2023

I tested this PR with

make SAGE_WHEELS=yes sagemath_categories-build-deps sagemath_repl && ./sage -sh -c '(cd pkgs/sagemath-categories && SAGE_NUM_THREADS=8 tox -v -v -v -e sagepython-sagewheels-nopypi-norequirements)'

which failed with

Processing ./.tox/.tmp/package/1/sagemath-categories-10.2b9.tar.gz
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: sagemath-categories
  Building wheel for sagemath-categories (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Building wheel for sagemath-categories (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [413 lines of output]
      Building interpreters for fast_callable
      -> Force rebuilding interpreters
      Compiling sage/rings/ring.pyx because it changed.
      Compiling sage/categories/coercion_methods.pyx because it changed.
      Compiling sage/categories/examples/semigroups_cython.pyx because it changed.
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      from sage.structure.parent_gens cimport ParentWithGens
      ^
      ------------------------------------------------------------
      
      sage/rings/ring.pxd:1:0: 'sage/structure/parent_gens.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      
      The purpose of this Cython module is to hold special coercion methods,
      which are inserted by their respective categories.
      """
      
      from sage.structure.element cimport Element
      ^
      ------------------------------------------------------------
      
      sage/categories/coercion_methods.pyx:8:0: 'sage/structure/element.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      
      The purpose of this Cython module is to hold special coercion methods,
      which are inserted by their respective categories.
      """
      
      from sage.structure.element cimport Element
      ^
      ------------------------------------------------------------
      
      sage/categories/coercion_methods.pyx:8:0: 'sage/structure/element/Element.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      from sage.structure.parent_gens cimport ParentWithGens
      ^
      ------------------------------------------------------------
      
      sage/rings/ring.pxd:1:0: 'sage/structure/parent_gens/ParentWithGens.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      from sage.structure.parent_gens cimport ParentWithGens
      
      cpdef bint _is_Field(x) except -2
      
      cdef class Ring(ParentWithGens):
                      ^
      ------------------------------------------------------------
      
      sage/rings/ring.pxd:5:16: First base of 'Ring' is not an extension type
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
              ....:                                       '_mul_parent')
              True
              sage: x._mul_parent.__func__ is sage.categories.coercion_methods._mul_parent
              True
          """
          return (<Element>self)._parent.product(self, other)
                   ^
      ------------------------------------------------------------
      
      sage/categories/coercion_methods.pyx:53:13: 'Element' is not a type identifier
      Traceback (most recent call last):
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1345, in cythonize_one_helper
          return cythonize_one(*m)
                 ^^^^^^^^^^^^^^^^^
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1321, in cythonize_one
          raise CompileError(None, pyx_file)
      Cython.Compiler.Errors.CompileError: sage/categories/coercion_methods.pyx
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      r"""
      Examples of semigroups in cython
      """
      
      from sage.structure.parent cimport Parent
      ^
      ------------------------------------------------------------
      
      sage/categories/examples/semigroups_cython.pyx:5:0: 'sage/structure/parent.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      r"""
      Examples of semigroups in cython
      """
      
      from sage.structure.parent cimport Parent
      ^
      ------------------------------------------------------------
      
      sage/categories/examples/semigroups_cython.pyx:5:0: 'sage/structure/parent/Parent.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      r"""
      Examples of semigroups in cython
      """
      
      from sage.structure.parent cimport Parent
      from sage.structure.element cimport Element
      ^
      ------------------------------------------------------------
      
      sage/categories/examples/semigroups_cython.pyx:6:0: 'sage/structure/element.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      r"""
      Examples of semigroups in cython
      """
      
      from sage.structure.parent cimport Parent
      from sage.structure.element cimport Element
      ^
      ------------------------------------------------------------
      
      sage/categories/examples/semigroups_cython.pyx:6:0: 'sage/structure/element/Element.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
                      True
                  """
                  return True
      
      
      cdef class LeftZeroSemigroupElement(Element):
                                          ^
      ------------------------------------------------------------
      
      sage/categories/examples/semigroups_cython.pyx:49:36: First base of 'LeftZeroSemigroupElement' is not an extension type
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      #                  http://www.gnu.org/licenses/
      #*****************************************************************************
      
      from sage.misc.cachefunc import cached_method
      
      from sage.structure.coerce cimport coercion_model
      ^
      ------------------------------------------------------------
      
      sage/rings/ring.pyx:71:0: 'sage/structure/coerce.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      #                  http://www.gnu.org/licenses/
      #*****************************************************************************
      
      from sage.misc.cachefunc import cached_method
      
      from sage.structure.coerce cimport coercion_model
      ^
      ------------------------------------------------------------
      
      sage/rings/ring.pyx:71:0: 'sage/structure/coerce/coercion_model.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      #*****************************************************************************
      
      from sage.misc.cachefunc import cached_method
      
      from sage.structure.coerce cimport coercion_model
      from sage.structure.parent cimport Parent
      ^
      ------------------------------------------------------------
      
      sage/rings/ring.pyx:72:0: 'sage/structure/parent.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
                  sage: from sage.categories.examples.semigroups_cython import LeftZeroSemigroup
                  sage: S = LeftZeroSemigroup()
                  sage: x = S(3)
                  sage: TestSuite(x).run()
              """
              Element.__init__(self, parent=parent)
                     ^
      ------------------------------------------------------------
      
      sage/categories/examples/semigroups_cython.pyx:61:15: cimported module has no attribute '__init__'
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
                  sage: S = LeftZeroSemigroup()
                  sage: S.category()
                  Category of idempotent semigroups
                  sage: TestSuite(S).run()
              """
              Parent.__init__(self, category=IdempotentSemigroups())
                    ^
      ------------------------------------------------------------
      
      sage/categories/examples/semigroups_cython.pyx:218:14: cimported module has no attribute '__init__'
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      #*****************************************************************************
      
      from sage.misc.cachefunc import cached_method
      
      from sage.structure.coerce cimport coercion_model
      from sage.structure.parent cimport Parent
      ^
      ------------------------------------------------------------
      
      sage/rings/ring.pyx:72:0: 'sage/structure/parent/Parent.pxd' not found
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
      from sage.categories.euclidean_domains import EuclideanDomains
      
      _Rings = Rings()
      _CommutativeRings = CommutativeRings()
      
      cdef class Ring(ParentWithGens):
                      ^
      ------------------------------------------------------------
      
      sage/rings/ring.pyx:85:16: First base of 'Ring' is not an extension type
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
              if proof:
                  raise NotImplementedError("No way to prove that %s is an integral domain!" % self)
              else:
                  return False
      
          cpdef bint is_exact(self) except -2:
                ^
      ------------------------------------------------------------
      
      sage/rings/ring.pyx:742:10: C method 'is_exact' not previously declared in definition part of extension type 'Ring'
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
                  sage: S = LeftZeroSemigroup()
                  sage: S.category()
                  Category of idempotent semigroups
                  sage: TestSuite(S).run()
              """
              Parent.__init__(self, category=IdempotentSemigroups())
                                                                 ^
      ------------------------------------------------------------
      
      sage/categories/examples/semigroups_cython.pyx:218:59: Compiler crash in OptimizeBuiltinCalls
      
      ModuleNode.body = StatListNode(semigroups_cython.pyx:5:0)
      StatListNode.stats[8] = PyClassDefNode(semigroups_cython.pyx:128:0,
          doc = "\n    An example of semigroup\n\n    This class illustrates a minimal implementation of a semi-group\n    where the element class is an extension type, and still gets code\n    from the category. The category itself must be a Python class\n    though.\n\n    This is purely a proof of concept. The code obviously needs refactorisation!\n\n    Comments:\n\n    - one cannot play ugly class surgery tricks (as with _mul_parent).\n      available operations should really be declared to the coercion model!\n\n    EXAMPLES::\n\n        sage: from sage.categories.examples.semigroups_cython import LeftZeroSemigroup\n        sage: S = LeftZeroSemigroup(); S\n        An example of a semigroup: the left zero semigroup\n\n    This is the semigroup which contains all sort of objects::\n\n        sage: S.some_elements()\n        [3, 42, 'a', 3.4, 'raton laveur']\n\n    with product rule given by `a \\times b = a` for all `a,b`. ::\n\n        sage: S('hello') * S('world')\n        'hello'\n\n        sage: S(3)*S(1)*S(2)\n        3\n\n        sage: S(3)^12312321312321\n        3\n\n        sage: TestSuite(S).run(verbose = True)\n        running ._test_an_element() . . . pass\n        running ._test_associativity() . . . pass\n        running ._test_cardinality() . . . pass\n        running ._test_category() . . . pass\n        running ._test_construction() . . . pass\n        running ._test_elements() . . .\n          Running the test suite of self.an_element()\n          running ._test_category() . . . pass\n          running ._test_eq() . . . pass\n          running ._test_new() . . . pass\n          running ._test_not_implemented_methods() . . . pass\n          running ._test_pickling() . . . pass\n          pass\n        running ._test_elements_eq_reflexive() . . . pass\n        running ._test_elements_eq_symmetric() . . . pass\n        running ._test_elements_eq_transitive() . . . pass\n        running ._test_elements_neq() . . . pass\n        running ._test_eq() . . . pass\n        running ._test_new() . . . pass\n        running ._test_not_implemented_methods() . . . pass\n        running ._test_pickling() . . . pass\n        running ._test_some_elements() . . . pass\n\n    That's really the only method which is obtained from the category ... ::\n\n        sage: S(42).is_idempotent\n        <bound method IdempotentSemigroups.ElementMethods.is_idempotent of 42>\n        sage: S(42).is_idempotent()\n        True\n\n        sage: S(42)._pow_int\n        <bound method IdempotentSemigroups.ElementMethods._pow_int of 42>\n        sage: S(42)^10\n        42\n\n        sage: S(42).is_idempotent\n        <bound method IdempotentSemigroups.ElementMethods.is_idempotent of 42>\n        sage: S(42).is_idempotent()\n        True\n    ",
          name = 'LeftZeroSemigroup')
      PyClassDefNode.body = StatListNode(semigroups_cython.pyx:129:4)
      StatListNode.stats[0] = DefNode(semigroups_cython.pyx:208:4,
          doc = '\n        TESTS::\n\n            sage: from sage.categories.examples.semigroups_cython import LeftZeroSemigroup\n            sage: S = LeftZeroSemigroup()\n            sage: S.category()\n            Category of idempotent semigroups\n            sage: TestSuite(S).run()\n        ',
          is_cyfunction = True,
          modifiers = [...]/0,
          name = '__init__',
          np_args_idx = [...]/0,
          num_required_args = 1,
          outer_attrs = [...]/2,
          py_wrapper_required = True,
          reqd_kw_flags_cname = '0',
          used = True)
      DefNode.body = StatListNode(semigroups_cython.pyx:209:8)
      StatListNode.stats[0] = ExprStatNode(semigroups_cython.pyx:218:23)
      ExprStatNode.expr = GeneralCallNode(semigroups_cython.pyx:218:23,
          use_managed_ref = True)
      GeneralCallNode.keyword_args = DictNode(semigroups_cython.pyx:218:30,
          is_dict_literal = True,
          is_temp = 1,
          obj_conversion_errors = [...]/0,
          reject_duplicates = True,
          result_is_used = True,
          use_managed_ref = True)
      DictNode.key_value_pairs[0] = DictItemNode(semigroups_cython.pyx:218:30,
          result_is_used = True,
          use_managed_ref = True)
      DictItemNode.value = SimpleCallNode(semigroups_cython.pyx:218:59,
          result_is_used = True,
          use_managed_ref = True)
      
      Compiler crash traceback from this point on:
        File "Cython/Compiler/Visitor.py", line 182, in Cython.Compiler.Visitor.TreeVisitor._visit
        File "Cython/Compiler/Visitor.py", line 528, in Cython.Compiler.Visitor.MethodDispatcherTransform.visit_SimpleCallNode
      AttributeError: 'NoneType' object has no attribute 'is_pyobject'
      Traceback (most recent call last):
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1345, in cythonize_one_helper
          return cythonize_one(*m)
                 ^^^^^^^^^^^^^^^^^
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1321, in cythonize_one
          raise CompileError(None, pyx_file)
      Cython.Compiler.Errors.CompileError: sage/categories/examples/semigroups_cython.pyx
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
              #
              # This is a low-level class. For performance, we trust that the category
              # is fine, if it is provided. If it isn't, we use the category of rings.
              if category is None:
                  category=_Rings
              Parent.__init__(self, base=base, names=names, normalize=normalize,
                    ^
      ------------------------------------------------------------
      
      sage/rings/ring.pyx:207:14: cimported module has no attribute '__init__'
      
      Error compiling Cython file:
      ------------------------------------------------------------
      ...
                  TypeError: self must be an integral domain.
              """
              try:
                  return self.fraction_field()
              except (NotImplementedError,TypeError):
                  return coercion_model.division_parent(self)
                                       ^
      ------------------------------------------------------------
      
      sage/rings/ring.pyx:1280:33: cimported module has no attribute 'division_parent'
      Traceback (most recent call last):
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1345, in cythonize_one_helper
          return cythonize_one(*m)
                 ^^^^^^^^^^^^^^^^^
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1321, in cythonize_one
          raise CompileError(None, pyx_file)
      Cython.Compiler.Errors.CompileError: sage/rings/ring.pyx
      Exception while cythonizing source files: CompileError(None, 'sage/categories/coercion_methods.pyx')
      [1/3] Cythonizing sage/categories/coercion_methods.pyx
      [2/3] Cythonizing sage/categories/examples/semigroups_cython.pyx
      [3/3] Cythonizing sage/rings/ring.pyx
      ************************************************************************
      multiprocessing.pool.RemoteTraceback:
      """
      Traceback (most recent call last):
        File "/usr/local/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/multiprocessing/pool.py", line 125, in worker
          result = (True, func(*args, **kwds))
                          ^^^^^^^^^^^^^^^^^^^
        File "/usr/local/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/multiprocessing/pool.py", line 48, in mapstar
          return list(map(*args))
                 ^^^^^^^^^^^^^^^^
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1345, in cythonize_one_helper
          return cythonize_one(*m)
                 ^^^^^^^^^^^^^^^^^
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1321, in cythonize_one
          raise CompileError(None, pyx_file)
      Cython.Compiler.Errors.CompileError: sage/categories/coercion_methods.pyx
      """
      
      The above exception was the direct cause of the following exception:
      
      Traceback (most recent call last):
        File "/Users/kwankyu/GitHub/sage-dev/pkgs/sagemath-categories/.tox/sagepython-sagewheels-nopypi-norequirements/lib/python3.11/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 351, in <module>
          main()
        File "/Users/kwankyu/GitHub/sage-dev/pkgs/sagemath-categories/.tox/sagepython-sagewheels-nopypi-norequirements/lib/python3.11/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 333, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/Users/kwankyu/GitHub/sage-dev/pkgs/sagemath-categories/.tox/sagepython-sagewheels-nopypi-norequirements/lib/python3.11/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 249, in build_wheel
          return _build_backend().build_wheel(wheel_directory, config_settings,
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 434, in build_wheel
          return self._build_with_temp_dir(
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 419, in _build_with_temp_dir
          self.run_setup()
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 341, in run_setup
          exec(code, locals())
        File "<string>", line 5, in <module>
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/sage_setup/__init__.py", line 126, in sage_setup
          extensions = cythonize(
                       ^^^^^^^^^^
        File "/private/var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pip-build-env-4o1a4jhq/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1145, in cythonize
          result.get(99999)  # seconds
          ^^^^^^^^^^^^^^^^^
        File "/usr/local/Cellar/python@3.11/3.11.6_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/multiprocessing/pool.py", line 774, in get
          raise self._value
      Cython.Compiler.Errors.CompileError: sage/categories/coercion_methods.pyx
      ************************************************************************
      Error building the Sage library
      ************************************************************************
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for sagemath-categories
Failed to build sagemath-categories
ERROR: Could not build wheels for sagemath-categories, which is required to install pyproject.toml-based projects
sagepython-sagewheels-nopypi-norequirements: 31397 C exit 1 (8.10 seconds) /Users/kwankyu/GitHub/sage-dev/pkgs/sagemath-categories> python -I -m pip install --force-reinstall --no-deps /Users/kwankyu/GitHub/sage-dev/pkgs/sagemath-categories/.tox/.tmp/package/1/sagemath-categories-10.2b9.tar.gz pid=95734 [tox/execute/api.py:279]
.pkg-sagepython-sagewheels-nopypi: 31399 W _exit> python /usr/local/Cellar/tox/4.11.3/libexec/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta [tox/tox_env/api.py:427]
Backend: run command _exit with args {}
Backend: Wrote response {'return': 0} to /var/folders/td/fw1q9ljs311ggyph77rs53_40000gn/T/pep517__exit-3heoyj07.json
.pkg-sagepython-sagewheels-nopypi: 31402 I exit None (0.00 seconds) /Users/kwankyu/GitHub/sage-dev/pkgs/sagemath-categories> python /usr/local/Cellar/tox/4.11.3/libexec/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta pid=95245 [tox/execute/api.py:279]
.pkg-sagepython-sagewheels-nopypi: 31484 D delete package /Users/kwankyu/GitHub/sage-dev/pkgs/sagemath-categories/.tox/.tmp/package/1/sagemath-categories-10.2b9.tar.gz [tox/tox_env/python/virtual_env/package/pyproject.py:206]
  sagepython-sagewheels-nopypi-norequirements: FAIL code 1 (31.09 seconds)
  evaluation failed :( (31.23 seconds)

@kwankyu
Copy link
Collaborator

kwankyu commented Nov 5, 2023

There should be no change in the contents of sdists and wheels from this PR.

Perhaps. But I could not check.

@kwankyu
Copy link
Collaborator

kwankyu commented Nov 6, 2023

Without this PR, this command

make SAGE_WHEELS=yes sagemath_categories-build-deps sagemath_repl && ./sage -sh -c '(cd pkgs/sagemath-categories && SAGE_NUM_THREADS=8 tox -v -v -v -e sagepython-sagewheels-nopypi-norequirements)'

succeeds.

@mkoeppe
Copy link
Member Author

mkoeppe commented Nov 6, 2023

Thanks for testing! I'll take a look

Copy link

Documentation preview for this PR (built with commit b6b51b7; changes) is ready! 🎉

@mkoeppe
Copy link
Member Author

mkoeppe commented Apr 13, 2024

Closing as I'll do this as part of #36380.

@mkoeppe mkoeppe closed this Apr 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants