Skip to content

Commit a0424d6

Browse files
authored
Merge branch 'root-project:master' into curl-send-put-req
2 parents 56a9b65 + c719f23 commit a0424d6

180 files changed

Lines changed: 9945 additions & 5490 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/cibuildwheel-impl/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ runs:
99
using: "composite"
1010
steps:
1111
- name: Build wheel
12-
uses: pypa/cibuildwheel@v3.0.1
12+
uses: pypa/cibuildwheel@v3.4.1
1313
env:
1414
CIBW_BUILD: ${{ inputs.build-tag }}
1515

.github/workflows/cppinterop-diff.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ jobs:
2929
run: |
3030
rm -rf .git .github discord.svg
3131
- name: Compare
32-
run: diff --exclude=CMakeLists.txt -ur CppInterOp/ root/interpreter/CppInterOp/
32+
run: diff -ur CppInterOp/ root/interpreter/CppInterOp/

.github/workflows/python_wheel_build.yml

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ name: 'ROOT Python wheels'
33
on:
44
workflow_dispatch:
55
inputs:
6-
branch:
7-
description: 'The branch for which the Python wheel has to be generated'
6+
ref:
7+
description: 'The git ref to build the wheel from (branch, tag, or commit SHA).'
88
type: string
99
required: true
10-
default: "master"
10+
default: ''
1111
schedule:
1212
- cron: '01 1 * * *'
1313
pull_request:
@@ -28,10 +28,12 @@ jobs:
2828
strategy:
2929
fail-fast: false
3030
matrix:
31-
target: [cp310-manylinux_x86_64, cp311-manylinux_x86_64, cp312-manylinux_x86_64, cp313-manylinux_x86_64]
31+
target: [cp310-manylinux_x86_64, cp311-manylinux_x86_64, cp312-manylinux_x86_64, cp313-manylinux_x86_64, cp314-manylinux_x86_64]
3232
name: ${{ matrix.target }}
3333
steps:
3434
- uses: actions/checkout@v6
35+
with:
36+
ref: ${{ github.event.inputs.ref }}
3537
- uses: ./.github/workflows/cibuildwheel-impl
3638
with:
3739
build-tag: ${{ matrix.target }}
@@ -42,11 +44,12 @@ jobs:
4244
strategy:
4345
fail-fast: false
4446
matrix:
45-
python-version: ["3.10", "3.11", "3.12", "3.13"]
47+
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
4648
name: test-wheel-cp${{ matrix.python-version }}
4749
steps:
4850
- uses: actions/checkout@v6
49-
51+
with:
52+
ref: ${{ github.event.inputs.ref }}
5053
- name: Download produced wheels
5154
uses: actions/download-artifact@v4
5255
with:
@@ -121,3 +124,23 @@ jobs:
121124
kinit -p ${{ secrets.KRB5USER }}@${{ secrets.KRB5REALM }} -kt ${KT_FILE_NAME}
122125
echo +++ Running the copy
123126
xrdcp --parallel ${NFILES} -rf wheelhouse/* ${EOS_ENDPOINT}/${EOS_PATH}/
127+
128+
publish-to-pypi:
129+
if: github.event_name == 'workflow_dispatch'
130+
needs: build-wheels
131+
runs-on: ubuntu-latest
132+
name: >-
133+
Publish Python distribution to PyPI
134+
environment:
135+
name: pypi
136+
url: https://pypi.org/p/root
137+
permissions:
138+
id-token: write
139+
steps:
140+
- name: Download produced wheels
141+
uses: actions/download-artifact@v4
142+
with:
143+
merge-multiple: true
144+
path: dist/
145+
- name: Publish distribution to PyPI
146+
uses: pypa/gh-action-pypi-publish@release/v1

.github/workflows/root-ci.yml

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ jobs:
223223
path: /Users/sftnight/ROOT-CI/build/TestResults.xml
224224

225225
- name: Upload binaries
226-
if: ${{ !cancelled() && (inputs.binaries || github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/')) }}
226+
if: ${{ !cancelled() && !matrix.is_special && (inputs.binaries || github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/')) }}
227227
uses: actions/upload-artifact@v6
228228
with:
229229
name: Binaries ${{ matrix.platform }} ${{ matrix.arch }}
@@ -576,7 +576,7 @@ jobs:
576576
path: /github/home/ROOT-CI/build/TestResults.xml
577577

578578
- name: Upload binaries
579-
if: ${{ !cancelled() && (inputs.binaries || github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/')) }}
579+
if: ${{ !cancelled() && !matrix.is_special && (inputs.binaries || github.event_name == 'schedule' || startsWith(github.ref, 'refs/tags/')) }}
580580
uses: actions/upload-artifact@v6
581581
with:
582582
name: Binaries ${{ matrix.image }} ${{ matrix.property }}
@@ -588,14 +588,17 @@ jobs:
588588
ccache -s || true
589589
590590
- name: Install
591+
if: ${{ !cancelled() && !matrix.is_special }}
591592
run: "cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_DIR }}"
592593

593594
- name: Build post-install test project
595+
if: ${{ !cancelled() && !matrix.is_special }}
594596
run: |
595597
cmake -S test/PostInstall/ -B ${{ env.POST_INSTALL_DIR }} -DCMAKE_PREFIX_PATH=${{ env.INSTALL_DIR }};
596598
cmake --build ${{ env.POST_INSTALL_DIR }};
597599
598600
- name: CTest in post-install test project
601+
if: ${{ !cancelled() && !matrix.is_special }}
599602
working-directory: ${{ env.POST_INSTALL_DIR }}
600603
run: ctest --output-on-failure -j $(nproc)
601604

@@ -615,3 +618,48 @@ jobs:
615618
with:
616619
name: Event File
617620
path: ${{ github.event_path }}
621+
622+
publish_binaries:
623+
# Publish the binary tarballs to the website
624+
if: ${{ github.event_name == 'workflow_dispatch' && inputs.binaries}}
625+
name: "Publish binaries on the web"
626+
needs: [build-linux, build-windows, build-macos]
627+
runs-on: ubuntu-latest
628+
steps:
629+
- name: Download All Artifacts
630+
uses: actions/download-artifact@v8
631+
- name: Install Kerberos utilities
632+
run: sudo apt-get install -y krb5-user
633+
- name: Install XRootD client
634+
run: sudo apt-get -y install xrootd-client
635+
- name: Copy Binaries to EOS
636+
env:
637+
RWEBEOS_KT: ${{ secrets.RWEBEOS_KT }}
638+
KT_FILE_NAME: /tmp/decoded.keytab
639+
EOS_PATH: /eos/project/r/root-eos/website/download
640+
EOS_ENDPOINT: root://eosproject-r.cern.ch
641+
KRB5CCNAME: /tmp/krb5cc
642+
working-directory: ${{ env.WORKDIR }}
643+
run: |
644+
echo +++ Content
645+
ls
646+
echo +++ Retrieving the secret
647+
echo ${RWEBEOS_KT} | base64 -d > ${KT_FILE_NAME}
648+
echo +++ Creating the token
649+
kinit -p ${{ secrets.KRB5USER }}@${{ secrets.KRB5REALM }} -kt ${KT_FILE_NAME}
650+
echo +++ Running the copy
651+
xrdcp -rf Binaries*/root_v* ${EOS_ENDPOINT}/${EOS_PATH}/
652+
653+
654+
invoke_rn_creation:
655+
# Create release notes
656+
if: ${{ github.event_name == 'workflow_dispatch' && inputs.binaries}}
657+
name: "Invoke the creation of the Release Notes"
658+
needs: publish_binaries
659+
uses: ./.github/workflows/root-rn-ci.yml
660+
secrets:
661+
RWEBEOS_KT: ${{ secrets.RWEBEOS_KT }}
662+
KRB5REALM: ${{ secrets.KRB5REALM }}
663+
KRB5USER: ${{ secrets.KRB5USER }}
664+
with:
665+
branch: ${{ github.head_ref || github.ref_name }}

.github/workflows/root-rn-ci.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,19 @@ on:
88
type: string
99
required: true
1010
default: "master"
11-
11+
workflow_call:
12+
inputs:
13+
branch:
14+
type: string
15+
required: true
16+
secrets:
17+
RWEBEOS_KT:
18+
required: true
19+
KRB5REALM:
20+
required: true
21+
KRB5USER:
22+
required: true
23+
1224
jobs:
1325
create_release_notes:
1426
runs-on: ubuntu-latest
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
name: 'Src Tarball'
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
major:
7+
type: choice
8+
description: Major
9+
options:
10+
- 6
11+
- 7
12+
- 8
13+
required: true
14+
default: 6
15+
minor:
16+
type: choice
17+
description: Minor
18+
options:
19+
- 26
20+
- 28
21+
- 30
22+
- 32
23+
- 36
24+
- 38
25+
- 40
26+
- 42
27+
- 44
28+
- 46
29+
- 48
30+
required: true
31+
default: 40
32+
patch:
33+
type: choice
34+
description: Patch
35+
options:
36+
- "00"
37+
- "02"
38+
- "04"
39+
- "06"
40+
- "08"
41+
- "10"
42+
- "12"
43+
- "14"
44+
- "16"
45+
- "18"
46+
- "20"
47+
- "22"
48+
- "24"
49+
- "26"
50+
- "28"
51+
- "30"
52+
required: true
53+
default: "00"
54+
55+
jobs:
56+
check-tag:
57+
runs-on: ubuntu-latest
58+
steps:
59+
- name: Checkout the official ROOT repo
60+
uses: actions/checkout@v6
61+
with:
62+
path: root
63+
ref: v${{ inputs.major }}-${{ inputs.minor }}-${{ inputs.patch }}
64+
- name: Install Kerberos utilities
65+
run: sudo apt-get install -y krb5-user
66+
- name: Install XRootD client
67+
run: sudo apt-get -y install xrootd-client
68+
- name: Create a Source Tarball
69+
run: sh root/cmake/unix/makedistsrc.sh ${{ inputs.major }}.${{ inputs.minor }}.${{ inputs.patch }} root
70+
- name: Copy Source Tarball to EOS
71+
env:
72+
RWEBEOS_KT: ${{ secrets.RWEBEOS_KT }}
73+
KT_FILE_NAME: /tmp/decoded.keytab
74+
EOS_PATH: /eos/project/r/root-eos/website/download
75+
EOS_ENDPOINT: root://eosproject-r.cern.ch
76+
KRB5CCNAME: /tmp/krb5cc
77+
run: |
78+
echo +++ Content
79+
ls
80+
echo +++ Retrieving the secret
81+
echo ${RWEBEOS_KT} | base64 -d > ${KT_FILE_NAME}
82+
echo +++ Creating the token
83+
kinit -p ${{ secrets.KRB5USER }}@${{ secrets.KRB5REALM }} -kt ${KT_FILE_NAME}
84+
echo +++ Running the copy
85+
xrdcp -rf root_v${{ inputs.major }}.${{ inputs.minor }}.${{ inputs.patch }}.source.tar.gz ${EOS_ENDPOINT}/${EOS_PATH}/

README/ReleaseNotes/v640/index.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ The following people have contributed to this new version:
5959
* The `TFTP`, `TNetFile`, `TNetFileStager`, and `TNetSystem` classes are deprecated and will be removed in ROOT 6.42. These classes rely on **rootd**, which was removed in release 6.16.
6060
* The ROOT **auth** package together with `TVirtualAuth` and `TROOT::GetListOfSecContexts()`, and the **authenticated sockets** (`TSocket::CreateAuthSocket()`) feature are deprecated and will be remove in ROOT 6.42.
6161
The security assumtions in the current socket authentication implementation is not up to date anymore.
62-
Secure communication should be provided by standard means, such as SSL sockets or SSH tunneling.
62+
Secure communication should be provided by external means, such as SSH tunneling.
63+
* The `TSSLSocket` class is deprecated and should not be used in user code anymore. Secure communication should be provided by externals means, such as SSH tunneling.
6364
* The `builtin_davix` build option has been removed.
6465
The Davix I/O code in ROOT remains uneffected and is built as before provided that the Davix library is found on the system.
6566
* `RRealField::SetQuantized` now has a new overload and the existing signature has been deprecated. The new overload enforces proper ordering of the arguments.
@@ -335,6 +336,7 @@ Given the risk of silently incorrect physics results, and the absence of known w
335336

336337
## RDataFrame
337338

339+
- The RDataFrame documentation now contains a section to help translate `TTree::Draw` expressions to RDataFrame, the ["Rosetta stone"](https://root.cern/doc/master/classROOT_1_1RDataFrame.html#rosetta-stone).
338340
- The change of default compression settings used by Snapshot for the TTree output data format introduced in 6.38 (was 101 before 6.38, became 505 in 6.38) is reverted. That choice was based on evidence available up to that point that indicated that ZSTD was outperforming ZLIB in all cases for the available datasets. New evidence demonstrated that this is not always the case, and in particular for the notable case of TTree branches made of collections where many (up to all) of them are empty. The investigation is described at https://github.com/vepadulano/ttree-lossless-compression-studies. The new default compression settings for Snapshot are respectively `kUndefined` for the compression algorithm and `0` for the compression level. When Snapshot detects `kUndefined` used in the options, it changes the compression settings to the new defaults of 101 (for TTree) and 505 (for RNTuple).
339341
- Signatures of the HistoND and HistoNSparseD operations have been changed. Previously, the list of input column names was allowed to contain an extra column for events weights. This was done to align the logic with the THnBase::Fill method. But this signature was inconsistent with all other Histo* operations, which have a separate function argument that represents the column to get the weights from. Thus, HistoND and HistoNSparseD both now have a separate function argument for the weights. The previous signature is still supported, but deprecated: a warning will be raised if the user passes the column name of the weights as an extra element of the list of input column names. In a future version of ROOT this functionality will be removed. From now on, creating a (sparse) N-dim histogram with weights should be done by calling `HistoN[Sparse]D(histoModel, inputColumns, weightColumn)`.
340342
- The string expressions passed to `Vary` calls can now be shortened. If the string begins with '{' and ends with '}' (excluding whitespace, tab and newline characters), RDataFrame will automatically inject the return type in the generated lambda expression before declaring it to the interpreter. This for example allows writing an expression such as `{{px * 0.9, px * 1.1}, {py * 0.9, py * 1.1}}` instead of `ROOT::RVec<ROOT::RVec<ROOT::RVec<float>>>{{px * 0.9, px * 1.1}, {py * 0.9, py * 1.1}}`
@@ -801,4 +803,3 @@ More than 130 items were addressed for this release:
801803
* [[ROOT-7499](https://its.cern.ch/jira/browse/ROOT-7499)] - ExpectedData generated from RooSimultaneous does not have non-integer weights
802804
* [[ROOT-5306](https://its.cern.ch/jira/browse/ROOT-5306)] - Read a file with a versioned class layout fails if the current class layout is unversioned
803805
* [[ROOT-5174](https://its.cern.ch/jira/browse/ROOT-5174)] - rootcling without linkdef
804-

bindings/pyroot/pythonizations/python/ROOT/__init__.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from __future__ import annotations
1212

13+
import atexit
1314
import builtins
1415
import os
1516
import platform
@@ -188,3 +189,28 @@ def find_spec(self, fullname: str, path, target=None) -> ModuleSpec:
188189
from . import _jupyroot # noqa: F401 # imported the side effect of setting up JupyROOT
189190

190191
# from . import JsMVA
192+
193+
194+
def _cleanup():
195+
# Delete TBrowser instances while the GUI event loop is still alive,
196+
# which fixed https://github.com/root-project/root/issues/21912.
197+
#
198+
# The cleanup is kept tight on purpose. A previous version called
199+
# TROOT::EndOfProcessCleanups() outright (removed in commit e9d2803), which
200+
# also ran gInterpreter->ResetGlobals() and ShutDown() and interfered with
201+
# Python objects still alive at exit time, by cleaning up objects that
202+
# might be referenced by other Python proxies outside the control of gROOT.
203+
facade = sys.modules[__name__]
204+
205+
# Skip if the C++ runtime was never initialized (i.e. _finalSetup did
206+
# not run): nothing to clean up, and we don't want to drag cppyy in.
207+
if "_cppyy" not in facade.__dict__:
208+
return
209+
210+
if not getattr(facade.PyConfig, "ShutDown", True):
211+
return
212+
213+
facade.gROOT.GetListOfBrowsers().Delete()
214+
215+
216+
atexit.register(_cleanup)

bindings/pyroot/pythonizations/python/ROOT/_facade.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,11 @@ def __init__(self, module, is_ipython):
155155
# calls). We reproduce their semantics here using LiveProxy.
156156
self.gDirectory = TDirectoryPythonAdapter()
157157

158+
def _gclient_resolver():
159+
import ROOT
160+
161+
return ROOT.TGClient.Instance()
162+
158163
def _gpad_resolver():
159164
import ROOT
160165

@@ -165,6 +170,7 @@ def _gvirtualx_resolver():
165170

166171
return ROOT.TVirtualX.Instance()
167172

173+
self.gClient = LiveProxy(_gclient_resolver)
168174
self.gPad = LiveProxy(_gpad_resolver)
169175
self.gVirtualX = LiveProxy(_gvirtualx_resolver)
170176

@@ -300,6 +306,14 @@ def _finalSetup(self):
300306
# Make sure the interpreter is initialized once gROOT has been initialized
301307
self._cppyy.gbl.TInterpreter.Instance()
302308

309+
# Release the GIL on the heavy TInterpreter functions. This lets
310+
# background Python threads make progress - in particular, JupyROOT's
311+
# StreamCapture polling thread can drain stdout/stderr live to the
312+
# notebook frontend instead of waiting for the cell to finish.
313+
TInterpreter = self._cppyy.gbl.TInterpreter
314+
for name in ("ProcessLine", "ProcessLineSynch", "Declare", "LoadFile", "LoadMacro", "ExecuteMacro"):
315+
getattr(TInterpreter, name).__release_gil__ = True
316+
303317
# Setup interactive usage from Python
304318
self.__dict__["app"] = PyROOTApplication(self.PyConfig, self._is_ipython)
305319
if not self.gROOT.IsBatch() and self.PyConfig.StartGUIThread:

0 commit comments

Comments
 (0)