Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

596 lines
16 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 2000
  5. //
  6. // File: buildtimes.js
  7. //
  8. // Contents:
  9. //
  10. //
  11. //
  12. //----------------------------------------------------------------------------
  13. //
  14. // Globals
  15. //
  16. var g_reDate = new RegExp("[a-zA-Z0-9_-]+\\t(\\d{4})/(\\d{2})/(\\d{2}):(\\d{2}):(\\d{2}):(\\d{2})");
  17. var g_reStartBuildExe = new RegExp("\\(([a-zA-Z]+)\\) Build for [a-zA-Z]+ started. PID=(\\d+)");
  18. var g_rePassComplete = new RegExp("\\(([a-zA-Z]+)\\) pass (\\d) complete on pid (\\d+)");
  19. var g_reTaskStep = new RegExp("\\(([a-zA-Z]+)\\) TASK STEPPING ");
  20. var g_reProcessExit = new RegExp("\\(([a-zA-Z]+)\\) Process id (\\d+) exited");
  21. var g_reStartPost = new RegExp("\\(([a-zA-Z]+)\\) postbuild task thread for Root started.");
  22. var g_reExitPost = new RegExp("\\(([a-zA-Z]+)\\) postbuild for Root completed.");
  23. var g_reStartBuild = new RegExp("STARTING PASS 0 of build.");
  24. var g_reExitBuild = new RegExp("WAIT FOR NEXTPASS 2 of waitbuild");
  25. var g_reStartCFPBTS = new RegExp("Received copyfilesfrompostbuildtoslave command from remote machine");
  26. var g_reStartCFTPB = new RegExp("CopyFilesToPostBuild\\(([a-zA-Z]+)\\).*There are (\\d+) files");
  27. var g_reLastCopyCFTPB = new RegExp("RoboCopyCopyFile\\(([a-zA-Z]+)\\)");
  28. var g_reEndCFTPB = new RegExp("(Received) nextpass command from remote machine.");
  29. var g_reBuildType = new RegExp("razzle.cmd");
  30. // NTAXP01 2000/04/13:17:50:01 taskBuildFiles(strSDRoot) (Root) Build for Root started. PID=548
  31. // NTAXP01 2000/04/13:17:56:20 ParseBuildMessages(pid) (Root) pass 0 complete on pid 548
  32. // NTAXP01 2000/04/13:18:45:20 ParseBuildMessages(pid) (Root) pass 1 complete on pid 548
  33. // NTAXP01 2000/04/13:21:59:11 ParseBuildMessages(pid) (Root) pass 2 complete on pid 548
  34. // NTAXP01 2000/04/13:21:59:12 ParseBuildMessages(pid) (Root) Process id 548 exited!
  35. // NTAXP01 2000/04/13:18:44:53 taskBuildFiles(strSDRoot) (Root) TASK STEPPING Root
  36. // AXP64FRE 2000/04/13:17:49:27 MyRunLocalCommand(strCmd) (Root) RunLocalCommand('cmd /c d:\nt\Tools\razzle.cmd win64 free officialbuild no_certcheck no_sdrefresh no_title & sdinit && sd -s sync 2>&1', 'd:\nt\.', 'Sync Root', 'true', 'true', 'false')
  37. // NTBLD04 2000/04/25:14:20:20 mtscript_js::OnRemoteExec(cmd) Received copyfilesfrompostbuildtoslave command from remote machine.
  38. // NTBLD04 2000/04/25:14:19:55 CopyFilesToPostBuild(aPublishedEnlistments) (#0) There are 3 files
  39. // NTBLD04 2000/04/25:14:19:55 RoboCopyCopyFile(srcdir) RoboCopy file d:\nt\public\sdk\lib\i386\AutoDiscovery.tlb to \\NTBLD03\d$\nt\Public\sdk\lib\i386\AutoDiscovery.tlb
  40. // NTBLD04 2000/04/25:14:20:05 mtscript_js::OnRemoteExec(cmd) Received nextpass command from remote machine.
  41. var g_aMatches =
  42. [
  43. { re: g_reStartBuildExe, fn: NewDepot},
  44. { re: g_rePassComplete , fn: PassComplete},
  45. { re: g_reTaskStep , fn: TaskStep},
  46. { re: g_reProcessExit , fn: ProcessExit},
  47. { re: g_reStartPost , fn: PostStart},
  48. { re: g_reExitPost , fn: PostExit},
  49. { re: g_reStartBuild , fn: ElapsedStart},
  50. { re: g_reExitBuild , fn: ElapsedExit},
  51. { re: g_reStartCFPBTS , fn: StartCFPBTS},
  52. { re: g_reStartCFTPB , fn: StartCFTPB},
  53. { re: g_reLastCopyCFTPB, fn: LastFileCFTPB},
  54. { re: g_reEndCFTPB , fn: EndCFTPB}
  55. ];
  56. var g_strBuildType;
  57. var g_strMachine;
  58. var g_aStrFileNames = new Array();
  59. var g_FSObj = new ActiveXObject("Scripting.FileSystemObject");
  60. var g_hDepots = new Object;
  61. var g_hTimers = new Object;
  62. var g_fMerged = true; // Merge "root" and "mergedcomponents" report
  63. var g_fPrintElapsed = false;
  64. var g_fPrintPost = false;
  65. var g_CFObj;
  66. // Add new methods...
  67. Error.prototype.toString = Error_ToString;
  68. //
  69. // First, parse command line arguments
  70. //
  71. ParseArguments(WScript.Arguments);
  72. main();
  73. WScript.Quit(0);
  74. function ParseArguments(Arguments)
  75. {
  76. var strArg;
  77. var chArg0;
  78. var chArg1;
  79. var argn;
  80. for(argn = 0; argn < Arguments.length; argn++)
  81. {
  82. strArg = Arguments(argn);
  83. chArg0 = strArg.charAt(0);
  84. chArg1 = strArg.toLowerCase().slice(1);
  85. if (chArg0 != '-' && chArg0 != '/')
  86. {
  87. g_aStrFileNames[g_aStrFileNames.length] = Arguments(argn);
  88. }
  89. else
  90. {
  91. switch(chArg1)
  92. {
  93. case 'm':
  94. g_fMerged = true;
  95. break;
  96. case 's':
  97. g_fMerged = false;
  98. break;
  99. case 'e':
  100. g_fPrintElapsed = true;
  101. break;
  102. case 'p':
  103. g_fPrintPost = true;
  104. break;
  105. case '?':
  106. LogMsg("HELP");
  107. Usage();
  108. break;
  109. default:
  110. LogMsg("HELP " + strArg);
  111. Usage();
  112. break;
  113. }
  114. }
  115. }
  116. if (g_aStrFileNames.length < 1)
  117. Usage();
  118. }
  119. // PadDigits(n, cDigits)
  120. // Return a string representation of the given
  121. // number. Leading zeros are added to make the
  122. // string cDigits long.
  123. function PadDigits(n, cDigits)
  124. {
  125. var strDigits = '';
  126. var i;
  127. var strNumber = n.toString();
  128. for(i = 0; i < cDigits - strNumber.length; ++i)
  129. strDigits += '0';
  130. return strDigits + n;
  131. }
  132. // PadString(str, cDigits)
  133. function PadString(str, cDigits)
  134. {
  135. var strDigits = '';
  136. var i;
  137. for(i = 0; i < cDigits - str.length; ++i)
  138. strDigits += ' ';
  139. return str + strDigits;
  140. }
  141. function Error_ToString()
  142. {
  143. var i;
  144. var str = 'Exception(';
  145. /*
  146. Only some error messages get filled in for "ex".
  147. Specifically the text for disk full never seems
  148. to get set by functions such as CreateTextFile().
  149. */
  150. if (this.number != null && this.description == "")
  151. {
  152. switch(this.number)
  153. {
  154. case -2147024784:
  155. this.description = "There is not enough space on the disk.";
  156. break;
  157. case -2147024894:
  158. this.description = "The system cannot find the file specified.";
  159. break;
  160. case -2147023585:
  161. this.description = "There are currently no logon servers available to service the logon request.";
  162. break;
  163. case -2147023170:
  164. this.description = "The remote procedure call failed.";
  165. break;
  166. case -2147024837:
  167. this.description = "An unexpected network error occurred";
  168. break;
  169. default:
  170. this.description = "Error text not set for (" + this.number + ")";
  171. break;
  172. }
  173. }
  174. for(i in this)
  175. {
  176. str += i + ": " + this[i] + " ";
  177. }
  178. return str + ")";
  179. }
  180. function LogMsg(msg)
  181. {
  182. WScript.Echo(msg);
  183. }
  184. function Usage()
  185. {
  186. LogMsg('Usage: buildtimes [-s] [-e] [-p] path\\filename*.log');
  187. LogMsg(' -s Do not merge build time of "root" and "mergedcomponents"');
  188. LogMsg(' -e Print total elasped build time');
  189. LogMsg(' -p Print postbuild time');
  190. WScript.Quit(0);
  191. }
  192. //////////////////////////////////////
  193. //////////////////////////////////////
  194. // The DEPOT object
  195. //////////////////////////////////////
  196. //////////////////////////////////////
  197. function Depot(strDepotName, nDepotPID)
  198. {
  199. this.strName = strDepotName;
  200. this.nPID = nDepotPID;
  201. this.nElapsed = 0;
  202. this.nLast = 0; // used for postbuild
  203. Depot.prototype.Begin = Depot_Begin;
  204. Depot.prototype.SetLast = Depot_SetLast;
  205. Depot.prototype.End = Depot_End;
  206. Depot.prototype.End2 = Depot_End2;
  207. Depot.prototype.Terminate = Depot_Terminate;
  208. Depot.prototype.GetStrStatus = Depot_GetStrStatus;
  209. }
  210. function Depot_Begin(dateVal)
  211. {
  212. if (this.bBegin)
  213. throw new Error(-1, "Multiple begins without end on depot " + this.strName);
  214. this.nBegin = dateVal;
  215. }
  216. function Depot_SetLast(dateVal)
  217. {
  218. if (!this.nBegin)
  219. throw new Error(-1, "SetLast without begin on depot " + this.strName);
  220. this.nLast = dateVal;
  221. }
  222. function Depot_End(dateVal)
  223. {
  224. if (!this.nBegin)
  225. throw new Error(-1, "End without begin on depot " + this.strName);
  226. var delta = dateVal - this.nBegin;
  227. delete this.nBegin;
  228. this.nElapsed += delta;
  229. }
  230. function Depot_End2(dateVal)
  231. {
  232. if (!this.nBegin)
  233. throw new Error(-1, "End without begin on depot " + this.strName);
  234. var delta = dateVal - this.nBegin;
  235. delete this.nBegin;
  236. LogMsg("DELTA " + this.strName + " = " + delta);
  237. this.nElapsed += delta;
  238. }
  239. function Depot_Terminate(dateVal)
  240. {
  241. }
  242. function Depot_GetStrStatus()
  243. {
  244. var seconds = Math.floor(this.nElapsed / 1000);
  245. var s = seconds % 60;
  246. var m = Math.floor(seconds / 60) % 60;
  247. var h = Math.floor(seconds / 60 / 60);
  248. var strElapsed = PadDigits(h, 2) + ":" + PadDigits(m, 2) + ":" + PadDigits(s, 2);
  249. return PadString(this.strName, 16) + " " + strElapsed;// + ", " + (this.nElapsed / 1000);
  250. }
  251. //////////////////////////////////////
  252. //////////////////////////////////////
  253. //////////////////////////////////////
  254. function NewDepot(dateVal, strDepotName, a)
  255. {
  256. var nPID = a[0];
  257. if (g_hDepots[strDepotName])
  258. {
  259. if (strDepotName == "root")
  260. {
  261. var depot = g_hDepots[strDepotName];
  262. depot.Begin(dateVal);
  263. }
  264. else
  265. throw new Error(-1, "Duplicate depot information for depot " + strDepotName);
  266. }
  267. var depot = new Depot(strDepotName, nPID);
  268. depot.Begin(dateVal);
  269. g_hDepots[strDepotName] = depot;
  270. }
  271. function PassComplete(dateVal, strDepotName, a)
  272. {
  273. var nPass = a[0];
  274. var nPID = a[1];
  275. var depot = g_hDepots[strDepotName];
  276. if (!depot)
  277. throw new Error(-1, "PassComplete on missing depot " + strDepotName);
  278. depot.End(dateVal);
  279. }
  280. function TaskStep(dateVal, strDepotName)
  281. {
  282. var depot = g_hDepots[strDepotName];
  283. if (!depot)
  284. throw new Error(-1, "TaskStep on missing depot " + strDepotName);
  285. depot.Begin(dateVal);
  286. }
  287. function ProcessExit(dateVal, strDepotName, a)
  288. {
  289. var nPID = a[0];
  290. var depot = g_hDepots[strDepotName];
  291. if (!depot)
  292. throw new Error(-1, "ProcessExit on missing depot " + strDepotName);
  293. depot.Terminate(dateVal);
  294. }
  295. function PostStart(dateVal, strDepotName)
  296. {
  297. if (g_fPrintPost)
  298. {
  299. var depot = new Depot('postbuild', 0);
  300. depot.Begin(dateVal);
  301. g_hTimers['postbuild'] = depot;
  302. }
  303. }
  304. function PostExit(dateVal, strDepotName)
  305. {
  306. if (g_fPrintPost)
  307. {
  308. var depot = g_hTimers['postbuild'];
  309. if (!depot)
  310. throw new Error(-1, "TaskStep on missing depot " + 'postbuild');
  311. depot.End(dateVal);
  312. }
  313. }
  314. function ElapsedStart(dateVal, strDepotName)
  315. {
  316. if (g_fPrintElapsed)
  317. {
  318. var depot = new Depot('entirebuild', 0);
  319. depot.Begin(dateVal);
  320. g_hTimers['entirebuild'] = depot;
  321. }
  322. }
  323. function ElapsedExit(dateVal, strDepotName)
  324. {
  325. if (g_fPrintElapsed)
  326. {
  327. var depot = g_hTimers['entirebuild'];
  328. if (!depot)
  329. throw new Error(-1, "TaskStep on missing depot " + 'entirebuild');
  330. depot.End(dateVal);
  331. }
  332. }
  333. function StartCFPBTS(dateVal, strDepotName)
  334. {
  335. var depot;
  336. if (true)
  337. {
  338. if (g_CFObj)
  339. EndCFTPB(dateVal, strDepotName);
  340. depot = g_hTimers['toslave'];
  341. if (!depot)
  342. depot = new Depot('toslave', 0);
  343. depot.Begin(dateVal);
  344. depot.SetLast(dateVal);
  345. g_hTimers['toslave'] = depot;
  346. g_CFObj = depot;
  347. // LogMsg("StartCFPBTS at " + ( new Date(dateVal)));
  348. }
  349. }
  350. function StartCFTPB(dateVal, strDepotName)
  351. {
  352. var depot;
  353. if (true)
  354. {
  355. if (g_CFObj)
  356. EndCFTPB(dateVal, strDepotName);
  357. depot = g_hTimers['topostbuild'];
  358. if (!depot)
  359. depot = new Depot('topostbuild', 0);
  360. depot.Begin(dateVal);
  361. depot.SetLast(dateVal);
  362. g_hTimers['topostbuild'] = depot;
  363. g_CFObj = depot;
  364. //LogMsg("StartCFTPB at " + ( new Date(dateVal)));
  365. }
  366. }
  367. function LastFileCFTPB(dateVal, strDepotName)
  368. {
  369. if (true)
  370. {
  371. if (g_CFObj)
  372. {
  373. g_CFObj.SetLast(dateVal);
  374. }
  375. }
  376. }
  377. function EndCFTPB(dateVal, strDepotName)
  378. {
  379. if (true)
  380. {
  381. var depot = null;
  382. if (g_CFObj)
  383. {
  384. depot = g_CFObj;
  385. //LogMsg("EndCFTPB at " + ( new Date(depot.nLast)));
  386. depot.End(depot.nLast);
  387. g_CFObj = null;
  388. }
  389. }
  390. }
  391. function ParseDate(strLine)
  392. {
  393. var a = g_reDate.exec(strLine);
  394. if (!a)
  395. {
  396. throw new Error(-1, "Incorrect date format: " + strLine);
  397. }
  398. var d = new Date(a[1], a[2] - 1, a[3], a[4], a[5], a[6]);
  399. return d.getTime();
  400. }
  401. function GetBuildType(strLine)
  402. {
  403. //Build Type: free
  404. //Build Platform: 64bit
  405. //Incremental Build: false
  406. //Build Manager: BUILDCON1
  407. //PostBuild Machine: AXP64FRE
  408. var str;
  409. var n;
  410. var m;
  411. var fWin64 = false;
  412. var fFree = false;
  413. n = strLine.indexOf("\t");
  414. if (n >= 0)
  415. {
  416. g_strMachine = strLine.slice(0, n);
  417. }
  418. n = strLine.indexOf("razzle.cmd", 0);
  419. if (n > 0)
  420. { // Extract the stuff between "razzle.cmd" and the first "&"
  421. m = strLine.indexOf("&", n);
  422. str = strLine.slice(n, m);
  423. n = str.indexOf("win64");
  424. if (n >= 0)
  425. fWin64 = true;
  426. n = str.indexOf("free");
  427. if (n >= 0)
  428. fFree = true;
  429. g_strBuildType = (fWin64 ? "64bit " : "32bit ") + (fFree ? "free" : "checked");
  430. }
  431. }
  432. function MergeRoot(str)
  433. {
  434. str = str.toLowerCase();
  435. if (g_fMerged && str == "mergedcomponents")
  436. return "root";
  437. return str;
  438. }
  439. function ParseLogFile(strFileName)
  440. {
  441. var strDepotName;
  442. var hFile = g_FSObj.OpenTextFile(strFileName, 1, false);
  443. var a;
  444. var nLine = 0;
  445. var i;
  446. try
  447. {
  448. while(1)
  449. {
  450. r = hFile.ReadLine();
  451. ++nLine;
  452. if (!g_strBuildType)
  453. {
  454. if (g_reBuildType.test(r))
  455. GetBuildType(r);
  456. }
  457. // debugger;
  458. for(i = 0; i < g_aMatches.length; ++i)
  459. {
  460. a = g_aMatches[i].re.exec(r);
  461. if (a != null)
  462. {
  463. if (a.length > 1)
  464. strDepotName = MergeRoot(a[1]);
  465. else
  466. strDepotName = '';
  467. a = a.slice(2);
  468. g_aMatches[i].fn(ParseDate(r), strDepotName, a);
  469. break;
  470. }
  471. }
  472. }
  473. }
  474. catch(ex)
  475. {
  476. if (ex.number != -2146828226) // Input past end
  477. {
  478. LogMsg("Exception in ParseLogFile " + strFileName + ", line=" + nLine + ", ex=" + ex);
  479. LogMsg("I is " + i);
  480. }
  481. }
  482. hFile.Close();
  483. }
  484. function main()
  485. {
  486. var i;
  487. var strDepot;
  488. var depot;
  489. for(i = 0; i < g_aStrFileNames.length; ++i)
  490. {
  491. g_strMachine = null;
  492. g_strBuildType = null;
  493. g_hDepots = new Object;
  494. g_hTimers = new Object;
  495. ParseLogFile(g_aStrFileNames[i]);
  496. if (!g_strMachine)
  497. g_strMachine = g_aStrFileNames[i];
  498. g_strMachine = PadString(PadString(g_strMachine, 12) + g_strBuildType, 24);
  499. //LogMsg(g_strMachine + ": " + g_strBuildType);
  500. for(strDepot in g_hDepots)
  501. {
  502. LogMsg(g_strMachine + ": Depot: " + g_hDepots[strDepot].GetStrStatus());
  503. }
  504. for(strDepot in g_hTimers)
  505. {
  506. LogMsg(g_strMachine + ": " + g_hTimers[strDepot].GetStrStatus());
  507. }
  508. }
  509. }