[1776] | 1 | |
---|
| 2 | import array as arr |
---|
| 3 | import collections |
---|
| 4 | import glob |
---|
[1771] | 5 | import os |
---|
| 6 | import sys |
---|
[1776] | 7 | import subprocess |
---|
| 8 | import socket |
---|
| 9 | import os.path |
---|
| 10 | from os import path |
---|
[1771] | 11 | |
---|
| 12 | from collections import Counter |
---|
| 13 | |
---|
| 14 | |
---|
| 15 | def filename_list_generator(file_to_open): |
---|
| 16 | word = "" |
---|
| 17 | with open(file_to_open, "r") as file: |
---|
| 18 | file.read(0) |
---|
| 19 | for line in file: |
---|
[1776] | 20 | if not line.startswith("#"): |
---|
| 21 | for word in line.split(" "): |
---|
| 22 | if word.endswith(".nc") or word.endswith("_nc_files"): |
---|
| 23 | yield word |
---|
| 24 | break |
---|
[1771] | 25 | |
---|
| 26 | def configname_list_generator(file_to_open): |
---|
| 27 | word = "" |
---|
| 28 | with open(file_to_open, "r") as file: |
---|
| 29 | file.read(0) |
---|
| 30 | for line in file: |
---|
[1776] | 31 | if not line.startswith("#"): |
---|
| 32 | for word in line.split(" "): |
---|
| 33 | if "config_" in word: |
---|
| 34 | yield word |
---|
| 35 | break |
---|
[1771] | 36 | |
---|
| 37 | def foldername_list_generator(file_to_open): |
---|
| 38 | word = "" |
---|
| 39 | |
---|
| 40 | with open(file_to_open, "r") as file: |
---|
| 41 | file.read(0) |
---|
| 42 | for line in file: |
---|
[1776] | 43 | if not line.startswith("#"): |
---|
| 44 | for word in line.split(" "): |
---|
| 45 | if word.startswith("test_"): |
---|
| 46 | yield word |
---|
| 47 | break |
---|
[1771] | 48 | |
---|
| 49 | def result_list_generator(file_to_open): |
---|
| 50 | word = "" |
---|
| 51 | with open(file_to_open, "r") as file: |
---|
| 52 | file.read(0) |
---|
| 53 | for line in file: |
---|
[1776] | 54 | if not line.startswith("#"): |
---|
| 55 | for word in line.split(" "): |
---|
| 56 | if word == '-1' or word == '0' or word == '1': |
---|
| 57 | yield(word) |
---|
| 58 | break |
---|
[1771] | 59 | |
---|
[1776] | 60 | def OSinfo(runthis): |
---|
| 61 | red = lambda text: '\033[0;31m' + text + '\033[0m' |
---|
| 62 | osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True) |
---|
| 63 | theInfo = osstdout.communicate()[0].strip() |
---|
| 64 | if osstdout.returncode!=0: |
---|
| 65 | print(red(runthis+" FAILED")) |
---|
| 66 | print >> sys.stderr, osstdout.returncode |
---|
| 67 | sys.exit() |
---|
| 68 | # else: |
---|
| 69 | # print(runthis+" OK") |
---|
[1771] | 70 | |
---|
| 71 | def main(): |
---|
[1776] | 72 | unfold_icon = '⮯' |
---|
| 73 | fold_icon = '⮭' |
---|
[1771] | 74 | |
---|
[1776] | 75 | current_revision_report = sys.argv[1] |
---|
| 76 | |
---|
| 77 | if os.path.exists(current_revision_report) : |
---|
| 78 | file_to_open=current_revision_report |
---|
[1771] | 79 | else : |
---|
| 80 | file_to_open="plein_report_example.txt" |
---|
| 81 | |
---|
[1776] | 82 | |
---|
| 83 | f=open(file_to_open, "r") |
---|
| 84 | for line in f : |
---|
| 85 | if line.startswith("#revision"): |
---|
| 86 | revision_number = line.split(" ")[1].replace("\n", "") |
---|
| 87 | elif line.startswith("#build_dir"): |
---|
| 88 | build_dir = line.split(" ")[1].replace("\n", "") |
---|
| 89 | elif line.startswith("#arch"): |
---|
| 90 | arch = line.split(" ")[1].replace("\n", "") |
---|
| 91 | elif line.startswith("#machine"): |
---|
| 92 | machine = line.split(" ")[1].replace("\n", "") |
---|
| 93 | if machine == "jeanzay": |
---|
| 94 | machine = "Jean-Zay" |
---|
| 95 | elif machine == "irene": |
---|
| 96 | machine = "Irene" |
---|
| 97 | else : |
---|
| 98 | machine = "other" |
---|
| 99 | elif line.startswith("#relurl"): |
---|
| 100 | words = line.split("/") |
---|
| 101 | words_size = len(words) |
---|
| 102 | branch = words[words_size-1].replace("\n", "") |
---|
| 103 | |
---|
[1771] | 104 | folderlist=[] |
---|
| 105 | for x in foldername_list_generator(file_to_open): |
---|
| 106 | folderlist.append(x) |
---|
| 107 | |
---|
| 108 | configlist=[] |
---|
| 109 | for x in configname_list_generator(file_to_open): |
---|
| 110 | configlist.append(x) |
---|
| 111 | |
---|
| 112 | filelist=[] |
---|
| 113 | for x in filename_list_generator(file_to_open): |
---|
| 114 | filelist.append(x) |
---|
| 115 | |
---|
| 116 | resultlist=[] |
---|
| 117 | for x in result_list_generator(file_to_open): |
---|
| 118 | resultlist.append(x) |
---|
| 119 | |
---|
| 120 | total_records = len(resultlist) |
---|
| 121 | |
---|
| 122 | c = Counter(folderlist) |
---|
| 123 | nb_level1 = len(c) |
---|
| 124 | |
---|
| 125 | my_struncture = dict() |
---|
| 126 | |
---|
| 127 | for i in range(nb_level1): |
---|
| 128 | my_key1 = list(c.keys())[i] # algo_name |
---|
| 129 | my_struncture.update({my_key1 : dict()}) |
---|
| 130 | min_range=-1 |
---|
| 131 | for index in range(total_records) : |
---|
| 132 | if my_key1 == folderlist[index] : |
---|
| 133 | if min_range == -1 : |
---|
| 134 | min_range = index |
---|
| 135 | max_range = index |
---|
| 136 | else : |
---|
| 137 | max_range = index |
---|
| 138 | cc = Counter(configlist[min_range: max_range+1]) |
---|
| 139 | nb_level2 = len(cc) |
---|
| 140 | |
---|
| 141 | for j in range(nb_level2) : |
---|
| 142 | my_key2 = list(cc.keys())[j] #config_name |
---|
| 143 | my_struncture[my_key1].update({my_key2:dict()}) |
---|
| 144 | min_range = -1 |
---|
| 145 | for index in range(total_records) : |
---|
| 146 | if my_key2 == configlist[index] : |
---|
| 147 | if min_range == -1 : |
---|
| 148 | min_range = index |
---|
| 149 | max_range = index |
---|
| 150 | else : |
---|
| 151 | max_range = index |
---|
| 152 | |
---|
| 153 | ccc = Counter(filelist[min_range: max_range+1]) |
---|
| 154 | nb_level3 = len(ccc) |
---|
| 155 | |
---|
| 156 | for k in range(nb_level3) : |
---|
| 157 | my_key3 = list(ccc.keys())[k] #filename |
---|
| 158 | |
---|
| 159 | min_range = -1 |
---|
| 160 | for index in range(total_records) : |
---|
| 161 | if my_key3 == filelist[index] : |
---|
| 162 | if min_range == -1 : |
---|
| 163 | min_range = index |
---|
| 164 | max_range = index |
---|
| 165 | else : |
---|
| 166 | max_range = index |
---|
| 167 | my_struncture[my_key1][my_key2].update({my_key3:resultlist[min_range]}) |
---|
| 168 | |
---|
| 169 | |
---|
| 170 | |
---|
| 171 | nb_algo = len(my_struncture) |
---|
| 172 | |
---|
| 173 | for x in range(nb_algo) : |
---|
| 174 | algo_name = list(my_struncture.keys())[x] |
---|
| 175 | nb_config = len(my_struncture[algo_name]) |
---|
| 176 | for y in range(nb_config) : |
---|
| 177 | config_name = list(my_struncture[algo_name].keys())[y] |
---|
| 178 | nb_file = len(my_struncture[algo_name][config_name]) |
---|
| 179 | |
---|
| 180 | |
---|
| 181 | algo_names=list(my_struncture.keys()) |
---|
| 182 | |
---|
| 183 | nb_files = [0]*nb_algo |
---|
| 184 | nb_configs = [0]*nb_algo |
---|
| 185 | |
---|
| 186 | for x in range(nb_algo) : |
---|
| 187 | nb_files[x] = len(my_struncture[list(my_struncture.keys())[x]][list(my_struncture[list(my_struncture.keys())[x]].keys())[0]]) |
---|
| 188 | nb_configs[x] = len(my_struncture[list(my_struncture.keys())[x]]) |
---|
| 189 | |
---|
| 190 | |
---|
| 191 | level1_answer=1 |
---|
| 192 | level2_answer=[1]*nb_algo |
---|
| 193 | |
---|
| 194 | level3_answer = [[]]*nb_algo |
---|
| 195 | for x in range(nb_algo) : |
---|
| 196 | level3_answer[x] = [1]*nb_configs[x] |
---|
| 197 | |
---|
| 198 | level4_answer = [[[]]]*nb_algo |
---|
| 199 | for x in range(nb_algo) : |
---|
| 200 | level4_answer[x] = [[]]*nb_configs[x] |
---|
| 201 | for y in range(nb_configs[x]) : |
---|
| 202 | level4_answer[x][y] = [1]*nb_files[x] |
---|
| 203 | for z in range(nb_files[x]) : |
---|
| 204 | x_dict = my_struncture |
---|
| 205 | y_dict = x_dict[list(x_dict.keys())[x]] |
---|
| 206 | z_dict = y_dict[list(y_dict.keys())[y]] |
---|
| 207 | level4_answer[x][y][z] = int(z_dict[list(z_dict.keys())[z]]) |
---|
| 208 | |
---|
| 209 | index=0 |
---|
| 210 | for x in range(nb_algo): |
---|
| 211 | for y in range(len(level3_answer[x])): |
---|
| 212 | for z in range(len(level4_answer[x][y])): |
---|
| 213 | level3_answer[x][y] = min(level4_answer[x][y][z], level3_answer[x][y]) |
---|
| 214 | index+=1 |
---|
| 215 | |
---|
| 216 | index=0 |
---|
| 217 | for x in range(len(level2_answer)): |
---|
| 218 | for y in range(len(level3_answer[x])): |
---|
| 219 | level2_answer[x] = min(level2_answer[x], level3_answer[x][y]) |
---|
| 220 | index+=1 |
---|
| 221 | |
---|
| 222 | for x in range(len(level2_answer)): |
---|
| 223 | level1_answer = min(level1_answer, level2_answer[x]) |
---|
| 224 | |
---|
[1774] | 225 | # ans_dict = {-1: 'Failed', 0: 'Initialized', 1: 'Passed'} |
---|
| 226 | ans_dict = {-1: '❌', 0: '❎', 1: '✅'} |
---|
[1771] | 227 | |
---|
| 228 | algo_list = list(my_struncture.keys()) |
---|
| 229 | |
---|
| 230 | |
---|
| 231 | config_list=[] |
---|
| 232 | for x in range(nb_algo) : |
---|
| 233 | my_list = list(my_struncture[list(my_struncture.keys())[x]].keys()) |
---|
| 234 | for y in range(len(my_list)) : |
---|
| 235 | config_list.append(my_list[y]) |
---|
| 236 | |
---|
| 237 | |
---|
| 238 | file_list=[] |
---|
| 239 | for x in range(nb_algo) : |
---|
| 240 | l = list(my_struncture.keys())[x] |
---|
| 241 | ll = list(my_struncture[l].keys())[0] |
---|
| 242 | lll = list(my_struncture[l][ll].keys()) |
---|
| 243 | for y in range(len(lll)) : |
---|
| 244 | file_list.append(lll[y]) |
---|
| 245 | |
---|
| 246 | |
---|
| 247 | old_config_list=config_list[:] |
---|
| 248 | for x in range(len(config_list)) : |
---|
| 249 | word = config_list[x] |
---|
| 250 | new_word='' |
---|
| 251 | for i in range(len(word)) : |
---|
| 252 | if word[i]=="@" : |
---|
| 253 | new_word = word[i+1:] |
---|
| 254 | break |
---|
| 255 | # old_config_list.append(new_word) |
---|
| 256 | old_config_list[x]=new_word |
---|
| 257 | word = new_word.replace("config_", "CONFIG: ") |
---|
| 258 | new_word = word.replace("_", " ") |
---|
| 259 | config_list[x] = new_word |
---|
| 260 | |
---|
| 261 | |
---|
| 262 | for x in range(len(file_list)) : |
---|
| 263 | word = file_list[x] |
---|
| 264 | new_word='' |
---|
| 265 | for i in range(len(word)) : |
---|
| 266 | if word[i]=="@" : |
---|
| 267 | new_word = word[i+1:] |
---|
| 268 | break |
---|
| 269 | file_list[x] = new_word |
---|
| 270 | |
---|
| 271 | for x in range(len(file_list)) : |
---|
| 272 | word = file_list[x] |
---|
| 273 | new_word='' |
---|
| 274 | for i in range(len(word)) : |
---|
| 275 | if word[i]=="@" : |
---|
| 276 | new_word = word[i+1:] |
---|
| 277 | break |
---|
| 278 | file_list[x] = new_word |
---|
| 279 | |
---|
[1776] | 280 | if os.path.exists("xios_table_"+revision_number+".js") : |
---|
| 281 | print("table for revision "+revision_number+" exists already") |
---|
| 282 | else : |
---|
| 283 | f=open("xios_table_"+revision_number+".js", "w") |
---|
| 284 | f.write("document.write(`\n") |
---|
| 285 | f.write("<html>\n") |
---|
| 286 | f.write("<head>\n") |
---|
| 287 | f.write("</head>\n") |
---|
| 288 | f.write("<body>\n") |
---|
| 289 | f.write(" <div id=\"navborder_"+revision_number+"\" class=\"class_navborder\">\n") |
---|
| 290 | f.write(" <p id=\"xiosinfo\">Information of XIOS source:</p>\n") |
---|
| 291 | f.write(" <table id=\"xiosinfotable\">\n") |
---|
| 292 | f.write(" <tr><td>Branch</td><td><em>"+branch+"</em></td></tr>\n") |
---|
| 293 | f.write(" <tr><td>Revision</td><td><em>"+revision_number+"</em></td></tr>\n") |
---|
| 294 | f.write(" <tr><td>Machine</td><td><em>"+machine+"</em></td></tr>\n") |
---|
| 295 | f.write(" <tr><td>Architecture</td><td><em>"+arch+"</em></td></tr>\n") |
---|
| 296 | f.write(" <tr><td>Compile mode</td><td><em>prod</em></td></tr>\n") |
---|
| 297 | f.write(" <tr><td>Build directory</td><td><em>"+build_dir+"</em></td></tr>\n") |
---|
| 298 | f.write(" </table>\n") |
---|
| 299 | f.write(" </div>\n") |
---|
| 300 | f.write(" <table id=\"xiostable_"+revision_number+"\" class=\"class_xiostable\">\n") |
---|
| 301 | f.write(" <thead></thead>\n") |
---|
| 302 | f.write(" <tfoot></tfoot>\n") |
---|
| 303 | f.write(" <tbody>\n") |
---|
| 304 | f.write(" <tr class=\"level1\" style=\"background-color:#85c1e9;font-size:1.6em;\" >\n") |
---|
| 305 | f.write(" <td>"+revision_number+" XIOS Unit tests <span id=\""+revision_number+"_icon_level1_1\" onclick=\"level1_unfold(\'"+revision_number+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n") |
---|
| 306 | f.write(" <span id=\""+revision_number+"_icon_level1_2\" onclick=\"level1_fold(\'"+revision_number+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n") |
---|
[1771] | 307 | f.write(" <td><div class=\"dropdown\"><button class=\"dropbtn\">🔎</button>\n") |
---|
| 308 | f.write(" <div class=\"dropdown-content\">\n") |
---|
[1776] | 309 | f.write(" <a href=\"#\" onclick=\"show_xios_info(\'"+revision_number+"\')\">show/hide XIOS info</a>\n") |
---|
| 310 | f.write(" <a href=\"#\" onclick=\"show_plein_report(\'"+revision_number+"\')\">show plein report</a>\n") |
---|
[1771] | 311 | f.write(" </div></div></td>\n") |
---|
[1776] | 312 | f.write(" <td></td>\n") |
---|
| 313 | f.write(" <td></td>\n") |
---|
| 314 | f.write(" <td style=\"border-left: 0px\" class=\"testanswer\">"+ ans_dict[level1_answer]+"</td>\n") |
---|
| 315 | f.write(" <td></td>\n") |
---|
| 316 | f.write(" <td></td>\n") |
---|
| 317 | f.write(" <td></td>\n") |
---|
[1771] | 318 | f.write(" </tr>\n") |
---|
| 319 | |
---|
[1776] | 320 | |
---|
| 321 | x_offset = 0 |
---|
| 322 | y_offset = 0 |
---|
| 323 | for x in range(nb_algo): |
---|
| 324 | f.write(" <tr class=\"level2\" data-algo-type=\""+algo_list[x]+"\" style=\"display:none;background-color:#aed6f1;font-size:1.4em;\">\n") |
---|
[1771] | 325 | f.write(" <td></td>\n") |
---|
[1776] | 326 | f.write(" <td>"+algo_list[x]+" <span id=\""+revision_number+"_icon_level2_"+algo_list[x]+"_1\" onClick=\"level2_unfold(\'"+revision_number+"\',\'"+algo_list[x]+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n") |
---|
| 327 | f.write(" <span id=\""+revision_number+"_icon_level2_"+algo_list[x]+"_2\" onClick=\"level2_fold(\'"+revision_number+"\',\'"+algo_list[x]+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n") |
---|
[1771] | 328 | f.write(" <td><div class=\"dropdown\"><button class=\"dropbtn\">🔎</button>\n") |
---|
| 329 | f.write(" <div class=\"dropdown-content\">\n") |
---|
[1776] | 330 | f.write(" <a href=\"#\" onclick=\"show_param_"+algo_list[x]+"(\'"+revision_number+"\')\">show user_params.def</a>\n") |
---|
[1771] | 331 | f.write(" </div></div></td>\n") |
---|
[1776] | 332 | f.write(" <td> </td>\n") |
---|
| 333 | f.write(" <td> </td>\n") |
---|
| 334 | f.write(" <td class=\"testanswer\">"+ans_dict[level2_answer[x]]+"</td>\n") |
---|
| 335 | f.write(" <td> </td>\n") |
---|
| 336 | f.write(" <td> </td>\n") |
---|
[1771] | 337 | f.write(" </tr>\n") |
---|
| 338 | |
---|
[1776] | 339 | for y in range(nb_configs[x]): |
---|
| 340 | f.write(" <tr class=\"level3_"+algo_list[x]+"\" data-algoconfig-type=\""+algo_list[x]+"_"+old_config_list[y_offset]+"\" style=\"display:none;background-color:#d6eaf8;font-size:1.2em;\">\n") |
---|
[1771] | 341 | f.write(" <td></td>\n") |
---|
| 342 | f.write(" <td></td>\n") |
---|
[1776] | 343 | f.write(" <td>"+config_list[y_offset]+" <span id=\""+revision_number+"_icon_level3_"+algo_list[x]+"_"+old_config_list[y_offset]+"_1\" onClick=\"level3_unfold(\'"+revision_number+"\',\'"+algo_list[x]+"_"+old_config_list[y_offset]+"\');\" style=\"display:inline\" title=\"unfold\">"+unfold_icon+"</span>\n") |
---|
| 344 | f.write(" <span id=\""+revision_number+"_icon_level3_"+algo_list[x]+"_"+old_config_list[y_offset]+"_2\" onClick=\"level3_fold(\'"+revision_number+"\',\'"+algo_list[x]+"_"+old_config_list[y_offset]+"\');\" style=\"display:none\" title=\"fold\">"+fold_icon+"</span></td>\n") |
---|
| 345 | f.write(" <td><div class=\"dropdown\"><button class=\"dropbtn\">🔎</button>\n") |
---|
| 346 | f.write(" <div class=\"dropdown-content\">\n") |
---|
| 347 | f.write(" <a href=\"#\" onclick=\"show_param_"+algo_list[x]+"_config(\'"+revision_number+"\',"+repr(old_config_list[y_offset])+")\">show all_param.def</a>\n") |
---|
| 348 | f.write(" <a href=\"#\" onclick=\"show_user_param_"+algo_list[x]+"_config(\'"+revision_number+"\',"+repr(old_config_list[y_offset])+")\">show user_param.def</a>\n") |
---|
| 349 | f.write(" </div></div></td>\n") |
---|
| 350 | y_position=y_offset |
---|
| 351 | y_offset+=1 |
---|
[1771] | 352 | f.write(" <td></td>\n") |
---|
| 353 | f.write(" <td></td>\n") |
---|
[1776] | 354 | f.write(" <td class=\"testanswer\">"+ ans_dict[level3_answer[x][y]]+"</td>\n") |
---|
[1771] | 355 | f.write(" <td></td>\n") |
---|
[1776] | 356 | f.write(" </tr>\n") |
---|
[1771] | 357 | |
---|
[1776] | 358 | for z in range(nb_files[x]): |
---|
| 359 | f.write(" <tr class=\"level4_"+algo_list[x]+"_"+old_config_list[y_position]+"\" style=\"display:none;background-color:#ebf5fb;\">\n") |
---|
| 360 | f.write(" <td></td>\n") |
---|
| 361 | f.write(" <td></td>\n") |
---|
| 362 | f.write(" <td></td>\n") |
---|
| 363 | f.write(" <td>"+file_list[x_offset+z]+"</td>\n") |
---|
| 364 | f.write(" <td></td>\n") |
---|
| 365 | f.write(" <td></td>\n") |
---|
| 366 | f.write(" <td></td>\n") |
---|
| 367 | f.write(" <td class=\"testanswer\">"+ ans_dict[level4_answer[x][y][z]]+"</td>\n") |
---|
| 368 | f.write(" </tr>\n") |
---|
[1771] | 369 | |
---|
[1776] | 370 | x_offset = x_offset+nb_files[x] |
---|
| 371 | |
---|
| 372 | f.write(" </tbody>\n") |
---|
| 373 | f.write(" </table>\n") |
---|
| 374 | # f.write("<script>\n") |
---|
| 375 | # f.write(" var ans = document.getElementsByClassName('testanswer')\n") |
---|
| 376 | # f.write(" for (var i = 0; i < ans.length; i++) {\n") |
---|
| 377 | # f.write(" var cell = ans[i]\n") |
---|
| 378 | # f.write(" if (cell.textContent == 'Passed') {\n") |
---|
| 379 | # f.write(" cell.classList.add('green') }\n") |
---|
| 380 | # f.write(" else if (cell.textContent == 'Failed') {\n") |
---|
| 381 | # f.write(" cell.classList.add('red') }\n") |
---|
| 382 | # f.write(" else if (cell.textContent == 'Initialized') {\n") |
---|
| 383 | # f.write(" cell.classList.add('goldenrod') }\n") |
---|
| 384 | # f.write(" }\n") |
---|
| 385 | |
---|
| 386 | # f.write("\n\n") |
---|
[1771] | 387 | |
---|
[1776] | 388 | # f.write("</script>\n") |
---|
[1771] | 389 | |
---|
[1776] | 390 | f.write("</body>\n") |
---|
| 391 | f.write("</html>\n") |
---|
| 392 | f.write("`);\n") |
---|
[1771] | 393 | |
---|
| 394 | |
---|
| 395 | |
---|
[1776] | 396 | f.close() |
---|
[1771] | 397 | |
---|
| 398 | |
---|
| 399 | if __name__== "__main__": |
---|
| 400 | main() |
---|
| 401 | |
---|
| 402 | |
---|