Your message dated Sun, 1 Jun 2025 12:46:36 +0200
with message-id <adwvjanham8cm...@ramacher.at>
and subject line Re: Bug#1106890: unblock: cctbx/2024.10+ds2+~3.22.1+ds1-5
has caused the Debian Bug report #1106890,
regarding unblock: cctbx/2024.10+ds2+~3.22.1+ds1-5
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
1106890: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1106890
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: cc...@packages.debian.org
Control: affects -1 + src:cctbx

Please unblock package cctbx


[ Reason ]
Fixed numpy2 compatibility by backporting the upstream patch; this makes the
autopkgtest testsuite pass again.
Also includes one policy compliance fix (using DEB_BUILD_OPTION_PARALLEL
instead of nproc).

[ Impact ]
A few reverse depends in the crystallography field.

[ Tests ]
Full autopkgtest testsuite.

[ Risks ]
Low, since the patch has been reviewed upstream in an MR then merged. It's also
part of the new upstream release (which I'll keep for after the Trixie
release).

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing


unblock cctbx/2024.10+ds2+~3.22.1+ds1-5
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog      2024-11-20 
15:50:35.000000000 +0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog      2025-05-29 
18:19:06.000000000 +0200
@@ -1,3 +1,17 @@
+cctbx (2024.10+ds2+~3.22.1+ds1-5) unstable; urgency=medium
+
+  [ Michael R. Crusoe ]
+  * Team upload.
+  * d/rules: use DEB_BUILD_OPTION_PARALLEL instead of nproc to respect
+    Debian Policy 4.9.1.
+
+  [ Roland Mas ]
+  * Backport upstream patch to fix: "autopkgtest regression in testing",
+    thanks to Graham Inggs (Closes: #1101031).
+  * Fix pip invocation to help with autopkgtests.
+
+ -- Roland Mas <lola...@debian.org>  Thu, 29 May 2025 18:19:06 +0200
+
 cctbx (2024.10+ds2+~3.22.1+ds1-4) unstable; urgency=medium
 
   * Bug fix: "removal of Python standard libraries in Python 3.13", thanks
diff -Nru 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch
 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch
--- 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch
        1970-01-01 01:00:00.000000000 +0100
+++ 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch
        2025-05-29 17:53:19.000000000 +0200
@@ -0,0 +1,447 @@
+From: Roland Mas <lola...@debian.org>
+Date: Thu, 29 May 2025 16:53:52 +0200
+Subject: Numpy 2 compat from upstream
+
+---
+ dxtbx/dependencies.yaml                            |  5 +--
+ dxtbx/src/dxtbx/boost_python/flumpy.cc             |  2 +-
+ .../src/dxtbx/format/FormatHDF5EigerNearlyNexus.py | 48 +++++++++++-----------
+ dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py  | 10 ++---
+ dxtbx/src/dxtbx/format/FormatSER.py                |  4 +-
+ dxtbx/src/dxtbx/format/nexus.py                    | 18 ++++----
+ dxtbx/src/dxtbx/format/nxmx_writer.py              |  4 +-
+ dxtbx/src/dxtbx/nexus/__init__.py                  |  2 +-
+ dxtbx/src/dxtbx/util/rotate_and_average.py         |  2 +-
+ dxtbx/tests/conftest.py                            |  4 +-
+ dxtbx/tests/format/test_FormatNXmxDLS16M.py        | 20 ++++-----
+ dxtbx/tests/nexus/test_build_dxtbx_models.py       |  2 +-
+ dxtbx/tests/test_flumpy.py                         |  2 +-
+ 13 files changed, 59 insertions(+), 64 deletions(-)
+
+diff --git a/dxtbx/dependencies.yaml b/dxtbx/dependencies.yaml
+index ba2e954..b2460f8 100644
+--- a/dxtbx/dependencies.yaml
++++ b/dxtbx/dependencies.yaml
+@@ -54,12 +54,11 @@ build:
+ 
+ host:
+   - cctbx-base # [prebuilt_cctbx and bootstrap]
+-  - cctbx-base >=2024 # [not bootstrap]
++  - cctbx-base >=2025 # [not bootstrap]
+   - hdf5
+   - libboost-devel
+   - libboost-python-devel
+-  - numpy >=1.21.5,<2 #[bootstrap]
+-  - numpy  # [not bootstrap]
++  - numpy
+   - pip
+   - pybind11
+   - python
+diff --git a/dxtbx/src/dxtbx/boost_python/flumpy.cc 
b/dxtbx/src/dxtbx/boost_python/flumpy.cc
+index d7ce34b..e8cb4ea 100644
+--- a/dxtbx/src/dxtbx/boost_python/flumpy.cc
++++ b/dxtbx/src/dxtbx/boost_python/flumpy.cc
+@@ -587,7 +587,7 @@ py::object miller_index_from_numpy(py::array np_array) {
+   if (accepted_types.find(dtype) == std::string::npos) {
+     throw std::invalid_argument(
+       std::string("miller_index only supports int32 or intc types - cannot 
convert '")
+-      + std::to_string(dtype) + "'");
++      + dtype + "'");
+   }
+   return vec_from_numpy<cctbx::miller::index>(np_array);
+ }
+diff --git a/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py 
b/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py
+index 25d7a4c..4721c38 100644
+--- a/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py
++++ b/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py
+@@ -32,7 +32,7 @@ def find_entries(nx_file):
+     if "entry" in nx_file:
+         entry = nx_file["entry"]
+         if "NX_class" in entry.attrs:
+-            if entry.attrs["NX_class"] == np.string_("NXentry"):
++            if entry.attrs["NX_class"] == np.bytes_("NXentry"):
+                 if "definition" not in entry:
+                     return entry
+     return None
+@@ -49,7 +49,7 @@ def is_eiger_nearly_nexus_file(filename):
+         if entry is not None:
+             try:
+                 return (
+-                    np.string_("dectris eiger")
++                    np.bytes_("dectris eiger")
+                     in 
entry["instrument"]["detector"]["description"][()].lower()
+                 )
+             except KeyError:
+@@ -76,7 +76,7 @@ class EigerNXmxFixer:
+             dataset[()] = value
+ 
+         # Add NXmx definition
+-        create_scalar(handle["entry"], "definition", "S4", np.string_("NXmx"))
++        create_scalar(handle["entry"], "definition", "S4", np.bytes_("NXmx"))
+ 
+         # Add saturation value
+         try:
+@@ -100,7 +100,7 @@ class EigerNXmxFixer:
+ 
+         # Add detector type
+         create_scalar(
+-            handle["entry/instrument/detector"], "type", "S5", 
np.string_("PIXEL")
++            handle["entry/instrument/detector"], "type", "S5", 
np.bytes_("PIXEL")
+         )
+ 
+         # Move the beam
+@@ -111,7 +111,7 @@ class EigerNXmxFixer:
+         module_path = "/entry/instrument/detector/module"
+         # print "Creating detector module %s" % (module_path)
+         group = handle.create_group(module_path)
+-        group.attrs["NX_class"] = np.string_("NXdetector_module")
++        group.attrs["NX_class"] = np.bytes_("NXdetector_module")
+ 
+         # Add a module index
+         create_scalar(group, "module_index", "int64", 0)
+@@ -174,13 +174,13 @@ class EigerNXmxFixer:
+             "float32",
+             handle["/entry/instrument/detector/x_pixel_size"][()],
+         )
+-        group["fast_pixel_direction"].attrs["transformation_type"] = 
np.string_(
++        group["fast_pixel_direction"].attrs["transformation_type"] = 
np.bytes_(
+             "translation"
+         )
+         group["fast_pixel_direction"].attrs["vector"] = fast_axis
+         group["fast_pixel_direction"].attrs["offset"] = (0, 0, 0)
+-        group["fast_pixel_direction"].attrs["units"] = np.string_("m")
+-        group["fast_pixel_direction"].attrs["depends_on"] = 
np.string_(depends_on)
++        group["fast_pixel_direction"].attrs["units"] = np.bytes_("m")
++        group["fast_pixel_direction"].attrs["depends_on"] = 
np.bytes_(depends_on)
+ 
+         # Add slow_pixel_size dataset
+         create_scalar(
+@@ -189,29 +189,29 @@ class EigerNXmxFixer:
+             "float32",
+             handle["/entry/instrument/detector/y_pixel_size"][()],
+         )
+-        group["slow_pixel_direction"].attrs["transformation_type"] = 
np.string_(
++        group["slow_pixel_direction"].attrs["transformation_type"] = 
np.bytes_(
+             "translation"
+         )
+         group["slow_pixel_direction"].attrs["vector"] = slow_axis
+         group["slow_pixel_direction"].attrs["offset"] = (0, 0, 0)
+-        group["slow_pixel_direction"].attrs["units"] = np.string_("m")
+-        group["slow_pixel_direction"].attrs["depends_on"] = 
np.string_(depends_on)
++        group["slow_pixel_direction"].attrs["units"] = np.bytes_("m")
++        group["slow_pixel_direction"].attrs["depends_on"] = 
np.bytes_(depends_on)
+ 
+         # Add module offset dataset
+         # print "Set module offset to be zero relative to detector"
+         create_scalar(group, "module_offset", "float32", 0)
+-        group["module_offset"].attrs["transformation_type"] = 
np.string_("translation")
++        group["module_offset"].attrs["transformation_type"] = 
np.bytes_("translation")
+         group["module_offset"].attrs["vector"] = (0, 0, 0)
+         group["module_offset"].attrs["offset"] = (0, 0, 0)
+-        group["module_offset"].attrs["units"] = np.string_("m")
+-        group["module_offset"].attrs["depends_on"] = np.string_(depends_on)
++        group["module_offset"].attrs["units"] = np.bytes_("m")
++        group["module_offset"].attrs["depends_on"] = np.bytes_(depends_on)
+ 
+         # Create detector depends_on
+         create_scalar(
+             handle["/entry/instrument/detector"],
+             "depends_on",
+             "S%d" % len(depends_on),
+-            np.string_(depends_on),
++            np.bytes_(depends_on),
+         )
+ 
+         # Add detector position
+@@ -228,22 +228,22 @@ class EigerNXmxFixer:
+             )
+         )
+         group = 
handle.create_group("/entry/instrument/detector/transformations")
+-        group.attrs["NX_class"] = np.string_("NXtransformations")
++        group.attrs["NX_class"] = np.bytes_("NXtransformations")
+         create_scalar(group, "translation", "float32", 
detector_offset_vector.length())
+-        group["translation"].attrs["transformation_type"] = 
np.string_("translation")
++        group["translation"].attrs["transformation_type"] = 
np.bytes_("translation")
+         if detector_offset_vector.length() > 0:
+             group["translation"].attrs["vector"] = 
detector_offset_vector.normalize()
+         else:
+             group["translation"].attrs["vector"] = detector_offset_vector
+         group["translation"].attrs["offset"] = 0
+-        group["translation"].attrs["units"] = np.string_("m")
+-        group["translation"].attrs["depends_on"] = np.string_(".")
++        group["translation"].attrs["units"] = np.bytes_("m")
++        group["translation"].attrs["depends_on"] = np.bytes_(".")
+ 
+         # Create goniometer transformations if not found
+         if "/entry/sample/transformations" not in handle:
+             # print "Creating group /entry/sample/transformation"
+             group = handle.create_group("/entry/sample/transformations")
+-            group.attrs["NX_class"] = np.string_("NXtransformations")
++            group.attrs["NX_class"] = np.bytes_("NXtransformations")
+         else:
+             group = handle["/entry/sample/transformations"]
+ 
+@@ -274,11 +274,11 @@ class EigerNXmxFixer:
+             for name in sorted(handle["/entry/data"]):
+                 num_images += handle_orig_entry_properties[name]["length"]
+             dataset = group.create_dataset("omega", (num_images,), 
dtype="float32")
+-            dataset.attrs["units"] = np.string_("degree")
+-            dataset.attrs["transformation_type"] = np.string_("rotation")
++            dataset.attrs["units"] = np.bytes_("degree")
++            dataset.attrs["transformation_type"] = np.bytes_("rotation")
+             dataset.attrs["vector"] = default_axis
+             dataset.attrs["offset"] = 0
+-            dataset.attrs["depends_on"] = np.string_(".")
++            dataset.attrs["depends_on"] = np.bytes_(".")
+             omega_range_average = handle[
+                 "/entry/sample/goniometer/omega_range_average"
+             ][()]
+@@ -295,7 +295,7 @@ class EigerNXmxFixer:
+                 handle["/entry/sample"],
+                 "depends_on",
+                 "S%d" % len(dataset.name),
+-                np.string_(dataset.name),
++                np.bytes_(dataset.name),
+             )
+ 
+         # Change relative paths to absolute paths
+diff --git a/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py 
b/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py
+index e43892c..8a9198c 100644
+--- a/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py
++++ b/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py
+@@ -106,11 +106,11 @@ class FormatNexusJungfrauHack(FormatNexus):
+         detector_material = clean_string(str(material))
+         material = {
+             "Si": "Si",
+-            np.string_("Si"): "Si",
+-            np.string_("Silicon"): "Si",
+-            np.string_("Sillicon"): "Si",
+-            np.string_("CdTe"): "CdTe",
+-            np.string_("GaAs"): "GaAs",
++            np.bytes_("Si"): "Si",
++            np.bytes_("Silicon"): "Si",
++            np.bytes_("Sillicon"): "Si",
++            np.bytes_("CdTe"): "CdTe",
++            np.bytes_("GaAs"): "GaAs",
+         }.get(detector_material)
+         if not material:
+             raise RuntimeError("Unknown material: %s" % detector_material)
+diff --git a/dxtbx/src/dxtbx/format/FormatSER.py 
b/dxtbx/src/dxtbx/format/FormatSER.py
+index acf5ccc..0fd3031 100644
+--- a/dxtbx/src/dxtbx/format/FormatSER.py
++++ b/dxtbx/src/dxtbx/format/FormatSER.py
+@@ -142,7 +142,7 @@ def read_emi(filename):
+ 
+ 
+ def _parseEntry_emi(value):
+-    """Auxiliary function to parse string entry to int, float or np.string_().
++    """Auxiliary function to parse string entry to int, float or np.bytes_().
+     Parameters
+     ----------
+         value : str
+@@ -162,7 +162,7 @@ def _parseEntry_emi(value):
+             p = float(value)
+         except ValueError:
+             # if neither int nor float, stay with string
+-            p = np.string_(str(value))
++            p = np.bytes_(str(value))
+ 
+     return p
+ 
+diff --git a/dxtbx/src/dxtbx/format/nexus.py b/dxtbx/src/dxtbx/format/nexus.py
+index 35dfefa..a7fc1c6 100644
+--- a/dxtbx/src/dxtbx/format/nexus.py
++++ b/dxtbx/src/dxtbx/format/nexus.py
+@@ -48,15 +48,15 @@ except ImportError:
+ NXNode = Union[h5py.File, h5py.Group]
+ 
+ 
+-def h5str(h5_value: str | numpy.string_ | bytes) -> str:
++def h5str(h5_value: str | numpy.bytes_ | bytes) -> str:
+     """
+     Convert a value returned an h5py attribute to str.
+ 
+-    h5py can return either a bytes-like (numpy.string_) or str object
++    h5py can return either a bytes-like (numpy.bytes_) or str object
+     for attribute values depending on whether the value was written as
+     fixed or variable length. This function collapses the two to str.
+     """
+-    if isinstance(h5_value, (numpy.string_, bytes)):
++    if isinstance(h5_value, (numpy.bytes_, bytes)):
+         return h5_value.decode("utf-8")
+     return h5_value
+ 
+@@ -68,7 +68,7 @@ def dataset_as_flex(dataset, selection):
+         assert numpy.issubdtype(dataset.dtype, numpy.floating)
+         double_types = [
+             numpy.double,
+-            numpy.longfloat,
++            numpy.longdouble,
+             numpy.float64,
+         ]
+         if hasattr(numpy, "float96"):
+@@ -78,7 +78,7 @@ def dataset_as_flex(dataset, selection):
+         if dataset.dtype in [
+             numpy.half,
+             numpy.single,
+-            numpy.float_,
++            numpy.float64,
+             numpy.float16,
+             numpy.float32,
+         ]:
+@@ -1095,7 +1095,7 @@ class DetectorFactory:
+         # mu_at_angstrom returns cm^-1, but need mu in mm^-1
+         table = attenuation_coefficient.get_table(material)
+         wavelength = beam.get_wavelength()
+-        mu = table.mu_at_angstrom(wavelength) / 10.0
++        mu = float(table.mu_at_angstrom(wavelength)) / 10.0
+ 
+         # Construct the detector model
+         pixel_size = (fast_pixel_direction_value, slow_pixel_direction_value)
+@@ -1112,9 +1112,9 @@ class DetectorFactory:
+             Panel(
+                 detector_type,
+                 detector_name,
+-                tuple(fast_axis),
+-                tuple(slow_axis),
+-                tuple(origin),
++                tuple(float(x) for x in fast_axis),
++                tuple(float(x) for x in slow_axis),
++                tuple(float(x) for x in origin),
+                 pixel_size,
+                 image_size,
+                 trusted_range,
+diff --git a/dxtbx/src/dxtbx/format/nxmx_writer.py 
b/dxtbx/src/dxtbx/format/nxmx_writer.py
+index 57cfce0..7161654 100644
+--- a/dxtbx/src/dxtbx/format/nxmx_writer.py
++++ b/dxtbx/src/dxtbx/format/nxmx_writer.py
+@@ -171,7 +171,7 @@ class NXmxWriter:
+             entry["end_time_estimated"] = 
self.params.nexus_details.end_time_estimated
+ 
+         # --> definition
+-        self._create_scalar(entry, "definition", "S4", np.string_("NXmx"))
++        self._create_scalar(entry, "definition", "S4", np.bytes_("NXmx"))
+ 
+         # --> sample
+         sample = self.handle["entry"].create_group("sample")
+@@ -354,7 +354,7 @@ class NXmxWriter:
+         det_group.attrs["NX_class"] = "NXdetector_group"
+ 
+         det_group.create_dataset("group_index", data=list(range(1, 3)), 
dtype="i")
+-        data = [np.string_("detector"), np.string_("detector")]
++        data = [np.bytes_("detector"), np.bytes_("detector")]
+         det_group.create_dataset("group_names", (2,), data=data, dtype="S12")
+         det_group.create_dataset("group_parent", (2,), data=[-1, 1], 
dtype="i")
+         det_group.create_dataset("group_type", (2,), data=[1, 2], dtype="i")
+diff --git a/dxtbx/src/dxtbx/nexus/__init__.py 
b/dxtbx/src/dxtbx/nexus/__init__.py
+index e506e3a..b1df642 100644
+--- a/dxtbx/src/dxtbx/nexus/__init__.py
++++ b/dxtbx/src/dxtbx/nexus/__init__.py
+@@ -440,7 +440,7 @@ def get_dxtbx_detector(
+         material = KNOWN_SENSOR_MATERIALS.get(nxdetector.sensor_material)
+         if not material:
+             raise ValueError(f"Unknown material: 
{nxdetector.sensor_material}")
+-        thickness = nxdetector.sensor_thickness.to("mm").magnitude
++        thickness = float(nxdetector.sensor_thickness.to("mm").magnitude)
+         table = eltbx.attenuation_coefficient.get_table(material)
+         mu = table.mu_at_angstrom(wavelength) / 10.0
+         px_mm = dxtbx.model.ParallaxCorrectedPxMmStrategy(mu, thickness)
+diff --git a/dxtbx/src/dxtbx/util/rotate_and_average.py 
b/dxtbx/src/dxtbx/util/rotate_and_average.py
+index 61012ea..02fb53e 100644
+--- a/dxtbx/src/dxtbx/util/rotate_and_average.py
++++ b/dxtbx/src/dxtbx/util/rotate_and_average.py
+@@ -16,7 +16,7 @@ def rotate_and_average(data, angle, deg=False, mask=None):
+     ny, nx = np.shape(data)
+ 
+     xx, yy = np.meshgrid(np.arange(nx), np.arange(ny))
+-    xx_yy = np.row_stack((xx.ravel(), yy.ravel()))
++    xx_yy = np.vstack((xx.ravel(), yy.ravel()))
+     R = np.array(((np.cos(angle), -np.sin(angle)), (np.sin(angle), 
np.cos(angle))))
+     xx_yy_rotated = np.matmul(R, xx_yy)
+     xx_rotated = xx_yy_rotated[0, :].reshape((ny, nx))
+diff --git a/dxtbx/tests/conftest.py b/dxtbx/tests/conftest.py
+index cc1761f..effe2e6 100644
+--- a/dxtbx/tests/conftest.py
++++ b/dxtbx/tests/conftest.py
+@@ -27,9 +27,7 @@ def nxmx_example():
+ 
+         instrument = entry.create_group("instrument")
+         instrument.attrs["NX_class"] = "NXinstrument"
+-        name = instrument.create_dataset(
+-            "name", data=np.string_("DIAMOND BEAMLINE I03")
+-        )
++        name = instrument.create_dataset("name", data=np.bytes_("DIAMOND 
BEAMLINE I03"))
+         name.attrs["short_name"] = "I03"
+ 
+         beam = instrument.create_group("beam")
+diff --git a/dxtbx/tests/format/test_FormatNXmxDLS16M.py 
b/dxtbx/tests/format/test_FormatNXmxDLS16M.py
+index 56ecc14..a9ba1d2 100644
+--- a/dxtbx/tests/format/test_FormatNXmxDLS16M.py
++++ b/dxtbx/tests/format/test_FormatNXmxDLS16M.py
+@@ -200,11 +200,11 @@ def test_understand(beamline, tmp_path):
+     with h5py.File(nxs, mode="w") as fh:
+         entry = fh.create_group("entry")
+         instrument = entry.create_group("instrument")
+-        instrument.attrs["short_name"] = np.string_(f"DLS {beamline}")
++        instrument.attrs["short_name"] = np.bytes_(f"DLS {beamline}")
+         name = instrument.create_dataset(
+-            "name", data=np.string_(f"DIAMOND BEAMLINE {beamline}")
++            "name", data=np.bytes_(f"DIAMOND BEAMLINE {beamline}")
+         )
+-        name.attrs["short_name"] = np.string_(f"DLS {beamline}")
++        name.attrs["short_name"] = np.bytes_(f"DLS {beamline}")
+     assert FormatNXmxDLS16M.understand(nxs)
+     assert FormatNXmxDLS.understand(nxs)
+ 
+@@ -216,9 +216,9 @@ def test_understand_legacy(beamline, tmp_path):
+     with h5py.File(nxs, mode="w") as fh:
+         entry = fh.create_group("entry")
+         instrument = entry.create_group("instrument")
+-        instrument.attrs["short_name"] = np.string_(f"{beamline}")
+-        name = instrument.create_dataset("name", 
data=np.string_(f"{beamline}"))
+-        name.attrs["short_name"] = np.string_(f"{beamline}")
++        instrument.attrs["short_name"] = np.bytes_(f"{beamline}")
++        name = instrument.create_dataset("name", 
data=np.bytes_(f"{beamline}"))
++        name.attrs["short_name"] = np.bytes_(f"{beamline}")
+     assert FormatNXmxDLS16M.understand(nxs)
+     assert FormatNXmxDLS.understand(nxs)
+ 
+@@ -236,9 +236,7 @@ def test_do_not_understand_i24(tmp_path):
+     with h5py.File(nxs, mode="w") as fh:
+         entry = fh.create_group("entry")
+         instrument = entry.create_group("instrument")
+-        instrument.attrs["short_name"] = np.string_("DLS I24")
+-        name = instrument.create_dataset(
+-            "name", data=np.string_("DIAMOND BEAMLINE I24")
+-        )
+-        name.attrs["short_name"] = np.string_("DLS I24")
++        instrument.attrs["short_name"] = np.bytes_("DLS I24")
++        name = instrument.create_dataset("name", data=np.bytes_("DIAMOND 
BEAMLINE I24"))
++        name.attrs["short_name"] = np.bytes_("DLS I24")
+     assert not FormatNXmxDLS16M.understand(nxs)
+diff --git a/dxtbx/tests/nexus/test_build_dxtbx_models.py 
b/dxtbx/tests/nexus/test_build_dxtbx_models.py
+index 4f4591c..26fc12b 100644
+--- a/dxtbx/tests/nexus/test_build_dxtbx_models.py
++++ b/dxtbx/tests/nexus/test_build_dxtbx_models.py
+@@ -805,7 +805,7 @@ def test_dataset_as_flex_float():
+ def test_dataset_as_flex_double():
+     slices = ()
+     np_double_types = (
+-        np.float_,
++        np.float64,
+         np.double,
+         np.float64,
+     )
+diff --git a/dxtbx/tests/test_flumpy.py b/dxtbx/tests/test_flumpy.py
+index a8d9965..5fc2f2e 100644
+--- a/dxtbx/tests/test_flumpy.py
++++ b/dxtbx/tests/test_flumpy.py
+@@ -217,7 +217,7 @@ def test_reverse_vec3_dtype(dtype):
+ @pytest.mark.parametrize("dtype", [np.int32, np.intc, int])
+ def test_reverse_miller_index(dtype):
+     hkl = np.array([(1, 0, 0), (0, 1, 0), (0, 0, 1)], dtype=dtype)
+-    if dtype is int and np.dtype("l").itemsize != np.dtype("i").itemsize:
++    if np.dtype(dtype).itemsize != np.dtype(np.intc).itemsize:
+         with pytest.raises(ValueError):
+             flumpy.miller_index_from_numpy(hkl)
+     else:
diff -Nru 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch  
1970-01-01 01:00:00.000000000 +0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch  
2025-05-29 17:53:19.000000000 +0200
@@ -0,0 +1,20 @@
+From: Roland Mas <lola...@debian.org>
+Date: Thu, 29 May 2025 17:28:46 +0200
+Subject: Fix pip invocation
+
+---
+ dxtbx/libtbx_refresh.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/dxtbx/libtbx_refresh.py b/dxtbx/libtbx_refresh.py
+index eef867e..9981234 100644
+--- a/dxtbx/libtbx_refresh.py
++++ b/dxtbx/libtbx_refresh.py
+@@ -42,6 +42,7 @@ def _install_setup_readonly_fallback(package_name: str):
+             build_path,
+             "--no-build-isolation",
+             "--no-deps",
++            "--ignore-installed",
+             "-e",
+             root_path,
+         ],
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series 2024-11-20 
15:50:35.000000000 +0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series 2025-05-29 
17:53:19.000000000 +0200
@@ -24,3 +24,5 @@
 0031-Add-missing-ctdint-header.patch
 0032-no-future.patch
 0027-Replace-unmaintained-orderedset-with-ordered_set.patch
+0027-Numpy-2-compat-from-upstream.patch
+0028-Fix-pip-invocation.patch
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules 
cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules
--- cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules  2024-11-20 15:50:35.000000000 
+0100
+++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules  2025-05-29 15:20:57.000000000 
+0200
@@ -8,15 +8,11 @@
 export DH_OPTIONS
 
 DPKG_EXPORT_BUILDFLAGS = 1
-include /usr/share/dpkg/buildflags.mk
+include /usr/share/dpkg/default.mk
 
 export DEB_CXXFLAGS_MAINT_APPEND := $(shell pkg-config --cflags hdf5-serial) 
-DBOOST_TIMER_ENABLE_DEPRECATED=1
 export DEB_LDFLAGS_MAINT_APPEND=$(shell pkg-config --libs hdf5-serial)
 
-# parallel support
-#NPROC ?= $(shell dh_assistant which-build-system| jq .parallel)
-NPROC ?= $(shell nproc)  # for backport
-
 MODULES         = annlib_adaptbx boost_adaptbx cbflib_adaptbx ccp4io_adaptbx 
cctbx cma_es crys3d dxtbx fable gltbx iotbx libtbx mmtbx omptbx rstbx scitbx 
serialtbx smtbx spotfinder tbxx wxtbx
 #MODULES_TODO    = gltbx
 MODULES_FAKE    = annlib ccp4io
@@ -68,7 +64,7 @@
        dh_auto_build --sourcedirectory=dxtbx
 
        # build the cctbx extensions and libraries
-       dh_auto_build -- -s custom --build-args="cd {build_dir}_ && 
./bin/libtbx.scons -j $(NPROC)"
+       dh_auto_build -- -s custom --build-args="cd {build_dir}_ && 
./bin/libtbx.scons $(DEB_BUILD_OPTION_PARALLEL:%=-j %)"
        iconv -f ISO-8859-1 -t UTF-8 cctbx/eltbx/covalent_radii.h > 
covalent_radii.h
        mv covalent_radii.h cctbx/eltbx/covalent_radii.h
 

--- End Message ---
--- Begin Message ---
On 2025-05-31 13:01:55 +0200, Roland Mas wrote:
> Package: release.debian.org
> Severity: normal
> User: release.debian....@packages.debian.org
> Usertags: unblock
> X-Debbugs-Cc: cc...@packages.debian.org
> Control: affects -1 + src:cctbx
> 
> Please unblock package cctbx

cctbx has successful autopkgtests and will migrate on its own.

Cheers
-- 
Sebastian Ramacher

--- End Message ---

Reply via email to