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.

2373 lines
66 KiB

  1. <HTML>
  2. <HEAD>
  3. <TITLE>Run the Gauntlet</TITLE>
  4. <script>
  5. resizeTo(800,600);
  6. </script>
  7. <HTA:APPLICATION
  8. id=hta_app
  9. applicationName="Gauntlet"
  10. border=think>
  11. <STYLE>
  12. BODY {
  13. background-color:white;
  14. color:darkblue;
  15. font:10pt Arial;
  16. }
  17. TABLE {
  18. font:10pt Arial;
  19. }
  20. TD {
  21. }
  22. H2 {
  23. text-align:center;
  24. color:black;
  25. margin-bottom:0;
  26. background-color:red;
  27. }
  28. .editgrid {
  29. behavior:url(editgrid.htc);
  30. }
  31. .page {
  32. visibility:hidden;
  33. position:absolute;
  34. left: 20px;
  35. top: 65px;
  36. width: 730px;
  37. height: 445px;
  38. }
  39. /*
  40. Expressions really hurt the performance of the page. Since the window gets
  41. sized to 800x600, we go ahead and hardcode numbers to fit that size.
  42. .page {
  43. visibility:hidden;
  44. position:absolute;
  45. left: 20px;
  46. background-color: plum;
  47. top: expression(locator1.offsetTop);
  48. width: expression(body.clientWidth - 40);
  49. height: expression(body.clientHeight - locator1.offsetTop - Next.offsetHeight - 20);
  50. }
  51. */
  52. .pageintro {
  53. padding-left: 210px;
  54. height: 130px;
  55. width: 730px;
  56. }
  57. /*
  58. .pageintro {
  59. background-color:lightgoldenrodyellow;
  60. padding-left: expression(coatofarms.offsetWidth);
  61. height: expression(locator2.offsetTop - locator1.offsetTop);
  62. width: expression(document.body.clientWidth - coatofarms.offsetLeft - document.body.rightMargin - document.body.leftMargin);
  63. }
  64. */
  65. .SendToHdr { font:9pt verdana, arial;
  66. font-weight:normal;
  67. font-style:normal;
  68. background:#003366;
  69. color:#FFFFFF;
  70. width:100px;
  71. }
  72. #coatofarms { float:left }
  73. #PageNumber {
  74. position:absolute;
  75. bottom:10px;
  76. left: 48%;
  77. color:gray;
  78. font:8pt Arial;
  79. }
  80. #Next,#Save{
  81. position:absolute;
  82. bottom:10px;
  83. right:20px;
  84. background-color:black;
  85. visibility:hidden;
  86. z-index:5;
  87. }
  88. #Finish {
  89. position:absolute;
  90. bottom:10px;
  91. right:20px;
  92. background-color:black;
  93. visibility:hidden;
  94. z-index:5;
  95. }
  96. #Back,#Load {
  97. position:absolute;
  98. bottom:10px;
  99. left:20px;
  100. background-color:black;
  101. visibility:hidden;
  102. z-index:5;
  103. }
  104. /*
  105. #Next2 {
  106. position:absolute;
  107. bottom:50px;
  108. left:320px;
  109. background-color:black;
  110. color:lightgreen;
  111. font:bold 14pt Old English Text MT;
  112. }
  113. */
  114. </STYLE>
  115. <script for=document event=onreadystatechange language=javascript>
  116. if (document.readyState == 'complete')
  117. {
  118. InitPage();
  119. }
  120. </script>
  121. <SCRIPT>
  122. // Change these variables for your project
  123. var g_strQueueServer = 'IEDIST2';
  124. var g_strQueueDB = 'Gauntlet';
  125. var g_strQueueTable = 'Queue';
  126. var g_strQueueUser = 'gauntlet_rw';
  127. var g_strQueuePass = 'checkin';
  128. var g_strRaidDSN = 'IE v. 5.0:Raid4';
  129. var g_strRaidUser = 'IEv50_ro';
  130. var g_strRaidPass = 'dYEhVIcE';
  131. // End of variables to change
  132. var g_cCurrentPage = 0;
  133. var g_cLastPage = 8;
  134. var g_aPageInit = new Array(g_cLastPage+1);
  135. var g_strDefDir = '';
  136. var g_strDrv = 'Z';
  137. var g_objTempDir = null;
  138. var g_strQueuePath = null;
  139. var g_strDevName = '';
  140. var g_strNetPath = null;
  141. var g_aSLMInfo = new Array();
  142. var g_aFiles = new Array();
  143. var g_strXMLPath = null;
  144. var g_aSaveLoadData = null;
  145. var g_fileVersion = 1;
  146. var g_strEndData = '--END DATA';
  147. var g_WSHShell = new ActiveXObject("WScript.Shell");
  148. var g_WSHNetwork = new ActiveXObject("WScript.Network");
  149. var g_FSObj = new ActiveXObject("Scripting.FileSystemObject");
  150. var g_strTempFile = 'c:\\ashraf_hack.txt';
  151. function InitPage()
  152. {
  153. // Make the init page visible
  154. document.all('page'+g_cCurrentPage).style.visibility = 'visible';
  155. //
  156. // Try and figure out where their NT enlistment is.
  157. //
  158. var wshEnv = g_WSHShell.Environment('PROCESS');
  159. g_strDefDir = wshEnv('GAUNTLET_ROOTDIR');
  160. if (IsEmpty(g_strDefDir))
  161. {
  162. g_strDefDir = wshEnv('_NTDRIVE') + wshEnv('_NTROOT');
  163. }
  164. // Cache the temporary folder
  165. g_objTempDir = g_FSObj.GetSpecialFolder(2); // 2 = Temporary Folder
  166. // Get the user's login name
  167. g_strDevName = g_WSHNetwork.UserName;
  168. // Find an open drive letter for network use.
  169. var strDrives = '';
  170. var aDrives = new Enumerator(g_FSObj.Drives);
  171. for (; !aDrives.atEnd(); aDrives.moveNext())
  172. {
  173. strDrives += aDrives.item().DriveLetter;
  174. }
  175. while (g_strDrv > 'A')
  176. {
  177. if (strDrives.indexOf(g_strDrv) == -1)
  178. {
  179. break;
  180. }
  181. g_strDrv = String.fromCharCode(g_strDrv.charCodeAt(0) - 1);
  182. }
  183. if (g_strDrv == 'A')
  184. {
  185. window.alert('You have no free drive letters to use for a network drive!');
  186. return;
  187. }
  188. g_strDrv += ':';
  189. // Initialize the pages
  190. for (i=0;i<g_aPageInit.length;i++)
  191. {
  192. g_aPageInit[i] = false;
  193. }
  194. PageNumber.innerText = 'Page ' + g_cCurrentPage + ' of ' + g_cLastPage;
  195. OnPageLoad(g_cCurrentPage, true);
  196. }
  197. function doFinish(fKeyDown)
  198. {
  199. var fFail = false;
  200. var descr = null;
  201. if (fKeyDown != null && fKeyDown == true)
  202. {
  203. if (event.keyCode != 13 && event.keyCode != 32)
  204. {
  205. return;
  206. }
  207. }
  208. if (g_cCurrentPage > g_cLastPage)
  209. {
  210. window.close();
  211. return;
  212. }
  213. goNext(true);
  214. // ISSUE -- For some reason the try/catch handler gets lost after the
  215. // call to GetSLMInfoOnFiles(). Thus the separate try/catch blocks.
  216. // This may be a bug in the JScript engine.
  217. if (!fFail)
  218. {
  219. try
  220. {
  221. GetSLMInfoOnFiles(); // Gather version information on the files
  222. }
  223. catch(ex)
  224. {
  225. fFail = true;
  226. descr = ex.description;
  227. }
  228. }
  229. if (!fFail)
  230. {
  231. try
  232. {
  233. WriteXMLFile(); // Write the XML information file
  234. }
  235. catch(ex)
  236. {
  237. fFail = true;
  238. descr = ex.description;
  239. }
  240. }
  241. if (!fFail)
  242. {
  243. try
  244. {
  245. CopyFilesToServer(); // Copy the files to the server
  246. }
  247. catch(ex)
  248. {
  249. fFail = true;
  250. descr = ex.description;
  251. }
  252. }
  253. if (!fFail)
  254. {
  255. try
  256. {
  257. SubmitToDatabase(); // Actually submit
  258. }
  259. catch(ex)
  260. {
  261. fFail = true;
  262. descr = ex.description;
  263. }
  264. }
  265. if (fFail)
  266. {
  267. window.alert('Submission Failed!\n' +
  268. 'The following error occurred submitting your files:\n' +
  269. descr);
  270. goNext(false);
  271. return;
  272. }
  273. try
  274. {
  275. g_FSObj.DeleteFile(g_strXMLPath);
  276. }
  277. catch(ex)
  278. {
  279. // Ignore
  280. }
  281. goNext(true);
  282. }
  283. function goNext(fForward, fKeyDown, fNoValidate)
  284. {
  285. if (fKeyDown != null && fKeyDown == true)
  286. {
  287. if (event.keyCode != 13 && event.keyCode != 32)
  288. {
  289. return;
  290. }
  291. }
  292. if (fForward && (fNoValidate == null || fNoValidate == false))
  293. {
  294. if (OnPageUnload(g_cCurrentPage))
  295. return;
  296. }
  297. document.all('page'+g_cCurrentPage).style.visibility = 'hidden';
  298. if (fForward)
  299. {
  300. g_cCurrentPage++;
  301. //
  302. // For whistler, we don't need separate add/deleted pages
  303. //
  304. if (g_cCurrentPage == 4)
  305. {
  306. g_cCurrentPage = 6;
  307. }
  308. }
  309. else
  310. {
  311. g_cCurrentPage--;
  312. //
  313. // For whistler, we don't need separate add/deleted pages
  314. //
  315. if (g_cCurrentPage == 5)
  316. {
  317. g_cCurrentPage = 3;
  318. }
  319. }
  320. document.all('page'+g_cCurrentPage).style.visibility = 'visible';
  321. if (g_cCurrentPage > 1)
  322. {
  323. Back.style.visibility = 'visible';
  324. Load.style.visibility = 'hidden';
  325. }
  326. else
  327. {
  328. Back.style.visibility = 'hidden';
  329. Load.style.visibility = 'visible';
  330. }
  331. if (g_cCurrentPage == g_cLastPage)
  332. {
  333. Next.style.visibility = 'hidden';
  334. Finish.style.visibility = 'visible';
  335. }
  336. else if (g_cCurrentPage > g_cLastPage)
  337. {
  338. // We're past the point of no return.
  339. Next.style.visibility = 'hidden';
  340. Finish.style.visibility = 'hidden';
  341. Back.style.visibility = 'hidden';
  342. }
  343. else
  344. {
  345. Next.style.visibility = 'visible';
  346. Finish.style.visibility = 'hidden';
  347. }
  348. if (g_cCurrentPage <= g_cLastPage)
  349. PageNumber.innerText = 'Page ' + g_cCurrentPage + ' of ' + g_cLastPage;
  350. else
  351. PageNumber.innerText = '';
  352. OnPageLoad(g_cCurrentPage, fForward);
  353. }
  354. function IsEmpty(str)
  355. {
  356. for (i = 0; i < str.length; i++)
  357. {
  358. if (str.charAt(i) != ' ')
  359. {
  360. return false;
  361. break;
  362. }
  363. }
  364. return true;
  365. }
  366. function VerifyValue(obj, property, invalid, desc)
  367. {
  368. if (typeof(invalid) == 'string' && invalid == '')
  369. {
  370. if (!IsEmpty(obj[property]))
  371. {
  372. return false;
  373. }
  374. }
  375. else if (obj[property] != invalid)
  376. {
  377. return false;
  378. }
  379. window.alert('Please enter a valid value for ' + desc);
  380. obj.focus();
  381. return true;
  382. }
  383. function VerifyBugList(bugs)
  384. {
  385. var fRet = false;
  386. re = /[;, ]+/g;
  387. bugs = bugs.replace(re, ',');
  388. if (bugs.toLowerCase() != 'none' && bugs.toLowerCase() != 'n/a')
  389. {
  390. bugslist = bugs.split(',');
  391. for (i=0; i < bugslist.length; i++)
  392. {
  393. if ( isNaN(parseInt(bugslist[i]))
  394. || (parseInt(bugslist[i]).toString() != bugslist[i])
  395. || (parseInt(bugslist[i]) == 0))
  396. {
  397. fRet = true;
  398. window.alert('The bug number "' + bugslist[i] + '" is not valid. Enter "none" if you don\'t want to enter any bugs.');
  399. break;
  400. }
  401. }
  402. }
  403. return fRet;
  404. }
  405. function VerifyEditGrid(grid, fVerifyFiles)
  406. {
  407. fRet = false;
  408. var i;
  409. var str;
  410. // Walk through the edit grid and verify all the fields
  411. for (i=0; i < grid.numRows; i++)
  412. {
  413. // First, verify that the file exists on the user's machine.
  414. if (fVerifyFiles)
  415. {
  416. str = grid.getCellValue(i, 1);
  417. if (!g_FSObj.FileExists(str))
  418. {
  419. /*
  420. * ISSUE: put this back
  421. *
  422. window.alert('The file ' + str + ' does not exist on your machine!');
  423. grid.selectCell(i, 1);
  424. fRet = true;
  425. */
  426. continue;
  427. }
  428. var file = g_FSObj.GetFile(str);
  429. if (file.Attributes & 31)
  430. {
  431. window.alert('The file ' + str + ' is not a file or is not checked out!');
  432. grid.selectCell(i, 1);
  433. fRet = true;
  434. break;
  435. }
  436. }
  437. // Verify the comment is not blank.
  438. if (IsEmpty(grid.getCellValue(i, 3)))
  439. {
  440. window.alert('Please specify comments for each file.');
  441. grid.selectCell(i, 3);
  442. fRet = true;
  443. break;
  444. }
  445. // Verify the bug numbers
  446. str = grid.getCellValue(i, 4);
  447. if (!IsEmpty(str) && VerifyBugList(str))
  448. {
  449. grid.selectCell(i, 4);
  450. fRet = true;
  451. break;
  452. }
  453. }
  454. return fRet;
  455. }
  456. function OnPageUnload(curPage)
  457. {
  458. var fRet = false;
  459. switch (curPage)
  460. {
  461. case 0:
  462. break;
  463. case 1:
  464. fRet = fRet || VerifyValue(gen_project, 'selectedIndex', 0, 'Affected Project and Version');
  465. fRet = fRet || VerifyValue(gen_desc, 'value', '', 'Description');
  466. fRet = fRet || VerifyValue(gen_bugs, 'value', '', 'Raid Bugs Fixed');
  467. if (!fRet)
  468. {
  469. fRet = VerifyBugList(gen_bugs.value);
  470. if (fRet)
  471. gen_bugs.focus();
  472. }
  473. // Validate the fixed rev field
  474. if (!fRet)
  475. {
  476. if (IsEmpty(gen_fixedrev.value))
  477. {
  478. gen_fixedrev.value = '';
  479. }
  480. else
  481. {
  482. // Check for a format of DD.DD.DD.DDDD where D is a digit
  483. var strFmt = 'DD.DD.DD.DDDD';
  484. var strValue = gen_fixedrev.value;
  485. var i;
  486. for (i = 0; i < strFmt.length; i++)
  487. {
  488. if (strFmt.charAt(i) == 'D')
  489. {
  490. if (isNaN(parseInt(strValue.charAt(i))))
  491. {
  492. fRet = true;
  493. break;
  494. }
  495. }
  496. else if (strValue.charAt(i) != strFmt.charAt(i))
  497. {
  498. fRet = true;
  499. break;
  500. }
  501. }
  502. }
  503. if (fRet)
  504. {
  505. window.alert('The Fixed Rev field format is incorrect. You may leave the field blank if you want to use the default value.');
  506. gen_fixedrev.focus();
  507. }
  508. }
  509. g_strQueuePath = gen_project.options(gen_project.selectedIndex).queueshare;
  510. break;
  511. case 2:
  512. fRet = fRet || VerifyValue(mail_tester, 'value', '', 'Tested By');
  513. fRet = fRet || VerifyValue(mail_codereview, 'value', '', 'Code Reviewer');
  514. fRet = fRet || VerifyValue(mail_summary, 'value', '', 'Summary');
  515. fRet = fRet || VerifyValue(mail_binaries, 'value', '', 'Binaries Affected');
  516. break;
  517. case 3:
  518. fRet = VerifyEditGrid(mod_editgrid, true);
  519. break;
  520. case 4:
  521. fRet = VerifyEditGrid(new_editgrid, true);
  522. break;
  523. case 5:
  524. fRet = VerifyEditGrid(old_editgrid, false);
  525. break;
  526. case 6:
  527. break;
  528. case 7:
  529. break;
  530. case 8:
  531. break;
  532. case 9:
  533. break;
  534. default:
  535. window.alert('Unhandled page in OnPageUnload!');
  536. break;
  537. }
  538. return fRet;
  539. }
  540. function TrimTrailingWS(str)
  541. {
  542. if (typeof(str) != 'string')
  543. return str;
  544. var end = str.length - 1;
  545. while (str.charAt(end) == ' ')
  546. {
  547. end--;
  548. }
  549. return str.slice(0, end+1);
  550. }
  551. function OnPageLoad(curPage, fForward)
  552. {
  553. var fInit = g_aPageInit[curPage];
  554. switch (curPage)
  555. {
  556. case 0:
  557. if (!fInit)
  558. {
  559. var ado;
  560. var rs;
  561. var o, strProj, strVer;
  562. var strConfigTable = 'Projects';
  563. ado = new ActiveXObject("ADODB.Connection");
  564. ado.ConnectionString = 'driver={SQL Server};' +
  565. 'server='+g_strQueueServer+';'+
  566. 'uid='+g_strQueueUser+';'+
  567. 'pwd='+g_strQueuePass+';'+
  568. 'database='+g_strQueueDB;
  569. ado.ConnectionTimeout = 10;
  570. ado.Open();
  571. rs = ado.Execute('SELECT Project, Version, QueueShare, SendTo, BldBreak_SendTo ' +
  572. 'FROM ' + strConfigTable + ' ' +
  573. 'ORDER BY Project, Version');
  574. while (!rs.EOF)
  575. {
  576. o = document.createElement('OPTION');
  577. strProj = TrimTrailingWS(rs('Project').Value);
  578. strVer = TrimTrailingWS(rs('Version').Value);
  579. o.text = strProj + ' ' + strVer;
  580. o.project = strProj;
  581. o.queueshare = TrimTrailingWS(rs('QueueShare').Value);
  582. o.version = strVer;
  583. o.sendto = TrimTrailingWS(rs('SendTo').Value);
  584. o.bbsendto = TrimTrailingWS(rs('BldBreak_SendTo').Value);
  585. // ISSUE: If the sendto isn't defined and we're in Whistler,
  586. // hack to make is send some buildmail. The current state of
  587. // affairs ignores the gauntlet server config and looks for
  588. // a hard-coded database field. This is silly, the xml.js
  589. // config file for the server should write to the database,
  590. // but this is going to take me some research. This will
  591. // get us working. -- Arye
  592. if (o.sendto == null && strVer == "Whistler")
  593. {
  594. o.sendto = "ddmc; iebld; ieslm";
  595. }
  596. gen_project.options.add(o);
  597. rs.MoveNext();
  598. }
  599. ado.Close();
  600. }
  601. while (IsEmpty(g_strDefDir) || !g_FSObj.FolderExists(g_strDefDir + '\\tools'))
  602. {
  603. window.alert('The location of your NT enlistment could not be determined.\n' +
  604. 'The wizard needs to know the location of a valid enlistment\n' +
  605. 'on your machine in order to find various tools such as SLM.\n' +
  606. 'You can do this by setting the _NTDRIVE and _NTROOT razzle variables\n' +
  607. 'in your global environment, or the GAUNTLET_ROOTDIR variable\n' +
  608. 'to point at an enlistment. It does not have to be the same enlistment\n' +
  609. 'as the one your are submitting files from.\n' +
  610. 'Please enter the location of an NT enlistment in the following dialog.');
  611. g_strDefDir = showModalDialog('dirchoose.htm', '', 'dialogHeight:350px;' +
  612. 'dialogWidth:400px;' +
  613. 'center:yes;' +
  614. 'help:no;' +
  615. 'resizable:no;' +
  616. 'status:no');
  617. if (IsEmpty(g_strDefDir))
  618. {
  619. window.alert('Cannot continue with no NT enlistment.');
  620. window.close();
  621. return;
  622. }
  623. if (!g_FSObj.FolderExists(g_strDefDir + '\\tools'))
  624. {
  625. window.alert('Sorry, that directory does not appear to point to a valid NT enlistment.');
  626. g_strDefDir = '';
  627. }
  628. }
  629. goNext(true);
  630. break;
  631. case 1:
  632. gen_devname.innerText = g_strDevName;
  633. gen_monitorlist.focus();
  634. break;
  635. case 2:
  636. if (gen_ckintype[1].checked == true)
  637. goNext(fForward, false, true);
  638. else
  639. {
  640. if (!fInit)
  641. {
  642. if ( gen_bugs.value.toLowerCase() != 'none'
  643. && gen_bugs.value.toLowerCase() != 'n/a')
  644. {
  645. var ado;
  646. var rs;
  647. var str = '';
  648. var buglist;
  649. var sql;
  650. var i;
  651. var fOK = true;
  652. var re=/[\D]+/g
  653. buglist = gen_bugs.value.replace(re, ';').split(';');
  654. ado = new ActiveXObject("ADODB.Connection");
  655. ado.ConnectionString = 'DSN=' + g_strRaidDSN + ';uid=' + g_strRaidUser + ';pwd=' + g_strRaidPass;
  656. ado.ConnectionTimeout = 10;
  657. try
  658. {
  659. ado.Open();
  660. }
  661. catch(ex)
  662. {
  663. window.alert('Could not connect to the RAID database: ' + ex.description);
  664. fOK = false;
  665. }
  666. if (fOK)
  667. {
  668. sql = 'SELECT BugID, War, Title FROM Bugs WHERE ';
  669. sql += 'BugID=' + buglist[0] + ' ';
  670. for (i = 1; i < buglist.length; i++)
  671. {
  672. sql += 'OR BugID=' + buglist[i] + ' ';
  673. }
  674. sql += ' ORDER BY BugID';
  675. try
  676. {
  677. rs = ado.Execute(sql);
  678. }
  679. catch(ex)
  680. {
  681. // Ignore failures
  682. rs = null;
  683. }
  684. while (rs != null && !rs.EOF)
  685. {
  686. str += rs("BugID").Value + ' ' + rs("War").Value + ' ' + rs("Title").Value + '\r\n';
  687. rs.MoveNext();
  688. }
  689. ado.Close();
  690. }
  691. mail_summary.value = str + '\r\n' + mail_summary.value;
  692. }
  693. }
  694. mail_cclist.focus();
  695. mail_tolist.innerText = gen_project(gen_project.selectedIndex).sendto;
  696. }
  697. break;
  698. case 3:
  699. mod_editgrid.focus();
  700. break;
  701. case 4:
  702. new_editgrid.focus();
  703. break;
  704. case 5:
  705. old_editgrid.focus();
  706. break;
  707. case 6:
  708. if (gen_ckintype[1].checked == false)
  709. {
  710. goNext(fForward, false, true);
  711. }
  712. break;
  713. case 7:
  714. break;
  715. case 8:
  716. break;
  717. case 9:
  718. break;
  719. case 10:
  720. Finish.style.visibility = 'visible';
  721. break;
  722. default:
  723. window.alert('Unhandled page in OnPageLoad!');
  724. break;
  725. }
  726. g_aPageInit[curPage] = true;
  727. }
  728. function BrowseForFiles(editgrid)
  729. {
  730. if (!IsEmpty(g_strDefDir))
  731. {
  732. comdlg.InitDir = g_strDefDir;
  733. }
  734. comdlg.FileName = '*.*';
  735. comdlg.DialogTitle = 'Select Modified Files';
  736. comdlg.Flags = 524288 + // Use explorer format
  737. 4 + // Hide read-only checkbox
  738. 512 + // Allow multiple selection
  739. 2048 + // Path must exist
  740. 4096; // File must exist
  741. comdlg.Filter = 'All Files (*.*)|*.*';
  742. comdlg.ShowOpen();
  743. if (comdlg.FileName == '*.*')
  744. {
  745. return;
  746. }
  747. var FileNameAry = comdlg.FileName.split('\0');
  748. if (FileNameAry.length == 1)
  749. {
  750. editgrid.addRow('EMPTYVALUE', FileNameAry[0], 'EMPTYVALUE', 'EMPTYVALUE', 'EMPTYVALUE');
  751. }
  752. else
  753. {
  754. var basename = FileNameAry[0];
  755. for (i = 1; i < FileNameAry.length; i++)
  756. {
  757. editgrid.addRow('EMPTYVALUE', basename + '\\' + FileNameAry[i], 'EMPTYVALUE', 'EMPTYVALUE', 'EMPTYVALUE');
  758. }
  759. }
  760. }
  761. function AddFromFile(editgrid)
  762. {
  763. var inputfile = null;
  764. if (!IsEmpty(g_strDefDir))
  765. {
  766. comdlg.InitDir = g_strDefDir;
  767. }
  768. comdlg.FileName = '*.*';
  769. comdlg.DialogTitle = 'Select Input File';
  770. comdlg.Flags = 524288 + // Use explorer format
  771. 4 + // Hide read-only checkbox
  772. 2048 + // Path must exist
  773. 4096; // File must exist
  774. comdlg.Filter = 'All Files (*.*)|*.*';
  775. comdlg.ShowOpen();
  776. if (comdlg.FileName == '*.*')
  777. {
  778. return;
  779. }
  780. try
  781. {
  782. var line;
  783. var lineary;
  784. inputfile = g_FSObj.OpenTextFile(comdlg.FileName, 1); // Open for reading only
  785. while (!inputfile.AtEndOfStream)
  786. {
  787. line = inputfile.ReadLine();
  788. lineary = line.split(';');
  789. if (lineary.length != 3)
  790. {
  791. if (line.length > 2) // Don't choke on blank lines
  792. {
  793. window.alert('Sorry, the input file is of the wrong format.\n' +
  794. 'Each line should be <filename>;<comment>;<bug nums>\n' +
  795. 'Use semi-colons for your delimiters, and\n' +
  796. 'leave the <bug nums> field blank if not applicable.');
  797. inputfile.Close();
  798. return;
  799. }
  800. else
  801. {
  802. continue;
  803. }
  804. }
  805. editgrid.addRow('EMPTYVALUE', lineary[0], 'EMPTYVALUE', lineary[1], lineary[2]);
  806. }
  807. inputfile.Close();
  808. }
  809. catch(ex)
  810. {
  811. window.alert('Error: Could not read ' + comdlg.FileName + ': ' + ex.description);
  812. if (inputfile != null)
  813. {
  814. inputfile.Close();
  815. }
  816. }
  817. }
  818. function RemoveDriveConnection()
  819. {
  820. if (g_strDrv != '')
  821. {
  822. try
  823. {
  824. g_WSHNetwork.RemoveNetworkDrive(g_strDrv);
  825. }
  826. catch(ex)
  827. {
  828. }
  829. }
  830. }
  831. function SetDriveConnection(dir)
  832. {
  833. if (g_strNetPath != dir)
  834. {
  835. try
  836. {
  837. g_WSHNetwork.RemoveNetworkDrive(g_strDrv);
  838. }
  839. catch(ex)
  840. {
  841. // Do nothing
  842. }
  843. try
  844. {
  845. g_WSHNetwork.MapNetworkDrive(g_strDrv, dir);
  846. g_strNetPath = dir;
  847. }
  848. catch(ex)
  849. {
  850. window.alert('Could not connect drive '+g_strDrv+' to ' + dir + ': ' + ex.description);
  851. g_strNetPath = '';
  852. return false;
  853. }
  854. }
  855. return true;
  856. }
  857. function EnsureSLMInfo(dir)
  858. {
  859. var slm;
  860. var line;
  861. var equ;
  862. var ex = new Object();
  863. var re1 = /\//g;
  864. var re2 = /\"/g;
  865. // Make sure we have the necessary SLM information about this directory.
  866. slm = g_aSLMInfo[dir];
  867. if (slm == null)
  868. {
  869. slm = new Object();
  870. // First, we verify that the directory is part of a slm project.
  871. if (!g_FSObj.FileExists(dir + '\\slm.ini'))
  872. {
  873. return;
  874. }
  875. try
  876. {
  877. slm.file = g_FSObj.OpenTextFile(dir + '\\slm.ini', 1); // Open for reading
  878. while (!slm.file.AtEndOfStream)
  879. {
  880. line = slm.file.ReadLine();
  881. line = line.replace(re1, '\\');
  882. line = line.replace(re2, '');
  883. equ = line.indexOf(' = ');
  884. if (equ == -1)
  885. {
  886. ex.description = 'Unknown format for slm.ini file!';
  887. throw(ex);
  888. }
  889. slm[line.substring(0, equ)] = line.substr(equ+3);
  890. }
  891. g_aSLMInfo[dir] = slm;
  892. slm.file.Close();
  893. if (slm['sub dir'] == '\\')
  894. {
  895. slm['sub dir'] = '';
  896. }
  897. slm.path = g_strDrv+'\\src\\' + slm.project + slm['sub dir'];
  898. slm.localpath = dir;
  899. }
  900. catch(ex)
  901. {
  902. window.alert('Error reading ' + dir + '\\slm.ini file: ' + ex.description);
  903. if (slm.file != null)
  904. {
  905. slm.file.Close();
  906. }
  907. return null;
  908. }
  909. }
  910. return slm;
  911. }
  912. function ShellExec(str, trace)
  913. {
  914. if (trace)
  915. {
  916. alert(str);
  917. }
  918. g_WSHShell.Run(str, 0, true);
  919. }
  920. function SearchDirectory(editgrid, dir)
  921. {
  922. var szSd = g_strDefDir + '\\tools\\x86\\sd.exe';
  923. try
  924. {
  925. var outfile;
  926. var line;
  927. var lineary;
  928. ShellExec('cmd /c "cd /d ' + g_strDefDir + '\\inetcore & ' +
  929. szSd + ' opened -l >' + g_strTempFile + '"', false);
  930. infile = g_FSObj.OpenTextFile(g_strTempFile, 1, false);
  931. while (!infile.AtEndOfStream)
  932. {
  933. line = infile.ReadLine();
  934. lineary = line.split('#');
  935. editgrid.addRow('EMPTYVALUE', lineary[0], 'EMPTYVALUE','EMPTYVALUE', 'EMPTYVALUE');
  936. }
  937. infile.Close();
  938. g_FSObj.DeleteFile(g_strTempFile);
  939. }
  940. catch(ex)
  941. {
  942. window.alert('Could not find checked out files!');
  943. }
  944. }
  945. function DoDirSearch(editgrid, dir)
  946. {
  947. SearchDirectory(editgrid, dir);
  948. mod_output.innerText = '';
  949. try
  950. {
  951. g_WSHNetwork.RemoveNetworkDrive(g_strDrv);
  952. }
  953. catch(ex)
  954. {
  955. // Ignore
  956. }
  957. }
  958. function FindCheckedOutFiles(editgrid)
  959. {
  960. var dir = showModalDialog('dirchoose.htm',
  961. g_strDefDir,
  962. 'dialogHeight:350px;' +
  963. 'dialogWidth:400px;' +
  964. 'center:yes;' +
  965. 'help:no;' +
  966. 'resizable:no;' +
  967. 'status:no');
  968. if (IsEmpty(dir))
  969. {
  970. return;
  971. }
  972. var re = /\\/g;
  973. mod_output.innerText = 'Searching ' + dir + '...';
  974. dir = dir.replace(re, '\\\\');
  975. // We use setTimeout so that the above innerText call will actually do
  976. // something. DoDirSearch() blocks the UI.
  977. setTimeout('DoDirSearch(' + editgrid.id + ', "' + dir + '")', 500);
  978. }
  979. function DoWindiff(editgrid, row)
  980. {
  981. var file = editgrid.getCellValue(row - 1, 1);
  982. var szWindiff = g_strDefDir + '\\tools\\x86\\windiff.exe';
  983. if (!g_FSObj.FileExists(file))
  984. {
  985. window.alert('The file ' + file + ' does not exist!');
  986. return;
  987. }
  988. if (!g_FSObj.FileExists(szWindiff))
  989. {
  990. szWindiff = 'windiff.exe';
  991. }
  992. try
  993. {
  994. g_WSHShell.Run(szWindiff + ' -l ' + file);
  995. }
  996. catch(ex)
  997. {
  998. window.alert('Could not run windiff: ' + ex.description +
  999. '\nMake sure windiff.exe is on your default path.');
  1000. }
  1001. }
  1002. function DoCmtCopy(grid, row)
  1003. {
  1004. var comment = grid.getCellValue(row - 1, 3);
  1005. var bugs = grid.getCellValue(row - 1, 4);
  1006. var i;
  1007. if (IsEmpty(comment))
  1008. {
  1009. window.alert('There is no comment for this file!');
  1010. return;
  1011. }
  1012. for (i=0; i < grid.numRows; i++)
  1013. {
  1014. if (i != row-1 && IsEmpty(grid.getCellValue(i, 3)))
  1015. {
  1016. grid.putCellValue(i, 3, comment);
  1017. }
  1018. if (i != row-1 && IsEmpty(grid.getCellValue(i, 4)))
  1019. {
  1020. grid.putCellValue(i, 4, bugs);
  1021. }
  1022. }
  1023. }
  1024. function InitSaveLoadData()
  1025. {
  1026. if (g_aSaveLoadData != null)
  1027. {
  1028. return;
  1029. }
  1030. g_aSaveLoadData = new Array();
  1031. g_aSaveLoadData['Dev'] = 'gen_devname,textbox';
  1032. g_aSaveLoadData['MonitorList'] = 'gen_monitorlist,textbox';
  1033. g_aSaveLoadData['Project'] = 'gen_project,select';
  1034. g_aSaveLoadData['Priority'] = 'gen_priority,radio';
  1035. g_aSaveLoadData['Description'] = 'gen_desc,textbox';
  1036. g_aSaveLoadData['BugsFixed'] = 'gen_bugs,textbox';
  1037. g_aSaveLoadData['NoResolve'] = 'gen_noresolve,checkbox';
  1038. g_aSaveLoadData['FixedRev'] = 'gen_fixedrev,textbox';
  1039. g_aSaveLoadData['CheckinType'] = 'gen_ckintype,radio';
  1040. g_aSaveLoadData['Mail'] = 'null,groupstart';
  1041. g_aSaveLoadData['CCList'] = 'mail_cclist,textbox';
  1042. g_aSaveLoadData['Tester'] = 'mail_tester,textbox';
  1043. g_aSaveLoadData['CodeReviewer'] = 'mail_codereview,textbox';
  1044. g_aSaveLoadData['Dependency'] = 'mail_depend,checkbox';
  1045. g_aSaveLoadData['BuildBreak'] = 'mail_buildbreak,checkbox';
  1046. g_aSaveLoadData['Summary'] = 'mail_summary,textarea';
  1047. g_aSaveLoadData['Binaries'] = 'mail_binaries,textarea';
  1048. g_aSaveLoadData['Files'] = 'null,groupstart';
  1049. g_aSaveLoadData['ModifiedFiles'] = 'mod_editgrid,editgrid';
  1050. g_aSaveLoadData['NewFiles'] = 'new_editgrid,editgrid';
  1051. g_aSaveLoadData['ObsoleteFiles'] = 'old_editgrid,editgrid';
  1052. g_aSaveLoadData['Options'] = 'null,groupstart';
  1053. g_aSaveLoadData['FullBuild'] = 'opt_fullbuild,checkbox';
  1054. // g_aSaveLoadData['PauseStart'] = 'opt_pausestart,checkbox';
  1055. // g_aSaveLoadData['PauseTest'] = 'opt_pausetest,checkbox';
  1056. // g_aSaveLoadData['PauseEnd'] = 'opt_pauseend,checkbox';
  1057. //g_aSaveLoadData['NoMerge'] = 'opt_nomerge,checkbox';
  1058. //g_aSaveLoadData['MsgNotify'] = 'opt_notify,checkbox';
  1059. //g_aSaveLoadData['Failure'] = 'opt_failure,radio';
  1060. g_aSaveLoadData['NotifyBuilds'] = 'opt_eventbuild,checkbox';
  1061. g_aSaveLoadData['NotifyAllBuilds'] = 'opt_eventallbuild,checkbox';
  1062. g_aSaveLoadData['NotifyEachTest'] = 'opt_eventeachtest,checkbox';
  1063. g_aSaveLoadData['NotifyTests'] = 'opt_eventtest,checkbox';
  1064. }
  1065. function doSave(fKeyDown)
  1066. {
  1067. var outputfile;
  1068. var fields;
  1069. var obj;
  1070. if (fKeyDown != null && fKeyDown == true)
  1071. {
  1072. if (event.keyCode != 13 && event.keyCode != 32)
  1073. {
  1074. return;
  1075. }
  1076. }
  1077. if (!IsEmpty(g_strDefDir))
  1078. {
  1079. comdlg.InitDir = g_strDefDir;
  1080. }
  1081. comdlg.FileName = '*.gnt';
  1082. comdlg.DialogTitle = 'Select Save File';
  1083. comdlg.Flags = 524288 + // Use explorer format
  1084. 2 + // Prompt to overwrite
  1085. 4 + // Hide read-only checkbox
  1086. 2048; // Path must exist
  1087. comdlg.Filter = 'Gauntlet Files (*.gnt)|*.gnt|All Files (*.*)|*.*';
  1088. comdlg.ShowSave();
  1089. if (comdlg.FileName == '*.gnt')
  1090. {
  1091. return;
  1092. }
  1093. InitSaveLoadData();
  1094. try
  1095. {
  1096. outputfile = g_FSObj.CreateTextFile(comdlg.FileName, true);
  1097. }
  1098. catch(ex)
  1099. {
  1100. window.alert('Could not open "' + comdlg.FileName + '".');
  1101. return;
  1102. }
  1103. outputfile.WriteLine('FileVersion=' + g_fileVersion);
  1104. for (prop in g_aSaveLoadData)
  1105. {
  1106. fields = g_aSaveLoadData[prop].split(',');
  1107. obj = document.all(fields[0]);
  1108. switch(fields[1])
  1109. {
  1110. case 'textbox':
  1111. outputfile.WriteLine(prop + '=' + obj.value);
  1112. break;
  1113. case 'checkbox':
  1114. outputfile.WriteLine(prop + '=' + obj.checked);
  1115. break;
  1116. case 'select':
  1117. outputfile.WriteLine(prop + '=' + obj.options(obj.selectedIndex).text);
  1118. break;
  1119. case 'radio':
  1120. for (i=0; i < obj.length; i++)
  1121. {
  1122. if (obj[i].checked == true)
  1123. {
  1124. outputfile.WriteLine(prop + '=' + obj[i].value);
  1125. break;
  1126. }
  1127. }
  1128. break;
  1129. case 'textarea':
  1130. outputfile.WriteLine(prop + '=');
  1131. outputfile.WriteLine(obj.value);
  1132. outputfile.WriteLine(g_strEndData);
  1133. break;
  1134. case 'editgrid':
  1135. outputfile.WriteLine(prop + '=');
  1136. for (i=0; i < obj.numRows; i++)
  1137. {
  1138. outputfile.WriteLine(obj.getCellValue(i, 1)); // Filename
  1139. outputfile.WriteLine(obj.getCellValue(i, 3)); // Comment
  1140. outputfile.WriteLine(obj.getCellValue(i, 4)); // Bug numbers
  1141. }
  1142. outputfile.WriteLine(g_strEndData);
  1143. break;
  1144. case 'groupstart':
  1145. break;
  1146. default:
  1147. window.alert('Bug in code - unhandled control type: ' + fields[1]);
  1148. break;
  1149. }
  1150. }
  1151. outputfile.Close();
  1152. }
  1153. function doLoad(fKeyDown)
  1154. {
  1155. var inputfile;
  1156. var fields;
  1157. var obj;
  1158. var prop;
  1159. var value;
  1160. var equ;
  1161. var ex = new Object();
  1162. var line='BEGINNING';
  1163. if (fKeyDown != null && fKeyDown == true)
  1164. {
  1165. if (event.keyCode != 13 && event.keyCode != 32)
  1166. {
  1167. return;
  1168. }
  1169. }
  1170. if (!IsEmpty(g_strDefDir))
  1171. {
  1172. comdlg.InitDir = g_strDefDir;
  1173. }
  1174. comdlg.FileName = '*.gnt';
  1175. comdlg.DialogTitle = 'Select Load File';
  1176. comdlg.Flags = 524288 + // Use explorer format
  1177. 4 + // Hide read-only checkbox
  1178. 2048 + // Path must exist
  1179. 4096; // File must exist
  1180. comdlg.Filter = 'Gauntlet Files (*.gnt)|*.gnt|All Files (*.*)|*.*';
  1181. comdlg.ShowOpen();
  1182. if (comdlg.FileName == '*.gnt')
  1183. {
  1184. return;
  1185. }
  1186. InitSaveLoadData();
  1187. try
  1188. {
  1189. inputfile = g_FSObj.OpenTextFile(comdlg.FileName, 1); // Open for reading
  1190. }
  1191. catch(ex)
  1192. {
  1193. window.alert('Could not open "' + comdlg.FileName + '".');
  1194. return;
  1195. }
  1196. line = inputfile.ReadLine();
  1197. var srch = 'FileVersion=';
  1198. if (line.indexOf(srch) != 0 || parseInt(line.substr(srch.length)) != g_fileVersion)
  1199. {
  1200. window.alert('The selected file is invalid or is an incompatible version.');
  1201. inputfile.Close();
  1202. return;
  1203. }
  1204. try
  1205. {
  1206. while (!inputfile.AtEndOfStream)
  1207. {
  1208. line = inputfile.ReadLine();
  1209. equ = line.indexOf('=');
  1210. if (equ == -1)
  1211. {
  1212. ex.description = 'Invalid name/value pair';
  1213. throw(ex);
  1214. }
  1215. prop = line.substring(0, equ);
  1216. value = line.substr(equ+1);
  1217. if (g_aSaveLoadData[prop] == null)
  1218. {
  1219. //ex.description = 'Unknown data field: ' + prop;
  1220. //throw(ex);
  1221. // Just skip unknown fields
  1222. continue;
  1223. }
  1224. fields = g_aSaveLoadData[prop].split(',');
  1225. obj = document.all(fields[0]);
  1226. switch(fields[1])
  1227. {
  1228. case 'textbox':
  1229. obj.value = value;
  1230. break;
  1231. case 'checkbox':
  1232. if (value.toLowerCase() == 'true')
  1233. obj.checked = true;
  1234. else
  1235. obj.checked = false;
  1236. break;
  1237. case 'select':
  1238. for (i=0; i<obj.options.length;i++)
  1239. {
  1240. if (obj.options(i).text == value)
  1241. {
  1242. obj.selectedIndex = i;
  1243. break;
  1244. }
  1245. }
  1246. // If not found, leave the default.
  1247. break;
  1248. case 'radio':
  1249. for (i=0; i < obj.length; i++)
  1250. {
  1251. if (obj[i].value == value)
  1252. {
  1253. obj[i].checked = true;
  1254. break;
  1255. }
  1256. }
  1257. break;
  1258. case 'textarea':
  1259. {
  1260. var str = '';
  1261. line = inputfile.ReadLine();
  1262. while (line != g_strEndData && !inputfile.AtEndOfStream)
  1263. {
  1264. str += line + '\n';
  1265. line = inputfile.ReadLine();
  1266. }
  1267. obj.value = str.slice(0, -1); // Trim off last CR
  1268. }
  1269. break;
  1270. case 'editgrid':
  1271. {
  1272. var file;
  1273. var comment;
  1274. var bugs;
  1275. file = inputfile.ReadLine();
  1276. while (file != g_strEndData)
  1277. {
  1278. comment = inputfile.ReadLine();
  1279. bugs = inputfile.ReadLine();
  1280. obj.addRow('EMPTYVALUE', file, 'EMPTYVALUE', comment, bugs);
  1281. file = inputfile.ReadLine();
  1282. }
  1283. }
  1284. break;
  1285. case 'groupstart':
  1286. break;
  1287. default:
  1288. window.alert('Bug in code - unhandled control type: ' + fields[1]);
  1289. break;
  1290. }
  1291. }
  1292. }
  1293. catch(ex)
  1294. {
  1295. window.alert('A fatal error occurred reading the input file:\n' + line + '\n' + ex.description);
  1296. }
  1297. inputfile.Close();
  1298. }
  1299. function FileCompare(fileinfo1, fileinfo2)
  1300. {
  1301. if (fileinfo1.path == fileinfo2.path)
  1302. {
  1303. return 0;
  1304. }
  1305. else if (fileinfo1.path < fileinfo2.path)
  1306. {
  1307. return -1;
  1308. }
  1309. return 1;
  1310. }
  1311. function GetSLMInfoOnFiles()
  1312. {
  1313. var aEditGrids = new Array(mod_editgrid, new_editgrid, old_editgrid);
  1314. var aFileType = new Array("modified", "addfile", "delfile");
  1315. var i;
  1316. var j;
  1317. var fileinfo;
  1318. var index;
  1319. var slm = null;
  1320. var grid;
  1321. var ex = new Object();
  1322. var fOutOfDateWarning = false;
  1323. var tempbatch = g_objTempDir.Path + '\\' + g_FSObj.GetTempName() + '.bat';
  1324. var outputpath = g_objTempDir.Path + '\\' + g_FSObj.GetTempName() + '.out';
  1325. var outputstr;
  1326. var strFStat = g_strDefDir + '\\tools\\x86\\sd.exe fstat';
  1327. var strHaveRev = "... haveRev ";
  1328. var strAction = "... action ";
  1329. var strDepotFile = "... depotFile ";
  1330. var actionMap = new Object();
  1331. actionMap['edit'] = "modified";
  1332. actionMap['add'] = "addfile";
  1333. actionMap['delete'] = "delfile";
  1334. // First, build the complete list of files being submitted
  1335. for (i = 0; i < aEditGrids.length; i++)
  1336. {
  1337. grid = aEditGrids[i];
  1338. for (j=0; j < grid.numRows; j++)
  1339. {
  1340. fileinfo = new Object();
  1341. fileinfo.type = aFileType[i];
  1342. fileinfo.path = TrimTrailingWS(grid.getCellValue(j, 1));
  1343. fileinfo.name = g_FSObj.GetFileName(fileinfo.path).toLowerCase();
  1344. fileinfo.comment = grid.getCellValue(j, 3);
  1345. fileinfo.bugs = grid.getCellValue(j, 4);
  1346. ShellExec('cmd /c "cd /d ' + g_strDefDir + '\\inetcore & ' +
  1347. strFStat + ' ' + fileinfo.path + ' >' + g_strTempFile + '"', false);
  1348. infile = g_FSObj.OpenTextFile(g_strTempFile, 1, false);
  1349. while (!infile.AtEndOfStream)
  1350. {
  1351. line = infile.ReadLine();
  1352. if (line.indexOf(strHaveRev) != -1)
  1353. {
  1354. fileinfo.slmver = line.substr(strHaveRev.length);
  1355. fileinfo.localver = fileinfo.slmver;
  1356. }
  1357. else if (line.indexOf(strAction) != -1)
  1358. {
  1359. var strType = line.substr(strAction.length);
  1360. fileinfo.type = actionMap[strType];
  1361. }
  1362. else if (line.indexOf(strDepotFile) != -1)
  1363. {
  1364. fileinfo.slmroot = line.substr(strDepotFile.length);
  1365. }
  1366. }
  1367. infile.Close();
  1368. fileinfo.project = "mshtml";
  1369. prefix = g_strDefDir + '\\inetcore\\';
  1370. fileinfo.subdir = fileinfo.path.substr(prefix.length);
  1371. if (fileinfo.type != 'delfile')
  1372. {
  1373. fileinfo.tempname = fileinfo.name + i++ + '.src';
  1374. }
  1375. g_aFiles[g_aFiles.length] = fileinfo;
  1376. }
  1377. }
  1378. if (g_aFiles.length == 0)
  1379. {
  1380. ex.description = 'You did not enter any files to be submitted!';
  1381. throw(ex);
  1382. }
  1383. }
  1384. function Normalize(str)
  1385. {
  1386. var re1 = /&/g;
  1387. var re2 = /</g;
  1388. str = str.replace(re1, '&amp;');
  1389. str = str.replace(re2, '&lt;');
  1390. return str;
  1391. }
  1392. function WriteXMLFile()
  1393. {
  1394. var xmlfile;
  1395. var groupname = null;
  1396. var strDevName;
  1397. strDevName = Normalize(document.all('gen_devname').value);
  1398. g_strXMLPath = g_objTempDir.Path + '\\' + strDevName + '.xml';
  1399. InitSaveLoadData();
  1400. xmlfile = g_FSObj.CreateTextFile(g_strXMLPath, true);
  1401. xmlfile.WriteLine("<?xml version='1.0' encoding='windows-1252'?>");
  1402. xmlfile.WriteLine("<?xml-stylesheet type='text/xsl' href='\\\\tridentbld2\\xsl\\gauntlet.xsl'?>");
  1403. xmlfile.WriteLine('<root>');
  1404. for (prop in g_aSaveLoadData)
  1405. {
  1406. fields = g_aSaveLoadData[prop].split(',');
  1407. obj = document.all(fields[0]);
  1408. if (fields[1] != 'groupstart' && groupname == 'Files')
  1409. {
  1410. continue;
  1411. }
  1412. if (groupname != null && fields[1] != 'groupstart')
  1413. {
  1414. xmlfile.Write(' ');
  1415. }
  1416. switch(fields[1])
  1417. {
  1418. case 'textbox':
  1419. xmlfile.WriteLine('<'+prop+'>' + Normalize(obj.value) + '</'+prop+'>');
  1420. break;
  1421. case 'checkbox':
  1422. xmlfile.WriteLine('<'+prop+'>' + obj.checked + '</'+prop+'>');
  1423. break;
  1424. case 'select':
  1425. if (prop = 'Project')
  1426. {
  1427. xmlfile.WriteLine('<Project>' + Normalize(obj.options(obj.selectedIndex).project) + '</Project>');
  1428. xmlfile.WriteLine('<Version>' + Normalize(obj.options(obj.selectedIndex).version) + '</Version>');
  1429. }
  1430. else
  1431. xmlfile.WriteLine('<'+prop+'>' + Normalize(obj.options(obj.selectedIndex).text) + '</'+prop+'>');
  1432. break;
  1433. case 'radio':
  1434. for (i=0; i < obj.length; i++)
  1435. {
  1436. if (obj[i].checked == true)
  1437. {
  1438. xmlfile.WriteLine('<'+prop+'>' + Normalize(obj[i].value) + '</'+prop+'>');
  1439. }
  1440. }
  1441. break;
  1442. case 'textarea':
  1443. xmlfile.WriteLine('<'+prop+'>');
  1444. xmlfile.WriteLine('<![CDATA['+obj.value+']]>');
  1445. xmlfile.WriteLine(' </'+prop+'>');
  1446. break;
  1447. case 'editgrid':
  1448. break;
  1449. case 'groupstart':
  1450. if (groupname != null && groupname != 'Files')
  1451. {
  1452. xmlfile.WriteLine('</'+groupname+'>');
  1453. }
  1454. groupname = prop;
  1455. if (groupname == 'Files')
  1456. {
  1457. var i;
  1458. var val;
  1459. for (i = 0; i < g_aFiles.length; i++)
  1460. {
  1461. xmlfile.WriteLine('<File>');
  1462. for (val in g_aFiles[i])
  1463. {
  1464. xmlfile.WriteLine(' <'+val+'>' + Normalize(g_aFiles[i][val]) + '</'+val+'>');
  1465. }
  1466. xmlfile.WriteLine('</File>');
  1467. }
  1468. }
  1469. else
  1470. {
  1471. xmlfile.WriteLine('<'+groupname+'>');
  1472. if (groupname == 'Mail')
  1473. {
  1474. var veropt = gen_project.options(gen_project.selectedIndex);
  1475. xmlfile.WriteLine(' <SendTo>' + veropt.sendto + '</SendTo>');
  1476. xmlfile.WriteLine(' <BBSendTo>' + veropt.bbsendto + '</BBSendTo>');
  1477. }
  1478. }
  1479. break;
  1480. default:
  1481. window.alert('Bug in code - unhandled control type: ' + fields[1]);
  1482. break;
  1483. }
  1484. }
  1485. xmlfile.WriteLine('</'+groupname+'>');
  1486. xmlfile.WriteLine('</root>');
  1487. xmlfile.Close();
  1488. }
  1489. function CopyFilesToServer()
  1490. {
  1491. var ex = new Object();
  1492. var i;
  1493. g_strDestDir = Normalize(document.all('gen_devname').value) + '.' + g_FSObj.GetBaseName(g_FSObj.GetTempName()) + '\\';
  1494. if (!SetDriveConnection(g_strQueuePath))
  1495. {
  1496. ex.description = 'Could not connect to destination share';
  1497. throw(ex);
  1498. }
  1499. var destfolder = g_FSObj.CreateFolder(g_strDrv+'\\' + g_strDestDir);
  1500. g_FSObj.CopyFile(g_strXMLPath, g_strDrv+'\\' + g_strDestDir);
  1501. for (i = 0; i < g_aFiles.length; i++)
  1502. {
  1503. if (g_aFiles[i].type != 'delfile')
  1504. {
  1505. g_FSObj.CopyFile(g_aFiles[i].path, g_strDrv+'\\' + g_strDestDir + g_aFiles[i].tempname);
  1506. }
  1507. }
  1508. RemoveDriveConnection();
  1509. }
  1510. function Stringize(str)
  1511. {
  1512. return "'" + str.replace(/\'/gi, "''") + "'";
  1513. }
  1514. function SubmitToDatabase()
  1515. {
  1516. var ado;
  1517. var SQL;
  1518. var i;
  1519. SQL = "INSERT INTO " + g_strQueueTable + " (datetime, Project, Priority, Type, Status, Version, Dev, Dir, Description) ";
  1520. SQL += "VALUES (GETDATE(), ";
  1521. // Project Name
  1522. SQL += Stringize(gen_project.options(gen_project.selectedIndex).project) + ', ';
  1523. // Priority
  1524. for (i=0; i < gen_priority.length; i++)
  1525. {
  1526. if (gen_priority[i].checked == true)
  1527. {
  1528. SQL += gen_priority[i].value + ', ';
  1529. }
  1530. }
  1531. // Checkin Type (only support "Normal" right now)
  1532. SQL += "'Normal', ";
  1533. // Checkin Status ("Pending" means just added)
  1534. SQL += "'Pending', ";
  1535. // Version
  1536. SQL += Stringize(gen_project.options(gen_project.selectedIndex).version) + ', ';
  1537. // Developer
  1538. SQL += Stringize(Normalize(document.all('gen_devname').value)) + ', ';
  1539. // File location
  1540. SQL += Stringize(g_strQueuePath + '\\' + g_strDestDir) + ', ';
  1541. // Description
  1542. SQL += Stringize(gen_desc.value);
  1543. SQL += ")";
  1544. ado = new ActiveXObject("ADODB.Connection");
  1545. ado.ConnectionString = 'driver={SQL Server};' +
  1546. 'server='+g_strQueueServer+';'+
  1547. 'uid='+g_strQueueUser+';'+
  1548. 'pwd='+g_strQueuePass+';'+
  1549. 'database='+g_strQueueDB;
  1550. ado.ConnectionTimeout = 10;
  1551. ado.Open();
  1552. ado.Execute(SQL);
  1553. ado.Close();
  1554. }
  1555. </SCRIPT>
  1556. </HEAD>
  1557. <BODY>
  1558. <IMG id=coatofarms src=coatarms.gif>
  1559. <IMG src=title2.jpg><BR>
  1560. <SPAN id=locator1></SPAN>
  1561. <BR clear=left>
  1562. <SPAN id=locator2></SPAN>
  1563. <IMG id=Back src=back.gif onkeyup="goNext(false, true)" onclick="goNext(false)" tabindex=0
  1564. accesskey=b
  1565. onmouseover="Back.style.backgroundColor='darkred'"
  1566. onfocus="onmouseover()";
  1567. onmouseout="Back.style.backgroundColor='black'"
  1568. onblur="onmouseout()">
  1569. <IMG id=Next src=next.gif onkeyup="goNext(true, true)" onclick="goNext(true)" tabindex=0
  1570. accesskey=n
  1571. onmouseover="Next.style.backgroundColor='darkred'"
  1572. onfocus="onmouseover()";
  1573. onmouseout="Next.style.backgroundColor='black'"
  1574. onblur="onmouseout()">
  1575. <IMG id=Finish src=finish.gif onkeyup="doFinish(true)" onclick="doFinish()" tabindex=0
  1576. accesskey=f
  1577. onmouseover="Finish.style.backgroundColor='darkblue'"
  1578. onfocus="onmouseover()";
  1579. onmouseout="Finish.style.backgroundColor='black'"
  1580. onblur="onmouseout()">
  1581. <IMG id=Load src=load.gif onkeyup="doLoad(true)" onclick="doLoad()" tabindex=0
  1582. title="Click this to load information you saved previously when checking in."
  1583. accesskey=l
  1584. onmouseover="Load.style.backgroundColor='darkgreen'"
  1585. onfocus="onmouseover()";
  1586. onmouseout="Load.style.backgroundColor='black'"
  1587. onblur="onmouseout()">
  1588. <!--
  1589. <SPAN id=Next2>
  1590. <IMG src=button.gif style="position:absolute; z-index:-1">
  1591. <SPAN style="position:relative; top:2px; left:26px;">
  1592. <FONT face="Wingdings">&#0231;</FONT>Load
  1593. </SPAN>
  1594. </SPAN>
  1595. -->
  1596. <SPAN id=PageNumber>Page 0 of 0</SPAN>
  1597. <!-------------------------------------------------------------------------
  1598. PAGE 0 -- Initialize
  1599. -------------------------------------------------------------------------->
  1600. <DIV id=page0 class=page style="visibility:visible">
  1601. <DIV class=pageintro>
  1602. <H2>Initialization</H2>
  1603. <P>Please wait while the Gauntlet checkin wizard initializes.
  1604. </DIV>
  1605. </DIV>
  1606. <!-------------------------------------------------------------------------
  1607. PAGE 1 -- General checkin data
  1608. -------------------------------------------------------------------------->
  1609. <DIV id=page1 class=page>
  1610. <DIV class=pageintro>
  1611. <H2>Basic Information</H2>
  1612. <P>Welcome to the Gauntlet Checkin Wizard! Over the next few pages you will
  1613. enter all the appropriate information necessary to build, test, and checkin
  1614. your modified source files.
  1615. <P>On this first page please enter the requested
  1616. information regarding your checkin as a whole.
  1617. </DIV>
  1618. <TABLE cellpadding=3>
  1619. <COLGROUP align=right>
  1620. <COLGROUP align=left>
  1621. <TR>
  1622. <TD title="Email alias of the developer submitting the checkin - default is your network name">
  1623. Developer:
  1624. </TD>
  1625. <TD>
  1626. <INPUT type=text id=gen_devname>
  1627. </TD>
  1628. </TR>
  1629. <TR>
  1630. <TD title="People you want CC'd on email related to this checkin for monitoring purposes.">
  1631. CC List:
  1632. </TD>
  1633. <TD>
  1634. <INPUT type=text id=gen_monitorlist>
  1635. </TD>
  1636. </TR>
  1637. <TR>
  1638. <TD title="Project you are working for. This is used to determine what builds and tests are done on your changes. Your checkin may include files in other projects.">
  1639. Affected Project:
  1640. </TD>
  1641. <TD>
  1642. <SELECT id=gen_project>
  1643. <OPTION>Select a Project and Version</OPTION>
  1644. </SELECT>
  1645. </TD>
  1646. </TR>
  1647. <TR>
  1648. <TD title="The priority of your checkin, as determined by guidelines set by your team. If in doubt, use 'Normal'">
  1649. Checkin Priority:
  1650. </TD>
  1651. <TD>
  1652. <input type=radio name=gen_priority value=5>High&nbsp;&nbsp;
  1653. <input type=radio name=gen_priority value=10 checked>Normal&nbsp;&nbsp;
  1654. <input type=radio name=gen_priority value=15>Low&nbsp;&nbsp;
  1655. <!--<input type=radio name=gen_priority value=99>Custom &nbsp;&nbsp;<input type=text id=gen_privalue size=10 style="visibility:hidden">-->
  1656. </TD>
  1657. </TR>
  1658. <TR>
  1659. <TD title="An informative description that will be displayed when others look at your checkin in the queue. This is also used as the subject of your checkin mail.">
  1660. Description:
  1661. </TD>
  1662. <TD>
  1663. <INPUT id=gen_desc size=50>
  1664. </TD>
  1665. </TR>
  1666. <TR>
  1667. <TD title="Semi-colon separated list of RAID bug numbers that are fixed by this checkin. Enter 'none' for none.">
  1668. Raid Bugs Fixed:
  1669. </TD>
  1670. <TD>
  1671. <INPUT id=gen_bugs size=50>
  1672. </TD>
  1673. </TR>
  1674. <TR>
  1675. <TD title="Check this checkbox if you don't want to have the above RAID bugs automatically resolved">
  1676. <INPUT id=gen_noresolve type=checkbox>
  1677. </TD>
  1678. <TD>
  1679. Don't resolve the above bugs in RAID
  1680. </TD>
  1681. </TR>
  1682. <TR>
  1683. <TD title="The build number where you expect your fixes to be available. Leave blank for the default.">
  1684. Fixed Rev:
  1685. </TD>
  1686. <TD>
  1687. <INPUT id=gen_fixedrev size=20>&nbsp;&nbsp;Format for IE5.5: 05.50.MM.DDRR (MM: Apr00 = 32)
  1688. </TD>
  1689. </TR>
  1690. <TR>
  1691. <TD title="Select 'Run Tests Only' if you desire only to run tests but not actually check in.">
  1692. Checkin Type:
  1693. </TD>
  1694. <TD>
  1695. <input type=radio name=gen_ckintype value=Normal checked>Normal checkin
  1696. <input type=radio name=gen_ckintype value=Test disabled=true>Run Tests Only (don't checkin)
  1697. </TD>
  1698. </TR>
  1699. </TABLE>
  1700. </DIV>
  1701. <!-------------------------------------------------------------------------
  1702. PAGE 2 -- Checkin Mail
  1703. -------------------------------------------------------------------------->
  1704. <DIV id=page2 class=page>
  1705. <DIV class=pageintro>
  1706. <H2>Checkin Mail</H2>
  1707. <P>On this page please describe your checkin in detail. This will be sent in
  1708. email to the entire team when your checkin completes.
  1709. <P>Include descriptions of the bugs you have fixed, as well as any details
  1710. that others may be interested in.
  1711. </DIV>
  1712. <TABLE cellspacing=0>
  1713. <COLGROUP align=right class=SendToHdr>
  1714. <COLGROUP align=left>
  1715. <TR>
  1716. <TD>To:</TD>
  1717. <TD style="padding-left:5px"><SPAN id=mail_tolist style="color:gray">Error obtaining list</SPAN></TD>
  1718. </TR>
  1719. <TR>
  1720. <TD>CC:</TD>
  1721. <TD style="padding-left:5px"><input id=mail_cclist type=text size=50></TD>
  1722. </TR>
  1723. </TABLE>
  1724. <HR>
  1725. <TABLE cellpadding=0
  1726. style="background-color:silver; width:100%; color:black;
  1727. border-bottom:2px solid gray; border-right:2px solid gray">
  1728. <COLGROUP align=right>
  1729. <COLGROUP align=left>
  1730. <COLGROUP align=right>
  1731. <COLGROUP align=left>
  1732. <TR>
  1733. <TD>Tested By:</TD>
  1734. <TD><input id=mail_tester type=text size=10></TD>
  1735. <TD>Code Reviewed By:</TD>
  1736. <TD><input id=mail_codereview type=text size=10></TD>
  1737. </TR>
  1738. <TR>
  1739. <TD>Dependency Delta:</TD>
  1740. <TD><input id=mail_depend type=checkbox></TD>
  1741. <TD>Build Break Fix:</TD>
  1742. <TD><input id=mail_buildbreak type=checkbox></TD>
  1743. </TR>
  1744. </TABLE>
  1745. Binaries Affected:<BR>
  1746. <textarea id=mail_binaries wrap=virtual style="width:100%; height:40px">
  1747. </textarea>
  1748. Summary/Description of Changes:<BR>
  1749. <textarea id=mail_summary wrap=virtual style="width:100%; height:120px; xexpression(page2.offsetHeight - mail_summary.offsetTop - 10)">
  1750. </textarea>
  1751. </DIV>
  1752. <!-------------------------------------------------------------------------
  1753. PAGE 3 -- Modified Files
  1754. -------------------------------------------------------------------------->
  1755. <DIV id=page3 class=page>
  1756. <DIV class=pageintro>
  1757. <H2>Modified Files</H2>
  1758. <P>On this page please enter all files that you have modified.
  1759. This should be only for files which already exist in the master source tree.
  1760. You will have a chance to enter new files or deleted files later.
  1761. </DIV>
  1762. <A href=about:blank class=link accesskey=b onclick="event.returnValue=false;BrowseForFiles(mod_editgrid)"><B>B</B>rowse For Files</A>&nbsp;&nbsp;
  1763. <A href=about:blank class=link accesskey=r onclick="event.returnValue=false;AddFromFile(mod_editgrid)"><B>R</B>ead List From File</A>&nbsp;&nbsp;
  1764. <A href=about:blank class=link accesskey=s onclick="event.returnValue=false;FindCheckedOutFiles(mod_editgrid)"><B>S</B>earch For Files</A>&nbsp;&nbsp;
  1765. <SPAN id=mod_output style="color:red; font-weight:bold"></SPAN>
  1766. <BR>
  1767. &nbsp;<BR>
  1768. <SPAN class=editgrid
  1769. id=mod_editgrid
  1770. columnNames=" ;Modified File; ;Comment;Fixed Bugs"
  1771. columnWidths="20px;55%;22px;30%;15%"
  1772. emptyValues="<IMG src=windiff.gif title='Run windiff on this file' onclick='event.returnValue=false;DoWindiff(mod_editgrid, parentElement.parentElement.rowIndex)'>*&amp;lt;new path&amp;gt;*<IMG src=copycmt.gif title='Duplicate comment to empty comment fields' onclick='event.returnValue=false;DoCmtCopy(mod_editgrid, parentElement.parentElement.rowIndex)'>*&amp;lt;enter comment&amp;gt;*&amp;lt;enter bugs&amp;gt;"
  1773. skipMask='1;0;1;0;0'
  1774. style="width:98%; height:60%; overflow:auto;"
  1775. >
  1776. </SPAN>
  1777. </DIV>
  1778. <!-------------------------------------------------------------------------
  1779. PAGE 4 -- New Files
  1780. -------------------------------------------------------------------------->
  1781. <DIV id=page4 class=page>
  1782. <DIV class=pageintro>
  1783. <H2>New Files</H2>
  1784. <P>On this page please enter all files you wish to add to the project.
  1785. This should only be for files which do not exist in the master source tree.
  1786. </DIV>
  1787. <A href=about:blank class=link accesskey=b onclick="event.returnValue=false;BrowseForFiles(new_editgrid)"><B>B</B>rowse For Files</A>&nbsp;&nbsp;
  1788. <A href=about:blank class=link accesskey=r onclick="event.returnValue=false;AddFromFile(new_editgrid)"><B>R</B>ead List From File</A>&nbsp;&nbsp;<BR>
  1789. &nbsp;<BR>
  1790. <SPAN class=editgrid
  1791. id=new_editgrid
  1792. columnNames=" ;New File; ;Comment;Fixed Bugs"
  1793. columnWidths="20px;55%;22px;30%;15%"
  1794. emptyValues="&nbsp;*&amp;lt;new path&amp;gt;*<IMG src=copycmt.gif title='Duplicate comment to empty comment fields' onclick='event.returnValue=false;DoCmtCopy(new_editgrid, parentElement.parentElement.rowIndex)'>*&amp;lt;enter comment&amp;gt;*&amp;lt;enter bugs&amp;gt;"
  1795. skipMask='1;0;1;0;0'
  1796. style="width:98%; height:60%; overflow:auto;"
  1797. >
  1798. </SPAN>
  1799. </DIV>
  1800. <!-------------------------------------------------------------------------
  1801. PAGE 5 -- Obsolete Files
  1802. -------------------------------------------------------------------------->
  1803. <DIV id=page5 class=page>
  1804. <DIV class=pageintro>
  1805. <H2>Obsolete Files</H2>
  1806. <P>On this page please enter all files you wish to permanently remove
  1807. from the project. This should only be for files which currently exist in the
  1808. master source tree but you wish to delete.
  1809. </DIV>
  1810. <A href=about:blank class=link accesskey=b onclick="event.returnValue=false;BrowseForFiles(old_editgrid)"><B>B</B>rowse For Files</A>&nbsp;&nbsp;
  1811. <A href=about:blank class=link accesskey=r onclick="event.returnValue=false;AddFromFile(old_editgrid)"><B>R</B>ead List From File</A>&nbsp;&nbsp;<BR>
  1812. &nbsp;<BR>
  1813. <SPAN class=editgrid
  1814. id=old_editgrid
  1815. columnNames=" ;Obsolete File; ;Comment;Fixed Bugs"
  1816. columnWidths="20px;55%;22px;30%;15%"
  1817. emptyValues="&nbsp;*&amp;lt;new path&amp;gt;*<IMG src=copycmt.gif title='Duplicate comment to empty comment fields' onclick='event.returnValue=false;DoCmtCopy(old_editgrid, parentElement.parentElement.rowIndex)'>*&amp;lt;enter comment&amp;gt;*&amp;lt;enter bugs&amp;gt;"
  1818. skipMask='1;0;1;0;0'
  1819. style="width:98%; height:60%; overflow:auto;"
  1820. >
  1821. </SPAN>
  1822. </DIV>
  1823. <!-------------------------------------------------------------------------
  1824. PAGE 6 -- Builds and Tests To Run
  1825. -------------------------------------------------------------------------->
  1826. <DIV id=page6 class=page>
  1827. <DIV class=pageintro>
  1828. <H2>Builds and Tests</H2>
  1829. <P>On this page you can select which builds
  1830. and what tests you want to have run against your changes.
  1831. </DIV>
  1832. Bind to XML data to get the lists of tests for this project.
  1833. </DIV>
  1834. <!-------------------------------------------------------------------------
  1835. PAGE 7 -- Options
  1836. -------------------------------------------------------------------------->
  1837. <DIV id=page7 class=page>
  1838. <DIV class=pageintro>
  1839. <H2>Options</H2>
  1840. <P>On this page you can specify how you want your checkin processed. Select
  1841. everything appropriate for this checkin.
  1842. </DIV>
  1843. <input type=checkbox id=opt_fullbuild>Do a full ssync and clean build.
  1844. <!--<P><input type=checkbox id=opt_presence>I need to be present when my build is being processed.-->
  1845. <!-- <BR><input type=checkbox id=opt_pausestart>Pause at the beginning of my checkin (after merging files). -->
  1846. <!-- <BR><input type=checkbox id=opt_pausetest>Pause after the builds complete but before starting the tests. -->
  1847. <!-- <BR><input type=checkbox id=opt_pauseend>Pause after the everything completes but before checking in. -->
  1848. <!--<BR><input type=checkbox id=opt_nomerge>Prevent others from merging their checkin with mine.-->
  1849. <!--<BR><input type=checkbox id=opt_notify>Send me message notifications in addition to email.-->
  1850. <!--
  1851. <P><DIV style="border:thin solid pink; width:50%">
  1852. <input type=radio name=opt_failure value=Default checked>Handle failures according to normal policies.<BR>
  1853. <input type=radio name=opt_failure value=Abort>If I don't respond after a failure, abort the checkin.
  1854. </DIV>-->
  1855. <P><DIV style="border:thin solid pink; width:50%; padding:5px">
  1856. Let me know when the following events occur:<BR>
  1857. <SPAN style="margin-left:30px">
  1858. &nbsp;&nbsp;<input type=checkbox id=opt_eventbuild>Each build completes.<BR>
  1859. &nbsp;&nbsp;<input type=checkbox id=opt_eventallbuild>All builds complete.<BR>
  1860. &nbsp;&nbsp;<input type=checkbox id=opt_eventeachtest>Each test completes.<BR>
  1861. &nbsp;&nbsp;<input type=checkbox id=opt_eventtest>All tests complete.<BR>
  1862. </SPAN>
  1863. </DIV>
  1864. <P>All of the above options are now supported.
  1865. </DIV>
  1866. <!-------------------------------------------------------------------------
  1867. PAGE 8 -- Last Chance
  1868. -------------------------------------------------------------------------->
  1869. <DIV id=page8 class=page>
  1870. <DIV class=pageintro>
  1871. <H2>Last Chance</H2>
  1872. <P>You have entered all the information necessary to submit your checkin.
  1873. Click "Finish" to complete the submission or use the Back button to go back
  1874. and change some of the options.
  1875. </DIV>
  1876. <P>If you like, you can save all the data you entered into a file. You can
  1877. then reload that data at a later time if you need to resubmit your checkin.
  1878. Click the Save button to save everything you entered into this wizard.
  1879. <P>
  1880. <IMG id=Save src=save.gif onkeyup="doSave(true)" onclick="doSave()" tabindex=0
  1881. style="visibility:inherit; position:static;"
  1882. accesskey=s
  1883. onmouseover="Save.style.backgroundColor='darkgreen'"
  1884. onfocus="onmouseover()";
  1885. onmouseout="Save.style.backgroundColor='black'"
  1886. onblur="onmouseout()">
  1887. </DIV>
  1888. <!-------------------------------------------------------------------------
  1889. PAGE 9 -- Process Files
  1890. -------------------------------------------------------------------------->
  1891. <DIV id=page9 class=page>
  1892. <DIV class=pageintro>
  1893. <H2>Process Files</H2>
  1894. <P>Please wait while the Gauntlet Checkin Wizard gathers information about
  1895. the files you are submitting and submits your checkin to the queue.
  1896. </DIV>
  1897. <P>Depending on the number of files in your checkin, this step may take
  1898. a few minutes.
  1899. <P>If nothing happens for a long time, look for a minimized console
  1900. window on your desktop. This window will be executing the status command
  1901. used to gain important information on the files you are submitting.
  1902. </DIV>
  1903. <!-------------------------------------------------------------------------
  1904. PAGE 10 -- Done!
  1905. -------------------------------------------------------------------------->
  1906. <DIV id=page10 class=page>
  1907. <DIV class=pageintro>
  1908. <H2>Done!</H2>
  1909. <P>Your checkin has been successfully submitted.
  1910. </DIV>
  1911. </DIV>
  1912. <OBJECT CLASSID = "clsid:5220cb21-c88d-11cf-b347-00aa00a28331">
  1913. <PARAM NAME="LPKPath" VALUE="comdlg.lpk">
  1914. </OBJECT>
  1915. <object id=comdlg
  1916. classid="clsid:F9043C85-F6F2-101A-A3C9-08002B2F49FB"
  1917. codebase="http://tridentbld2/controls/comdlg32.ocx#version=6,0,81,69"
  1918. >
  1919. </object>
  1920. </BODY>
  1921. </HTML>