diff --git a/io/io/src/TFileMerger.cxx b/io/io/src/TFileMerger.cxx index 6946eafc29701..51095b37e2cf1 100644 --- a/io/io/src/TFileMerger.cxx +++ b/io/io/src/TFileMerger.cxx @@ -542,7 +542,8 @@ Bool_t TFileMerger::MergeOne(TDirectory *target, TList *sourcelist, Int_t type, keyname, keytitle); return kTRUE; } - Bool_t canBeFound = (type & kIncremental) && (current_sourcedir->GetList()->FindObject(keyname) != nullptr); + Bool_t canBeFound = (type & kIncremental) && (current_sourcedir->GetList()->FindObject(keyname) != nullptr) && + (target->GetList()->FindObject(keyname) != nullptr); // if (cl->IsTObject()) // obj->ResetBit(kMustCleanup); @@ -806,7 +807,8 @@ Bool_t TFileMerger::MergeOne(TDirectory *target, TList *sourcelist, Int_t type, delete ndir; } } else if (!canBeFound) { // Don't write the partial result for TTree and TH1 - + if (gDebug > 0) + Info("MergeOne", "Writing partial result of %s into target", oldkeyname.Data()); if (!canBeMerged) { TIter peeknextkey(nextkey); status = WriteCycleInOrder(oldkeyname, nextkey, peeknextkey, target) && status; diff --git a/io/io/test/TFileMergerTests.cxx b/io/io/test/TFileMergerTests.cxx index 66329320dc781..5f299c4f82d04 100644 --- a/io/io/test/TFileMergerTests.cxx +++ b/io/io/test/TFileMergerTests.cxx @@ -219,3 +219,39 @@ TEST(TFileMerger, ChangeFile) gSystem->Unlink("file6640mergerinput_2.root"); gSystem->Unlink("file6640mergeroutput.root"); } + +// https://github.com/root-project/root/issues/9022 +TEST(TFileMerger, SingleHistFile) +{ + auto filename1 = "f1_9022.root"; + auto filename2 = "f2_9022.root"; + auto outname = "file9022mergeroutput.root"; + { + TFile f1(filename1, "RECREATE"); + TH1F h("h1", "h1", 1, 0, 1); + h.Write(); + f1.Close(); + TFile f2(filename2, "RECREATE"); + TH1F h2("h2", "h2", 1, 0, 1); + h2.Write(); + f2.Close(); + } + { + TFileMerger filemerger{false, false}; + filemerger.SetMaxOpenedFiles(2); + filemerger.OutputFile(std::unique_ptr{TFile::Open(outname, "RECREATE")}); + + filemerger.AddFile(filename1); + filemerger.AddFile(filename2); + + filemerger.Merge(); + } + { + TFile file(outname, "READ"); + EXPECT_NE(file.Get("h1"), nullptr); + EXPECT_NE(file.Get("h2"), nullptr); + } + gSystem->Unlink(filename1); + gSystem->Unlink(filename2); + gSystem->Unlink(outname); +}