@@ -106,6 +106,16 @@ static std::optional<ENTupleMergeErrBehavior> ParseOptionErrBehavior(const TStri
106106 {" Skip" , ENTupleMergeErrBehavior::kSkip },
107107 });
108108}
109+
110+ static std::optional<ENTupleMergeVersionBehavior> ParseOptionVersionBehavior (const TString &opts)
111+ {
112+ return ParseStringOption<ENTupleMergeVersionBehavior>(
113+ opts, " rntuple.VersionBehavior=" ,
114+ {
115+ {" WarnOnHigherVersion" , ENTupleMergeVersionBehavior::kWarnOnHigherVersion },
116+ {" AbortOnHigherVersion" , ENTupleMergeVersionBehavior::kAbortOnHigherVersion },
117+ });
118+ }
109119// -------------------------------------------------------------------------------------
110120
111121// Entry point for TFileMerger. Internally calls RNTupleMerger::Merge().
@@ -244,6 +254,9 @@ try {
244254 if (auto errBehavior = ParseOptionErrBehavior (mergeInfo->fOptions )) {
245255 mergerOpts.fErrBehavior = *errBehavior;
246256 }
257+ if (auto versionBehavior = ParseOptionVersionBehavior (mergeInfo->fOptions )) {
258+ mergerOpts.fVersionBehavior = *versionBehavior;
259+ }
247260 merger.Merge (sourcePtrs, mergerOpts).ThrowOnError ();
248261
249262 // Provide the caller with a merged anchor object (even though we've already
@@ -1241,9 +1254,16 @@ ROOT::RResult<void> RNTupleMerger::Merge(std::span<RPageSource *> sources, const
12411254 mergeData.fSrcDescriptor = &srcDescriptor.GetRef ();
12421255
12431256 if (mergeData.fSrcDescriptor ->GetVersion () > ROOT::RNTuple::GetCurrentVersion ()) {
1244- R__LOG_WARNING (NTupleMergeLog ()) << " RNTuple '" << mergeData.fSrcDescriptor ->GetName ()
1245- << " ' has a higher format version than the latest supported by this version "
1246- " of ROOT. Merging will work but some features may be dropped." ;
1257+ if (mergeOpts.fVersionBehavior == ENTupleMergeVersionBehavior::kWarnOnHigherVersion ) {
1258+ R__LOG_WARNING (NTupleMergeLog ())
1259+ << " RNTuple '" << mergeData.fSrcDescriptor ->GetName ()
1260+ << " ' has a higher format version than the latest supported by this version "
1261+ " of ROOT. Merging will work but some features may be dropped." ;
1262+ } else {
1263+ return R__FAIL (" RNTuple '" + mergeData.fSrcDescriptor ->GetName () +
1264+ " ' has a higher format version than the latest supported by this version. Refusing to "
1265+ " merge, since RNTupleMergeOptions::fVersionBehavior is set to AbortOnHigherVersion." );
1266+ }
12471267 }
12481268
12491269 // Create sink from the input model if not initialized
0 commit comments