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 '' >> CHANGES.html +echo '' >> CHANGES.html +echo '' >> CHANGES.html +cat >> CHANGES.html << EOF + +EOF +echo '' >> CHANGES.html +echo '' >> CHANGES.html +(cd $DOC_REPOSITORY && git diff $BASE_DOC_COMMIT -- *.html) > diff.txt +python3 - << EOF +import os, re, html +with open('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: + doc = match.group(1) + path = 'html/' + doc + file_path = os.path.join('$DOC_REPOSITORY', doc) + with open(file_path, 'r') as file: + content = file.readlines() + count = 0 + for line in block.splitlines(): + if line.startswith('@@ -'): + line_number = int(re.search(r'@@ -(\d+)', line).group(1)) + for i in range(line_number, -1, -1): + if content[i].startswith('<'): + count += 1 + content[i] = f'' + content[i] + break + with open(file_path, 'w') as file: + file.writelines(content) + hunks = ' '.join(f'#{i + 1}' for i in range(count)) + out_blocks.append(f'

{doc} ' + hunks + ' 

' + + '\n
'
+                            + html.escape(block).strip() + '
') +output_text = '\n'.join(out_blocks) +with open('diff.html', 'w') as f: + f.write(output_text) +EOF +cat diff.html >> CHANGES.html +echo '' >> CHANGES.html +echo '' >> CHANGES.html +rm diff.txt diff.html diff --git a/.ci/describe-system.sh b/.ci/describe-system.sh deleted file mode 100755 index 6bd3b0efd4a..00000000000 --- a/.ci/describe-system.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -# **************************************************************************** -# 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 +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 @@