diff --git a/.ci/create-changes-html.sh b/.ci/create-changes-html.sh
new file mode 100755
index 00000000000..1a6fbeef27b
--- /dev/null
+++ b/.ci/create-changes-html.sh
@@ -0,0 +1,91 @@
+#!/bin/sh
+if [ $# != 2 ]; then
+ echo >&2 "usage: $0 BASE_DOC_COMMIT DOC_REPO"
+ echo >&2 "creates CHANGES.html in the current directory"
+ echo >&2 "for the diffs of DOC_REPO against BASE_DOC_COMMIT"
+ exit 1
+fi
+BASE_DOC_COMMIT="$1"
+DOC_REPOSITORY="$2"
+
+# Wipe out chronic diffs between old doc and new doc
+(cd $DOC_REPOSITORY && find . -name "*.html" | xargs sed -i -e '\;; d')
+# Create CHANGES.html
+echo '' > CHANGES.html
+echo '
' >> CHANGES.html
+echo '
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 2 of the License, or
-# (at your option) any later version.
-# http://www.gnu.org/licenses/
-# ****************************************************************************
-
-set +e -x
-
-docker info
-docker run docker sh -c "
- set -x
- uname -a
- df -h
- cat /proc/cpuinfo
- cat /proc/meminfo
- cat /proc/sys/vm/overcommit_memory
- cat /proc/sys/vm/overcommit_ratio"
diff --git a/.ci/merge-fixes.sh b/.ci/merge-fixes.sh
index 8ee138660ec..73b4c665caf 100755
--- a/.ci/merge-fixes.sh
+++ b/.ci/merge-fixes.sh
@@ -1,36 +1,82 @@
#!/bin/sh
-# Merge open PRs from sagemath/sage labeled "blocker".
-REPO="sagemath/sage"
-GH="gh -R $REPO"
-PRs="$($GH pr list --label "p: blocker / 1" --json number --jq '.[].number')"
-if [ -z "$PRs" ]; then
- echo 'Nothing to do: Found no open PRs with "blocker" status.'
-else
- echo "Found PRs: " $PRs
- export GIT_AUTHOR_NAME="ci-sage workflow"
- export GIT_AUTHOR_EMAIL="ci-sage@example.com"
- export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
- export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
- git tag -f test_base
- git commit -q -m "Uncommitted changes" --no-allow-empty -a
- for a in $PRs; do
- git fetch --unshallow --all > /dev/null 2>&1 && echo "Unshallowed."
- echo "::group::Merging PR https://github.com/$REPO/pull/$a"
- git tag -f test_head
- $GH pr checkout -b pr-$a $a
- git checkout -q test_head
- if git merge --no-edit --squash -q pr-$a; then
- echo "::endgroup::"
- if git commit -q -m "Merge https://github.com/$REPO/pull/$a" -a --no-allow-empty; then
- echo "Merged #$a"
+# Apply open PRs labeled "blocker" from sagemath/sage as patches.
+# This script is invoked by various workflows in .github/workflows
+#
+# The repository variable SAGE_CI_FIXES_FROM_REPOS can be set
+# to customize this for CI runs in forks:
+#
+# - If set to a whitespace-separated list of repositories, use them instead of sagemath/sage.
+# - If set to "none", do not apply any PRs.
+#
+# https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository
+export GIT_AUTHOR_NAME="ci-sage workflow"
+export GIT_AUTHOR_EMAIL="ci-sage@example.com"
+export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
+export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
+mkdir -p upstream
+for REPO in ${SAGE_CI_FIXES_FROM_REPOSITORIES:-sagemath/sage}; do
+ case $REPO in
+ none)
+ echo "Nothing to do for 'none' in SAGE_CI_FIXES_FROM_REPOSITORIES"
+ ;;
+ */*)
+ echo "Getting open PRs with 'blocker' status from https://github.com/$REPO/pulls?q=is%3Aopen+label%3A%22p%3A+blocker+%2F+1%22"
+ GH="gh -R $REPO"
+ REPO_FILE="upstream/ci-fixes-${REPO%%/*}-${REPO##*/}"
+ PRs="$($GH pr list --label "p: blocker / 1" --json number --jq '.[].number' | tee $REPO_FILE)"
+ date -u +"%Y-%m-%dT%H:%M:%SZ" > $REPO_FILE.date # Record the date, for future reference
+ if [ -z "$PRs" ]; then
+ echo "Nothing to do: Found no open PRs with 'blocker' status in $REPO."
else
- echo "Empty, skipped"
+ echo "Found open PRs with 'blocker' status in $REPO: $(echo $PRs)"
+ git tag -f test_base
+ git commit -q -m "Uncommitted changes" --no-allow-empty -a
+ for a in $PRs; do
+ # We used to pull the branch and merge it (after unshallowing), but when run on PRs that are
+ # based on older releases, it has the side effect of updating to this release,
+ # which may be confusing.
+ #
+ # Here, we obtain the "git am"-able patch of the PR branch.
+ # This also makes it unnecessary to unshallow the repository.
+ #
+ # Considered alternative: Use https://github.com/$REPO/pull/$a.diff,
+ # which squashes everything into one diff without commit metadata.
+ PULL_URL="https://github.com/$REPO/pull/$a"
+ PULL_FILE="$REPO_FILE-$a"
+ PATH=build/bin:$PATH build/bin/sage-download-file --quiet "$PULL_URL.patch" $PULL_FILE.patch
+ date -u +"%Y-%m-%dT%H:%M:%SZ" > $PULL_FILE.date # Record the date, for future reference
+ LAST_SHA=$(sed -n -E '/^From [0-9a-f]{40}/s/^From ([0-9a-f]{40}).*/\1/p' $PULL_FILE.patch | tail -n 1)
+ COMMITS_URL="https://github.com/$REPO/commits/$LAST_SHA"
+ echo "::group::Applying PR $PULL_URL @ $COMMITS_URL as a patch"
+ export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME applying $PULL_URL @ $COMMITS_URL"
+ if git am --signoff --empty=keep < $PULL_FILE.patch; then
+ echo "---- Applied patch --------------------------------------------------------------------------------"
+ cat $PULL_FILE.patch
+ echo "--------------------------------------------------------------------8<-----------------------------"
+ echo "::endgroup::"
+ elif git am --abort \
+ && if git fetch --unshallow --all > /dev/null 2>&1; then echo "Unshallowed"; fi \
+ && echo "Retrying with 3-way merge" \
+ && git am --empty=keep --3way < $PULL_FILE.patch; then
+ echo "---- Applied patch --------------------------------------------------------------------------------"
+ cat $PULL_FILE.patch
+ echo "--------------------------------------------------------------------8<-----------------------------"
+ echo "::endgroup::"
+ else
+ echo "---- Failure applying patch -----------------------------------------------------------------------"
+ git am --signoff --show-current-patch=diff
+ echo "--------------------------------------------------------------------8<-----------------------------"
+ echo "::endgroup::"
+ echo "Failure applying $PULL_URL as a patch, resetting"
+ git am --signoff --abort
+ fi
+ done
fi
- else
- echo "::endgroup::"
- echo "Failure merging #$a, resetting"
- git reset --hard
- fi
- done
- git log test_base..HEAD
-fi
+ ;;
+ *)
+ echo "Repository variable SAGE_CI_FIXES_FROM_REPOSITORIES, if set, should be a whitespace-separated list of repositories or 'none'"
+ echo "Got: $SAGE_CI_FIXES_FROM_REPOSITORIES"
+ exit 1
+ ;;
+ esac
+done
diff --git a/.ci/protect-secrets.sh b/.ci/protect-secrets.sh
deleted file mode 100755
index 527604106ca..00000000000
--- a/.ci/protect-secrets.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/sh
-
-# This script protects all environment variables that start with "SECRET_".
-# It puts them in a temporary file. The name of the variable contains the path
-# of that file. This filename can then safely be used in `cat` even if `set
-# -x` has been turned on. Also you can run "export" to understand the
-# environment without danger.
-# Be careful, however, not to use this like the following:
-# docker login $DOCKER_USER $(cat $SECRET_DOCKER_PASS)
-# as this would expose the password if `set -x` has been turned on.
-
-# ****************************************************************************
-# Copyright (C) 2018 Julian Rüth
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 2 of the License, or
-# (at your option) any later version.
-# http://www.gnu.org/licenses/
-# ****************************************************************************
-
-set -eo pipefail
-set +x
-
-function encrypt {
- RET=`mktemp`
- eval " echo \$$1" > "$RET"
- echo $RET
-}
-
-for name in `awk 'END { for (name in ENVIRON) { print name; } }' < /dev/null`; do
-case "$name" in
- SECRET_*)
- export $name="$(encrypt $name)"
- echo "Protected $name"
- ;;
-esac
-done
-
-unset encrypt
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 53a281ca5b4..c9282086422 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -38,6 +38,7 @@ jobs:
.ci/merge-fixes.sh
env:
GH_TOKEN: ${{ github.token }}
+ SAGE_CI_FIXES_FROM_REPOSITORIES: ${{ vars.SAGE_CI_FIXES_FROM_REPOSITORIES }}
- name: Store CI fixes in upstream artifact
run: |
mkdir -p upstream
diff --git a/.github/workflows/ci-conda.yml b/.github/workflows/ci-conda.yml
index 2240c224a52..7e6282b92cc 100644
--- a/.github/workflows/ci-conda.yml
+++ b/.github/workflows/ci-conda.yml
@@ -38,6 +38,7 @@ jobs:
.ci/merge-fixes.sh
env:
GH_TOKEN: ${{ github.token }}
+ SAGE_CI_FIXES_FROM_REPOSITORIES: ${{ vars.SAGE_CI_FIXES_FROM_REPOSITORIES }}
- name: Create conda environment files
run: ./bootstrap-conda
diff --git a/.github/workflows/ci-linux-incremental.yml b/.github/workflows/ci-linux-incremental.yml
index ff3260980d3..d3b7801c548 100644
--- a/.github/workflows/ci-linux-incremental.yml
+++ b/.github/workflows/ci-linux-incremental.yml
@@ -98,6 +98,7 @@ jobs:
["standard",
"minimal"]
docker_push_repository: ghcr.io/${{ github.repository }}/
+ max_parallel: 8
site:
needs: [changed_files]
@@ -120,16 +121,10 @@ jobs:
docker_targets: "with-targets"
targets: "${{needs.changed_files.outputs.uninstall_targets}} ${{needs.changed_files.outputs.build_targets}} build doc-html ptest"
# Only test systems with a usable system python (>= 3.9)
+ # with only a small number of test failures as of 10.2.rc0
tox_system_factors: >-
- ["ubuntu-jammy",
- "ubuntu-mantic",
- "debian-bullseye",
- "debian-bookworm",
- "fedora-33",
- "fedora-38",
- "gentoo-python3.11",
- "archlinux",
- "debian-bullseye-i386"]
+ ["gentoo-python3.11",
+ "archlinux"]
tox_packages_factors: >-
["standard-sitepackages"]
docker_push_repository: ghcr.io/${{ github.repository }}/
diff --git a/.github/workflows/doc-build-pdf.yml b/.github/workflows/doc-build-pdf.yml
index 37b0cff6376..bfa32760934 100644
--- a/.github/workflows/doc-build-pdf.yml
+++ b/.github/workflows/doc-build-pdf.yml
@@ -32,6 +32,7 @@ jobs:
.ci/merge-fixes.sh
env:
GH_TOKEN: ${{ github.token }}
+ SAGE_CI_FIXES_FROM_REPOSITORIES: ${{ vars.SAGE_CI_FIXES_FROM_REPOSITORIES }}
- name: Store CI fixes in upstream artifact
run: |
mkdir -p upstream
@@ -58,7 +59,6 @@ jobs:
eval $(sage-print-system-package-command auto --yes --no-install-recommends install zip)
eval $(sage-print-system-package-command auto --spkg --yes --no-install-recommends install git texlive)
-
- name: Add prebuilt tree as a worktree
id: worktree
run: |
diff --git a/.github/workflows/doc-build.yml b/.github/workflows/doc-build.yml
index b0f3e4566bc..0c5200dbe81 100644
--- a/.github/workflows/doc-build.yml
+++ b/.github/workflows/doc-build.yml
@@ -27,6 +27,7 @@ jobs:
.ci/merge-fixes.sh
env:
GH_TOKEN: ${{ github.token }}
+ SAGE_CI_FIXES_FROM_REPOSITORIES: ${{ vars.SAGE_CI_FIXES_FROM_REPOSITORIES }}
- name: Store CI fixes in upstream artifact
run: |
mkdir -p upstream
@@ -68,8 +69,8 @@ jobs:
-e 's;'"$mathjax_path_from"';'"$mathjax_path_to"';' \
-e '\;; d')
# Create git repo from old doc
- (cd /sage/local/share/doc/sage/html && \
- git init && \
+ DOC_DIR=/sage/local/share/doc/sage/html
+ (cd $DOC_DIR && git init && \
(echo "*.svg binary"; echo "*.pdf binary") >> .gitattributes && \
(echo ".buildinfo"; echo '*.inv'; echo '.git*'; echo '*.svg'; echo '*.pdf'; echo '*.png'; echo 'searchindex.js') > .gitignore; \
git add -A && git commit --quiet -m "old")
@@ -115,10 +116,11 @@ jobs:
# incremental docbuild may introduce broken links (inter-file references) though build succeeds
run: |
set -ex
- export SAGE_USE_CDNS=yes
- mv /sage/local/share/doc/sage/html/.git /sage/.git-doc
+ DOC_DIR=/sage/local/share/doc/sage/html
+ mv $DOC_DIR/.git /sage/.git-doc
make doc-clean doc-uninstall
- mkdir -p /sage/local/share/doc/sage/html/ && mv /sage/.git-doc /sage/local/share/doc/sage/html/.git
+ mkdir -p $DOC_DIR/ && mv /sage/.git-doc $DOC_DIR/.git
+ export SAGE_USE_CDNS=yes
./config.status && make sagemath_doc_html-no-deps
working-directory: ./worktree-image
env:
@@ -130,63 +132,17 @@ jobs:
if: (success() || failure()) && steps.docbuild.outcome == 'success'
run: |
set -ex
- mkdir -p ./docs
- (cd /sage/local/share/doc/sage/html && git commit -a -m 'new')
- # Wipe out chronic diffs between old doc and new doc
- (cd /sage/local/share/doc/sage/html && \
- find . -name "*.html" | xargs sed -i -e '\;; d')
- # Create CHANGES.html
- echo '' > ./docs/CHANGES.html
- echo '' >> ./docs/CHANGES.html
- echo ' ' >> ./docs/CHANGES.html
- echo '' >> ./docs/CHANGES.html
- echo '' >> ./docs/CHANGES.html
- cat >> ./docs/CHANGES.html << EOF
-
- EOF
- echo '' >> ./docs/CHANGES.html
- echo '' >> ./docs/CHANGES.html
- (cd /sage/local/share/doc/sage/html && git diff HEAD^ -- *.html; rm -rf .git) > ./docs/diff.txt
- /sage/sage -python - << EOF
- import re, html
- with open('./docs/diff.txt', 'r') as f:
- diff_text = f.read()
- diff_blocks = re.split(r'^(?=diff --git)', diff_text, flags=re.MULTILINE)
- out_blocks = []
- for block in diff_blocks:
- match = re.search(r'^diff --git a/(.*) b/\1', block, flags=re.MULTILINE)
- if match:
- path = 'html/' + match.group(1)
- out_blocks.append(f'{path}
\n' + html.escape(block).strip() + '
')
- output_text = '\n'.join(out_blocks)
- with open('./docs/diff.html', 'w') as f:
- f.write(output_text)
- EOF
- cat ./docs/diff.html >> ./docs/CHANGES.html
- echo '' >> ./docs/CHANGES.html
- echo '' >>./docs/CHANGES.html
- rm ./docs/diff.txt ./docs/diff.html
- # For some reason the deploy step below cannot find /sage/...
- # So copy everything from there to local folder
+ DOC_DIR=/sage/local/share/doc/sage/html
+ (cd $DOC_DIR && git commit -a -m 'new')
+ ls -l /sage/venv/bin
+ PATH=/sage/venv/bin:$PATH .ci/create-changes-html.sh $(cd $DOC_DIR; git rev-parse HEAD^) $DOC_DIR
+ (cd $DOC_DIR && rm -rf .git)
+ # We copy everything to a local folder
# We also need to replace the symlinks because netlify is not following them
- cp -r -L /sage/local/share/doc/sage/html ./docs
- cp /sage/local/share/doc/sage/index.html ./docs
+ mkdir -p ./docs
+ mv CHANGES.html ./docs
+ cp -r -L $DOC_DIR ./docs
+ cp $DOC_DIR/../index.html ./docs
# Zip everything for increased performance
zip -r docs.zip docs
@@ -202,11 +158,15 @@ jobs:
if: (success() || failure()) && steps.copy.outcome == 'success' && github.repository == 'sagemath/sage' && github.ref == 'refs/heads/develop'
run: |
set -ex
+ export PATH="build/bin:$PATH"
+ eval $(sage-print-system-package-command auto update)
+ eval $(sage-print-system-package-command auto --yes --no-install-recommends install zip)
+ eval $(sage-print-system-package-command auto --spkg --yes --no-install-recommends install git texlive)
export SAGE_USE_CDNS=yes
export SAGE_LIVE_DOC=yes
export SAGE_JUPYTER_SERVER=binder:sagemath/sage-binder-env/dev
make doc-clean doc-uninstall
- ./config.status && make sagemath_doc_html-no-deps
+ ./config.status && make sagemath_doc_html-no-deps sagemath_doc_pdf-no-deps
working-directory: ./worktree-image
env:
MAKE: make -j2 --output-sync=recurse
@@ -219,6 +179,7 @@ jobs:
set -ex
mkdir -p ./livedoc
cp -r -L /sage/local/share/doc/sage/html ./livedoc
+ cp -r -L /sage/local/share/doc/sage/pdf ./livedoc
cp /sage/local/share/doc/sage/index.html ./livedoc
zip -r livedoc.zip livedoc
diff --git a/.github/workflows/doc-publish.yml b/.github/workflows/doc-publish.yml
index 961809e343e..361dafb22e0 100644
--- a/.github/workflows/doc-publish.yml
+++ b/.github/workflows/doc-publish.yml
@@ -28,7 +28,7 @@ jobs:
# Once https://github.com/actions/download-artifact/issues/172 and/or https://github.com/actions/download-artifact/issues/60 is implemented, we can use the official download-artifact action
# For now use the solution from https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow
- name: Download docs
- uses: actions/github-script@v6.4.0
+ uses: actions/github-script@v7.0.1
with:
script: |
var artifacts = await github.rest.actions.listWorkflowRunArtifacts({
@@ -97,7 +97,7 @@ jobs:
if: github.event.workflow_run.conclusion == 'success' && github.repository == 'sagemath/sage' && github.event.workflow_run.head_branch == 'develop'
steps:
- name: Download live doc
- uses: actions/github-script@v6.4.1
+ uses: actions/github-script@v7.0.1
with:
script: |
var artifacts = await github.rest.actions.listWorkflowRunArtifacts({
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index cf1a04f6447..be3e784d87c 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -222,6 +222,8 @@ jobs:
.ci/merge-fixes.sh
env:
GH_TOKEN: ${{ github.token }}
+ SAGE_CI_FIXES_FROM_REPOSITORIES: ${{ vars.SAGE_CI_FIXES_FROM_REPOSITORIES }}
+
- name: Show disk space
run: |
df -h
diff --git a/.github/workflows/docker_hub.yml b/.github/workflows/docker_hub.yml
new file mode 100644
index 00000000000..694cd51762f
--- /dev/null
+++ b/.github/workflows/docker_hub.yml
@@ -0,0 +1,91 @@
+name: Reusable workflow for Docker Hub images
+
+on:
+ workflow_call:
+ inputs:
+ dockerhub_repository:
+ default: sagemath-dev
+ type: string
+ dockerfile_target:
+ default: make-build
+ type: string
+
+jobs:
+ build-and-push:
+ name: Build Docker image and push to DockerHub
+ runs-on: ubuntu-latest
+ steps:
+ - name: Maximize build disk space
+ uses: easimon/maximize-build-space@v8
+ with:
+ # need space in /var for Docker images
+ root-reserve-mb: 40000
+ remove-dotnet: true
+ remove-android: true
+ remove-haskell: true
+ remove-codeql: true
+ remove-docker-images: true
+
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set tag
+ # docker/metadata-action@v4 is not used since we need to distinguish
+ # between latest and develop tags
+ id: set_tag
+ run: |
+ git fetch --depth=1 origin +refs/tags/*:refs/tags/*
+ TAG_NAME=$(git tag --sort=creatordate | tail -1)
+ REPO=${{ inputs.dockerhub_repository }}
+ # see if the tag has already been pushed
+ # if yes then skip following steps
+ URL="https://registry.hub.docker.com/v2/repositories/sagemath/$REPO/tags?page_size=32"
+ LATEST_TAGS=$(curl -L -s $URL | jq '."results"[]["name"]')
+ JOB_DONE=false
+ for i in $LATEST_TAGS; do if [[ $i == \"$TAG_NAME\" ]]; then JOB_DONE=true; break; fi done
+ echo "JOB_DONE=$JOB_DONE" >> $GITHUB_ENV
+
+ if [[ $JOB_DONE == 'false' ]]
+ then
+ TAG="sagemath/$REPO:$TAG_NAME"
+ TAG_LIST="$TAG, sagemath/$REPO:develop"
+ BASE="sagemath/sagemath-dev:$TAG_NAME"
+ echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV
+ echo "TAG=$TAG" >> $GITHUB_ENV
+ echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV
+ echo "BASE=$BASE" >> $GITHUB_ENV
+ fi
+ df -h
+
+ - name: Update Tag List
+ id: upd_tag_list
+ run: |
+ REPO=${{ inputs.dockerhub_repository }}
+ TAG_LIST="${{ env.TAG_LIST }}, sagemath/$REPO:latest"
+ echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV
+ if: "env.JOB_DONE == 'false' && !contains(env.TAG_NAME, 'beta') && !contains(env.TAG_NAME, 'rc')"
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ if: env.JOB_DONE == 'false'
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+ if: env.JOB_DONE == 'false'
+
+ - name: Build and push make-build
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ file: docker/Dockerfile
+ target: ${{ inputs.dockerfile_target }}
+ build-args: |
+ MAKE_BUILD=${{ env.BASE }}
+ push: true
+ tags: ${{ env.TAG_LIST }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+ if: env.JOB_DONE == 'false'
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 7821ea20212..5d444594877 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -26,6 +26,7 @@ jobs:
.ci/merge-fixes.sh
env:
GH_TOKEN: ${{ github.token }}
+ SAGE_CI_FIXES_FROM_REPOSITORIES: ${{ vars.SAGE_CI_FIXES_FROM_REPOSITORIES }}
- name: Set up Python
uses: actions/setup-python@v4
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index 6d71bcefa16..bfa4bc58f96 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -94,6 +94,7 @@ jobs:
.ci/merge-fixes.sh
env:
GH_TOKEN: ${{ github.token }}
+ SAGE_CI_FIXES_FROM_REPOSITORIES: ${{ vars.SAGE_CI_FIXES_FROM_REPOSITORIES }}
- uses: actions/download-artifact@v3
with:
diff --git a/.github/workflows/push_to_docker_hub.yml b/.github/workflows/push_to_docker_hub.yml
index 77a9f819d70..cd289f6a88b 100644
--- a/.github/workflows/push_to_docker_hub.yml
+++ b/.github/workflows/push_to_docker_hub.yml
@@ -7,106 +7,32 @@ on:
- 'develop'
push:
tags:
- # Just create image on pushing a tag
- - '*'
+ # Match all release tags including beta, rc
+ - '[0-9]+.[0-9]+'
+ - '[0-9]+.[0-9]+.[0-9]+'
+ - '[0-9]+.[0-9]+.beta[0-9]+'
+ - '[0-9]+.[0-9]+.[0-9]+.beta[0-9]+'
+ - '[0-9]+.[0-9]+.rc[0-9]+'
+ - '[0-9]+.[0-9]+.[0-9]+.rc[0-9]+'
+
+ schedule:
+ # Recover failed runs each Tuesday and Thursday at one o'clock
+ - cron: '0 1 * * 2,4'
jobs:
sagemath-dev:
- name: Build Docker image on target make-build and push to DockerHub sagemath-dev
- # target make-build replaces former sagemath-dev, see https://github.com/sagemath/sage/pull/36047
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Set tag
- # docker/metadata-action@v4 is not used since we need to distinguish
- # between latest and develop tags
- id: set_tag
- run: |
- git fetch --depth=1 origin +refs/tags/*:refs/tags/*
- TAG_NAME=$(git tag --sort=creatordate | tail -1)
- TAG="sagemath/sagemath-dev:$TAG_NAME"
- TAG_LIST="$TAG, sagemath/sagemath-dev:develop"
- echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV
- echo "TAG=$TAG" >> $GITHUB_ENV
- echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV
-
- - name: Update Tag List
- id: upd_tag_list
- run: |
- TAG_LIST="${{ env.TAG_LIST }}, sagemath/sagemath-dev:latest"
- echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV
- if: "!contains(env.TAG_NAME, 'beta') && !contains(env.TAG_NAME, 'rc')"
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
-
- - name: Login to Docker Hub
- uses: docker/login-action@v3
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- - name: Build and push make-build
- uses: docker/build-push-action@v5
- with:
- context: .
- file: docker/Dockerfile
- target: make-build # see the corresponding header-note
- push: true
- tags: ${{ env.TAG_LIST }}
- cache-from: type=gha
- cache-to: type=gha,mode=max
+ uses: ./.github/workflows/docker_hub.yml
+ with:
+ # Build from scratch
+ dockerhub_repository: sagemath-dev
+ dockerfile_target: make-build
+ secrets: inherit
sagemath:
needs: sagemath-dev
- name: Build Docker image on target sagemath and push to DockerHub sagemath
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Set tag
- # docker/metadata-action@v4 is not used since we need to distinguish
- # between latest and develop tags
- id: set_tag
- run: |
- git fetch --depth=1 origin +refs/tags/*:refs/tags/*
- TAG_NAME=$(git tag --sort=creatordate | tail -1)
- TAG="sagemath/sagemath:$TAG_NAME"
- TAG_LIST="$TAG, sagemath/sagemath:develop"
- BASE="sagemath/sagemath-dev:$TAG_NAME"
- echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV
- echo "TAG=$TAG" >> $GITHUB_ENV
- echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV
- echo "BASE=$BASE" >> $GITHUB_ENV
-
- - name: Update Tag List
- id: upd_tag_list
- run: |
- TAG_LIST="${{ env.TAG_LIST }}, sagemath/sagemath:latest"
- echo "TAG_LIST=$TAG_LIST" >> $GITHUB_ENV
- if: "!contains(env.TAG_NAME, 'beta') && !contains(env.TAG_NAME, 'rc')"
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
-
- - name: Login to Docker Hub
- uses: docker/login-action@v3
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- - name: Build and push sagemath
- uses: docker/build-push-action@v5
- with:
- context: .
- file: docker/Dockerfile
- build-args: |
- MAKE_BUILD=${{ env.BASE }}
- target: sagemath
- push: true
- tags: ${{ env.TAG_LIST }}
- cache-from: type=gha
- cache-to: type=gha,mode=max
+ uses: ./.github/workflows/docker_hub.yml
+ with:
+ # Build from sagemath-dev
+ dockerhub_repository: sagemath
+ dockerfile_target: sagemath
+ secrets: inherit
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
deleted file mode 100644
index e80a04b422b..00000000000
--- a/.gitlab-ci.yml
+++ /dev/null
@@ -1,195 +0,0 @@
-# This file configures automatic builds of Sage on [GitLab](https://gitlab.com).
-# To make the build time not too excessive, we seed the build cache with
-# sagemath/sagemath-dev:develop. When basic SPKGs changed, this does not help
-# much and the full build might exceed the set time limit in GitLab. You can
-# increase that limit in Settings → CI/CD.
-# You can also provision your own private more powerful runner in the same
-# place
-# https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-in-docker-executor;
-# or set up your favourite cloud service to provide an on-demand autoscale
-# runner. More details below.
-
-# As of early 2018 a run on GitLab CI takes about 45 minutes. We could probably
-# save 10 minutes by not building/pushing/testing dev images for branches other
-# than master/develop.
-
-# Note that most of the time during CI is spent with pulling and pushing of
-# docker images and copying files locally as part of the docker build. At the
-# moment there is no reliable way of passing the docker images to the following
-# stages without explicit pushing/pulling or similar:
-# https://gitlab.com/gitlab-org/gitlab-runner/issues/1107
-
-# The timings mentioned above are typical values. The shared runners provided
-# on gitlab.com are sometimes much slower depending on the runner you are
-# scheduled on. Sometimes it's slower for no apparent reason, probably just an
-# overcommittment of virtual machines on hardware.
-
-# GitLab provides several flavours of shared runners (as of early 2018):
-# * runners tagged as "do" (digitalocean.com) provide about 60GB of HDD, two
-# cores, but only 2GB of RAM. The RAM is sometimes not sufficient to build
-# the documentation.
-# * runners tagged as "gce" (Google Compute Engine) provide about 22GB of HDD,
-# a single core, 4GB of RAM. Since we are relying on OverlayFS, the disk
-# space is not sufficient to build sage from scratch.
-# The shared runners are terminated after three hours. Currently, this is often
-# insufficient to build sage from scratch.
-
-# If you want to provide your own runners, make sure to tag them as follows:
-# * "big" (60GB of disk space are available) to make build-from-clean pass.
-
-image: docker:stable
-
-stages:
- - build
- - test
- - release
-
-variables:
- DOCKER_TAG: $CI_COMMIT_REF_NAME
- # Builds are very I/O intensive; make sure we have a fast file system.
- DOCKER_DRIVER: overlay2
- DEFAULT_ARTIFACT_BASE: sagemath/sagemath-dev:develop
-
-before_script:
- # GitLab has no mechanism yet to hide secret variables: https://gitlab.com/gitlab-org/gitlab-ce/issues/13784
- # So we roll our own which protects all variables that start with SECRET_
- - . .ci/protect-secrets.sh
- # Collect debug infos about the system we are running on
- - .ci/describe-system.sh
- # Set DOCKER_TAG according to the current branch/tag
- - . .ci/update-env.sh
- # Set MAKEFLAGS and SAGE_NUM_THREADS according to the machine we are running on
- - . .ci/setup-make-parallelity.sh
-
-# We use docker-in-docker to build our docker images, i.e., we run a
-# docker:dind "service" container and link to it from the container running the
-# actual scripts below.
-# Our scripts automatically connect to this service (unless you override it by
-# setting DOCKER_HOST.) For example, each RUN statement in the Dockerfile
-# spawns a docker container inside the docker:dind container to perform the RUN
-# command there.
-# It can be faster to expose your outer docker daemon by mounting
-# /var/run/docker.sock to /var/run/docker.sock and setting DOCKER_HOST in
-# Settings -> CI/CD -> Secret variable to unix:///var/run/docker.sock. (The
-# speedup is mostly due to sharing layers of intermediate images.) However,
-# this is only possible if you provision your own runners. Shared gitlab
-# runners, do not bind mount /var/run/docker.sock. Also, docker:dind provides
-# better isolation. If you expect many builds to run simultaneously on a host,
-# conflicting tags can cause issues with a mounted DOCKER_HOST.
-services:
-- docker:stable-dind
-
-# Build Sage and its documentation.
-# The build starts from the build artifacts of DEFAULT_ARTIFACT_BASE which is
-# usually much faster than building from a clean checkout of Sage.
-build-from-latest:
- stage: build
- artifacts:
- when: always
- paths:
- - gitlab-build-docker.log
- - html
- expire_in: 1 month
- script:
- - apk --update add coreutils rsync
- # The output of the build can get larger than gitlab.com's limit; only
- # print the first 1MB (and the last 80 lines.) GitLab's limit is 4MB,
- # however, the list of all branches and tags that shows up in the initial
- # checkout takes already 1.5 MB:
- # https://gitlab.com/gitlab-org/gitlab-runner/issues/4142
- - .ci/build-docker.sh | tee gitlab-build-docker.log | .ci/head-tail.sh 1048576
- - .ci/push-gitlab.sh sagemath-dev
- - .ci/push-gitlab.sh sagemath
- - DOCKER_TAG=$CI_COMMIT_SHA .ci/push-gitlab.sh sagemath
- except:
- - master
- - develop
- - tags
- - web
-
-# Build Sage and its documentation from a clean checkout of Sage.
-# Note that this takes several hours. You probably want to run this on your own
-# gitlab-runner and increase the standard GitLab time limit for CI runs.
-# Some of the shared runners provided by GitLab for free do not have enough
-# disk space for this to work. If a build fails with "no space left on device",
-# you could just retry it and hope to be scheduled on a machine with more disk
-# space, or provision your own runner.
-build-from-clean:
- extends:
- - build-from-latest
- artifacts:
- when: always
- paths:
- - gitlab-build-docker.log
- - html
- expire_in: 99 years
- variables:
- ARTIFACT_BASE: "source-clean"
- only:
- - master
- - develop
- - tags
- # Run build-from-clean for a pipeline that has been explicitly created
- # through GitLab's web interface.
- - web
- except: []
- tags:
- # 60 GB of HDD are available
- - big
- # This build takes several CPU hours. It is very unlikely that there are any
- # actual build errors for a tagged release but the (discounted) cloud
- # machines this is running on might be preempted during the long build time.
- # So let's try three times before we give up.
- retry: 2
-
-test-dev:
- stage: test
- dependencies: []
- script:
- - . .ci/pull-gitlab.sh sagemath-dev
- - sh .ci/test-dev.sh "$DOCKER_IMAGE"
-
-test-cli:
- stage: test
- dependencies: []
- script:
- - . .ci/pull-gitlab.sh sagemath
- - sh .ci/test-cli.sh "$DOCKER_IMAGE"
-
-test-jupyter:
- stage: test
- dependencies: []
- script:
- - . .ci/pull-gitlab.sh sagemath
- - sh .ci/test-jupyter.sh "$DOCKER_IMAGE" docker
-
-# Pushes the built images to Docker Hub if the Settings -> CI/CD -> Secret
-# variables DOCKER_USER and SECRET_DOCKER_PASS have been set up.
-push-dockerhub:
- stage: release
- dependencies: []
- only:
- refs:
- - branches
- - tags
- variables:
- - $SECRET_DOCKER_PASS
- script:
- - . .ci/pull-gitlab.sh sagemath
- - sh .ci/push-dockerhub.sh sagemath
-
-# Pushes the built dev images to Docker Hub if the Settings -> CI/CD -> Secret
-# variables DOCKER_USER and SECRET_DOCKER_PASS have been set up.
-push-dockerhub-dev:
- stage: release
- dependencies: []
- only:
- refs:
- - master
- - develop
- - tags
- variables:
- - $SECRET_DOCKER_PASS
- script:
- - . .ci/pull-gitlab.sh sagemath-dev
- - sh .ci/push-dockerhub.sh sagemath-dev
diff --git a/CITATION.cff b/CITATION.cff
index 33dda263384..b4e265090f4 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -4,8 +4,8 @@ title: SageMath
abstract: SageMath is a free open-source mathematics software system.
authors:
- name: "The SageMath Developers"
-version: 10.3.beta0
+version: 10.3.beta1
doi: 10.5281/zenodo.593563
-date-released: 2023-12-05
+date-released: 2023-12-10
repository-code: "https://github.com/sagemath/sage"
url: "https://www.sagemath.org/"
diff --git a/VERSION.txt b/VERSION.txt
index 75f3e554fbb..dc0e750e611 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-SageMath version 10.3.beta0, Release Date: 2023-12-05
+SageMath version 10.3.beta1, Release Date: 2023-12-10
diff --git a/build/bin/sage-dist-helpers b/build/bin/sage-dist-helpers
index b6259ca9ef1..b159d696745 100644
--- a/build/bin/sage-dist-helpers
+++ b/build/bin/sage-dist-helpers
@@ -355,38 +355,58 @@ sdh_store_and_pip_install_wheel() {
shift
done
sdh_store_wheel "$@"
- if [ -n "$SAGE_SUDO" ]; then
- # Trac #29585: Do the SAGE_DESTDIR staging of the wheel installation
- # ONLY if SAGE_SUDO is set (in that case, we still do the staging so
- # that we do not invoke pip as root).
+
+ wheel_basename="${wheel##*/}"
+ distname="${wheel_basename%%-*}"
+
+ if [ -d "$SAGE_BUILD_DIR/$PKG_NAME" ]; then
+ # Normal package install through sage-spkg;
+ # scripts live in the package's build directory
+ # until copied to the final destination by sage-spkg.
+ script_dir="$SAGE_BUILD_DIR/$PKG_NAME"
+ else
+ script_dir="$SAGE_SPKG_SCRIPTS/$PKG_BASE"
+ fi
+
+ if [ -n "$SAGE_DESTDIR" -a -z "$SAGE_SUDO" ]; then
+ # We stage the wheel file and do the actual installation in post.
+ echo "sdh_actually_pip_install_wheel $distname $pip_options -r \"\$SAGE_SPKG_SCRIPTS/\$PKG_BASE/spkg-requirements.txt\"" >> "$script_dir"/spkg-pipinst
+ else
if [ -n "$SAGE_DESTDIR" ]; then
+ # Trac #29585: Do the SAGE_DESTDIR staging of the wheel installation
+ # ONLY if SAGE_SUDO is set (in that case, we still do the staging so
+ # that we do not invoke pip as root).
# --no-warn-script-location: Suppress a warning caused by --root
local sudo=""
local root="--root=$SAGE_DESTDIR --no-warn-script-location"
- else
- # Trac #32361: Of course, this can only be done for normal packages,
- # whose installation goes through sage-spkg.
- # For script packages, we do have to invoke pip as root.
+ elif [ -n "$SAGE_SUDO" ]; then
+ # Trac #32361: For script packages, we do have to invoke pip as root.
local sudo="$SAGE_SUDO"
local root=""
+ else
+ #
+ local sudo=""
+ local root=""
fi
- else
- local sudo=""
- local root=""
+ sdh_actually_pip_install_wheel $distname $root $pip_options "$wheel"
fi
+ echo "sdh_pip_uninstall -r \"\$SAGE_SPKG_SCRIPTS/\$PKG_BASE/spkg-requirements.txt\"" >> "$script_dir"/spkg-piprm
+}
+
+sdh_actually_pip_install_wheel() {
+ distname=$1
+ shift
# Trac #32659: pip no longer reinstalls local wheels if the version is the same.
# Because neither (1) applying patches nor (2) local changes (in the case
# of sage-conf, sage-setup, etc.) bump the version number, we need to
# override this behavior. The pip install option --force-reinstall does too
# much -- it also reinstalls all dependencies, which we do not want.
- wheel_basename="${wheel##*/}"
- distname="${wheel_basename%%-*}"
$sudo sage-pip-uninstall "$distname"
if [ $? -ne 0 ]; then
echo "(ignoring error)" >&2
fi
- $sudo sage-pip-install $root $pip_options "$wheel" || \
- sdh_die "Error installing ${wheel##*/}"
+ $sudo sage-pip-install "$@" || \
+ sdh_die "Error installing $distname"
}
sdh_pip_uninstall() {
diff --git a/build/bin/sage-logger b/build/bin/sage-logger
index 1d8d92c0c75..9ae80d404f8 100755
--- a/build/bin/sage-logger
+++ b/build/bin/sage-logger
@@ -79,7 +79,7 @@ if [ -n "$SAGE_SILENT_BUILD" -a ${use_prefix} = true ]; then
status=$?
if [[ $status != 0 ]]; then
echo " [$logname] error installing, exit status $status. End of log file:"
- tail -n 72 "$logfile" | sed "/Please email sage-devel/,$ d;s;^; [$logname] ;" >&2
+ tail -n 120 "$logfile" | sed "/Please email sage-devel/,$ d;s;^; [$logname] ;" >&2
echo " [$logname] Full log file: $logfile"
else
echo " [$logname] successfully installed."
diff --git a/build/bin/sage-spkg b/build/bin/sage-spkg
index b540c8e866f..383a98ffbbc 100755
--- a/build/bin/sage-spkg
+++ b/build/bin/sage-spkg
@@ -9,21 +9,7 @@
#
# sage-spkg []
#
-# Options can be:
-# -s: do not delete temporary build directory
-# -k: do not uninstall existing installation of this package before
-# installing; instead simply overwrite existing files.
-# -c: after installing, run the test suite for the spkg. This should
-# override the settings of SAGE_CHECK.
-# Exit with an error if the test suite fails.
-# -w: after installing, run the test suite for the spkg. This should
-# override the settings of SAGE_CHECK.
-# Print a warning if the test suite fails.
-# -d: only download the package
-# -y: automatically reply "y" for all prompts regarding
-# experimental and old-style packages
-# -n: automatically reply "n" for all prompts regarding
-# experimental and old-style packages
+# Options: see usage() below.
#
# A package may assume that the following environment
# variables are defined:
@@ -89,13 +75,22 @@ Usage: sage {-i|-p}
Search Sage's list of packages (see 'sage --package list') for a
matching package, and if a match is found, install it.
-Options:
- -s: do not delete the temporary build directory
- -c: after installing, run the test suite for the package;
- exit with an error on test suite failures
- -w: after installing, run the test suite for the package;
- print a warning on test suite failures
- -d: only download the package
+Modes of operation (provide at most one):
+ -d, --download-only: only download the package
+ -b, --build-and-stage-only: build and install (stage) only,
+ do not run post-install or check
+ -p, --post-install-only: unload the staged installation
+ directory and run other post-installation steps only
+ -x, --check-only: exclusively run the test suite;
+ this may assume that:
+ * the package has been installed already and/or that
+ * the temporary build directory has not been deleted
+ -e, --erase-build-directory-only: erase (delete) the temporary
+ build directory only
+ --info: print information on the package only
+ --help: print this help only
+
+Other options:
-y: automatically reply "y" for all prompts regarding
experimental and old-style packages; warning: there
is no guarantee that these packages will build correctly;
@@ -104,6 +99,12 @@ Options:
experimental and old-style packages
-o: allow fetching the package from its upstream URL
when it is not available from the Sage mirrors (yet)
+ -c: after installing, run the test suite for the package;
+ exit with an error on test suite failures
+ -w: after installing, run the test suite for the package;
+ print a warning on test suite failures
+ -s: save (do not delete) the temporary build directory,
+ even when the installation was successful
EOF
}
@@ -230,15 +231,24 @@ fi
INFO=0
YES=0
KEEP_EXISTING=0
+INSTALL=1
+POST_INSTALL=1
+ERASE_ONLY=0
+MODE_SWITCHES=
while true; do
case "$1" in
--info)
+ MODE_SWITCHES+=", $1"
INFO=1;;
+ --help)
+ usage
+ exit 0;;
-y)
YES=1;;
-n)
YES=-1;;
- -d)
+ -d|--download-only)
+ MODE_SWITCHES+=", $1"
SAGE_INSTALL_FETCH_ONLY=1;;
-s)
export SAGE_KEEP_BUILT_SPKGS=yes;;
@@ -246,8 +256,20 @@ while true; do
export SAGE_CHECK=yes;;
-w|--check-warning-only)
export SAGE_CHECK=warn;;
+ -b|--build-and-stage-only)
+ MODE_SWITCHES+=", $1"
+ POST_INSTALL=0; export SAGE_CHECK=no;;
+ -p|--post-install-only)
+ MODE_SWITCHES+=", $1"
+ INSTALL=0; export SAGE_CHECK=no;;
+ -x|--check-only)
+ MODE_SWITCHES+=", $1"
+ INSTALL=0; POST_INSTALL=0; export SAGE_CHECK=yes;;
-k|--keep-existing)
KEEP_EXISTING=yes;;
+ -e|--erase-build-directory-only)
+ MODE_SWITCHES+=", $1"
+ ERASE_ONLY=1;;
-o|--allow-upstream)
SAGE_DOWNLOAD_FILE_OPTIONS+=" --allow-upstream";;
-*)
@@ -257,11 +279,15 @@ while true; do
esac
shift
done
-
-
-##################################################################
-# Figure out the package filename, download it if needed.
-##################################################################
+MODE_SWITCHES=${MODE_SWITCHES#, }
+case "$MODE_SWITCHES" in
+ *,*)
+ echo >&2 "Error: at most one of the mode switches may be given, got $MODE_SWITCHES"
+ echo >&2
+ usage
+ exit 1
+ ;;
+esac
# One should be able to install a package using
# sage -i
@@ -313,8 +339,23 @@ fi
PKG_BASE_VER=`echo $PKG_VER | sed 's/\.p[0-9][0-9]*$//'`
PKG_NAME_UPSTREAM=`lookup_param tarball "$PKG_SCRIPTS/checksums.ini" | sed "s/VERSION/$PKG_BASE_VER/"`
-# Warning for experimental packages
-if [ x`cat "$PKG_SCRIPTS/type"` = x"experimental" -a $INFO = 0 ]; then
+# Set the $SAGE_DESTDIR variable to be passed to the spkg-install
+# script (the script itself could set this, but better to standardize
+# this in one place)
+export SAGE_DESTDIR="${SAGE_BUILD_DIR}/${PKG_NAME}/inst"
+
+# The actual prefix where the installation will be staged. This is the
+# directory that you need to work in if you want to change the staged
+# installation tree (before final installation to $SAGE_INST_LOCAL) at the
+# end of spkg-install.
+export SAGE_DESTDIR_LOCAL="${SAGE_DESTDIR}${SAGE_INST_LOCAL}"
+
+INSTALLED_SCRIPTS="prerm piprm postrm"
+WRAPPED_SCRIPTS="build install check preinst postinst $INSTALLED_SCRIPTS"
+
+
+warning_for_experimental_packages() { ############################
+if [ x`cat "$PKG_SCRIPTS/type"` = x"experimental" ]; then
if [ $YES != 1 ]; then
# We use /dev/tty here because our output may be redirected
# to a logfile, or line-buffered.
@@ -344,11 +385,9 @@ EOF
echo > /dev/tty "OK, installing $PKG_NAME now..."
fi
fi
+} ############################## warning_for_experimental_packages
-if [ $INFO -ne 0 ]; then
- exec sage-spkg-info $PKG_BASE
-fi
-
+ensure_pkg_src() { ###############################################
# If we haven't found the package yet, we must download it
if [ ! -f "$PKG_SRC" ]; then
if [ -n "$PKG_NAME_UPSTREAM" ]; then
@@ -385,13 +424,9 @@ if [ -n "$SAGE_SPKG_COPY_UPSTREAM" ]; then
exit 1
fi
fi
-if [ -n "$SAGE_INSTALL_FETCH_ONLY" ]; then
- exit 0
-fi
+} ################################################# ensure_pkg_src
-##################################################################
-# Setup directories
-##################################################################
+setup_directories() { ############################################
for dir in "$SAGE_SPKG_INST" "$SAGE_SPKG_SCRIPTS" "$SAGE_BUILD_DIR"; do
mkdir -p "$dir"
@@ -442,15 +477,19 @@ if [ -e "$PKG_NAME" ]; then
error_msg "Error (re)moving $PKG_NAME"
exit 1
fi
+} ############################################## setup_directories
-##################################################################
-# Extract the package
-##################################################################
+extract_the_package() { ##########################################
+cd "$SAGE_BUILD_DIR" || exit $?
echo "Setting up build directory for $PKG_NAME"
cp -RLp "$PKG_SCRIPTS" "$PKG_NAME"
cd "$PKG_NAME" || exit $?
+if [ "$SAGE_KEEP_BUILT_SPKGS" = "yes" ]; then
+ touch .keep
+fi
+
case "$PKG_SRC" in
*.whl)
# (Platform-independent) wheel
@@ -476,10 +515,10 @@ case "$PKG_SRC" in
cd ..
;;
esac
+} ############################################ extract_the_package
-##################################################################
-# The package has been extracted, prepare for installation
-##################################################################
+# The package has been extracted,
+prepare_for_installation() { #####################################
# Rewrites the given bash pseudo-script with a boilerplate header that includes
# the shebang line and sourcing sage-env. Make sure the name of the script is
@@ -542,15 +581,15 @@ __EOF__
trap - ERR
}
-
-INSTALLED_SCRIPTS="prerm piprm postrm"
-WRAPPED_SCRIPTS="build install check preinst postinst $INSTALLED_SCRIPTS"
-
# Prepare script for uninstallation of packages that use sdh_pip_install
# or sdh_store_and_pip_install_wheel.
-echo 'sdh_pip_uninstall -r $SAGE_SPKG_SCRIPTS/$PKG_BASE/spkg-requirements.txt' > spkg-piprm.in
+touch spkg-piprm.in
+
+# Prepare script for deferred installation of packages that use sdh_pip_install
+# or sdh_store_and_pip_install_wheel.
+touch spkg-pipinst.in
-for script in $WRAPPED_SCRIPTS; do
+for script in $WRAPPED_SCRIPTS pipinst; do # pipinst can be added to WRAPPED_SCRIPTS later
# 'Installed' scripts are not run immediately out of the package build
# directory, and may be run later, so set their root directory to
# $SAGE_ROOT
@@ -566,6 +605,9 @@ for script in $WRAPPED_SCRIPTS; do
write_script_wrapper "$(pwd)/$script" "$script_dir"
fi
done
+} ####################################### prepare_for_installation
+
+actually_build_and_install() { ###################################
echo "****************************************************"
echo "Host system:"
@@ -576,15 +618,12 @@ echo "C compiler version:"
$CC -v
echo "****************************************************"
-##################################################################
# Poison the proxy variable to forbid downloads in spkg-install
-##################################################################
export http_proxy=http://192.0.2.0:5187/
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export rsync_proxy=$http_proxy
-##################################################################
# We need to run sage-rebase.sh for each package installed, but it
# can be dangerous to do this while other packages are installing
# so we need to use a lock to manage when rebase is allowed to
@@ -594,8 +633,6 @@ export rsync_proxy=$http_proxy
# that. This also unfortunately slows down parallel builds since
# all packages will eventually need to wait for this lock, but
# again there's no simple way around that.
-##################################################################
-
if [ "$UNAME" = "CYGWIN" ]; then
# This is a global lock - so we use SAGE_LOCAL, not SAGE_INST_LOCAL.
if [ ! -d "$SAGE_LOCAL/var/lock" ]; then
@@ -605,21 +642,6 @@ if [ "$UNAME" = "CYGWIN" ]; then
sage-flock -s $lock_type 200
fi
-##################################################################
-# Actually install
-##################################################################
-
-# Set the $SAGE_DESTDIR variable to be passed to the spkg-install
-# script (the script itself could set this, but better to standardize
-# this in one place)
-export SAGE_DESTDIR="${SAGE_BUILD_DIR}/${PKG_NAME}/inst"
-
-# The actual prefix where the installation will be staged. This is the
-# directory that you need to work in if you want to change the staged
-# installation tree (before final installation to $SAGE_INST_LOCAL) at the
-# end of spkg-install.
-export SAGE_DESTDIR_LOCAL="${SAGE_DESTDIR}${SAGE_INST_LOCAL}"
-
# First uninstall the previous version of this package, if any
if [ "$KEEP_EXISTING" != "yes" ]; then
sage-spkg-uninstall "$PKG_BASE" "$SAGE_INST_LOCAL"
@@ -658,14 +680,17 @@ else
exit 1
fi
fi
+} ##################################### actually_build_and_install
-# To work around #26996: Remove the symlink set, or we get "cp: cannot overwrite directory"
+unload_destdir() { ###############################################
+# To work around #26996: Remove the symlink set,
+# or we get "cp: cannot overwrite directory"
rm -f "$SAGE_DESTDIR_LOCAL/lib64"
# All spkgs should eventually support this, but fall back on old behavior in
# case DESTDIR=$SAGE_DESTDIR installation was not used
-echo "Copying package files from temporary location $SAGE_DESTDIR to $SAGE_INST_LOCAL"
if [ -d "$SAGE_DESTDIR" ]; then
+ echo "Moving package files from temporary location $SAGE_DESTDIR to $SAGE_INST_LOCAL"
# Some `find` implementations will put superfluous slashes in the
# output if we give them a directory name with a slash; so make sure
# any trailing slash is removed; https://github.com/sagemath/sage/issues/26013
@@ -683,22 +708,25 @@ if [ -d "$SAGE_DESTDIR" ]; then
# Copy files into $SAGE_INST_LOCAL
$SAGE_SUDO cp -Rp "$PREFIX/." "$SAGE_INST_LOCAL"
if [ $? -ne 0 ]; then
- error_msg "Error copying files for $PKG_NAME."
+ error_msg "Error moving files for $PKG_NAME."
exit 1
fi
# Remove the $SAGE_DESTDIR entirely once all files have been moved to their
# final location.
rm -rf "$SAGE_DESTDIR"
+else
+ echo "The temporary location $SAGE_DESTDIR does not exist; has it been unloaded already?"
+ exit 1
fi
-
# At this stage the path in $SAGE_DESTDIR no longer exists, so the variable
# should be unset
unset SAGE_DESTDIR
unset SAGE_DESTDIR_LOCAL
+} ################################################# unload_destdir
-
+install_scripts() { ##############################################
# Some spkg scripts, if they exist, should also be installed to
# $SAGE_SPKG_SCRIPTS; they are not included in the package's manifest, but are
# removed by sage-spkg-uninstall
@@ -706,10 +734,11 @@ INSTALLED_SCRIPTS_DEST="$SAGE_SPKG_SCRIPTS/$PKG_BASE"
if [ ! -f $INSTALLED_SCRIPTS_DEST/spkg-requirements.txt ]; then
# No packages to uninstall with pip, so remove the prepared uninstall script
- rm -f spkg-piprm spkg-piprm.in
+ # and the prepared deferred installation script
+ rm -f spkg-piprm spkg-piprm.in spkg-pipinst spkg-pipinst.in
fi
-for script in $INSTALLED_SCRIPTS; do
+for script in $INSTALLED_SCRIPTS pipinst; do # pipinst can be added to WRAPPED_SCRIPTS later
script="spkg-$script"
if [ -f "$script" ]; then
@@ -726,9 +755,19 @@ for script in $INSTALLED_SCRIPTS; do
fi
fi
done
+} ################################################ install_scripts
-
+post_install() { #################################################
# Run the post-install script, if any
+# But first complete the delayed installation of wheels.
+if [ -f spkg-pipinst ]; then
+ echo "Running pip-install script for $PKG_NAME."
+ $SAGE_SUDO ./spkg-pipinst
+ if [ $? -ne 0 ]; then
+ error_msg "Error running the pipinst script for $PKG_NAME."
+ exit 1
+ fi
+fi
if [ -f spkg-postinst ]; then
echo "Running post-install script for $PKG_NAME."
time $SAGE_SUDO ./spkg-postinst
@@ -750,8 +789,9 @@ if [ "$UNAME" = "CYGWIN" ]; then
sage-flock -x "$SAGE_LOCAL/var/lock/rebase.lock" \
sage-rebase.sh "$SAGE_LOCAL" 2>/dev/null
fi
+} ################################################### post_install
-
+run_test_suite() { ###############################################
# Note: spkg-check tests are run after the package has been copied into
# SAGE_INST_LOCAL. It might make more sense to run the tests before, but the
# spkg-check scripts were written before use of DESTDIR installs, and so
@@ -764,7 +804,8 @@ if [ "$SAGE_CHECK" = "yes" -o "$SAGE_CHECK" = "warn" ]; then
if [ $? -ne 0 ]; then
TEST_SUITE_RESULT="failed"
if [ "$SAGE_CHECK" = "warn" ]; then
- # The following warning message must be consistent with SAGE_ROOT/build/make/install (see trac:32781)
+ # The following warning message must be consistent
+ # with SAGE_ROOT/build/make/install (see #32781)
error_msg "Warning: Failures testing package $PKG_NAME (ignored)" "make check"
else
error_msg "Error testing package $PKG_NAME" "make check"
@@ -779,7 +820,9 @@ if [ "$SAGE_CHECK" = "yes" -o "$SAGE_CHECK" = "warn" ]; then
TEST_SUITE_RESULT="not available"
fi
fi
+} ################################################# run_test_suite
+write_installation_record() { ####################################
# For each line in $FILE_LIST, enclose in double quotes:
NEW_LIST=""
for f in $FILE_LIST; do
@@ -806,25 +849,69 @@ cat > "$PKG_NAME_INSTALLED" << __EOF__
]
}
__EOF__
+} ###################################### write_installation_record
-
-echo "Successfully installed $PKG_NAME"
-
-
-##################################################################
-# Delete the temporary build directory if required
-##################################################################
-if [ "x$SAGE_KEEP_BUILT_SPKGS" != "xyes" ]; then
+delete_the_temporary_build_directory() { #########################
echo "Deleting temporary build directory"
echo "$SAGE_BUILD_DIR/$PKG_NAME"
# On Solaris, the current working directory cannot be deleted,
# so we "cd" out of $SAGE_BUILD_DIR/$PKG_NAME. See #12637.
cd "$SAGE_BUILD_DIR"
rm -rf "$SAGE_BUILD_DIR/$PKG_NAME"
+} ########################### delete_the_temporary_build_directory
+
+delete_the_temporary_build_directory_if_required() { #############
+if [ ! -e "$SAGE_BUILD_DIR/$PKG_NAME/.keep" ]; then
+ delete_the_temporary_build_directory
else
echo "You can safely delete the temporary build directory"
echo "$SAGE_BUILD_DIR/$PKG_NAME"
fi
+} ############### delete_the_temporary_build_directory_if_required
+
+
+##################################################################
+# MAIN
+##################################################################
+
+if [ $INFO -ne 0 ]; then
+ exec sage-spkg-info $PKG_BASE
+fi
+
+if [ $ERASE_ONLY = 1 ]; then
+ delete_the_temporary_build_directory
+ exit 0
+fi
+
+if [ $INSTALL = 1 ]; then
+ warning_for_experimental_packages
+ ensure_pkg_src
+fi
+
+if [ -n "$SAGE_INSTALL_FETCH_ONLY" ]; then
+ exit 0
+fi
+if [ $INSTALL = 1 ]; then
+ setup_directories
+ extract_the_package
+ prepare_for_installation
+ actually_build_and_install
+else
+ cd "$SAGE_BUILD_DIR/$PKG_NAME" || exit $?
+fi
-echo "Finished installing $PKG_NAME"
+if [ $POST_INSTALL = 1 ]; then
+ unload_destdir
+ install_scripts
+ post_install
+fi
+
+run_test_suite
+
+if [ $POST_INSTALL = 1 ]; then
+ write_installation_record
+ echo "Successfully installed $PKG_NAME"
+ delete_the_temporary_build_directory_if_required
+ echo "Finished installing $PKG_NAME"
+fi
diff --git a/build/pkgs/cmake/checksums.ini b/build/pkgs/cmake/checksums.ini
index a145b30dfb4..312edba61ff 100644
--- a/build/pkgs/cmake/checksums.ini
+++ b/build/pkgs/cmake/checksums.ini
@@ -1,5 +1,5 @@
tarball=cmake-VERSION.tar.gz
-sha1=3e9b980bfb16974f57ca02b5e2b403a2ef2d4eca
-md5=7228f5fcc8a858fdeac27e29bda0c144
-cksum=2027526722
+sha1=05de9ac807fefeb2a36ed5e8fcea376a00dd3d57
+md5=df0e65607c9280a8df68b2c93eac4437
+cksum=3851971657
upstream_url=https://github.com/Kitware/CMake/releases/download/vVERSION/cmake-VERSION.tar.gz
diff --git a/build/pkgs/cmake/package-version.txt b/build/pkgs/cmake/package-version.txt
index a155471fc06..f641ba7ef04 100644
--- a/build/pkgs/cmake/package-version.txt
+++ b/build/pkgs/cmake/package-version.txt
@@ -1 +1 @@
-3.27.3
+3.27.8
diff --git a/build/pkgs/configure/checksums.ini b/build/pkgs/configure/checksums.ini
index 6fab326e890..d89eb3cf828 100644
--- a/build/pkgs/configure/checksums.ini
+++ b/build/pkgs/configure/checksums.ini
@@ -1,4 +1,4 @@
tarball=configure-VERSION.tar.gz
-sha1=cba1a107f45084e1884ca8a873504c70eec9c16c
-md5=b61e77023581c8994c73313e867a6c26
-cksum=615928275
+sha1=60efc2b1ac7c0dcd9175cbfad5beefaf8969f24f
+md5=0dc99ff8479a481293e59816a5d21488
+cksum=2783976116
diff --git a/build/pkgs/configure/package-version.txt b/build/pkgs/configure/package-version.txt
index d124c289596..b10c55b0156 100644
--- a/build/pkgs/configure/package-version.txt
+++ b/build/pkgs/configure/package-version.txt
@@ -1 +1 @@
-9b1e18ffc022a8ed0e7451ccf190a009ceb2d81c
+f66d283d487c6f8bcee6e135c93c5613796ce9e2
diff --git a/build/pkgs/meson_python/checksums.ini b/build/pkgs/meson_python/checksums.ini
index 7eb55561d9a..1561ae04424 100644
--- a/build/pkgs/meson_python/checksums.ini
+++ b/build/pkgs/meson_python/checksums.ini
@@ -1,5 +1,5 @@
tarball=meson_python-VERSION.tar.gz
-sha1=ce9192048927ee724673f57d9881b6bee320ff82
-md5=27bc0a24d1f5e2e83236a73f0826eadb
-cksum=530505556
+sha1=71bf382c2f2e76aada2f511a84bd59a99a6b1238
+md5=e91eb9946d7bb8be06e434c5a2dadd05
+cksum=535820777
upstream_url=https://pypi.io/packages/source/m/meson_python/meson_python-VERSION.tar.gz
diff --git a/build/pkgs/meson_python/package-version.txt b/build/pkgs/meson_python/package-version.txt
index a803cc227fe..a5510516948 100644
--- a/build/pkgs/meson_python/package-version.txt
+++ b/build/pkgs/meson_python/package-version.txt
@@ -1 +1 @@
-0.14.0
+0.15.0
diff --git a/build/pkgs/pari/spkg-configure.m4 b/build/pkgs/pari/spkg-configure.m4
index 1404defc518..5ece8b4891e 100644
--- a/build/pkgs/pari/spkg-configure.m4
+++ b/build/pkgs/pari/spkg-configure.m4
@@ -1,6 +1,6 @@
SAGE_SPKG_CONFIGURE([pari], [
dnl See gp_version below on how the version is computed from MAJV.MINV.PATCHV
- m4_pushdef([SAGE_PARI_MINVER],["134912"])dnl this version and higher allowed
+ m4_pushdef([SAGE_PARI_MINVER],["134916"])dnl this version and higher allowed
m4_pushdef([SAGE_PARI_MAXVER],["999999"])dnl this version and higher not allowed
SAGE_SPKG_DEPCHECK([gmp readline], [
AC_PATH_PROG([GP], [gp])
@@ -68,24 +68,6 @@ SAGE_SPKG_CONFIGURE([pari], [
sage_spkg_install_pari=yes
fi
- AC_MSG_CHECKING([whether factor() bug 2469 of pari 2.15.3 is fixed])
- result=`echo "f=factor(2^2203-1); print(\"ok\")" | timeout 1 $GP -qf`
- if test x"$result" = xok; then
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no; cannot use system pari/GP with known bug])
- sage_spkg_install_pari=yes
- fi
-
- AC_MSG_CHECKING([whether qfbclassno() bug 2466 of pari 2.15.3 is fixed])
- result=`echo "qfbclassno(33844)" | $GP -qf`
- if test x"$result" = x3; then
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no; cannot use system pari/GP with known bug])
- sage_spkg_install_pari=yes
- fi
-
fi dnl end GP test
if test x$sage_spkg_install_pari = xno; then dnl main PARI test
diff --git a/build/pkgs/pip/spkg-pipinst.in b/build/pkgs/pip/spkg-pipinst.in
new file mode 100644
index 00000000000..3e3f6bbc94e
--- /dev/null
+++ b/build/pkgs/pip/spkg-pipinst.in
@@ -0,0 +1,5 @@
+cd src
+
+# pip can install its own wheel! But first we need to ensure that the pip
+# source directory in on the PYTHONPATH
+export PYTHONPATH="$(pwd)/src"
diff --git a/build/pkgs/sage_conf/install-requires.txt b/build/pkgs/sage_conf/install-requires.txt
index 38ec7e2cd5d..e21358d2d6c 100644
--- a/build/pkgs/sage_conf/install-requires.txt
+++ b/build/pkgs/sage_conf/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sage-conf ~= 10.3b0
+sage-conf ~= 10.3b1
diff --git a/build/pkgs/sage_docbuild/install-requires.txt b/build/pkgs/sage_docbuild/install-requires.txt
index 3769c7054e8..f1e8ac83886 100644
--- a/build/pkgs/sage_docbuild/install-requires.txt
+++ b/build/pkgs/sage_docbuild/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sage-docbuild ~= 10.3b0
+sage-docbuild ~= 10.3b1
diff --git a/build/pkgs/sage_setup/install-requires.txt b/build/pkgs/sage_setup/install-requires.txt
index 0913b873634..2cee4def9db 100644
--- a/build/pkgs/sage_setup/install-requires.txt
+++ b/build/pkgs/sage_setup/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sage-setup ~= 10.3b0
+sage-setup ~= 10.3b1
diff --git a/build/pkgs/sage_sws2rst/install-requires.txt b/build/pkgs/sage_sws2rst/install-requires.txt
index 8e3570a99d3..fe18058a251 100644
--- a/build/pkgs/sage_sws2rst/install-requires.txt
+++ b/build/pkgs/sage_sws2rst/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sage-sws2rst ~= 10.3b0
+sage-sws2rst ~= 10.3b1
diff --git a/build/pkgs/sagelib/install-requires.txt b/build/pkgs/sagelib/install-requires.txt
index 307a02db545..5ef8b7febd4 100644
--- a/build/pkgs/sagelib/install-requires.txt
+++ b/build/pkgs/sagelib/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-standard ~= 10.3b0
+sagemath-standard ~= 10.3b1
diff --git a/build/pkgs/sagemath_bliss/install-requires.txt b/build/pkgs/sagemath_bliss/install-requires.txt
index b340ea27044..434216dc8ef 100644
--- a/build/pkgs/sagemath_bliss/install-requires.txt
+++ b/build/pkgs/sagemath_bliss/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-bliss ~= 10.3b0
+sagemath-bliss ~= 10.3b1
diff --git a/build/pkgs/sagemath_categories/install-requires.txt b/build/pkgs/sagemath_categories/install-requires.txt
index 9019a793f10..57a3530c389 100644
--- a/build/pkgs/sagemath_categories/install-requires.txt
+++ b/build/pkgs/sagemath_categories/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-categories ~= 10.3b0
+sagemath-categories ~= 10.3b1
diff --git a/build/pkgs/sagemath_coxeter3/install-requires.txt b/build/pkgs/sagemath_coxeter3/install-requires.txt
index e57fd056654..395192023e6 100644
--- a/build/pkgs/sagemath_coxeter3/install-requires.txt
+++ b/build/pkgs/sagemath_coxeter3/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-coxeter3 ~= 10.3b0
+sagemath-coxeter3 ~= 10.3b1
diff --git a/build/pkgs/sagemath_environment/install-requires.txt b/build/pkgs/sagemath_environment/install-requires.txt
index 9202789d78a..f44a3871358 100644
--- a/build/pkgs/sagemath_environment/install-requires.txt
+++ b/build/pkgs/sagemath_environment/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-environment ~= 10.3b0
+sagemath-environment ~= 10.3b1
diff --git a/build/pkgs/sagemath_mcqd/install-requires.txt b/build/pkgs/sagemath_mcqd/install-requires.txt
index 93f176e6fc5..04eb1f48c9f 100644
--- a/build/pkgs/sagemath_mcqd/install-requires.txt
+++ b/build/pkgs/sagemath_mcqd/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-mcqd ~= 10.3b0
+sagemath-mcqd ~= 10.3b1
diff --git a/build/pkgs/sagemath_meataxe/install-requires.txt b/build/pkgs/sagemath_meataxe/install-requires.txt
index ee1e280aad1..83a3c23ac0c 100644
--- a/build/pkgs/sagemath_meataxe/install-requires.txt
+++ b/build/pkgs/sagemath_meataxe/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-meataxe ~= 10.3b0
+sagemath-meataxe ~= 10.3b1
diff --git a/build/pkgs/sagemath_objects/install-requires.txt b/build/pkgs/sagemath_objects/install-requires.txt
index 07baf32ec81..46ec6f8eb68 100644
--- a/build/pkgs/sagemath_objects/install-requires.txt
+++ b/build/pkgs/sagemath_objects/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-objects ~= 10.3b0
+sagemath-objects ~= 10.3b1
diff --git a/build/pkgs/sagemath_repl/install-requires.txt b/build/pkgs/sagemath_repl/install-requires.txt
index 79c7e5a7ed0..4d3da43b2cf 100644
--- a/build/pkgs/sagemath_repl/install-requires.txt
+++ b/build/pkgs/sagemath_repl/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-repl ~= 10.3b0
+sagemath-repl ~= 10.3b1
diff --git a/build/pkgs/sagemath_sirocco/install-requires.txt b/build/pkgs/sagemath_sirocco/install-requires.txt
index 44ebb97d788..fa923dda429 100644
--- a/build/pkgs/sagemath_sirocco/install-requires.txt
+++ b/build/pkgs/sagemath_sirocco/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-sirocco ~= 10.3b0
+sagemath-sirocco ~= 10.3b1
diff --git a/build/pkgs/sagemath_tdlib/install-requires.txt b/build/pkgs/sagemath_tdlib/install-requires.txt
index ea24439a16a..913c85d2233 100644
--- a/build/pkgs/sagemath_tdlib/install-requires.txt
+++ b/build/pkgs/sagemath_tdlib/install-requires.txt
@@ -1,2 +1,2 @@
# This file is updated on every release by the sage-update-version script
-sagemath-tdlib ~= 10.3b0
+sagemath-tdlib ~= 10.3b1
diff --git a/build/pkgs/symengine/checksums.ini b/build/pkgs/symengine/checksums.ini
index 1c1813e7eea..8eb65f05ef9 100644
--- a/build/pkgs/symengine/checksums.ini
+++ b/build/pkgs/symengine/checksums.ini
@@ -1,5 +1,5 @@
tarball=symengine-VERSION.tar.gz
-sha1=11885879ddcd0a9ab69e36a79b93aef836d6c95d
-md5=4673c85b423241ce85a9df35a7ed61bb
-cksum=1344562381
+sha1=a2c8957f2099c9199751b165f107bf93d6823818
+md5=fe3c3fee1bd8dfdb9576fc2d28cb1076
+cksum=3544211225
upstream_url=https://github.com/symengine/symengine/releases/download/vVERSION/symengine-VERSION.tar.gz
diff --git a/build/pkgs/symengine/distros/arch.txt b/build/pkgs/symengine/distros/arch.txt
new file mode 100644
index 00000000000..7bcf459b746
--- /dev/null
+++ b/build/pkgs/symengine/distros/arch.txt
@@ -0,0 +1 @@
+symengine
diff --git a/build/pkgs/symengine/distros/homebrew.txt b/build/pkgs/symengine/distros/homebrew.txt
new file mode 100644
index 00000000000..7bcf459b746
--- /dev/null
+++ b/build/pkgs/symengine/distros/homebrew.txt
@@ -0,0 +1 @@
+symengine
diff --git a/build/pkgs/symengine/package-version.txt b/build/pkgs/symengine/package-version.txt
index 571215736a6..af88ba82486 100644
--- a/build/pkgs/symengine/package-version.txt
+++ b/build/pkgs/symengine/package-version.txt
@@ -1 +1 @@
-0.10.1
+0.11.1
diff --git a/build/pkgs/symengine/spkg-configure.m4 b/build/pkgs/symengine/spkg-configure.m4
new file mode 100644
index 00000000000..c037d2e5f72
--- /dev/null
+++ b/build/pkgs/symengine/spkg-configure.m4
@@ -0,0 +1,45 @@
+SAGE_SPKG_CONFIGURE([symengine], [
+ m4_pushdef(SAGE_SYMENGINE_VERSION_MAJOR, [0])
+ m4_pushdef(SAGE_SYMENGINE_VERSION_MINOR, [11])
+ SAGE_SPKG_DEPCHECK([gmp arb ecm flint mpc mpfr], [
+ AC_CHECK_HEADER([symengine/symengine_config.h], [], [sage_spkg_install_symengine=yes])
+ AC_MSG_CHECKING([whether we can link a program using symengine])
+ SYMENGINE_SAVED_LIBS=$LIBS
+ LIBS="$LIBS -lsymengine"
+ AC_LINK_IFELSE([
+ AC_LANG_PROGRAM([[#include ]],
+ [[using SymEngine::Expression;
+ Expression x("x");
+ auto ex = pow(x+sqrt(Expression(2)), 6);]]
+ )], [AC_MSG_RESULT([yes])], [
+ AC_MSG_RESULT([no]); sage_spkg_install_symengine=yes
+ LIBS=$SYMENGINE_SAVED_LIBS
+ ])
+ AC_MSG_CHECKING([symengine version >= ]SAGE_SYMENGINE_VERSION_MAJOR[.]SAGE_SYMENGINE_VERSION_MINOR)
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM(
+ [[#include
+ #include
+ ]], [[
+ fprintf(stderr, "%s\n", SYMENGINE_VERSION);
+ if (SYMENGINE_MAJOR_VERSION >]] SAGE_SYMENGINE_VERSION_MAJOR[[) return 0;
+ else if (SYMENGINE_MAJOR_VERSION ==]] SAGE_SYMENGINE_VERSION_MAJOR[[ &&
+ SYMENGINE_MINOR_VERSION >=]] SAGE_SYMENGINE_VERSION_MINOR[[) return 0;
+ else return 1;
+ ]])], [
+ AC_MSG_RESULT([yes])
+ ], [
+ AC_MSG_RESULT([no])
+ sage_spkg_install_symengine=yes
+ ], [
+ dnl assume that the person running cross-compiling
+ dnl knows what they are doing
+ AC_MSG_RESULT([yes])
+ ])
+ ])
+
+ m4_popdef([SAGE_SYMENGINE_VERSION_MAJOR])
+ m4_popdef([SAGE_SYMENGINE_VERSION_MINOR])
+], [], [], []
+)
+
diff --git a/build/pkgs/symengine_py/checksums.ini b/build/pkgs/symengine_py/checksums.ini
index 0235c5e9cd9..f8790fdfb4e 100644
--- a/build/pkgs/symengine_py/checksums.ini
+++ b/build/pkgs/symengine_py/checksums.ini
@@ -1,5 +1,5 @@
tarball=symengine.py-VERSION.tar.gz
-sha1=fbbf052e66077ec51df319444b71f94114f33d9e
-md5=fc5d2d7f571a880aa2e040214aed2ff0
-cksum=2535731241
-upstream_url=https://github.com/symengine/symengine.py/archive/vVERSION.tar.gz
+sha1=4a8da0d0a057c8709c5b28543dbb3d26a060f013
+md5=d10f4ba5c27b09ef234fcafddf824ce5
+cksum=1332096394
+upstream_url=https://pypi.io/packages/source/p/symengine/symengine-VERSION.tar.gz
diff --git a/build/pkgs/symengine_py/distros/arch.txt b/build/pkgs/symengine_py/distros/arch.txt
new file mode 100644
index 00000000000..16ff7effe29
--- /dev/null
+++ b/build/pkgs/symengine_py/distros/arch.txt
@@ -0,0 +1 @@
+python-symengine
diff --git a/build/pkgs/symengine_py/distros/freebsd.txt b/build/pkgs/symengine_py/distros/freebsd.txt
new file mode 100644
index 00000000000..9fa30f46fb7
--- /dev/null
+++ b/build/pkgs/symengine_py/distros/freebsd.txt
@@ -0,0 +1 @@
+math/py-symengine
diff --git a/build/pkgs/symengine_py/distros/gentoo.txt b/build/pkgs/symengine_py/distros/gentoo.txt
new file mode 100644
index 00000000000..e8851805aea
--- /dev/null
+++ b/build/pkgs/symengine_py/distros/gentoo.txt
@@ -0,0 +1 @@
+dev-python/symengine
diff --git a/build/pkgs/symengine_py/package-version.txt b/build/pkgs/symengine_py/package-version.txt
index 78bc1abd14f..d9df1bbc0c7 100644
--- a/build/pkgs/symengine_py/package-version.txt
+++ b/build/pkgs/symengine_py/package-version.txt
@@ -1 +1 @@
-0.10.0
+0.11.0
diff --git a/build/pkgs/symengine_py/spkg-configure.m4 b/build/pkgs/symengine_py/spkg-configure.m4
new file mode 100644
index 00000000000..9559bdb6da0
--- /dev/null
+++ b/build/pkgs/symengine_py/spkg-configure.m4
@@ -0,0 +1 @@
+SAGE_SPKG_CONFIGURE([symengine_py], [SAGE_PYTHON_PACKAGE_CHECK([symengine_py])])
diff --git a/build/pkgs/symengine_py/type b/build/pkgs/symengine_py/type
index af4d63af86d..134d9bc32d5 100644
--- a/build/pkgs/symengine_py/type
+++ b/build/pkgs/symengine_py/type
@@ -1 +1 @@
-experimental
\ No newline at end of file
+optional
diff --git a/build/pkgs/texttable/checksums.ini b/build/pkgs/texttable/checksums.ini
index 380a205bdd3..d8725b785b2 100644
--- a/build/pkgs/texttable/checksums.ini
+++ b/build/pkgs/texttable/checksums.ini
@@ -1,5 +1,5 @@
tarball=texttable-VERSION.tar.gz
-sha1=25e1b92e02c8e919dc0da053efbe8c4874418a8d
-md5=83eb15fb541dd857ff051a8d0c979b9c
-cksum=3183998721
+sha1=0fa175fa6e0fefea31434746641bedc8cbb60248
+md5=e5d380c04fab132ccf0bbfd4f761bd51
+cksum=274394355
upstream_url=https://pypi.io/packages/source/t/texttable/texttable-VERSION.tar.gz
diff --git a/build/pkgs/texttable/package-version.txt b/build/pkgs/texttable/package-version.txt
index 400084b1bf2..bd8bf882d06 100644
--- a/build/pkgs/texttable/package-version.txt
+++ b/build/pkgs/texttable/package-version.txt
@@ -1 +1 @@
-1.6.7
+1.7.0
diff --git a/build/pkgs/trove_classifiers/checksums.ini b/build/pkgs/trove_classifiers/checksums.ini
index 1f04c749038..d59736dbac2 100644
--- a/build/pkgs/trove_classifiers/checksums.ini
+++ b/build/pkgs/trove_classifiers/checksums.ini
@@ -1,5 +1,5 @@
tarball=trove-classifiers-VERSION.tar.gz
-sha1=4763a32114b3bb96dfd447404022586355c5f83f
-md5=6ae148c8374d131dd18e28c22275d56a
-cksum=1938191178
+sha1=c6821e6c6d57dc2eec2d4156d63cdca939373759
+md5=154ae4cdb69ac37bb35a35c6fbc477cd
+cksum=84032195
upstream_url=https://pypi.io/packages/source/t/trove_classifiers/trove-classifiers-VERSION.tar.gz
diff --git a/build/pkgs/trove_classifiers/package-version.txt b/build/pkgs/trove_classifiers/package-version.txt
index 0497ae632a3..b82d6dba095 100644
--- a/build/pkgs/trove_classifiers/package-version.txt
+++ b/build/pkgs/trove_classifiers/package-version.txt
@@ -1 +1 @@
-2023.8.7
+2023.11.14
diff --git a/pkgs/sage-conf/VERSION.txt b/pkgs/sage-conf/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sage-conf/VERSION.txt
+++ b/pkgs/sage-conf/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sage-conf_conda/VERSION.txt b/pkgs/sage-conf_conda/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sage-conf_conda/VERSION.txt
+++ b/pkgs/sage-conf_conda/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sage-conf_pypi/VERSION.txt b/pkgs/sage-conf_pypi/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sage-conf_pypi/VERSION.txt
+++ b/pkgs/sage-conf_pypi/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sage-docbuild/VERSION.txt b/pkgs/sage-docbuild/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sage-docbuild/VERSION.txt
+++ b/pkgs/sage-docbuild/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sage-setup/VERSION.txt b/pkgs/sage-setup/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sage-setup/VERSION.txt
+++ b/pkgs/sage-setup/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sage-sws2rst/VERSION.txt b/pkgs/sage-sws2rst/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sage-sws2rst/VERSION.txt
+++ b/pkgs/sage-sws2rst/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-bliss/VERSION.txt b/pkgs/sagemath-bliss/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-bliss/VERSION.txt
+++ b/pkgs/sagemath-bliss/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-bliss/pyproject.toml.m4 b/pkgs/sagemath-bliss/pyproject.toml.m4
index 7783c12c118..df61e7fac6a 100644
--- a/pkgs/sagemath-bliss/pyproject.toml.m4
+++ b/pkgs/sagemath-bliss/pyproject.toml.m4
@@ -11,3 +11,25 @@ requires = [
SPKG_INSTALL_REQUIRES_pkgconfig
]
build-backend = "setuptools.build_meta"
+
+[project]
+name = "sagemath-bliss"
+description = "Sage: Open Source Mathematics Software: Graph (iso/auto)morphisms with bliss"
+dependencies = [
+ SPKG_INSTALL_REQUIRES_cysignals
+]
+dynamic = ["version"]
+include(`pyproject_toml_metadata.m4')dnl'
+
+[project.readme]
+file = "README.rst"
+content-type = "text/x-rst"
+
+[project.optional-dependencies]
+test = [SPKG_INSTALL_REQUIRES_sagemath_repl]
+
+[tool.setuptools]
+include-package-data = false
+
+[tool.setuptools.dynamic]
+version = {file = ["VERSION.txt"]}
diff --git a/pkgs/sagemath-bliss/setup.cfg.m4 b/pkgs/sagemath-bliss/setup.cfg.m4
deleted file mode 100644
index d1faa96a563..00000000000
--- a/pkgs/sagemath-bliss/setup.cfg.m4
+++ /dev/null
@@ -1,17 +0,0 @@
-include(`sage_spkg_versions.m4')dnl' -*- conf-unix -*-
-[metadata]
-name = sagemath-bliss
-version = file: VERSION.txt
-description = Sage: Open Source Mathematics Software: Graph (iso/auto)morphisms with bliss
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-include(`setup_cfg_metadata.m4')dnl'
-
-[options]
-python_requires = >=3.8, <3.12
-install_requires =
- SPKG_INSTALL_REQUIRES_cysignals
-
-[options.extras_require]
-test =
- SPKG_INSTALL_REQUIRES_sagemath_repl
diff --git a/pkgs/sagemath-categories/VERSION.txt b/pkgs/sagemath-categories/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-categories/VERSION.txt
+++ b/pkgs/sagemath-categories/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-coxeter3/VERSION.txt b/pkgs/sagemath-coxeter3/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-coxeter3/VERSION.txt
+++ b/pkgs/sagemath-coxeter3/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-coxeter3/pyproject.toml.m4 b/pkgs/sagemath-coxeter3/pyproject.toml.m4
index 69613011371..a8d0e52a4b0 100644
--- a/pkgs/sagemath-coxeter3/pyproject.toml.m4
+++ b/pkgs/sagemath-coxeter3/pyproject.toml.m4
@@ -10,3 +10,27 @@ requires = [
SPKG_INSTALL_REQUIRES_pkgconfig
]
build-backend = "setuptools.build_meta"
+
+[project]
+name = "sagemath-coxeter3"
+description = "Sage: Open Source Mathematics Software: Coxeter groups, Bruhat ordering, Kazhdan-Lusztig polynomials with coxeter3"
+dependencies = []
+dynamic = ["version"]
+include(`pyproject_toml_metadata.m4')dnl'
+
+[project.readme]
+file = "README.rst"
+content-type = "text/x-rst"
+
+[tool.setuptools]
+packages = ["sage.libs.coxeter3"]
+include-package-data = false
+
+[tool.setuptools.dynamic]
+version = {file = ["VERSION.txt"]}
+
+[tool.setuptools.package-data]
+"sage.libs.coxeter3" = [
+ "coxeter.pxd",
+ "decl.pxd",
+]
diff --git a/pkgs/sagemath-coxeter3/setup.cfg.m4 b/pkgs/sagemath-coxeter3/setup.cfg.m4
deleted file mode 100644
index ab3288d89ab..00000000000
--- a/pkgs/sagemath-coxeter3/setup.cfg.m4
+++ /dev/null
@@ -1,20 +0,0 @@
-include(`sage_spkg_versions.m4')dnl' -*- conf-unix -*-
-[metadata]
-name = sagemath-coxeter3
-version = file: VERSION.txt
-description = Sage: Open Source Mathematics Software: Coxeter groups, Bruhat ordering, Kazhdan-Lusztig polynomials with coxeter3
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-include(`setup_cfg_metadata.m4')dnl'
-
-[options]
-python_requires = >=3.8, <3.12
-install_requires =
-
-packages =
- sage.libs.coxeter3
-
-[options.package_data]
-sage.libs.coxeter3 =
- coxeter.pxd
- decl.pxd
diff --git a/pkgs/sagemath-environment/VERSION.txt b/pkgs/sagemath-environment/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-environment/VERSION.txt
+++ b/pkgs/sagemath-environment/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-mcqd/VERSION.txt b/pkgs/sagemath-mcqd/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-mcqd/VERSION.txt
+++ b/pkgs/sagemath-mcqd/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-mcqd/pyproject.toml.m4 b/pkgs/sagemath-mcqd/pyproject.toml.m4
index bb34e4c5eb9..c94aface3fd 100644
--- a/pkgs/sagemath-mcqd/pyproject.toml.m4
+++ b/pkgs/sagemath-mcqd/pyproject.toml.m4
@@ -11,3 +11,27 @@ requires = [
SPKG_INSTALL_REQUIRES_pkgconfig
]
build-backend = "setuptools.build_meta"
+
+[project]
+name = "sagemath-mcqd"
+description = "Sage: Open Source Mathematics Software: Finding maximum cliques with mcqd"
+dependencies = [
+ SPKG_INSTALL_REQUIRES_memory_allocator
+ SPKG_INSTALL_REQUIRES_cysignals
+]
+dynamic = ["version"]
+include(`pyproject_toml_metadata.m4')dnl'
+
+[project.readme]
+file = "README.rst"
+content-type = "text/x-rst"
+
+[tool.setuptools]
+packages = ["sage.graphs"]
+include-package-data = false
+
+[tool.setuptools.dynamic]
+version = {file = ["VERSION.txt"]}
+
+[tool.setuptools.package-data]
+"sage.graphs" = ["mcqd.pxd"]
diff --git a/pkgs/sagemath-mcqd/setup.cfg.m4 b/pkgs/sagemath-mcqd/setup.cfg.m4
deleted file mode 100644
index fff8f2805ef..00000000000
--- a/pkgs/sagemath-mcqd/setup.cfg.m4
+++ /dev/null
@@ -1,21 +0,0 @@
-include(`sage_spkg_versions.m4')dnl' -*- conf-unix -*-
-[metadata]
-name = sagemath-mcqd
-version = file: VERSION.txt
-description = Sage: Open Source Mathematics Software: Finding maximum cliques with mcqd
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-include(`setup_cfg_metadata.m4')dnl'
-
-[options]
-python_requires = >=3.8, <3.12
-install_requires =
- SPKG_INSTALL_REQUIRES_memory_allocator
- SPKG_INSTALL_REQUIRES_cysignals
-
-packages =
- sage.graphs
-
-[options.package_data]
-sage.graphs =
- mcqd.pxd
diff --git a/pkgs/sagemath-meataxe/VERSION.txt b/pkgs/sagemath-meataxe/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-meataxe/VERSION.txt
+++ b/pkgs/sagemath-meataxe/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-meataxe/pyproject.toml.m4 b/pkgs/sagemath-meataxe/pyproject.toml.m4
index 69613011371..0c8fd46d8be 100644
--- a/pkgs/sagemath-meataxe/pyproject.toml.m4
+++ b/pkgs/sagemath-meataxe/pyproject.toml.m4
@@ -10,3 +10,28 @@ requires = [
SPKG_INSTALL_REQUIRES_pkgconfig
]
build-backend = "setuptools.build_meta"
+
+[project]
+name = "sagemath-meataxe"
+description = "Sage: Open Source Mathematics Software: Matrices over small finite fields with meataxe"
+dependencies = []
+dynamic = ["version"]
+include(`pyproject_toml_metadata.m4')dnl'
+
+[project.readme]
+file = "README.rst"
+content-type = "text/x-rst"
+
+[tool.setuptools]
+packages = [
+ "sage.libs",
+ "sage.matrix",
+]
+include-package-data = false
+
+[tool.setuptools.dynamic]
+version = {file = ["VERSION.txt"]}
+
+[tool.setuptools.package-data]
+"sage.libs" = ["meataxe.pxd"]
+"sage.matrix" = ["matrix_gfpn_dense.pxd"]
diff --git a/pkgs/sagemath-meataxe/setup.cfg.m4 b/pkgs/sagemath-meataxe/setup.cfg.m4
deleted file mode 100644
index a558825e120..00000000000
--- a/pkgs/sagemath-meataxe/setup.cfg.m4
+++ /dev/null
@@ -1,22 +0,0 @@
-include(`sage_spkg_versions.m4')dnl' -*- conf-unix -*-
-[metadata]
-name = sagemath-meataxe
-version = file: VERSION.txt
-description = Sage: Open Source Mathematics Software: Matrices over small finite fields with meataxe
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-include(`setup_cfg_metadata.m4')dnl'
-
-[options]
-python_requires = >=3.8, <3.12
-
-packages =
- sage.libs
- sage.matrix
-
-[options.package_data]
-sage.libs =
- meataxe.pxd
-
-sage.matrix =
- matrix_gfpn_dense.pxd
diff --git a/pkgs/sagemath-objects/VERSION.txt b/pkgs/sagemath-objects/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-objects/VERSION.txt
+++ b/pkgs/sagemath-objects/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-repl/VERSION.txt b/pkgs/sagemath-repl/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-repl/VERSION.txt
+++ b/pkgs/sagemath-repl/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-sirocco/VERSION.txt b/pkgs/sagemath-sirocco/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-sirocco/VERSION.txt
+++ b/pkgs/sagemath-sirocco/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-sirocco/pyproject.toml.m4 b/pkgs/sagemath-sirocco/pyproject.toml.m4
index 684ed189d9f..55e400738d7 100644
--- a/pkgs/sagemath-sirocco/pyproject.toml.m4
+++ b/pkgs/sagemath-sirocco/pyproject.toml.m4
@@ -11,3 +11,23 @@ requires = [
SPKG_INSTALL_REQUIRES_pkgconfig
]
build-backend = "setuptools.build_meta"
+
+[project]
+name = "sagemath-sirocco"
+description = "Sage: Open Source Mathematics Software: Certified root continuation with sirocco"
+dependencies = [
+ SPKG_INSTALL_REQUIRES_cypari
+ SPKG_INSTALL_REQUIRES_cysignals
+]
+dynamic = ["version"]
+include(`pyproject_toml_metadata.m4')dnl'
+
+[project.readme]
+file = "README.rst"
+content-type = "text/x-rst"
+
+[tool.setuptools]
+include-package-data = false
+
+[tool.setuptools.dynamic]
+version = {file = ["VERSION.txt"]}
diff --git a/pkgs/sagemath-sirocco/setup.cfg.m4 b/pkgs/sagemath-sirocco/setup.cfg.m4
deleted file mode 100644
index 4f1e0f03d95..00000000000
--- a/pkgs/sagemath-sirocco/setup.cfg.m4
+++ /dev/null
@@ -1,14 +0,0 @@
-include(`sage_spkg_versions.m4')dnl' -*- conf-unix -*-
-[metadata]
-name = sagemath-sirocco
-version = file: VERSION.txt
-description = Sage: Open Source Mathematics Software: Certified root continuation with sirocco
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-include(`setup_cfg_metadata.m4')dnl'
-
-[options]
-python_requires = >=3.8, <3.12
-install_requires =
- SPKG_INSTALL_REQUIRES_cypari
- SPKG_INSTALL_REQUIRES_cysignals
diff --git a/pkgs/sagemath-tdlib/VERSION.txt b/pkgs/sagemath-tdlib/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/pkgs/sagemath-tdlib/VERSION.txt
+++ b/pkgs/sagemath-tdlib/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/pkgs/sagemath-tdlib/pyproject.toml.m4 b/pkgs/sagemath-tdlib/pyproject.toml.m4
index 69613011371..8e3bcdd988f 100644
--- a/pkgs/sagemath-tdlib/pyproject.toml.m4
+++ b/pkgs/sagemath-tdlib/pyproject.toml.m4
@@ -10,3 +10,22 @@ requires = [
SPKG_INSTALL_REQUIRES_pkgconfig
]
build-backend = "setuptools.build_meta"
+
+[project]
+name = "sagemath-tdlib"
+description = "Sage: Open Source Mathematics Software: Tree decompositions with tdlib"
+dependencies = [
+ SPKG_INSTALL_REQUIRES_cysignals
+]
+dynamic = ["version"]
+include(`pyproject_toml_metadata.m4')dnl'
+
+[project.readme]
+file = "README.rst"
+content-type = "text/x-rst"
+
+[tool.setuptools]
+include-package-data = false
+
+[tool.setuptools.dynamic]
+version = {file = ["VERSION.txt"]}
diff --git a/pkgs/sagemath-tdlib/setup.cfg.m4 b/pkgs/sagemath-tdlib/setup.cfg.m4
deleted file mode 100644
index 62833bbe6f6..00000000000
--- a/pkgs/sagemath-tdlib/setup.cfg.m4
+++ /dev/null
@@ -1,12 +0,0 @@
-include(`sage_spkg_versions.m4')dnl' -*- conf-unix -*-
-[metadata]
-name = sagemath-tdlib
-version = file: VERSION.txt
-description = Sage: Open Source Mathematics Software: Tree decompositions with tdlib
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-include(`setup_cfg_metadata.m4')dnl'
-
-[options]
-python_requires = >=3.8, <3.12
-install_requires = SPKG_INSTALL_REQUIRES_cysignals
diff --git a/src/VERSION.txt b/src/VERSION.txt
index d1741c9f234..84e7588ad82 100644
--- a/src/VERSION.txt
+++ b/src/VERSION.txt
@@ -1 +1 @@
-10.3.beta0
+10.3.beta1
diff --git a/src/bin/sage-version.sh b/src/bin/sage-version.sh
index 9f4098364dc..d97ae9d5c1a 100644
--- a/src/bin/sage-version.sh
+++ b/src/bin/sage-version.sh
@@ -4,6 +4,6 @@
# which stops "setup.py develop" from rewriting it as a Python file.
:
# This file is auto-generated by the sage-update-version script, do not edit!
-SAGE_VERSION='10.3.beta0'
-SAGE_RELEASE_DATE='2023-12-05'
-SAGE_VERSION_BANNER='SageMath version 10.3.beta0, Release Date: 2023-12-05'
+SAGE_VERSION='10.3.beta1'
+SAGE_RELEASE_DATE='2023-12-10'
+SAGE_VERSION_BANNER='SageMath version 10.3.beta1, Release Date: 2023-12-10'
diff --git a/src/doc/common/static/custom-furo.css b/src/doc/common/static/custom-furo.css
index 343fbb908cf..fc76a3f7c0f 100644
--- a/src/doc/common/static/custom-furo.css
+++ b/src/doc/common/static/custom-furo.css
@@ -11,3 +11,13 @@ body[data-theme="dark"] div.highlight {
background: #383838;
}
+/* Copied the style for a.pdf from website/templates/index_furo.html */
+
+a.pdf {
+ margin-right: 0.5em;
+}
+
+a.pdf:hover {
+ text-decoration: none;
+}
+
diff --git a/src/doc/de/tutorial/tour_plotting.rst b/src/doc/de/tutorial/tour_plotting.rst
index e7dc377193f..495c5a6943b 100644
--- a/src/doc/de/tutorial/tour_plotting.rst
+++ b/src/doc/de/tutorial/tour_plotting.rst
@@ -1,3 +1,5 @@
+.. sage-doctest: needs sage.plot sage.symbolic
+
.. _section-plot:
Plotten
diff --git a/src/doc/en/developer/packaging_sage_library.rst b/src/doc/en/developer/packaging_sage_library.rst
index 576356a9dff..d5f5a3dac4b 100644
--- a/src/doc/en/developer/packaging_sage_library.rst
+++ b/src/doc/en/developer/packaging_sage_library.rst
@@ -451,7 +451,7 @@ Apparently it does not in a very substantial way:
merely a heuristic. Looking at the source of "entropy", through
``log`` from :mod:`sage.misc.functional`, a runtime dependency on
symbolics comes in. In fact, for this reason, two doctests there are
- already marked as ``# optional - sage.symbolic``.
+ already marked as ``# needs sage.symbolic``.
So if packaged as **sagemath-coding**, now a domain expert would have
to decide whether these dependencies on symbolics are strong enough to
diff --git a/src/doc/en/prep/Calculus.rst b/src/doc/en/prep/Calculus.rst
index af6902b9e04..c2f636be558 100644
--- a/src/doc/en/prep/Calculus.rst
+++ b/src/doc/en/prep/Calculus.rst
@@ -1,4 +1,4 @@
-.. -*- coding: utf-8 -*-
+.. sage-doctest: needs sage.plot sage.symbolic
.. linkall
diff --git a/src/doc/en/prep/Quickstarts/Differential-Equations.rst b/src/doc/en/prep/Quickstarts/Differential-Equations.rst
index 3c023424db8..94964ccc0a7 100644
--- a/src/doc/en/prep/Quickstarts/Differential-Equations.rst
+++ b/src/doc/en/prep/Quickstarts/Differential-Equations.rst
@@ -1,4 +1,4 @@
-.. -*- coding: utf-8 -*-
+.. sage-doctest: needs sage.plot sage.symbolic
.. linkall
diff --git a/src/doc/en/prep/Quickstarts/Statistics-and-Distributions.rst b/src/doc/en/prep/Quickstarts/Statistics-and-Distributions.rst
index ed7eed79dfc..e83516d6833 100644
--- a/src/doc/en/prep/Quickstarts/Statistics-and-Distributions.rst
+++ b/src/doc/en/prep/Quickstarts/Statistics-and-Distributions.rst
@@ -142,13 +142,14 @@ the examples in ``r.kruskal_test?`` in the notebook.
::
- sage: x=r([2.9, 3.0, 2.5, 2.6, 3.2]) # normal subjects # optional - rpy2
- sage: y=r([3.8, 2.7, 4.0, 2.4]) # with obstructive airway disease # optional - rpy2
- sage: z=r([2.8, 3.4, 3.7, 2.2, 2.0]) # with asbestosis # optional - rpy2
- sage: a = r([x,y,z]) # make a long R vector of all the data # optional - rpy2
- sage: b = r.factor(5*[1]+4*[2]+5*[3]) # create something for R to tell # optional - rpy2
- ....: # which subjects are which
- sage: a; b # show them # optional - rpy2
+ sage: # optional - rpy2
+ sage: x = r([2.9, 3.0, 2.5, 2.6, 3.2]) # normal subjects
+ sage: y = r([3.8, 2.7, 4.0, 2.4]) # with obstructive airway disease
+ sage: z = r([2.8, 3.4, 3.7, 2.2, 2.0]) # with asbestosis
+ sage: a = r([x,y,z]) # make a long R vector of all the data
+ sage: b = r.factor(5*[1] + 4*[2] + 5*[3]) # create something for R to tell
+ ....: # which subjects are which
+ sage: a; b # show them
[1] 2.9 3.0 2.5 2.6 3.2 3.8 2.7 4.0 2.4 2.8 3.4 3.7 2.2 2.0
[1] 1 1 1 1 1 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
diff --git a/src/doc/en/prep/Symbolics-and-Basic-Plotting.rst b/src/doc/en/prep/Symbolics-and-Basic-Plotting.rst
index 6e0ab69765a..3bc9308669b 100644
--- a/src/doc/en/prep/Symbolics-and-Basic-Plotting.rst
+++ b/src/doc/en/prep/Symbolics-and-Basic-Plotting.rst
@@ -1,4 +1,4 @@
-.. -*- coding: utf-8 -*-
+.. sage-doctest: needs sage.plot sage.symbolic
.. linkall
diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst
index d39195c34d3..fd3963ab275 100644
--- a/src/doc/en/reference/references/index.rst
+++ b/src/doc/en/reference/references/index.rst
@@ -1238,6 +1238,9 @@ REFERENCES:
:doi:`10.1109/SFCS.1989.63516`,
_
+.. [Bro2009] \R. Bröker: *Constructing supersingular elliptic curves*.
+ Journal of Combinatorics and Number Theory 1.3 (2009), pp. 269--273.
+
.. [Broder2000] Broder, A.Z., Kumar, R., Maghoul, F., Raghavan, P., Rajagopalan,
S., Stata, R., Tomkins, A., Wiener, J.L.: Graph structure in
the web. Computer Networks 33(1-6), 309–320 (2000)
diff --git a/src/doc/en/thematic_tutorials/coercion_and_categories.rst b/src/doc/en/thematic_tutorials/coercion_and_categories.rst
index 7f5712caea7..1c1d7c85b5f 100644
--- a/src/doc/en/thematic_tutorials/coercion_and_categories.rst
+++ b/src/doc/en/thematic_tutorials/coercion_and_categories.rst
@@ -114,7 +114,6 @@ This base class provides a lot more methods than a general parent::
'_coerce_',
'_coerce_c',
'_coerce_impl',
- '_coerce_try',
'_default_category',
'_gens',
'_ideal_class_',
diff --git a/src/doc/en/thematic_tutorials/geometry/polyhedra_tutorial.rst b/src/doc/en/thematic_tutorials/geometry/polyhedra_tutorial.rst
index b7d689e5ca3..ca7fdac7197 100644
--- a/src/doc/en/thematic_tutorials/geometry/polyhedra_tutorial.rst
+++ b/src/doc/en/thematic_tutorials/geometry/polyhedra_tutorial.rst
@@ -91,7 +91,7 @@ and some rays.
::
- sage: P1 = Polyhedron(vertices = [[1, 0], [0, 1]], rays = [[1, 1]])
+ sage: P1 = Polyhedron(vertices=[[1, 0], [0, 1]], rays=[[1, 1]])
sage: P1
A 2-dimensional polyhedron in QQ^2 defined as the convex hull of 2 vertices and 1 ray
@@ -118,9 +118,9 @@ We can also add a lineality space.
::
- sage: P2 = Polyhedron(vertices = [[1/2, 0, 0], [0, 1/2, 0]],
- ....: rays = [[1, 1, 0]],
- ....: lines = [[0, 0, 1]])
+ sage: P2 = Polyhedron(vertices=[[1/2, 0, 0], [0, 1/2, 0]],
+ ....: rays=[[1, 1, 0]],
+ ....: lines=[[0, 0, 1]])
sage: P2
A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 2 vertices, 1 ray, 1 line
sage: P2.plot()
@@ -144,7 +144,7 @@ The chosen ring depends on the input format.
::
- sage: P3 = Polyhedron(vertices = [[0.5, 0], [0, 0.5]])
+ sage: P3 = Polyhedron(vertices=[[0.5, 0], [0, 0.5]])
sage: P3
A 1-dimensional polyhedron in RDF^2 defined as the convex hull of 2 vertices
sage: P3.parent()
@@ -163,22 +163,22 @@ The following example demonstrates the limitations of :code:`RDF`.
::
- sage: D = polytopes.dodecahedron() # optional - sage.rings.number_field
- sage: D # optional - sage.rings.number_field
+ sage: D = polytopes.dodecahedron() # needs sage.rings.number_field
+ sage: D # needs sage.rings.number_field
A 3-dimensional polyhedron
in (Number Field in sqrt5 with defining polynomial x^2 - 5
with sqrt5 = 2.236067977499790?)^3
defined as the convex hull of 20 vertices
- sage: vertices_RDF = [n(v.vector(),digits=6) for v in D.vertices()] # optional - sage.rings.number_field
- sage: D_RDF = Polyhedron(vertices=vertices_RDF, base_ring=RDF) # optional - sage.rings.number_field
+ sage: vertices_RDF = [n(v.vector(),digits=6) for v in D.vertices()] # needs sage.rings.number_field
+ sage: D_RDF = Polyhedron(vertices=vertices_RDF, base_ring=RDF) # needs sage.rings.number_field
doctest:warning
...
UserWarning: This polyhedron data is numerically complicated; cdd
could not convert between the inexact V and H representation
without loss of data. The resulting object might show
inconsistencies.
- sage: D_RDF = Polyhedron(vertices=sorted(vertices_RDF), base_ring=RDF) # optional - sage.rings.number_field
+ sage: D_RDF = Polyhedron(vertices=sorted(vertices_RDF), base_ring=RDF) # needs sage.rings.number_field
Traceback (most recent call last):
...
ValueError: *Error: Numerical inconsistency is found. Use the GMP exact arithmetic.
@@ -199,11 +199,12 @@ It is also possible to define a polyhedron over algebraic numbers.
::
- sage: sqrt_2 = AA(2)^(1/2) # optional - sage.rings.number_field
- sage: cbrt_2 = AA(2)^(1/3) # optional - sage.rings.number_field
- sage: timeit('Polyhedron(vertices = [[sqrt_2, 0], [0, cbrt_2]])') # optional - sage.rings.number_field # random
+ sage: # needs sage.rings.number_field
+ sage: sqrt_2 = AA(2)^(1/2)
+ sage: cbrt_2 = AA(2)^(1/3)
+ sage: timeit('Polyhedron(vertices=[[sqrt_2, 0], [0, cbrt_2]])') # random
5 loops, best of 3: 43.2 ms per loop
- sage: P4 = Polyhedron(vertices = [[sqrt_2, 0], [0, cbrt_2]]); P4 # optional - sage.rings.number_field
+ sage: P4 = Polyhedron(vertices=[[sqrt_2, 0], [0, cbrt_2]]); P4
A 1-dimensional polyhedron in AA^2 defined as the convex hull of 2 vertices
.. end of output
@@ -212,11 +213,12 @@ There is another way to create a polyhedron over algebraic numbers:
::
- sage: K. = NumberField(x^2 - 2, embedding=AA(2)**(1/2)) # optional - sage.rings.number_field
- sage: L. = NumberField(x^3 - 2, embedding=AA(2)**(1/3)) # optional - sage.rings.number_field
- sage: timeit('Polyhedron(vertices = [[a, 0], [0, b]])') # optional - sage.rings.number_field # random
+ sage: # needs sage.rings.number_field
+ sage: K. = NumberField(x^2 - 2, embedding=AA(2)**(1/2))
+ sage: L. = NumberField(x^3 - 2, embedding=AA(2)**(1/3))
+ sage: timeit('Polyhedron(vertices=[[a, 0], [0, b]])') # random
5 loops, best of 3: 39.9 ms per loop
- sage: P5 = Polyhedron(vertices = [[a, 0], [0, b]]); P5 # optional - sage.rings.number_field
+ sage: P5 = Polyhedron(vertices=[[a, 0], [0, b]]); P5
A 1-dimensional polyhedron in AA^2 defined as the convex hull of 2 vertices
.. end of output
@@ -225,10 +227,11 @@ If the base ring is known it may be a good option to use the proper :meth:`sage.
::
- sage: J = K.composite_fields(L)[0] # optional - sage.rings.number_field
- sage: timeit('Polyhedron(vertices = [[J(a), 0], [0, J(b)]])') # optional - sage.rings.number_field # random
+ sage: # needs sage.rings.number_field
+ sage: J = K.composite_fields(L)[0]
+ sage: timeit('Polyhedron(vertices=[[J(a), 0], [0, J(b)]])') # random
25 loops, best of 3: 9.8 ms per loop
- sage: P5_comp = Polyhedron(vertices = [[J(a), 0], [0, J(b)]]); P5_comp # optional - sage.rings.number_field
+ sage: P5_comp = Polyhedron(vertices=[[J(a), 0], [0, J(b)]]); P5_comp
A 1-dimensional polyhedron
in (Number Field in ab with defining polynomial
x^6 - 6*x^4 - 4*x^3 + 12*x^2 - 24*x - 4
@@ -242,9 +245,9 @@ It is not possible to define a polyhedron over it:
::
- sage: sqrt_2s = sqrt(2) # optional - sage.symbolic
- sage: cbrt_2s = 2^(1/3) # optional - sage.symbolic
- sage: Polyhedron(vertices = [[sqrt_2s, 0], [0, cbrt_2s]]) # optional - sage.symbolic
+ sage: sqrt_2s = sqrt(2) # needs sage.symbolic
+ sage: cbrt_2s = 2^(1/3) # needs sage.symbolic
+ sage: Polyhedron(vertices=[[sqrt_2s, 0], [0, cbrt_2s]]) # needs sage.symbolic
Traceback (most recent call last):
...
ValueError: no default backend for computations with Symbolic Ring
@@ -389,7 +392,7 @@ inequalities and equalities as objects.
::
- sage: P3_QQ = Polyhedron(vertices = [[0.5, 0], [0, 0.5]], base_ring=QQ)
+ sage: P3_QQ = Polyhedron(vertices=[[0.5, 0], [0, 0.5]], base_ring=QQ)
sage: HRep = P3_QQ.Hrepresentation()
sage: H1 = HRep[0]; H1
An equation (2, 2) x - 1 == 0
@@ -527,7 +530,7 @@ In order to use a specific backend, we specify the :code:`backend` parameter.
::
- sage: P1_cdd = Polyhedron(vertices = [[1, 0], [0, 1]], rays = [[1, 1]], backend='cdd')
+ sage: P1_cdd = Polyhedron(vertices=[[1, 0], [0, 1]], rays=[[1, 1]], backend='cdd')
sage: P1_cdd
A 2-dimensional polyhedron in QQ^2 defined as the convex hull of 2 vertices and 1 ray
@@ -567,7 +570,7 @@ The :code:`cdd` backend accepts also entries in :code:`RDF`:
::
- sage: P3_cdd = Polyhedron(vertices = [[0.5, 0], [0, 0.5]], backend='cdd')
+ sage: P3_cdd = Polyhedron(vertices=[[0.5, 0], [0, 0.5]], backend='cdd')
sage: P3_cdd
A 1-dimensional polyhedron in RDF^2 defined as the convex hull of 2 vertices
@@ -577,12 +580,12 @@ but not algebraic or symbolic values:
::
- sage: P4_cdd = Polyhedron(vertices = [[sqrt_2, 0], [0, cbrt_2]], backend='cdd') # optional - sage.rings.number_field
+ sage: P4_cdd = Polyhedron(vertices=[[sqrt_2, 0], [0, cbrt_2]], backend='cdd') # needs sage.rings.number_field
Traceback (most recent call last):
...
ValueError: No such backend (=cdd) implemented for given basering (=Algebraic Real Field).
- sage: P5_cdd = Polyhedron(vertices = [[sqrt_2s, 0], [0, cbrt_2s]], backend='cdd') # optional - sage.symbolic
+ sage: P5_cdd = Polyhedron(vertices=[[sqrt_2s, 0], [0, cbrt_2s]], backend='cdd') # needs sage.symbolic
Traceback (most recent call last):
...
ValueError: No such backend (=cdd) implemented for given basering (=Symbolic Ring).
@@ -656,8 +659,8 @@ An example with quadratic field:
::
- sage: V = polytopes.dodecahedron().vertices_list() # optional - sage.rings.number_field
- sage: Polyhedron(vertices=V, backend='polymake') # optional - jupymake # optional - sage.rings.number_field
+ sage: V = polytopes.dodecahedron().vertices_list() # needs sage.rings.number_field
+ sage: Polyhedron(vertices=V, backend='polymake') # optional - jupymake # needs sage.rings.number_field
A 3-dimensional polyhedron
in (Number Field in sqrt5 with defining polynomial x^2 - 5
with sqrt5 = 2.236067977499790?)^3
@@ -681,7 +684,7 @@ examples.
::
- sage: type(D) # optional - sage.rings.number_field
+ sage: type(D) # needs sage.rings.number_field
.. end of output
@@ -691,13 +694,14 @@ backend :code:`field` is called.
::
- sage: P4.parent() # optional - sage.rings.number_field
+ sage: # needs sage.rings.number_field
+ sage: P4.parent()
Polyhedra in AA^2
- sage: P5.parent() # optional - sage.rings.number_field
+ sage: P5.parent()
Polyhedra in AA^2
- sage: type(P4) # optional - sage.rings.number_field
+ sage: type(P4)
- sage: type(P5) # optional - sage.rings.number_field
+ sage: type(P5)
.. end of output
@@ -709,13 +713,15 @@ The fourth backend is :code:`normaliz` and is an optional Sage package.
::
- sage: P1_normaliz = Polyhedron(vertices = [[1, 0], [0, 1]], rays = [[1, 1]], backend='normaliz') # optional - pynormaliz
- sage: type(P1_normaliz) # optional - pynormaliz
+ sage: # optional - pynormaliz
+ sage: P1_normaliz = Polyhedron(vertices=[[1, 0], [0, 1]], rays=[[1, 1]],
+ ....: backend='normaliz')
+ sage: type(P1_normaliz)
- sage: P2_normaliz = Polyhedron(vertices = [[1/2, 0, 0], [0, 1/2, 0]], # optional - pynormaliz
- ....: rays = [[1, 1, 0]],
- ....: lines = [[0, 0, 1]], backend='normaliz')
- sage: type(P2_normaliz) # optional - pynormaliz
+ sage: P2_normaliz = Polyhedron(vertices=[[1/2, 0, 0], [0, 1/2, 0]],
+ ....: rays=[[1, 1, 0]],
+ ....: lines=[[0, 0, 1]], backend='normaliz')
+ sage: type(P2_normaliz)
.. end of output
@@ -724,7 +730,7 @@ This backend does not work with :code:`RDF` or other inexact fields.
::
- sage: P3_normaliz = Polyhedron(vertices = [[0.5, 0], [0, 0.5]], backend='normaliz') # optional - pynormaliz
+ sage: P3_normaliz = Polyhedron(vertices=[[0.5, 0], [0, 0.5]], backend='normaliz') # optional - pynormaliz
Traceback (most recent call last):
...
ValueError: No such backend (=normaliz) implemented for given basering (=Real Double Field).
@@ -738,12 +744,14 @@ the computation is done using an embedded number field.
::
- sage: P4_normaliz = Polyhedron(vertices = [[sqrt_2, 0], [0, cbrt_2]], backend='normaliz') # optional - pynormaliz
- sage: P4_normaliz # optional - pynormaliz
+ sage: # optional - pynormaliz
+ sage: P4_normaliz = Polyhedron(vertices=[[sqrt_2, 0], [0, cbrt_2]],
+ ....: backend='normaliz')
+ sage: P4_normaliz
A 1-dimensional polyhedron in AA^2 defined as the convex hull of 2 vertices
-
- sage: P5_normaliz = Polyhedron(vertices = [[sqrt_2s, 0], [0, cbrt_2s]], backend='normaliz') # optional - pynormaliz
- sage: P5_normaliz # optional - pynormaliz
+ sage: P5_normaliz = Polyhedron(vertices=[[sqrt_2s, 0], [0, cbrt_2s]],
+ ....: backend='normaliz')
+ sage: P5_normaliz
A 1-dimensional polyhedron in (Symbolic Ring)^2 defined as the convex hull of 2 vertices
.. end of output
@@ -753,12 +761,14 @@ The backend :code:`normaliz` provides other methods such as
::
- sage: P6 = Polyhedron(vertices = [[0, 0], [3/2, 0], [3/2, 3/2], [0, 3]], backend='normaliz') # optional - pynormaliz
- sage: IH = P6.integral_hull(); IH # optional - pynormaliz
+ sage: # optional - pynormaliz
+ sage: P6 = Polyhedron(vertices=[[0, 0], [3/2, 0], [3/2, 3/2], [0, 3]],
+ ....: backend='normaliz')
+ sage: IH = P6.integral_hull(); IH
A 2-dimensional polyhedron in QQ^2 defined as the convex hull of 4 vertices
- sage: P6.plot(color='blue')+IH.plot(color='red') # optional - pynormaliz
+ sage: P6.plot(color='blue') + IH.plot(color='red')
Graphics object consisting of 12 graphics primitives
- sage: P1_normaliz.integral_hull() # optional - pynormaliz
+ sage: P1_normaliz.integral_hull()
A 2-dimensional polyhedron in QQ^2 defined as the convex hull of 2 vertices and 1 ray
.. end of output
@@ -788,7 +798,7 @@ polytope is already defined!
::
- sage: A = polytopes.buckyball(); A # can take long # optional - sage.rings.number_field
+ sage: A = polytopes.buckyball(); A # can take long # needs sage.rings.number_field
A 3-dimensional polyhedron
in (Number Field in sqrt5 with defining polynomial x^2 - 5
with sqrt5 = 2.236067977499790?)^3
diff --git a/src/doc/en/thematic_tutorials/media/stand-a.png b/src/doc/en/thematic_tutorials/media/stand-a.png
index e2c973a3371..5b51eae50ff 100644
Binary files a/src/doc/en/thematic_tutorials/media/stand-a.png and b/src/doc/en/thematic_tutorials/media/stand-a.png differ
diff --git a/src/doc/en/thematic_tutorials/media/stand-b.png b/src/doc/en/thematic_tutorials/media/stand-b.png
index 21db8f321a6..bc270abde8c 100644
Binary files a/src/doc/en/thematic_tutorials/media/stand-b.png and b/src/doc/en/thematic_tutorials/media/stand-b.png differ
diff --git a/src/doc/en/thematic_tutorials/media/stand-c.png b/src/doc/en/thematic_tutorials/media/stand-c.png
index fe480d5f7f4..3874783ae7b 100644
Binary files a/src/doc/en/thematic_tutorials/media/stand-c.png and b/src/doc/en/thematic_tutorials/media/stand-c.png differ
diff --git a/src/doc/en/thematic_tutorials/media/stand-d.png b/src/doc/en/thematic_tutorials/media/stand-d.png
index 3f7809b4f1d..3a72676da90 100644
Binary files a/src/doc/en/thematic_tutorials/media/stand-d.png and b/src/doc/en/thematic_tutorials/media/stand-d.png differ
diff --git a/src/doc/en/thematic_tutorials/media/stand-g.png b/src/doc/en/thematic_tutorials/media/stand-g.png
index b817da8f1ad..aeb401483fd 100644
Binary files a/src/doc/en/thematic_tutorials/media/stand-g.png and b/src/doc/en/thematic_tutorials/media/stand-g.png differ
diff --git a/src/doc/en/thematic_tutorials/media/standard1.png b/src/doc/en/thematic_tutorials/media/standard1.png
index 1ddccd21c0d..28a9314dc82 100644
Binary files a/src/doc/en/thematic_tutorials/media/standard1.png and b/src/doc/en/thematic_tutorials/media/standard1.png differ
diff --git a/src/doc/en/thematic_tutorials/media/tableau1.png b/src/doc/en/thematic_tutorials/media/tableau1.png
index 98d034a0840..52e7c1703c9 100644
Binary files a/src/doc/en/thematic_tutorials/media/tableau1.png and b/src/doc/en/thematic_tutorials/media/tableau1.png differ
diff --git a/src/doc/en/thematic_tutorials/media/tableau2.png b/src/doc/en/thematic_tutorials/media/tableau2.png
index ba142fa1408..9dae9ebe93d 100644
Binary files a/src/doc/en/thematic_tutorials/media/tableau2.png and b/src/doc/en/thematic_tutorials/media/tableau2.png differ
diff --git a/src/doc/en/thematic_tutorials/media/tableau3.png b/src/doc/en/thematic_tutorials/media/tableau3.png
index 63f8894bdb7..bce84867d4a 100644
Binary files a/src/doc/en/thematic_tutorials/media/tableau3.png and b/src/doc/en/thematic_tutorials/media/tableau3.png differ
diff --git a/src/doc/en/thematic_tutorials/media/tableau4.png b/src/doc/en/thematic_tutorials/media/tableau4.png
index df317758406..1857acc6cb8 100644
Binary files a/src/doc/en/thematic_tutorials/media/tableau4.png and b/src/doc/en/thematic_tutorials/media/tableau4.png differ
diff --git a/src/doc/en/thematic_tutorials/media/tableaux.png b/src/doc/en/thematic_tutorials/media/tableaux.png
index 6dc74d77ccd..5d6ad183e60 100644
Binary files a/src/doc/en/thematic_tutorials/media/tableaux.png and b/src/doc/en/thematic_tutorials/media/tableaux.png differ
diff --git a/src/doc/en/thematic_tutorials/media/tensor.png b/src/doc/en/thematic_tutorials/media/tensor.png
index a15989a1075..c7287e2d0da 100644
Binary files a/src/doc/en/thematic_tutorials/media/tensor.png and b/src/doc/en/thematic_tutorials/media/tensor.png differ
diff --git a/src/doc/en/thematic_tutorials/numerical_sage/cvxopt.rst b/src/doc/en/thematic_tutorials/numerical_sage/cvxopt.rst
index ba6cfb5fb86..56ffac780ad 100644
--- a/src/doc/en/thematic_tutorials/numerical_sage/cvxopt.rst
+++ b/src/doc/en/thematic_tutorials/numerical_sage/cvxopt.rst
@@ -28,15 +28,16 @@ by
::
- sage: import numpy # optional - cvxopt
- sage: from cvxopt.base import spmatrix # optional - cvxopt
- sage: from cvxopt.base import matrix as m # optional - cvxopt
- sage: from cvxopt import umfpack # optional - cvxopt
- sage: Integer = int # optional - cvxopt
- sage: V = [2,3, 3,-1,4, 4,-3,1,2, 2, 6,1] # optional - cvxopt
- sage: I = [0,1, 0, 2,4, 1, 2,3,4, 2, 1,4] # optional - cvxopt
- sage: J = [0,0, 1, 1,1, 2, 2,2,2, 3, 4,4] # optional - cvxopt
- sage: A = spmatrix(V,I,J) # optional - cvxopt
+ sage: # needs cvxopt
+ sage: import numpy
+ sage: from cvxopt.base import spmatrix
+ sage: from cvxopt.base import matrix as m
+ sage: from cvxopt import umfpack
+ sage: Integer = int
+ sage: V = [2,3, 3,-1,4, 4,-3,1,2, 2, 6,1]
+ sage: I = [0,1, 0, 2,4, 1, 2,3,4, 2, 1,4]
+ sage: J = [0,0, 1, 1,1, 2, 2,2,2, 3, 4,4]
+ sage: A = spmatrix(V,I,J)
To solve an equation :math:`AX=B`, with :math:`B=[1,1,1,1,1]`,
we could do the following.
@@ -45,9 +46,9 @@ we could do the following.
::
- sage: B = numpy.array([1.0]*5) # optional - cvxopt
- sage: B.shape=(5,1) # optional - cvxopt
- sage: print(B) # optional - cvxopt
+ sage: B = numpy.array([1.0]*5) # needs cvxopt
+ sage: B.shape=(5,1) # needs cvxopt
+ sage: print(B) # needs cvxopt
[[1.]
[1.]
[1.]
@@ -55,15 +56,16 @@ we could do the following.
[1.]]
- sage: print(A) # optional - cvxopt
+ sage: # needs cvxopt
+ sage: print(A)
[ 2.00e+00 3.00e+00 0 0 0 ]
[ 3.00e+00 0 4.00e+00 0 6.00e+00]
[ 0 -1.00e+00 -3.00e+00 2.00e+00 0 ]
[ 0 0 1.00e+00 0 0 ]
[ 0 4.00e+00 2.00e+00 0 1.00e+00]
- sage: C = m(B) # optional - cvxopt
- sage: umfpack.linsolve(A,C) # optional - cvxopt
- sage: print(C) # optional - cvxopt
+ sage: C = m(B)
+ sage: umfpack.linsolve(A,C)
+ sage: print(C)
[ 5.79e-01]
[-5.26e-02]
[ 1.00e+00]
@@ -81,13 +83,14 @@ We could compute the approximate minimum degree ordering by doing
::
- sage: RealNumber = float # optional - cvxopt
- sage: Integer = int # optional - cvxopt
- sage: from cvxopt.base import spmatrix # optional - cvxopt
- sage: from cvxopt import amd # optional - cvxopt
- sage: A = spmatrix([10,3,5,-2,5,2],[0,2,1,2,2,3],[0,0,1,1,2,3]) # optional - cvxopt
- sage: P = amd.order(A) # optional - cvxopt
- sage: print(P) # optional - cvxopt
+ sage: # needs cvxopt
+ sage: RealNumber = float
+ sage: Integer = int
+ sage: from cvxopt.base import spmatrix
+ sage: from cvxopt import amd
+ sage: A = spmatrix([10,3,5,-2,5,2],[0,2,1,2,2,3],[0,0,1,1,2,3])
+ sage: P = amd.order(A)
+ sage: print(P)
[ 1]
[ 0]
[ 2]
@@ -108,14 +111,15 @@ For a simple linear programming example, if we want to solve
::
- sage: RealNumber = float # optional - cvxopt
- sage: Integer = int # optional - cvxopt
- sage: from cvxopt.base import matrix as m # optional - cvxopt
- sage: from cvxopt import solvers # optional - cvxopt
- sage: c = m([-4., -5.]) # optional - cvxopt
- sage: G = m([[2., 1., -1., 0.], [1., 2., 0., -1.]]) # optional - cvxopt
- sage: h = m([3., 3., 0., 0.]) # optional - cvxopt
- sage: sol = solvers.lp(c,G,h) # random # optional - cvxopt
+ sage: # needs cvxopt
+ sage: RealNumber = float
+ sage: Integer = int
+ sage: from cvxopt.base import matrix as m
+ sage: from cvxopt import solvers
+ sage: c = m([-4., -5.])
+ sage: G = m([[2., 1., -1., 0.], [1., 2., 0., -1.]])
+ sage: h = m([3., 3., 0., 0.])
+ sage: sol = solvers.lp(c,G,h) # random
pcost dcost gap pres dres k/t
0: -8.1000e+00 -1.8300e+01 4e+00 0e+00 8e-01 1e+00
1: -8.8055e+00 -9.4357e+00 2e-01 1e-16 4e-02 3e-02
@@ -127,6 +131,6 @@ For a simple linear programming example, if we want to solve
::
- sage: print(sol['x']) # optional - cvxopt # ... below since can get -00 or +00 depending on architecture
+ sage: print(sol['x']) # ... below since can get -00 or +00 depending on architecture # needs cvxopt
[ 1.00e...00]
[ 1.00e+00]
diff --git a/src/doc/en/thematic_tutorials/steenrod_algebra_modules.rst b/src/doc/en/thematic_tutorials/steenrod_algebra_modules.rst
index f038ff7acaa..6a096608c68 100644
--- a/src/doc/en/thematic_tutorials/steenrod_algebra_modules.rst
+++ b/src/doc/en/thematic_tutorials/steenrod_algebra_modules.rst
@@ -41,7 +41,8 @@ with relations, the coefficients for each relation is given::
sage: r1 = [Sq(8), Sq(7), 0] # First relation
sage: r2 = [Sq(7), 0, 1] # Second relation
sage: M = SteenrodFPModule(A, [0, 1, 7], relations=[r1, r2]); M
- Finitely presented left module on 3 generators and 2 relations over mod 2 Steenrod algebra, milnor basis
+ Finitely presented left module on 3 generators and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
The resulting module will have three generators in the degrees we gave them::
@@ -156,8 +157,8 @@ A vector space presentation can be produced::
Vector space quotient V/W of dimension 4 over Finite Field of size 2 where
V: Vector space of dimension 4 over Finite Field of size 2
W: Vector space of degree 4 and dimension 0 over Finite Field of size 2
- Basis matrix:
- []
+ Basis matrix:
+ []
Given any element, its coordinates with respect to this basis can be computed::
@@ -188,11 +189,13 @@ such homomorphisms using the function ``Hom``::
sage: Hko = SteenrodFPModule(A, [0], [[Sq(2)], [Sq(1)]])
sage: homspace = Hom(Hko, Hko); homspace
- Set of Morphisms from Finitely presented left module on 1 generator and 2 relations
- over mod 2 Steenrod algebra, milnor basis
- to Finitely presented left module on 1 generator and 2 relations
- over mod 2 Steenrod algebra, milnor basis
- in Category of finitely presented graded modules over mod 2 Steenrod algebra, milnor basis
+ Set of Morphisms
+ from Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
+ to Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
+ in Category of finitely presented graded modules
+ over mod 2 Steenrod algebra, milnor basis
Just as with module elements, homomorphisms are created using the homspace.
The only argument is a list of elements in the codomain, giving the
@@ -207,7 +210,8 @@ The resulting homomorphism is the one sending the `i`-th generator of the
domain to the `i`-th codomain value given::
sage: f
- Module endomorphism of Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
+ Module endomorphism of Finitely presented left module on 1 generator
+ and 2 relations over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> Sq(0,0,1)*g[0]
Homomorphisms can be evaluated on elements of the domain module::
@@ -232,7 +236,8 @@ Convenience methods exist for creating the trivial morphism::
sage: x == 0
False
sage: zero_map = homspace.zero(); zero_map
- Module endomorphism of Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
+ Module endomorphism of Finitely presented left module on 1 generator
+ and 2 relations over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> 0
sage: zero_map(x)
0
@@ -242,7 +247,8 @@ Convenience methods exist for creating the trivial morphism::
as well as the identity endomorphism::
sage: one = Hom(Hko, Hko).identity(); one
- Module endomorphism of Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
+ Module endomorphism of Finitely presented left module on 1 generator
+ and 2 relations over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[0]
sage: one.is_endomorphism()
True
@@ -271,7 +277,8 @@ Any two homomorphisms can be added as long as they are of the same degree::
sage: (f1 + f2).is_zero()
False
sage: f1 + f2
- Module endomorphism of Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
+ Module endomorphism of Finitely presented left module on 1 generator
+ and 2 relations over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> (Sq(0,0,3)+Sq(0,2,0,1)+Sq(8,2,1))*g[0]
or when at least one of them is zero::
@@ -302,32 +309,32 @@ elements is a linear transformation::
[1 0 0 0 0 0]
[0 0 0 0 0 0]
[1 0 0 0 0 0]
- Domain: Vector space quotient V/W of dimension 3 over Finite Field of size 2 where
- V: Vector space of dimension 20 over Finite Field of size 2
- W: Vector space of degree 20 and dimension 17 over Finite Field of size 2
- Basis matrix:
- [1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
- [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
- [0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
- [0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1]
- [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1]
- [0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1]
- [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1]
- [0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1]
- [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
- [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1]
- [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
- [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1]
- [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1]
- [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1]
- [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1]
- [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
- [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1]
+ Domain: Vector space quotient V/W of dimension 3 over Finite Field of size 2 where
+ V: Vector space of dimension 20 over Finite Field of size 2
+ W: Vector space of degree 20 and dimension 17 over Finite Field of size 2
+ Basis matrix:
+ [1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
+ [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
+ [0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
+ [0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1]
+ [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1]
+ [0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1]
+ [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1]
+ [0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1]
+ [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
+ [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1]
+ [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0]
+ [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1]
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1]
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1]
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1]
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]
+ [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1]
Codomain: Vector space quotient V/W of dimension 6 over Finite Field of size 2 where
- V: Vector space of dimension 35 over Finite Field of size 2
- W: Vector space of degree 35 and dimension 29 over Finite Field of size 2
- Basis matrix:
- 29 x 35 dense matrix over Finite Field of size 2
+ V: Vector space of dimension 35 over Finite Field of size 2
+ W: Vector space of degree 35 and dimension 29 over Finite Field of size 2
+ Basis matrix:
+ 29 x 35 dense matrix over Finite Field of size 2
This is compatible with the vector presentations of its domain and codomain
modules::
@@ -352,13 +359,13 @@ Elements in the preimage of a homomorphism can be found::
Homomorphisms can be composed as expected::
sage: g = homspace([Sq(0, 0, 0, 1)*gen]); g
- Module endomorphism of Finitely presented left module on 1 generator and 2 relations
- over mod 2 Steenrod algebra, milnor basis
+ Module endomorphism of Finitely presented left module on 1 generator
+ and 2 relations over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> Sq(0,0,0,1)*g[0]
sage: g*f
- Module endomorphism of Finitely presented left module on 1 generator and 2 relations
- over mod 2 Steenrod algebra, milnor basis
+ Module endomorphism of Finitely presented left module on 1 generator
+ and 2 relations over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> Sq(0,0,1,1)*g[0]
sage: one = homspace.identity()
@@ -412,13 +419,15 @@ homomorphism of free modules. We then construct a candidate for an isomorphism
and check that it is both injective and surjective::
sage: HZ = SteenrodFPModule(A, [0], [[Sq(1)]]); HZ
- Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
+ Finitely presented left module on 1 generator and 1 relation
+ over mod 2 Steenrod algebra, milnor basis
sage: F = SteenrodFPModule(A, [0])
sage: j = Hom(F, F)([Sq(1)*F.generator(0)])
- sage: coker = j.cokernel_projection() # the natural quotient homomorphism onto the cokernel.
+ sage: coker = j.cokernel_projection() # the natural quotient homomorphism onto the cokernel.
sage: hz = coker.codomain(); hz
- Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
+ Finitely presented left module on 1 generator and 1 relation
+ over mod 2 Steenrod algebra, milnor basis
sage: a = Hom(HZ, hz)([hz.generator(0)])
sage: a.is_injective()
@@ -435,8 +444,10 @@ injective homomorphism into the domain of `f`::
sage: k = f.kernel_inclusion(); k
Module morphism:
- From: Finitely presented left module on 1 generator and 3 relations over mod 2 Steenrod algebra, milnor basis
- To: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
+ From: Finitely presented left module on 1 generator and 3 relations
+ over mod 2 Steenrod algebra, milnor basis
+ To: Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
Defn: g[7] |--> Sq(0,0,1)*g[0]
sage: k.codomain() == f.domain()
True
@@ -445,7 +456,8 @@ injective homomorphism into the domain of `f`::
sage: ker = k.domain()
sage: ker
- Finitely presented left module on 1 generator and 3 relations over mod 2 Steenrod algebra, milnor basis
+ Finitely presented left module on 1 generator and 3 relations
+ over mod 2 Steenrod algebra, milnor basis
We can check that the injective image of `k` is the kernel of `f` by
showing that `f` factors as `h\circ c`, where `c` is the quotient map
@@ -470,8 +482,10 @@ equal to the submodule `\operatorname{im}(f)`::
sage: i = f.image(); i
Module morphism:
- From: Finitely presented left module on 1 generator and 3 relations over mod 2 Steenrod algebra, milnor basis
- To: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
+ From: Finitely presented left module on 1 generator and 3 relations
+ over mod 2 Steenrod algebra, milnor basis
+ To: Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
Defn: g[7] |--> Sq(0,0,1)*g[0]
sage: i.codomain() == f.codomain()
True
@@ -483,8 +497,10 @@ lifting `f` over `i`, and showing that the lift is surjective::
sage: f_ = f.lift(i); f_
Module morphism:
- From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
- To: Finitely presented left module on 1 generator and 3 relations over mod 2 Steenrod algebra, milnor basis
+ From: Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
+ To: Finitely presented left module on 1 generator and 3 relations
+ over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[7]
sage: i*f_ == f # Is im(i) contained in im(f) ?
True
@@ -501,7 +517,8 @@ domain `\ker(g)`::
sage: K = f.kernel_inclusion() # k: ker(f) -> Hko
sage: h = f.homology(f) # h: ker(f) -> ker(f) / im(f)
sage: h.codomain() # This is the homology module.
- Finitely presented left module on 1 generator and 4 relations over mod 2 Steenrod algebra, milnor basis
+ Finitely presented left module on 1 generator and 4 relations
+ over mod 2 Steenrod algebra, milnor basis
Free resolutions
@@ -632,8 +649,10 @@ The projection::
sage: q = Hom(HZ, Hko)([Hko.generator(0)])
sage: q
Module morphism:
- From: Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
- To: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
+ From: Finitely presented left module on 1 generator and 1 relation
+ over mod 2 Steenrod algebra, milnor basis
+ To: Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
Defn: g[0] |--> g[0]
The map to lift over `q`::
@@ -641,8 +660,10 @@ The map to lift over `q`::
sage: f = Hom(L, Hko)([Sq(0,2,1,1)*Hko.generator(0)])
sage: f
Module morphism:
- From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
- To: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
+ From: Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
+ To: Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
Defn: g[28] |--> Sq(0,2,1,1)*g[0]
sage: f.is_zero() # f is non-trivial.
@@ -703,8 +724,10 @@ Start by finding a single lift of `f` over the projection `q`::
sage: fl = f.lift(q); fl
Module morphism:
- From: Finitely presented left module on 1 generator and 2 relations over mod 2 Steenrod algebra, milnor basis
- To: Finitely presented left module on 1 generator and 1 relation over mod 2 Steenrod algebra, milnor basis
+ From: Finitely presented left module on 1 generator and 2 relations
+ over mod 2 Steenrod algebra, milnor basis
+ To: Finitely presented left module on 1 generator and 1 relation
+ over mod 2 Steenrod algebra, milnor basis
Defn: g[28] |--> (Sq(4,3,0,1)+Sq(6,0,1,1)+Sq(7,2,0,1)+Sq(10,1,0,1))*g[0]
We verify that ``fl`` is indeed a lift::
diff --git a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_advanced.rst b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_advanced.rst
index 104933d7bc8..7bd9934cffd 100644
--- a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_advanced.rst
+++ b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_advanced.rst
@@ -1,4 +1,4 @@
-.. -*- coding: utf-8 -*-
+.. sage-doctest: needs sage.plot sage.symbolic
.. linkall
diff --git a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_cartesian.rst b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_cartesian.rst
index 978aa129395..51300f93bc1 100644
--- a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_cartesian.rst
+++ b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_cartesian.rst
@@ -1,4 +1,4 @@
-.. -*- coding: utf-8 -*-
+.. sage-doctest: needs sage.plot sage.symbolic
.. linkall
diff --git a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_change.rst b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_change.rst
index d7164e7c363..029c5727435 100644
--- a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_change.rst
+++ b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_change.rst
@@ -1,4 +1,4 @@
-.. -*- coding: utf-8 -*-
+.. .. sage-doctest: needs sage.plot sage.symbolic
.. linkall
diff --git a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_curvilinear.rst b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_curvilinear.rst
index bdcff4b9af8..af11769e274 100644
--- a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_curvilinear.rst
+++ b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_curvilinear.rst
@@ -1,4 +1,4 @@
-.. -*- coding: utf-8 -*-
+.. sage-doctest: needs sage.plot sage.symbolic
.. linkall
diff --git a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_plane.rst b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_plane.rst
index 59c4270badb..921724105a0 100644
--- a/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_plane.rst
+++ b/src/doc/en/thematic_tutorials/vector_calculus/vector_calc_plane.rst
@@ -1,4 +1,4 @@
-.. -*- coding: utf-8 -*-
+.. sage-doctest: needs sage.plot sage.symbolic
.. linkall
diff --git a/src/doc/en/tutorial/tour_plotting.rst b/src/doc/en/tutorial/tour_plotting.rst
index a218f70ff1e..ad861c3ca56 100644
--- a/src/doc/en/tutorial/tour_plotting.rst
+++ b/src/doc/en/tutorial/tour_plotting.rst
@@ -1,3 +1,5 @@
+.. sage-doctest: needs sage.plot sage.symbolic
+
.. _section-plot:
Plotting
diff --git a/src/doc/en/website/templates/index_furo.html b/src/doc/en/website/templates/index_furo.html
index 1dca6907c93..2b086f35d8a 100644
--- a/src/doc/en/website/templates/index_furo.html
+++ b/src/doc/en/website/templates/index_furo.html
@@ -10,10 +10,13 @@
border: none;
}
a.pdf {
- margin-left: 0.5em;
- {%- if hide_pdf_links %}
+ margin-right: 0.3em;
+ {%- if hide_pdf_links %}
display: none;
- {%- endif %}
+ {%- endif %}
+ }
+ a.pdf:hover {
+ text-decoration: none;
}
table.contentstable {
align: center;
@@ -41,7 +44,7 @@