home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / vsinstallm.tcl < prev    next >
Text File  |  1997-05-29  |  12KB  |  437 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)vsinstallm.tcl    /main/hindenburg/7
  6. #      Author:         <generated>
  7. #      Description:    VCM integration file
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)vsinstallm.tcl    /main/hindenburg/7   29 May 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require installabl.tcl
  13. require methodextr.tcl
  14. require procs.tcl
  15. # End user added include file section
  16.  
  17. require "installman.tcl"
  18.  
  19. Class VSInstallManager : {InstallManager} {
  20.     constructor
  21.     method destructor
  22.     method createInterface
  23.     method handleInstall
  24.     method handleUninstall
  25.     method doInstall
  26.     method doUninstall
  27.     method handleShowCurrent
  28.     method showSuccess
  29.     method getProjects
  30.     method getOldInstallation
  31.     method addTclFile
  32.     method addEtcFile
  33.     method addAllFiles
  34.     method configureProject
  35.     method addToCorporate
  36.     method removeFromCorporate
  37.     method getCurrentIntegration
  38.     method install
  39.     method unInstall
  40.  
  41.     # Source directory for Tcl customization files.
  42.     #
  43.     attribute tclSrcDir
  44.  
  45.     # Source directory for etc customization files.
  46.     #
  47.     attribute etcSrcDir
  48.  
  49.     # List of methods that must be extracted to make
  50.     # the u_vcm.tcl customization file.
  51.     #
  52.     attribute uVcmMethodList
  53.  
  54.     # Map prefix to integration name.
  55.     #
  56.     attribute prefixToIntegration
  57.     attribute extracter
  58. }
  59.  
  60. constructor VSInstallManager {class this} {
  61.     set this [InstallManager::constructor $class $this]
  62.     # Start constructor user section
  63.     $this createInterface
  64.     set home [m4_var get M4_home]
  65.     $this tclSrcDir [path_name concat $home tcl]
  66.     $this etcSrcDir [path_name concat $home etc]
  67.     $this extracter [MethodExtracter new]
  68.     $this uVcmMethodList "vsObjectUserPath vsObjectVSPath vsFileUserPath vsFileVSPath"
  69.     $this addAllFiles
  70.  
  71.     $this prefixToIntegration [Dictionary new]
  72.     [$this prefixToIntegration] set razor "Razor"
  73.     [$this prefixToIntegration] set cc "ClearCase"
  74.     [$this prefixToIntegration] set cont "Continuus"
  75.  
  76.     set integration [[$this prefixToIntegration] set [$this prefix]]
  77.     [$this installWindow] title "$integration integration installation"
  78.     # End constructor user section
  79.     return $this
  80. }
  81.  
  82. method VSInstallManager::destructor {this} {
  83.     # Start destructor user section
  84.     # End destructor user section
  85.     $this InstallManager::destructor
  86. }
  87.  
  88.  
  89. # Make project selection box and add
  90. # push buttons for installing etc.
  91. #
  92. method VSInstallManager::createInterface {this} {
  93.     # project list part
  94.     interface DlgColumn .main.row.projCol {
  95.     Label label {
  96.         text "Projects:"
  97.     }
  98.     TextList projectList {
  99.         selectionPolicy MULTIPLE
  100.     }
  101.     }
  102.  
  103.     .main.row.projCol.projectList entrySet [$this getProjects]
  104.  
  105.     # push buttons
  106.     interface DlgColumn .main.row.buttonCol {
  107.     PushButton install {
  108.         label Install
  109.         sensitive 0
  110.     }
  111.     PushButton uninstall {
  112.         label Uninstall
  113.         sensitive 0
  114.     }
  115.     PushButton showCurrent {
  116.         label "Show current installation"
  117.     }
  118.     PushButton exit {
  119.         label Exit
  120.         activated { exit }
  121.     }
  122.     }
  123.  
  124.     .main.row.buttonCol.install activated "$this handleInstall"
  125.     .main.row.buttonCol.uninstall activated "$this handleUninstall"
  126.     .main.row.buttonCol.showCurrent activated "$this handleShowCurrent"
  127.  
  128.     # enable install if selection is made
  129.     .main.row.projCol.projectList selectionChanged {
  130.     if { [%this selectedSet] != "" } {
  131.         [[%this parent] parent].buttonCol.install sensitive 1
  132.         [[%this parent] parent].buttonCol.uninstall sensitive 1
  133.     } else { 
  134.         [[%this parent] parent].buttonCol.install sensitive 0
  135.         [[%this parent] parent].buttonCol.uninstall sensitive 0
  136.     }
  137.     }
  138. }
  139.  
  140.  
  141. # Callback for install button.
  142. #
  143. method VSInstallManager::handleInstall {this} {
  144.     set projects [.main.row.projCol.projectList selectedSet]
  145.     set oldInstallation [$this getOldInstallation]
  146.     set warnings ""
  147.     set errors ""
  148.  
  149.     # check old installation for conflicts
  150.     foreach project $projects {
  151.     set oldPrefix [$oldInstallation set $project]
  152.     if { $oldPrefix != "" } {
  153.         set integration [[$this prefixToIntegration] set $oldPrefix]
  154.         set message "\nProject $project already has $integration installed"
  155.         append message "\nDo you want to continue?"
  156.         if { $oldPrefix!= [$this prefix] } {
  157.         append errors $message
  158.         } else {
  159.         append warnings $message
  160.         }
  161.     }
  162.     }
  163.     
  164.     if { $errors != "" } {
  165.     ErrorDialog new .main.error -message $errors -okPressed { %this delete }
  166.     .main.error delHelpButton
  167.     .main.error popUp
  168.     return
  169.     }
  170.  
  171.     if { $warnings != "" } {
  172.     WarningDialog new .main.warning -message $warnings \
  173.         -okPressed "$this doInstall $projects"
  174.     .main.warning delHelpButton
  175.     .main.warning popUp
  176.     return
  177.     }
  178.  
  179.     $this doInstall $projects
  180. }
  181.  
  182.  
  183. # Callback for uninstall button.
  184. #
  185. method VSInstallManager::handleUninstall {this} {
  186.     set projects [.main.row.projCol.projectList selectedSet]
  187.     set oldInstallation [$this getOldInstallation]
  188.     set errors ""
  189.  
  190.     # check old installation for conflicts
  191.     foreach project $projects {
  192.     set oldPrefix [$oldInstallation set $project]
  193.     if { [string trim $oldPrefix] == "" } {
  194.         append errors "\nProject $project has no VCM integration installed"
  195.     } else {
  196.         set integration [[$this prefixToIntegration] set $oldPrefix]
  197.         if { $oldPrefix!= [$this prefix] } {
  198.         append errors "\nProject $project has $integration installed"
  199.         }
  200.     }
  201.     }
  202.     
  203.     if { $errors != "" } {
  204.     ErrorDialog new .main.error -message $errors -okPressed { %this delete }
  205.     .main.error delHelpButton
  206.     .main.error popUp
  207.     return
  208.     }
  209.  
  210.     $this doUninstall $projects
  211. }
  212.  
  213.  
  214. # Install in the given projects.
  215. #
  216. method VSInstallManager::doInstall {this newInstallation} {
  217.     foreach project $newInstallation {
  218.     $this install $project
  219.     }
  220.     $this showSuccess "installed"
  221. }
  222.  
  223.  
  224. # Uninstall in specified projects.
  225. #
  226. method VSInstallManager::doUninstall {this newInstallation} {
  227.     foreach project $newInstallation {
  228.     $this unInstall $project
  229.     }
  230.  
  231.     $this showSuccess "uninstalled"
  232. }
  233.  
  234.  
  235. # Show current installation status of projects.
  236. #
  237. method VSInstallManager::handleShowCurrent {this} {
  238.     set formatString "%-30s\t%s"
  239.     set infoString [format $formatString "Project" "VCM Integration\n"]
  240.     [$this getOldInstallation] foreach project prefix {
  241.     append infoString "\n"
  242.     set integration [[$this prefixToIntegration] set $prefix]
  243.     if { $integration == "" } {
  244.         set integration "None"
  245.     }
  246.     append infoString [format $formatString $project $integration]
  247.     }
  248.  
  249.     InfoDialog new .main.info \
  250.         -title "Current installation" \
  251.         -okPressed { %this delete } \
  252.         -message $infoString \
  253.         -font "courier-normal-12"
  254.  
  255.     .main.info delHelpButton
  256.     .main.info popUp
  257. }
  258.  
  259.  
  260. # Construct message: integration name, succesfully, action
  261. # and show in info box.
  262. #
  263. method VSInstallManager::showSuccess {this action} {
  264.     set message "[[$this prefixToIntegration] set [$this prefix]]"
  265.     append message " integration $action successfully"
  266.     append message "\nPlease restart your browser"
  267.     InfoDialog new .main.ok -message $message
  268.     .main.ok delHelpButton
  269.     .main.ok okPressed {
  270.     %this delete
  271.     }
  272.  
  273.     .main.ok popUp
  274. }
  275.  
  276.  
  277. # Return list of available projects.
  278. #
  279. method VSInstallManager::getProjects {this} {
  280.     set corporate [[ClientContext::global] currentCorporate]
  281.     set projects ""
  282.     foreach project [$corporate projects] {
  283.     append projects " [$project name]"
  284.     }
  285.  
  286.     return $projects
  287. }
  288.  
  289.  
  290. # Return current installation using project name as key
  291. # and install prefix as value.
  292. #
  293. method VSInstallManager::getOldInstallation {this} {
  294.     set installation [Dictionary new]
  295.     foreach project [$this getProjects] {
  296.     $installation set $project [$this getCurrentIntegration $project]
  297.     }
  298.  
  299.     return $installation
  300. }
  301.  
  302.  
  303. # Add given Tcl file to the customFile list,
  304. # using tclSrcDir.
  305. #
  306. method VSInstallManager::addTclFile {this name type} {
  307.     set customFile [InstallableCustomFile new $name $type $this]
  308.     $customFile source [$this tclSrcDir]
  309.     $customFile incremental 0
  310.     return $customFile
  311. }
  312.  
  313.  
  314. # Add given etc file to the customFile list,
  315. # using the prefix and etcSrcDir.
  316. #
  317. method VSInstallManager::addEtcFile {this name type} {
  318.     set customFile [InstallableCustomFile new $name $type $this]
  319.     $customFile source [$this etcSrcDir]
  320.     $customFile sourcePrefix [$this prefix]
  321.     $customFile incremental 1
  322.     return $customFile
  323. }
  324.  
  325.  
  326. # Construct customFile list.
  327. #
  328. method VSInstallManager::addAllFiles {this} {
  329.     [$this addEtcFile desk mnu] sourcePrefix vs
  330.     $this addEtcFile desk mnu
  331.     $this addEtcFile desk vie
  332.     [$this addTclFile u_uce tcl] sourcePrefix [$this prefix]
  333.     [$this addTclFile s_otsh tcl] sourcePrefix [$this prefix]
  334.     [$this addEtcFile vcmtype vcmtype] incremental 0
  335.     [$this addTclFile fstorage tcl] sourcePrefix vs
  336.     set uVcm [$this addTclFile u_vcm tcl]
  337.     $uVcm source ""
  338.  
  339.     # the following method will be evaluated in the context of
  340.     # InstallableCustomFile so $this will reference an InstallableCustomFile
  341.     # object
  342.     $uVcm sourceMethod { 
  343.     set tmpFile [BasicFS::tmpFile]
  344.     set prefix [[$this manager] prefix]
  345.     set tclSrcDir [[$this manager] tclSrcDir]
  346.     set uVcmSourceFile [string range "${prefix}system" 0 9]
  347.     set uVcmSourcePath [path_name concat $tclSrcDir "$uVcmSourceFile.tcl"]
  348.     set extractArgs [list $uVcmSourcePath $tmpFile]
  349.     [[$this manager] extracter] extract \
  350.          [concat $extractArgs [[$this manager] uVcmMethodList]]
  351.     set tmpFile
  352.     }    
  353. }
  354.  
  355.  
  356. # Configure given project for VCM integration: set property
  357. # with value. If value is empty the project is
  358. # effectively configured for ObjectTeam VCM (uninstall).
  359. #
  360. method VSInstallManager::configureProject {this project value} {
  361.     set corporate [[ClientContext::global] currentCorporate]
  362.     set project [$corporate findProject $project]
  363.     $project setProperty vcmIntegration $value
  364. }
  365.  
  366.  
  367. # Adds the given value to the corporate
  368. # property vcmIntegrationList if not 
  369. # yet in this list.
  370. #
  371. method VSInstallManager::addToCorporate {this value} {
  372.     set corporate [[ClientContext::global] currentCorporate]
  373.     set list [$corporate getPropertyValue vcmIntegrationList]
  374.     if { [lsearch $list $value] == -1 } {
  375.     append list " $value"
  376.     $corporate setProperty vcmIntegrationList $list
  377.     }
  378. }
  379.  
  380.  
  381. # Check if there are any projects left with the integration
  382. # specified by value, if not remove it from the
  383. # corporate property vcmIntegrationList.
  384. #
  385. method VSInstallManager::removeFromCorporate {this value} {
  386.     [$this getOldInstallation] foreach project integration {
  387.     if { $integration == $value } {
  388.         return
  389.     }
  390.     }
  391.  
  392.     set corporate [[ClientContext::global] currentCorporate]
  393.     set oldList [$corporate getPropertyValue vcmIntegrationList]
  394.     set oldValueIndex [lsearch $oldList $value]
  395.     if { $oldValueIndex == -1 } {
  396.     # this should not happen
  397.     return
  398.     }
  399.  
  400.     set newList [join [lreplace $oldList $oldValueIndex $oldValueIndex ""]]
  401.     $corporate setProperty vcmIntegrationList $newList
  402. }
  403.  
  404.  
  405. # Return prefix of integration currently installed in project.
  406. #
  407. method VSInstallManager::getCurrentIntegration {this project} {
  408.     set corporate [[ClientContext::global] currentCorporate]
  409.     set project [$corporate findProject $project]
  410.     return [$project getPropertyValue vcmIntegration]
  411. }
  412.  
  413.  
  414. # Install VCM integration in specified project
  415. # (project being the project name).
  416. #
  417. method VSInstallManager::install {this project} {
  418.     .main busy 1
  419.     $this installCustomFiles $project
  420.     $this configureProject $project [$this prefix]
  421.     $this addToCorporate [$this prefix]
  422.     $this showMessage ""
  423.     .main busy 0
  424. }
  425.  
  426. method VSInstallManager::unInstall {this project} {
  427.     .main busy 1
  428.     $this unInstallCustomFiles $project
  429.     $this configureProject $project "" 
  430.     $this removeFromCorporate [$this prefix]
  431.     $this showMessage ""
  432.     .main busy 0
  433. }
  434.  
  435. # Do not delete this line -- regeneration end marker
  436.  
  437.