ROOT logo
#include "hsrckeeper.h"
#include "hdiskspace.h"


#include "TSystem.h"
#include "TRegexp.h"
#include "TPRegexp.h"

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;



//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////////
//
//
// HSrcKeeper
//
// Tool to store source code along root output files.
// REMARK: To work with hadd for histogram merging
// a special hadd version has to be compiled which is linked
// against hydra libs (Dictionary is needed)
//
//------------------------------------------------------------------------------
// USAGE:
//
//    TFile* out = new TFile(outfile.Data(),"RECREATE");
//
//    HSrcKeeper keeper("hydra","hydra");
//
//    //keeper.addSourceFile("test.C");
//    //keeper.addSourceFiles(dir,"\\..*[cCh]+$");         // single files or files matching the regexp inside dir
//    keeper.addSourceFilesRecursive(dir,"\\..*[cCh]+$");  // recursive add through all subdir of dir
//
//    //keeper.print(".*",kFALSE); // print all files names (kTRUE: print also source code)
//    //keeper.extract(destinationdir,replacedir,".*"); // extract source code matching the regexp to destinationdir, replace replacedir in path names
//    // TMacro* m=keeper.getFile(name); // return NULL if nothing was found
//
//    keeper.Write();
//
//
//    out->Save();
//    out->Close();
//
////////////////////////////////////////////////////////////////////////////////

ClassImp(HSrcKeeper)


HSrcKeeper::HSrcKeeper(const char* name,const char* title)
    : TNamed(name,title)
{

}

HSrcKeeper::~HSrcKeeper(void)
{

}

TMacro*  HSrcKeeper::newFile(TString fname)
{
    // opens the input source fname
    // and creates TMacro by addiding line
    // by line the source code. If the soure
    // cannot be read Null will be returned

    TString n = fname;
    TMacro* m = NULL;

    ifstream input;
    input.open(fname);

    if(input.fail()) return m;

    m = new TMacro();
    m ->SetName(n.Data());

    Char_t line[4000];
    while(!input.eof()){
	input.getline(line,4000);
	m->AddLine(line);
    }
    input.close();
    return  m;
}

Bool_t HSrcKeeper::addSourceFile(TString name)
{
    // add a single source file. return kFALSE
    // if a problems occurs.
    
    TMacro* m = newFile(name);
    if(m) {
	cout<<name.Data()<<endl;
	source.AddLast(m);
	return kTRUE;
    }
    else  Error("addSourceFiles()","could not create macro for %s !",name.Data());
    return kFALSE;
}


Int_t HSrcKeeper::addSourceFiles(TString dir,TString regexp)
{
    // add all source files matching regexp
    // subdir will be ignored. returns the number of
    // added files
    vector<TString> files;
    HFileSys::lsFiles(dir,files,kTRUE);

    sort(files.begin(),files.end());
    TPRegexp expr(regexp);
    Int_t n=0;
    for(UInt_t i=0;i<files.size();i++){
	TString name = files[i];
	if(name(expr) != "") {
	    cout<<name.Data()<<endl;
	    TMacro* m = newFile(name);
	    if(m) {source.AddLast(m);n++;}
	    else  Error("addSourceFiles()","could not create macro!");
	}
    }
    cout<<"added n "<<n<<" files"<<endl;
    return n;


}

Int_t HSrcKeeper::addSourceFilesRecursive(TString dir,TString regexp)
{
    // add all source files of dir and its subdirs matching regexp
    // returns the number of added files

    vector<TString> files;
    HFileSys::lsFilesRecursive(dir,files);

    sort(files.begin(),files.end());
    TPRegexp expr(regexp);
    Int_t n=0;
    for(UInt_t i=0;i<files.size();i++){
	TString name = files[i];
	if(name(expr) != "") {
	    cout<<name.Data()<<endl;
	    TMacro* m = newFile(name);
	    if(m) {source.AddLast(m);n++;}
	    else  Error("addSourceFiles()","could not create macro!");
	}
    }
    cout<<"added n "<<n<<" files"<<endl;
    return n;
}

void HSrcKeeper::print(TString regexp,Bool_t show)
{
    // print all files matching regexp (".*" for all files)
    // if show==kTRUE the source code is printed too
    TPRegexp expr(regexp);
    TString name;
    for(Int_t i=0;i<source.GetEntries();i++){
	TMacro* m = (TMacro*) source.At(i);
        name = m->GetName() ;
	if(name(expr)!= ""){
	    
	    if(show)  {
                cout<<"-------------------------------------------------------------"<<endl;
		cout<<m->GetName()<<endl;
		m->Print();
	    } else cout<<m->GetName()<<endl;
	}
    }
}

void HSrcKeeper::extract(TString destinationdir,TString replacedir, TString regexp)
{
    // extracts all matching source file to destination dir. subdirs
    // will be created. if replacedir is set the original path of the
    // file will be replaced in the beginning of path by ""

    TPRegexp expr(regexp);
    if(destinationdir.EndsWith("/")) destinationdir.Replace(destinationdir.Length()-1,1,"");
    if(replacedir.EndsWith("/")    ) replacedir    .Replace(replacedir    .Length()-1,1,"");
    if(gSystem->AccessPathName(destinationdir.Data())!=0){
	if( gSystem->mkdir(destinationdir.Data()) ==-1) {
	    Error("extract()","Could not create destination dir %s. skipped.",destinationdir.Data());
            return;
	}
    }

    TString name;
    for(Int_t i=0;i<source.GetEntries();i++){
	TMacro* m = (TMacro*) source.At(i);
        name = m->GetName() ;
	if(name(expr)!= ""){
	    cout<<m->GetName()<<endl;
	    name.Replace(0,replacedir.Length(),"");
	    TString dir = gSystem->DirName(name.Data());
	    if(gSystem->AccessPathName(Form("%s/%s",destinationdir.Data(),dir.Data()))!=0)
	    {
		if( gSystem->mkdir(Form("%s/%s",destinationdir.Data(),dir.Data()),kTRUE) ==-1)
		{
		    Error("extract()","Could not create destination dir %s. skipped.",destinationdir.Data());
                    continue;
		}
	    }
	    m->SaveSource(Form("%s/%s",destinationdir.Data(),name.Data()));
	}
    }
}

TMacro* HSrcKeeper::getFile(TString fname,Bool_t usePath)
{
    // get TMacro of file fname. returns 0 if
    // the file does not exist in the container
    if(fname == "") return 0;
    TString name;
    for(Int_t i=0;i<source.GetEntries();i++){
	TMacro* m = (TMacro*) source.At(i);
	name = m->GetName() ;
        if(!usePath) name = gSystem->BaseName(name.Data());
	if(name.CompareTo(fname.Data())==0) return m;
    }
    return 0;
}

Long64_t HSrcKeeper::Merge(TCollection *li){

    // dummy function for hadd like merge of hist files

    if (!li) return 0;
    return (Long64_t) 1;

}

 hsrckeeper.cc:1
 hsrckeeper.cc:2
 hsrckeeper.cc:3
 hsrckeeper.cc:4
 hsrckeeper.cc:5
 hsrckeeper.cc:6
 hsrckeeper.cc:7
 hsrckeeper.cc:8
 hsrckeeper.cc:9
 hsrckeeper.cc:10
 hsrckeeper.cc:11
 hsrckeeper.cc:12
 hsrckeeper.cc:13
 hsrckeeper.cc:14
 hsrckeeper.cc:15
 hsrckeeper.cc:16
 hsrckeeper.cc:17
 hsrckeeper.cc:18
 hsrckeeper.cc:19
 hsrckeeper.cc:20
 hsrckeeper.cc:21
 hsrckeeper.cc:22
 hsrckeeper.cc:23
 hsrckeeper.cc:24
 hsrckeeper.cc:25
 hsrckeeper.cc:26
 hsrckeeper.cc:27
 hsrckeeper.cc:28
 hsrckeeper.cc:29
 hsrckeeper.cc:30
 hsrckeeper.cc:31
 hsrckeeper.cc:32
 hsrckeeper.cc:33
 hsrckeeper.cc:34
 hsrckeeper.cc:35
 hsrckeeper.cc:36
 hsrckeeper.cc:37
 hsrckeeper.cc:38
 hsrckeeper.cc:39
 hsrckeeper.cc:40
 hsrckeeper.cc:41
 hsrckeeper.cc:42
 hsrckeeper.cc:43
 hsrckeeper.cc:44
 hsrckeeper.cc:45
 hsrckeeper.cc:46
 hsrckeeper.cc:47
 hsrckeeper.cc:48
 hsrckeeper.cc:49
 hsrckeeper.cc:50
 hsrckeeper.cc:51
 hsrckeeper.cc:52
 hsrckeeper.cc:53
 hsrckeeper.cc:54
 hsrckeeper.cc:55
 hsrckeeper.cc:56
 hsrckeeper.cc:57
 hsrckeeper.cc:58
 hsrckeeper.cc:59
 hsrckeeper.cc:60
 hsrckeeper.cc:61
 hsrckeeper.cc:62
 hsrckeeper.cc:63
 hsrckeeper.cc:64
 hsrckeeper.cc:65
 hsrckeeper.cc:66
 hsrckeeper.cc:67
 hsrckeeper.cc:68
 hsrckeeper.cc:69
 hsrckeeper.cc:70
 hsrckeeper.cc:71
 hsrckeeper.cc:72
 hsrckeeper.cc:73
 hsrckeeper.cc:74
 hsrckeeper.cc:75
 hsrckeeper.cc:76
 hsrckeeper.cc:77
 hsrckeeper.cc:78
 hsrckeeper.cc:79
 hsrckeeper.cc:80
 hsrckeeper.cc:81
 hsrckeeper.cc:82
 hsrckeeper.cc:83
 hsrckeeper.cc:84
 hsrckeeper.cc:85
 hsrckeeper.cc:86
 hsrckeeper.cc:87
 hsrckeeper.cc:88
 hsrckeeper.cc:89
 hsrckeeper.cc:90
 hsrckeeper.cc:91
 hsrckeeper.cc:92
 hsrckeeper.cc:93
 hsrckeeper.cc:94
 hsrckeeper.cc:95
 hsrckeeper.cc:96
 hsrckeeper.cc:97
 hsrckeeper.cc:98
 hsrckeeper.cc:99
 hsrckeeper.cc:100
 hsrckeeper.cc:101
 hsrckeeper.cc:102
 hsrckeeper.cc:103
 hsrckeeper.cc:104
 hsrckeeper.cc:105
 hsrckeeper.cc:106
 hsrckeeper.cc:107
 hsrckeeper.cc:108
 hsrckeeper.cc:109
 hsrckeeper.cc:110
 hsrckeeper.cc:111
 hsrckeeper.cc:112
 hsrckeeper.cc:113
 hsrckeeper.cc:114
 hsrckeeper.cc:115
 hsrckeeper.cc:116
 hsrckeeper.cc:117
 hsrckeeper.cc:118
 hsrckeeper.cc:119
 hsrckeeper.cc:120
 hsrckeeper.cc:121
 hsrckeeper.cc:122
 hsrckeeper.cc:123
 hsrckeeper.cc:124
 hsrckeeper.cc:125
 hsrckeeper.cc:126
 hsrckeeper.cc:127
 hsrckeeper.cc:128
 hsrckeeper.cc:129
 hsrckeeper.cc:130
 hsrckeeper.cc:131
 hsrckeeper.cc:132
 hsrckeeper.cc:133
 hsrckeeper.cc:134
 hsrckeeper.cc:135
 hsrckeeper.cc:136
 hsrckeeper.cc:137
 hsrckeeper.cc:138
 hsrckeeper.cc:139
 hsrckeeper.cc:140
 hsrckeeper.cc:141
 hsrckeeper.cc:142
 hsrckeeper.cc:143
 hsrckeeper.cc:144
 hsrckeeper.cc:145
 hsrckeeper.cc:146
 hsrckeeper.cc:147
 hsrckeeper.cc:148
 hsrckeeper.cc:149
 hsrckeeper.cc:150
 hsrckeeper.cc:151
 hsrckeeper.cc:152
 hsrckeeper.cc:153
 hsrckeeper.cc:154
 hsrckeeper.cc:155
 hsrckeeper.cc:156
 hsrckeeper.cc:157
 hsrckeeper.cc:158
 hsrckeeper.cc:159
 hsrckeeper.cc:160
 hsrckeeper.cc:161
 hsrckeeper.cc:162
 hsrckeeper.cc:163
 hsrckeeper.cc:164
 hsrckeeper.cc:165
 hsrckeeper.cc:166
 hsrckeeper.cc:167
 hsrckeeper.cc:168
 hsrckeeper.cc:169
 hsrckeeper.cc:170
 hsrckeeper.cc:171
 hsrckeeper.cc:172
 hsrckeeper.cc:173
 hsrckeeper.cc:174
 hsrckeeper.cc:175
 hsrckeeper.cc:176
 hsrckeeper.cc:177
 hsrckeeper.cc:178
 hsrckeeper.cc:179
 hsrckeeper.cc:180
 hsrckeeper.cc:181
 hsrckeeper.cc:182
 hsrckeeper.cc:183
 hsrckeeper.cc:184
 hsrckeeper.cc:185
 hsrckeeper.cc:186
 hsrckeeper.cc:187
 hsrckeeper.cc:188
 hsrckeeper.cc:189
 hsrckeeper.cc:190
 hsrckeeper.cc:191
 hsrckeeper.cc:192
 hsrckeeper.cc:193
 hsrckeeper.cc:194
 hsrckeeper.cc:195
 hsrckeeper.cc:196
 hsrckeeper.cc:197
 hsrckeeper.cc:198
 hsrckeeper.cc:199
 hsrckeeper.cc:200
 hsrckeeper.cc:201
 hsrckeeper.cc:202
 hsrckeeper.cc:203
 hsrckeeper.cc:204
 hsrckeeper.cc:205
 hsrckeeper.cc:206
 hsrckeeper.cc:207
 hsrckeeper.cc:208
 hsrckeeper.cc:209
 hsrckeeper.cc:210
 hsrckeeper.cc:211
 hsrckeeper.cc:212
 hsrckeeper.cc:213
 hsrckeeper.cc:214
 hsrckeeper.cc:215
 hsrckeeper.cc:216
 hsrckeeper.cc:217
 hsrckeeper.cc:218
 hsrckeeper.cc:219
 hsrckeeper.cc:220
 hsrckeeper.cc:221
 hsrckeeper.cc:222
 hsrckeeper.cc:223
 hsrckeeper.cc:224
 hsrckeeper.cc:225
 hsrckeeper.cc:226
 hsrckeeper.cc:227
 hsrckeeper.cc:228
 hsrckeeper.cc:229
 hsrckeeper.cc:230
 hsrckeeper.cc:231
 hsrckeeper.cc:232
 hsrckeeper.cc:233
 hsrckeeper.cc:234
 hsrckeeper.cc:235
 hsrckeeper.cc:236
 hsrckeeper.cc:237
 hsrckeeper.cc:238
 hsrckeeper.cc:239