Index: openacs-4/packages/acs-admin/www/apm/version-edit-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/apm/version-edit-2.tcl,v diff -u -N -r1.11 -r1.11.10.1 --- openacs-4/packages/acs-admin/www/apm/version-edit-2.tcl 10 Jan 2007 21:21:59 -0000 1.11 +++ openacs-4/packages/acs-admin/www/apm/version-edit-2.tcl 25 Aug 2014 09:27:10 -0000 1.11.10.1 @@ -29,7 +29,7 @@ set attribute_value [ns_set iget [rp_getform] $attribute_name] if { [info exists attribute(validation_proc)] } { - set attribute_error [eval $attribute(validation_proc) $attribute_value] + set attribute_error [$attribute(validation_proc) $attribute_value] if { $attribute_error ne "" } { ad_return_complaint 1 $attribute_error Index: openacs-4/packages/acs-admin/www/install/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/install/index.adp,v diff -u -N -r1.7.8.1 -r1.7.8.2 --- openacs-4/packages/acs-admin/www/install/index.adp 11 Sep 2013 18:40:07 -0000 1.7.8.1 +++ openacs-4/packages/acs-admin/www/install/index.adp 25 Aug 2014 09:27:10 -0000 1.7.8.2 @@ -17,18 +17,12 @@ - Install from Repository + Install or + upgrade + from repository. - Install from Local + Install or upgrade from local file system. - - - Upgrade from Repository - - - Upgrade from Local - -

Installed Packages

Index: openacs-4/packages/acs-admin/www/install/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/install/index.tcl,v diff -u -N -r1.7 -r1.7.16.1 --- openacs-4/packages/acs-admin/www/install/index.tcl 20 Apr 2004 21:12:29 -0000 1.7 +++ openacs-4/packages/acs-admin/www/install/index.tcl 25 Aug 2014 09:27:10 -0000 1.7.16.1 @@ -5,10 +5,8 @@ } set page_title "Install Software" - set context [list $page_title] - template::list::create \ -name packages \ -multirow packages \ @@ -48,24 +46,21 @@ where t.package_key = v.package_key and v.enabled_p = 't' and v.installed_p = 't' - [template::list::filter_where_clauses -and -name "packages"] + [template::list::filter_where_clauses -and -name packages] order by t.package_type, t.pretty_name " { set package_type_pretty [string totitle [lindex [split $package_type "_"] 1]] } +#set local_install_url [export_vars -base "install" { { package_type apm_application } }] +#set local_service_install_url [export_vars -base "install" { { package_type apm_service } }] +#set local_upgrade_url [export_vars -base "install" { { upgrade_p 1 } }] -set local_install_url [export_vars -base "install" { { package_type apm_application } }] +set local_install_url "[ad_conn package_url]/apm/packages-install" -set local_service_install_url [export_vars -base "install" { { package_type apm_service } }] - -set local_upgrade_url [export_vars -base "install" { { upgrade_p 1 } }] - - -set repository_url "http://openacs.org/repository/[apm_get_repository_channel]/" - -set remote_install_url [export_vars -base "install" { repository_url { package_type apm_application } }] - -set remote_service_install_url [export_vars -base "install" { { package_type apm_service } repository_url }] - -set remote_upgrade_url [export_vars -base "install" { { upgrade_p 1 } repository_url }] +set repository_url "http://openacs.org/repository/" +set head_channel [lindex [apm_get_repository_channels $repository_url] 0] +set current_channel [apm_get_repository_channel] +set channel $current_channel +set remote_install_url [export_vars -base "install" { repository_url channel current_channel head_channel }] +set remote_upgrade_url [export_vars -base "install" { { upgrade_p 1 } repository_url channel current_channel head_channel}] Index: openacs-4/packages/acs-admin/www/install/install-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/install/install-2.tcl,v diff -u -N -r1.2.10.1 -r1.2.10.2 --- openacs-4/packages/acs-admin/www/install/install-2.tcl 2 Oct 2013 08:56:25 -0000 1.2.10.1 +++ openacs-4/packages/acs-admin/www/install/install-2.tcl 25 Aug 2014 09:27:10 -0000 1.2.10.2 @@ -6,48 +6,76 @@ } if { [llength $package_key] == 0 } { - ad_returnredirct . + ad_returnredirect . ad_script_abort } +if { $repository_url ne "" } { + set parent_page_title "Install From OpenACS Repository" +} else { + set parent_page_title "Install From Local File System" +} + ##### # # Check dependencies # ##### - apm_get_package_repository -repository_url $repository_url -array repository -array set result [apm_dependency_check_new \ - -repository_array repository \ - -package_keys $package_key] +set install_pkgs $package_key +set count 0 +while 1 { + set fixpoint_p 1 -switch $result(status) { - ok { - set continue_url [export_vars -base "install-3" { repository_url }] - ad_set_client_property acs-admin install $result(install) - set page_title "Confirm" + ns_log notice "run apm_dependency_check_new [incr count] with <$install_pkgs>" + + array set result [apm_dependency_check_new \ + -repository_array repository \ + -package_keys $install_pkgs] + array set failed $result(failed) + + switch $result(status) { + ok { + set continue_url [export_vars -base "install-3" { repository_url }] + set page_title "Confirm" + } + failed { + set page_title "Missing Required Packages" + } + default { + error "Bad status returned from apm_depdendency_check_new: '$result(status)'" + } } - failed { - set page_title "Missing Required Packages" + + set must_add {} + foreach pkg $result(packages) { + + if {$pkg ni $install_pkgs} { + lappend install_pkgs $pkg + } + + array unset version + array set version $repository($pkg) + + foreach p $version(install) { + if {$p ni $install_pkgs} { + lappend install_pkgs $p + set fixpoint_p 0 + } + } } - default { - error "Bad status returned from apm_depdendency_check_new: '$result(status)'" - } + + if {$fixpoint_p} break } -if { $repository_url ne "" } { - set parent_page_title "Install From OpenACS Repository" -} else { - set parent_page_title "Install From Local File System" -} +#ns_log notice "install_pkgs $install_pkgs" +ad_set_client_property acs-admin install $install_pkgs - set context [list [list "." "Install Software"] [list "install" $parent_page_title] $page_title] - ##### # # Build list to display to user @@ -58,11 +86,9 @@ set problems_p 0 set extras_p 0 -array set failed $result(failed) - multirow create install package_key version_name package_name comment extra_p -foreach key $result(packages) { +foreach key $install_pkgs { set extra_p [expr {$key ni $package_key}] if { $extra_p } { set extras_p 1 @@ -74,7 +100,7 @@ foreach elm $failed($key) { lappend comments "[lindex $elm 0] [lindex $elm 1]" } - set comment "Requires [join $comments "; "]" + set comment "Requires [join $comments {; }]" } else { set comment {} } Index: openacs-4/packages/acs-admin/www/install/install-3.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/install/install-3.tcl,v diff -u -N -r1.9.10.2 -r1.9.10.3 --- openacs-4/packages/acs-admin/www/install/install-3.tcl 17 Oct 2013 08:44:30 -0000 1.9.10.2 +++ openacs-4/packages/acs-admin/www/install/install-3.tcl 25 Aug 2014 09:27:10 -0000 1.9.10.3 @@ -13,13 +13,11 @@ # ##### - ad_progress_bar_begin \ -title "Installing Packages" \ -message_1 "Installing selected packages, please wait ..." \ -message_2 "We will continue automatically when installation is complete." - ##### # # Get packages to install @@ -29,7 +27,6 @@ apm_get_package_repository -repository_url $repository_url -array repository set install [ad_get_client_property acs-admin install] - if { [llength $install] == 0 } { ns_log Notice "install-3.tcl: Nothing to install. Is this a double-click?" } @@ -38,8 +35,46 @@ ad_set_client_property acs-admin install {} +# +# Perform a topological sort for the right install order +# +set install_order "" +set to_install $install +ns_log notice "to_install: $to_install" +while {[llength $to_install] > 0} { + foreach package_key $to_install { + array unset version + array set version $repository($package_key) + + set satisfied_p 1 + foreach req [concat $version(embeds) $version(extends) $version(requires)] { + lassign $req pkg req_version + + # + # A package can be installed, when its requirements are + # installed before the package. All other dependencies + # were checked earlier. + # + + if { $pkg in $to_install } { + set satisfied_p 0 + #ns_log notice "we have to delay $pkg" + break + } + } + if {$satisfied_p} { + lappend install_order $package_key + set pos [lsearch $to_install $package_key] + set to_install [lreplace $to_install $pos $pos] + } + } + #ns_log notice "iteration: \nto_install: $to_install\ninstall_order: $install_order" +} + +ns_log notice "Install packages in this order: $install_order" + ##### # # Install packages @@ -48,7 +83,7 @@ set success_p 1 -foreach package_key $install { +foreach package_key $install_order { ns_log Notice "Installing $package_key" array unset version @@ -102,7 +137,12 @@ ns_log Debug "Data model scripts: \nupgrade_from_version_name = $initial_version_name\nupgrade_to_version_name=$final_version_name\npackage_path=$package_path\npackage_key=$package_key\n => $data_model_files" - # Install the packages -- this actually copies the files into the right place in the file system and backs up any old files + ns_write [subst { +

Installing $package_key ...
+ + }] + # Install the packages -- this actually copies the files into the + # right place in the file system and backs up any old files set version_id [apm_package_install \ -enable \ -package_path $package_path \ @@ -115,7 +155,17 @@ # as there might be packages depending on the failed package. Ideally we should # probably check for such dependencies and continue if there are none. set success_p 0 + } elseif {[file exists $::acs::rootdir/packages/$package_key/install.xml]} { + ns_write "... configure $package_key
\n" + #ns_log notice "===== RUN /packages/$package_key/install.xml" + apm::process_install_xml /packages/$package_key/install.xml "" + ns_write "... installation OK
\n" + } else { + ns_write "... installation OK
\n" } + ns_write { + + } } ##### Index: openacs-4/packages/acs-admin/www/install/install.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/install/install.adp,v diff -u -N -r1.2.16.1 -r1.2.16.2 --- openacs-4/packages/acs-admin/www/install/install.adp 11 Sep 2013 18:40:07 -0000 1.2.16.1 +++ openacs-4/packages/acs-admin/www/install/install.adp 25 Aug 2014 09:27:10 -0000 1.2.16.2 @@ -10,10 +10,10 @@ -

There are no un-installed applications in your file system.

+

There are no un-installed applications in your file system meeting the filter criteria.

-

There are no un-installed applications in the OpenACS repository.

+

There are no un-installed applications in the OpenACS repository meeting the filter criteria.

Index: openacs-4/packages/acs-admin/www/install/install.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/install/install.tcl,v diff -u -N -r1.7.2.2 -r1.7.2.3 --- openacs-4/packages/acs-admin/www/install/install.tcl 12 Oct 2013 14:29:49 -0000 1.7.2.2 +++ openacs-4/packages/acs-admin/www/install/install.tcl 25 Aug 2014 09:27:10 -0000 1.7.2.3 @@ -1,12 +1,34 @@ ad_page_contract { Install from local file system } { - package_type:optional - {upgrade_p 0} + {package_type ""} + {upgrade_p:boolean 0} {repository_url ""} + {channel ""} + {maturity:naturalnum ""} + {current_channel} + {head_channel} } +# +# In upgrade mode, offer per default all maturities, in install-mode, +# start with mature packages. +# +if {$upgrade_p} { + set default_maturity 0 +} else { + set default_maturity 2 +} + +if {$maturity eq ""} { + set maturity $default_maturity +} + +# +# Set page title to reflect install from repository or from file system +# + if { $repository_url ne "" } { set page_title "Install or Upgrade From OpenACS Repository" } else { @@ -26,29 +48,57 @@ set upgrades_p 0 array set package [list] -apm_get_package_repository -repository_url $repository_url -array repository +if {$channel eq ""} {set channel $current_channel} +set fetch_url $repository_url/$channel/ +apm_get_package_repository -repository_url $fetch_url -array repository + foreach package_key [array names repository] { array unset version array set version $repository($package_key) - if { (![info exists package_type] || $package_type eq "") || $version(package.type) eq $package_type } { + if {![info exists version(maturity)] || $version(maturity) eq ""} { + set version(maturity) 0 + } + + #ns_log notice "$version(package.key) $repository($package_key)" + #ns_log notice "compare $version(package.key) $version(maturity) < $maturity" + if {$version(maturity) < $maturity} continue + if {![apm_package_supports_rdbms_p -package_key $package_key]} continue + + if { $package_type eq "" || $version(package.type) eq $package_type } { set package_key $version(package.key) - - # If in upgrade mode, only add to list if it's an upgrade - if { !$upgrade_p || $version(install_type) eq "upgrade" } { - if {(![info exists version(maturity)] || $version(maturity) eq "")} { - set version(maturity) "" + + # + # If in upgrade mode, only add to list if it's an upgrade, in + # install-mode list only installs. + # + if { (!$upgrade_p && $version(install_type) eq "install") + || ($upgrade_p && $version(install_type) eq "upgrade") + } { + + if {[info commands ::apm::package_version::attributes::maturity_int_to_text] ne ""} { + set maturity_text [::apm::package_version::attributes::maturity_int_to_text $version(maturity)] + } else { + set maturity_text "" } + set package([string toupper $version(package-name)]) \ [list \ $version(package.key) \ $version(package-name) \ $version(name) \ $version(package.type) \ $version(install_type) \ - $version(summary) \ - $version(maturity)] + $version(summary) \ + $maturity_text \ + $version(vendor) \ + $version(vendor.url) \ + $version(owner) \ + $version(owner.url) \ + $version(release-date) \ + $version(license) \ + ] } } } @@ -61,36 +111,22 @@ ##### # Sort the list alphabetically (in case package_name and package_key doesn't sort the same) -multirow create packages package_key package_name version_name package_type install_type summary maturity +multirow create packages package_key package_name version_name package_type install_type summary \ + maturity vendor vendor_url owner owner_url release_date license if {[catch {set maturity_label [apm::package_version::attributes::get_pretty_name maturity]} errmsg]} { set maturity_label "Maturity" } foreach name [lsort -ascii [array names package]] { - set row $package($name) - if {[info commands ::apm::package_version::attributes::maturity_int_to_text] ne ""} { - set maturity_text [::apm::package_version::attributes::maturity_int_to_text [lindex $row 6]] - } else { - set maturity_text "" - } - - multirow append packages \ - [lindex $row 0] \ - [lindex $row 1] \ - [lindex $row 2] \ - [lindex $row 3] \ - [lindex $row 4] \ - [lindex $row 5] \ - $maturity_text + multirow append packages {*}$package($name) } multirow extend packages install_url multirow -unclobber foreach packages { - set install_url [export_vars -base install-2 { package_key repository_url }] + set install_url [export_vars -base install-2 { package_key {repository_url $fetch_url}}] } - # Build the list-builder list template::list::create \ -name packages \ @@ -100,7 +136,7 @@ "Install or upgrade checked applications" "install-2" "Install or upgrade checked applications" } \ -bulk_action_export_vars { - repository_url + {repository_url $fetch_url} } \ -elements { package_name { @@ -110,6 +146,13 @@ } summary { label "Summary" + display_template {@packages.summary@
+ Vendor: @packages.vendor@ + @packages.vendor@ + (released on @packages.release_date@, license: @packages.license@) +
+ Details: @packages.package_key@ + } } maturity { label "$maturity_label" @@ -127,6 +170,26 @@ display_eval {[ad_decode $install_type "upgrade" "Upgrade" ""]} } } -filters { + channel { + label "Channel" + values { + {Current $current_channel} + {Head $head_channel} + } + default_value $current_channel + } + + maturity { + label "Maturity at least" + values { + {New 0} + {Immature 1} + {Mature 2} + {"Mature and Standard" 3} + } + default_value default_maturity + } + package_type { label "Type" values { @@ -142,9 +205,9 @@ } default_value 0 } - repository_url { - hide_p 1 - } + repository_url { hide_p 1 } + current_channel { hide_p 1 } + head_channel { hide_p 1 } }