ROOT logo
/**
 * @file   AvailableSoftware.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Tue Oct 16 17:54:11 2012
 * 
 * @brief  Find available packages
 * 
 * @ingroup pwglf_forward_trains_util
 */

#ifndef AVAILABLESOFTWARE_C
#define AVAILABLESOFTWARE_C
#ifndef __CINT__
# include <TString.h>
# include <TSystem.h>
# include <TError.h>
# include <TObjArray.h>
#else
class TString;
#endif

/**
 * Railway code to find available packages on Grid
 * 
 *
 * @ingroup pwglf_forward_trains_util
 */
struct AvailableSoftware
{
  static Bool_t Check(TString& aliroot, TString& root, Bool_t debug=false)
  {
    // Figure out what to do.  
    // If mode == 0, then do nothing. 
    // If bit 0 is set in mode (0x1), then list and exit 
    // If bit 1 is set in mode (0x2), select last AliROOT/ROOT version 
    // If bit 2 is set in mode (0x4), select ROOT corresponding to AliROOT
    UShort_t mode = 0; 
    
    Bool_t show = (aliroot.Contains("list", TString::kIgnoreCase) ||
		   root.Contains(   "list", TString::kIgnoreCase));
    Bool_t last = (aliroot.Contains("last", TString::kIgnoreCase) || 
		   aliroot.Contains("newest", TString::kIgnoreCase));
    Bool_t nots = (aliroot.Contains("nonspecial", TString::kIgnoreCase) ||
		   aliroot.Contains("regular",    TString::kIgnoreCase) ||
		   aliroot.Contains("standard",   TString::kIgnoreCase));
    Bool_t rele = (aliroot.Contains("release",    TString::kIgnoreCase));
    Bool_t anat = (aliroot.Contains("analysis",   TString::kIgnoreCase));
    
    TString c("wget -q http://alimonitor.cern.ch/packages/ -O - | "
	      "sed -n -e '/<tr/,/<\\/tr>/ p' | ");
#if 0
    if (rele || anat || nots) {
      c.Append("sed -n '/<a.*VO_ALICE@AliRoot::v[0-9]\\{1,\\}-[0-9]\\{1,\\}-");
      if (rele)
	c.Append("Rev-[0-9]\\{1,\\}");
      else if (anat) 
	c.Append("[0-9]\\{1,\\}-AN");
      else if (nots) 
	c.Append("\\([0-9]\\{1,\\}\\|Rev\\)-\\(AN\\|[0-9]\\{1,\\}\\)");
      c.Append("/,/VO_ALICE@ROOT::/ p' | ");
    }
    else 
      c.Append("sed -n '/<a.*VO_ALICE@AliRoot::/,/VO_ALICE@ROOT::/ p' | ");
#else 
    if (rele || anat || nots) { 
      c.Append("sed -n '/<a.*VO_ALICE@AliRoot::v");
      const char* relPat = "[0-9]\\{1,\\}-[0-9]\\{1,\\}-Rev-[0-9]\\{1,\\}";
      const char* anaPat = "AN-[0-9]\\{8,\\}";
      if      (rele) 	c.Append(relPat);
      else if (anat)  	c.Append(anaPat);
      else if (nots)    c.Append(Form("\\(%s\\|%s\\)", relPat, anaPat));
      c.Append("/,/VO_ALICE@ROOT::/ p' | ");
    }
    else  
      c.Append("sed -n '/<a.*VO_ALICE@AliRoot::/,/VO_ALICE@ROOT::/ p' | ");
#endif

    c.Append("sed -n -e 's/.*VO_ALICE@AliRoot::\\([-0-9a-zA-Z]*\\).*/%\\1%/p' "
	     "  -e 's/.*VO_ALICE@ROOT::\\([-0-9a-zA-Z]*\\).*/\\1@/p' | "
	     "tr -d '\\n' | tr '@' '\\n' | tr '%' '\\t' ");
    
    if (debug) 
      Printf("Command: %s", c.Data());

    if (show || aliroot.IsNull()) {
      Warning("AvaliableSoftware::Check", "No AliROOT/ROOT version specified, "
	      "available packages are:\n" 
	      "\tAliROOT \tROOT:");
      gSystem->Exec(c);
      return false;
    }

    if (last) 
      mode |= 0x2;
    else if (!aliroot.IsNull()) 
      mode |= 0x4; 

    // Nothing to do 
    if (mode == 0) return true; 
    
    if (debug) Printf("Mode=0x%02x", mode);

    TString    values = gSystem->GetFromPipe(c);
    TObjArray* tokens = values.Tokenize(" \t\n");
    Int_t      n      = tokens->GetEntries();

    // If we asked to select the last possible version, do so here and get out
    if (mode & 0x2) { 
      aliroot = tokens->At(n-2)->GetName();
      root    = tokens->At(n-1)->GetName();
      Info("AvaliableSoftware::Check", 
	   "Selecting lastest possible AliROOT/ROOT: %s/%s", 
	   aliroot.Data(), root.Data());
      delete tokens;
      return true;
    }
    
    // We get here if we're asked to find a ROOT version compatible
    // with the selected AliROOT version. 
    for (Int_t i = 0; i < n; i += 2) {
      if (aliroot.EqualTo(tokens->At(i)->GetName(), 
				  TString::kIgnoreCase)) { 
	root = tokens->At(i+1)->GetName();
	Info("AvaliableSoftware::Check",
	     "Found ROOT version compatible with AliROOT %s: %s",
	     aliroot.Data(), root.Data());
	delete tokens;
	return true;
      }
    }
    // If we get here, then we didn't find a ROOT version compatible
    // with the selected AliROOT, and we should fail. 
    Warning("AvaliableSoftware::Check",
	    "Didn't find a ROOT version compatible with AliROOT %s", 
	    aliroot.Data());
    delete tokens; 
    return false;
  }
  static void Test(const TString& ali, const TString& roo=TString())
  {
    TString aliroot(Form("list,%s",ali.Data()));
    TString root(roo);
    Printf("Checking with AliROOT=%s ROOT=%s", ali.Data(), roo.Data());
    AvailableSoftware::Check(aliroot, root);

    aliroot = Form("last,%s",ali.Data());
    AvailableSoftware::Check(aliroot, root);
    Printf("Got AliROOT=%s ROOT=%s", aliroot.Data(), root.Data());
  }
    
  static void Test()
  {
    Printf("All available");
    AvailableSoftware::Test("");
    Printf("All regular");
    AvailableSoftware::Test("regular");
    Printf("All releases");
    AvailableSoftware::Test("release");
    Printf("All analysis tags");
    AvailableSoftware::Test("analysis");
  }
};
#endif
 AvailableSoftware.C:1
 AvailableSoftware.C:2
 AvailableSoftware.C:3
 AvailableSoftware.C:4
 AvailableSoftware.C:5
 AvailableSoftware.C:6
 AvailableSoftware.C:7
 AvailableSoftware.C:8
 AvailableSoftware.C:9
 AvailableSoftware.C:10
 AvailableSoftware.C:11
 AvailableSoftware.C:12
 AvailableSoftware.C:13
 AvailableSoftware.C:14
 AvailableSoftware.C:15
 AvailableSoftware.C:16
 AvailableSoftware.C:17
 AvailableSoftware.C:18
 AvailableSoftware.C:19
 AvailableSoftware.C:20
 AvailableSoftware.C:21
 AvailableSoftware.C:22
 AvailableSoftware.C:23
 AvailableSoftware.C:24
 AvailableSoftware.C:25
 AvailableSoftware.C:26
 AvailableSoftware.C:27
 AvailableSoftware.C:28
 AvailableSoftware.C:29
 AvailableSoftware.C:30
 AvailableSoftware.C:31
 AvailableSoftware.C:32
 AvailableSoftware.C:33
 AvailableSoftware.C:34
 AvailableSoftware.C:35
 AvailableSoftware.C:36
 AvailableSoftware.C:37
 AvailableSoftware.C:38
 AvailableSoftware.C:39
 AvailableSoftware.C:40
 AvailableSoftware.C:41
 AvailableSoftware.C:42
 AvailableSoftware.C:43
 AvailableSoftware.C:44
 AvailableSoftware.C:45
 AvailableSoftware.C:46
 AvailableSoftware.C:47
 AvailableSoftware.C:48
 AvailableSoftware.C:49
 AvailableSoftware.C:50
 AvailableSoftware.C:51
 AvailableSoftware.C:52
 AvailableSoftware.C:53
 AvailableSoftware.C:54
 AvailableSoftware.C:55
 AvailableSoftware.C:56
 AvailableSoftware.C:57
 AvailableSoftware.C:58
 AvailableSoftware.C:59
 AvailableSoftware.C:60
 AvailableSoftware.C:61
 AvailableSoftware.C:62
 AvailableSoftware.C:63
 AvailableSoftware.C:64
 AvailableSoftware.C:65
 AvailableSoftware.C:66
 AvailableSoftware.C:67
 AvailableSoftware.C:68
 AvailableSoftware.C:69
 AvailableSoftware.C:70
 AvailableSoftware.C:71
 AvailableSoftware.C:72
 AvailableSoftware.C:73
 AvailableSoftware.C:74
 AvailableSoftware.C:75
 AvailableSoftware.C:76
 AvailableSoftware.C:77
 AvailableSoftware.C:78
 AvailableSoftware.C:79
 AvailableSoftware.C:80
 AvailableSoftware.C:81
 AvailableSoftware.C:82
 AvailableSoftware.C:83
 AvailableSoftware.C:84
 AvailableSoftware.C:85
 AvailableSoftware.C:86
 AvailableSoftware.C:87
 AvailableSoftware.C:88
 AvailableSoftware.C:89
 AvailableSoftware.C:90
 AvailableSoftware.C:91
 AvailableSoftware.C:92
 AvailableSoftware.C:93
 AvailableSoftware.C:94
 AvailableSoftware.C:95
 AvailableSoftware.C:96
 AvailableSoftware.C:97
 AvailableSoftware.C:98
 AvailableSoftware.C:99
 AvailableSoftware.C:100
 AvailableSoftware.C:101
 AvailableSoftware.C:102
 AvailableSoftware.C:103
 AvailableSoftware.C:104
 AvailableSoftware.C:105
 AvailableSoftware.C:106
 AvailableSoftware.C:107
 AvailableSoftware.C:108
 AvailableSoftware.C:109
 AvailableSoftware.C:110
 AvailableSoftware.C:111
 AvailableSoftware.C:112
 AvailableSoftware.C:113
 AvailableSoftware.C:114
 AvailableSoftware.C:115
 AvailableSoftware.C:116
 AvailableSoftware.C:117
 AvailableSoftware.C:118
 AvailableSoftware.C:119
 AvailableSoftware.C:120
 AvailableSoftware.C:121
 AvailableSoftware.C:122
 AvailableSoftware.C:123
 AvailableSoftware.C:124
 AvailableSoftware.C:125
 AvailableSoftware.C:126
 AvailableSoftware.C:127
 AvailableSoftware.C:128
 AvailableSoftware.C:129
 AvailableSoftware.C:130
 AvailableSoftware.C:131
 AvailableSoftware.C:132
 AvailableSoftware.C:133
 AvailableSoftware.C:134
 AvailableSoftware.C:135
 AvailableSoftware.C:136
 AvailableSoftware.C:137
 AvailableSoftware.C:138
 AvailableSoftware.C:139
 AvailableSoftware.C:140
 AvailableSoftware.C:141
 AvailableSoftware.C:142
 AvailableSoftware.C:143
 AvailableSoftware.C:144
 AvailableSoftware.C:145
 AvailableSoftware.C:146
 AvailableSoftware.C:147
 AvailableSoftware.C:148
 AvailableSoftware.C:149
 AvailableSoftware.C:150
 AvailableSoftware.C:151
 AvailableSoftware.C:152
 AvailableSoftware.C:153
 AvailableSoftware.C:154
 AvailableSoftware.C:155
 AvailableSoftware.C:156
 AvailableSoftware.C:157
 AvailableSoftware.C:158
 AvailableSoftware.C:159
 AvailableSoftware.C:160
 AvailableSoftware.C:161
 AvailableSoftware.C:162
 AvailableSoftware.C:163
 AvailableSoftware.C:164