Simplify the version bump process. ### Description

Simplify the version bump process.

- Use substitution hook in docs to update CDN URL.
  - In `dev` or `prerelease` versions, it will point to `dev` url
  - In `stable` versions, it will point it `vX.Y.Z` url
- Introduce a version bump script `tools/bump_version.py`.


~- Use `bump2version` to bump Python versions (continuing from #2460)~
~- Use `npm version` to bump JS versions~
~- Update `run_docker` script to use latest deployed pre-built docker image when `--pre-built` option is specified.~

### Checklists

- [x] Add new / update outdated documentation

From 77cdba9a810726e01542ab330ee7ec49f446a50e Mon Sep 17 00:00:00 2001
From: Roman Yurchak <rth.yurchak@gmail.com>
Date: Thu, 31 Mar 2022 17:19:07 -0700
Subject: [PATCH 04/14] Fix ieee754

Use float error status without external includes in numpy

A better solution would be to rely on FE_DIVBYZERO, FE_DIVBYZERO etc
defined in musl's fenv.h (https://github.com/numpy/numpy/pull/12124)
however these are not valid for emscripten
(https://github.com/emscripten-core/emscripten/issues/13678)
---
 numpy/core/src/npymath/ieee754.c.src | 30 ++++++++--------------------
 1 file changed, 8 insertions(+), 22 deletions(-)

diff --git a/numpy/core/src/npymath/ieee754.c.src b/numpy/core/src/npymath/ieee754.c.src
index 4e6ddb712..6aecb7577 100644
--- a/numpy/core/src/npymath/ieee754.c.src
+++ b/numpy/core/src/npymath/ieee754.c.src
@@ -682,7 +682,8 @@ void npy_set_floatstatus_invalid(void)
 }
 
 #elif defined(_MSC_VER) || (defined(__osf__) && defined(__alpha)) || \
-      defined (__UCLIBC__) || (defined(__arc__) && defined(__GLIBC__))
+      defined (__UCLIBC__) || (defined(__arc__) && defined(__GLIBC__)) || \
+      defined(__EMSCRIPTEN__)
 
 /*
  * By using a volatile floating point value,
@@ -719,37 +720,22 @@ void npy_set_floatstatus_invalid(void)
 }
 
 /* MS Windows -----------------------------------------------------*/
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) || defined(__EMSCRIPTEN__)
 
 #include <float.h>
 
 int npy_get_floatstatus_barrier(char *param)
 {
-    /*
-     * By using a volatile, the compiler cannot reorder this call
-     */
-#if defined(_WIN64)
-    int fpstatus = _statusfp();
-#else
-    /* windows enables sse on 32 bit, so check both flags */
-    int fpstatus, fpstatus2;
-    _statusfp2(&fpstatus, &fpstatus2);
-    fpstatus |= fpstatus2;
-#endif
-    if (param != NULL) {
-        volatile char NPY_UNUSED(c) = *(char*)param;
-    }
-    return ((SW_ZERODIVIDE & fpstatus) ? NPY_FPE_DIVIDEBYZERO : 0) |
-           ((SW_OVERFLOW & fpstatus) ? NPY_FPE_OVERFLOW : 0) |
-           ((SW_UNDERFLOW & fpstatus) ? NPY_FPE_UNDERFLOW : 0) |
-           ((SW_INVALID & fpstatus) ? NPY_FPE_INVALID : 0);
+   /* 
+   TODO: This is a suboptimal implementation from numpy 1.15.4 that would lead
+   to issues like https://github.com/numpy/numpy/issues/12095 
+   */
+   return 0;
 }
 
 int npy_clear_floatstatus_barrier(char *param)
 {
     int fpstatus = npy_get_floatstatus_barrier(param);
-    _clearfp();
-
     return fpstatus;
 }
 
-- 
2.25.1


From 77cdba9a810726e01542ab330ee7ec49f446a50e Mon Sep 17 00:00:00 2001
From: Roman Yurchak <rth.yurchak@gmail.com>
Date: Thu, 31 Mar 2022 17:19:07 -0700
Subject: [PATCH 04/14] Fix ieee754

Use float error status without external includes in numpy

A better solution would be to rely on FE_DIVBYZERO, FE_DIVBYZERO etc
defined in musl's fenv.h (https://github.com/numpy/numpy/pull/12124)
however these are not valid for emscripten
(https://github.com/emscripten-core/emscripten/issues/13678)
---
 numpy/core/src/npymath/ieee754.c.src | 30 ++++++++--------------------
 1 file changed, 8 insertions(+), 22 deletions(-)

diff --git a/numpy/core/src/npymath/ieee754.c.src b/numpy/core/src/npymath/ieee754.c.src
index 4e6ddb712..6aecb7577 100644
--- a/numpy/core/src/npymath/ieee754.c.src
+++ b/numpy/core/src/npymath/ieee754.c.src
@@ -682,7 +682,8 @@ void npy_set_floatstatus_invalid(void)
 }
 
 #elif defined(_MSC_VER) || (defined(__osf__) && defined(__alpha)) || \
-      defined (__UCLIBC__) || (defined(__arc__) && defined(__GLIBC__))
+      defined (__UCLIBC__) || (defined(__arc__) && defined(__GLIBC__)) || \
+      defined(__EMSCRIPTEN__)
 
 /*
  * By using a volatile floating point value,
@@ -719,37 +720,22 @@ void npy_set_floatstatus_invalid(void)
 }
 
 /* MS Windows -----------------------------------------------------*/
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) || defined(__EMSCRIPTEN__)
 
 #include <float.h>
 
 int npy_get_floatstatus_barrier(char *param)
 {
-    /*
-     * By using a volatile, the compiler cannot reorder this call
-     */
-#if defined(_WIN64)
-    int fpstatus = _statusfp();
-#else
-    /* windows enables sse on 32 bit, so check both flags */
-    int fpstatus, fpstatus2;
-    _statusfp2(&fpstatus, &fpstatus2);
-    fpstatus |= fpstatus2;
-#endif
-    if (param != NULL) {
-        volatile char NPY_UNUSED(c) = *(char*)param;
-    }
-    return ((SW_ZERODIVIDE & fpstatus) ? NPY_FPE_DIVIDEBYZERO : 0) |
-           ((SW_OVERFLOW & fpstatus) ? NPY_FPE_OVERFLOW : 0) |
-           ((SW_UNDERFLOW & fpstatus) ? NPY_FPE_UNDERFLOW : 0) |
-           ((SW_INVALID & fpstatus) ? NPY_FPE_INVALID : 0);
+   /* 
+   TODO: This is a suboptimal implementation from numpy 1.15.4 that would lead
+   to issues like https://github.com/numpy/numpy/issues/12095 
+   */
+   return 0;
 }
 
 int npy_clear_floatstatus_barrier(char *param)
 {
     int fpstatus = npy_get_floatstatus_barrier(param);
-    _clearfp();
-
     return fpstatus;
 }
 
-- 
2.25.1

