diff --git a/io/io/src/TFileMerger.cxx b/io/io/src/TFileMerger.cxx index cf8e80d4f564de2fb7c382b7bcb2c834127ce975..991bd24a424af1e894f8adb4f747bc19848c0efe 100644 --- a/io/io/src/TFileMerger.cxx +++ b/io/io/src/TFileMerger.cxx @@ -24,6 +24,7 @@ to be merged, like the standalone hadd program. #include "TFileMerger.h" #include "TDirectory.h" +#include "TError.h" #include "TUrl.h" #include "TFile.h" #include "TUUID.h" @@ -503,6 +504,9 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t obj = current_sourcedir->GetList()->FindObject(key->GetName()); if (!obj) { obj = key->ReadObj(); + } else if (info.fIsFirst && current_sourcedir != target) { + R__ASSERT(cl->IsTObject()); + obj = obj->Clone(); } } else { obj = key->ReadObj(); @@ -561,6 +565,7 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t if (alreadyseen) continue; TList inputs; + TList todelete; Bool_t oneGo = fHistoOneGo && cl->InheritsFrom(R__TH1_Class); // Loop over all source files and merge same-name object @@ -579,15 +584,21 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t // 'key' retrieved indirectly. // ndir->ResetBit(kMustCleanup); ndir->cd(); - TKey *key2 = (TKey*)ndir->GetListOfKeys()->FindObject(key->GetName()); - if (key2) { - TObject *hobj = key2->ReadObj(); - if (!hobj) { - Info("MergeRecursive", "could not read object for key {%s, %s}; skipping file %s", - key->GetName(), key->GetTitle(), nextsource->GetName()); - nextsource = (TFile*)sourcelist->After(nextsource); - continue; + TObject *hobj = ndir->GetList()->FindObject(key->GetName()); + if (!hobj) { + TKey *key2 = (TKey*)ndir->GetListOfKeys()->FindObject(key->GetName()); + if (key2) { + hobj = key2->ReadObj(); + if (!hobj) { + Info("MergeRecursive", "could not read object for key {%s, %s}; skipping file %s", + key->GetName(), key->GetTitle(), nextsource->GetName()); + nextsource = (TFile*)sourcelist->After(nextsource); + continue; + } + todelete.Add(hobj); } + } + if (hobj) { // Set ownership for collections if (hobj->InheritsFrom(TCollection::Class())) { ((TCollection*)hobj)->SetOwner(); @@ -602,7 +613,8 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t Error("MergeRecursive", "calling Merge() on '%s' with the corresponding object in '%s'", obj->GetName(), nextsource->GetName()); } - inputs.Delete(); + inputs.Clear(); + todelete.Delete(); } } } @@ -613,7 +625,8 @@ Bool_t TFileMerger::MergeRecursive(TDirectory *target, TList *sourcelist, Int_t ROOT::MergeFunc_t func = cl->GetMerge(); func(obj, &inputs, &info); info.fIsFirst = kFALSE; - inputs.Delete(); + inputs.Clear(); + todelete.Delete(); } } } else if (cl->IsTObject() &&