Commit 81d18124 authored by Frank Bergmann's avatar Frank Bergmann

- Upgrade to V4.0

parent 633786e1
......@@ -2,22 +2,23 @@
<!-- Generated by the OpenACS Package Manager -->
<package key="acs-bootstrap-installer" url="http://openacs.org/repository/apm/packages/acs-bootstrap-installer" type="apm_service">
<license>GPL V2.0 or any later version</license>
<package-name>Bootstrap Installer</package-name>
<pretty-plural>Bootstrap Installers</pretty-plural>
<initial-install-p>t</initial-install-p>
<singleton-p>t</singleton-p>
<version name="5.1.5" url="http://openacs.org/repository/download/apm/acs-bootstrap-installer-5.1.5.apm">
<version name="5.6.0" url="http://openacs.org/repository/download/apm/acs-bootstrap-installer-5.6.0.apm">
<owner url="mailto:dhogaza@pacifier.com">Don Baccus</owner>
<summary>Bootstraps an OpenACS installation.</summary>
<release-date>2004-02-28</release-date>
<release-date>2010-06-17</release-date>
<maturity>3</maturity>
<vendor url="http://openacs.org">OpenACS</vendor>
<license url="http://www.gnu.org/copyleft/gpl.html">GPL</license>
<maturity>3</maturity>
<description format="text/html">This package bootstraps OpenACS. If the core packages have not yet been installed, it calls the installer which leads the user through the steps necessary to do so. It also checks that the installation meets the requirements for a successful install of OpenACS.</description>
<provides url="acs-bootstrap-installer" version="5.1.4"/>
<requires url="acs-kernel" version="5.0.0"/>
<provides url="acs-bootstrap-installer" version="5.6.0"/>
<requires url="acs-kernel" version="5.6.0"/>
<callbacks>
</callbacks>
......
......@@ -140,6 +140,21 @@ set errno [catch {
ns_log Notice "Loading acs-automated-testing specially so other packages can define tests..."
apm_bootstrap_load_libraries -procs acs-automated-testing
# GN: Should be loaded before user packages such they can use
# the xotcl infrastructure
# DRB: only do it if xotcl's installed
if {[info command ::xotcl::Class] ne "" &&
[file isdirectory $root_directory/packages/xotcl-core]} {
apm_bootstrap_load_libraries -procs xotcl-core
apm_bootstrap_load_libraries -init xotcl-core
}
# Build the list of subsite packages
apm_build_subsite_packages_list
# Build the nsv dependency and descendent structures
apm_build_package_relationships
# Load libraries, queries etc. for remaining packages
apm_load_packages
......@@ -168,7 +183,7 @@ if { $errno && $errno != 2 } {
# thrown by a call to bootstrap_fatal_error. If not, bootstrap_fatal_error was
# never called, so we need to call it now.
global errorCode
if { [string compare $errorCode "bootstrap_fatal_error"] } {
if {$errorCode ne "bootstrap_fatal_error" } {
bootstrap_fatal_error "Error during bootstrapping" 0
}
}
......@@ -10,7 +10,7 @@ proc db_bootstrap_checks { errors error_p } {
upvar $error_p my_error_p
foreach pool [db_available_pools {}] {
if { [catch { set db [ns_db gethandle -timeout 15 $pool]}] || ![string compare $db ""] } {
if { [catch { set db [ns_db gethandle -timeout 15 $pool]}] || $db eq "" } {
# This should never happened - we were able to grab a handle previously, why not now?
append my_errors "(db_bootstrap_checks) Internal error accessing pool \"$pool\".<br>"
set my_error_p 1
......@@ -26,10 +26,13 @@ proc db_bootstrap_checks { errors error_p } {
}
if { ![info exists my_error_p] } {
# DRB: I've got the SQL to pick the version to drop in later...what we really want,
# though, is Oracle's "compat version" number and I'm not sure how to get it (it is
# reported as 8.1.0 during the Oracle installation process)
nsv_set ad_database_version . "8.1.6"
# Get the version from Oracle, using the db tools equivalent of
# sticks and fire...
set db [ns_db gethandle [lindex [db_available_pools {}] 0]]
set selection [ns_db 1row $db "select version from product_component_version where product like 'Oracle%'"]
regexp {^[0-9]+\.[0-9]+\.[0-9]+} [ns_set value $selection 0] match
ns_db releasehandle $db
nsv_set ad_database_version . $match
}
}
......@@ -41,7 +44,9 @@ proc db_installer_checks { errors error_p } {
# Date format is a globally defined value for Oracle, so we only need to check it once
# for correctness.
if { [db_string sysdate "select sysdate from dual"] != [ns_fmttime [ns_time] "%Y-%m-%d"] } {
if { [db_string sysdate "select sysdate from dual"] !=
[db_string sysdate2 "select to_char(sysdate,'YYYY-MM-DD') from dual"] } {
# See if NLS_DATE_FORMAT is set correctly
append my_errors "<hr><P><B>"
append my_errors [db_string sysdate "select sysdate from dual"]
......
......@@ -12,7 +12,7 @@ proc db_bootstrap_checks { errors error_p } {
set my_errors "We found the following problems with your PostgreSQL installation:<p><ul>\n"
foreach pool [db_available_pools {}] {
if { [catch { set db [ns_db gethandle -timeout 15 $pool]}] || ![string compare $db ""] } {
if { [catch { set db [ns_db gethandle -timeout 15 $pool]}] || $db eq "" } {
# This should never happened - we were able to grab a handle previously, why not now?
append my_errors "<li>(db_bootstrap_checks) Internal error accessing pool \"$pool\".<br>"
set my_error_p 1
......@@ -35,8 +35,8 @@ proc db_bootstrap_checks { errors error_p } {
nsv_set ad_database_version . $version
}
if { $version < 7.3 } {
append my_errors "<li>Your installed version of Postgres is too old. Please install PostgreSQL 7.2 or later.\n"
if { $version < 8.0 } {
append my_errors "<li>Your installed version of Postgres is too old. Please install PostgreSQL 8.0 or later.\n"
set my_error_p 1
}
......
......@@ -6,4 +6,4 @@
# Create a mutex for the installer
nsv_set acs_installer mutex [ns_mutex create]
nsv_set acs_installer mutex [ns_mutex create oacs:installer]
This diff is collapsed.
......@@ -64,7 +64,7 @@ if { [file exists [apm_install_xml_file_path]] } {
# Parse the xml document
set root_node [apm_load_install_xml_file]
if { ![string equal [xml_node_get_name $root_node] application] } {
if { [xml_node_get_name $root_node] ne "application" } {
error "Installer: Could not find root node application in install.xml file"
}
......@@ -77,7 +77,7 @@ The installer will automatically install the $acs_application(pretty_name)
application after the basic OpenACS tookit has been installed.
"
if { ![string equal $acs_application(home) ""] } {
if { $acs_application(home) ne "" } {
append body "<p>
For more information about the $acs_application(pretty_name) application visit the
<a href=\"$acs_application(home)\">$acs_application(pretty_name) home page</a>
......@@ -104,7 +104,7 @@ if { [nsv_exists acs_properties database_problem] } {
installation is to configure your RDBMS, correctly install a database driver,
and configure AOLserver to use it. You can download
and install the latest version of the AOLserver Oracle and PostgreSQL drivers
from the <a href='http://openacs.org/software.adp'>OpenACS.org Software Page</a>.
from the <a href='http://openacs.org/software'>OpenACS.org Software Page</a>.
<p>
Once you're sure everything is installed and configured correctly, restart AOLserver.</b></p>
......@@ -172,7 +172,7 @@ if {![xml_support_ok xml_status_msg]} {
# AOLserver must support the "fancy" ADP parser.
set adp_support [ns_config "ns/server/[ns_info server]/adp" DefaultParser]
if { [string compare $adp_support "fancy"] } {
if {$adp_support ne "fancy" } {
append errors "<li><p><strong>The fancy ADP parser is not enabled. This is required to support
the OpenACS Templating System. Without this templating system, none of the OpenACS pages installed by default
will display. Please add the following to your AOLserver configuration file (usually in
......@@ -192,16 +192,16 @@ After adding support for the fancy ADP parser, please restart your web server.
# in the install.xml file)
set stacksize [ns_config "ns/threads" StackSize]
if { $stacksize < [expr $acs_application(min_stack_size) * 1024] } {
append errors "<li><p>The configured AOLserver Stacksize is too small
([expr $stacksize / 1024]K).
if { ![string is integer $stacksize] ||
$stacksize < [expr {$acs_application(min_stack_size) * 1024}] } {
append errors "<li><p><strong>The configured AOLserver Stacksize is too small, missing, or a non-integer value.
$acs_application(pretty_name) requires a StackSize parameter of at least
${acs_application(min_stack_size)}K.
<p>Please add the following line to your .tcl configuration file
<blockquote><pre>
ns_section \"ns/threads\"
ns_param StackSize \[expr ${acs_application(min_stack_size)}*1024\]
ns_param StackSize \[expr {${acs_application(min_stack_size)}*1024}\]
</blockquote></pre>
After adding support the larger stacksize, please restart your web server.
</strong></p>"
......@@ -212,7 +212,7 @@ After adding support the larger stacksize, please restart your web server.
# APM needs to check its permissions.
if { [catch {apm_workspace_dir} ] } {
append errors "<li><p><strong>The [acs_root_dir] directory has incorrect permissions. It must be owned by
the user executing the web server, normally <code>nsadmin</code>, and the owner must have read and write priveliges
the user executing the web server, normally <code>nsadmin</code>, and the owner must have read and write privileges
on this directory. You can correct this by running the following script as root.
To give another user access to the files, add them to <code>web</code> group.
<blockquote><pre>
......@@ -228,7 +228,7 @@ chmod -R ug+rw [acs_root_dir]
if { ![file writable [file join [acs_root_dir] packages]] } {
append errors "<li><p><strong>The [acs_root_dir]/packages directory has incorrect permissions. It must be owned by
the user executing the web server, normally <code>nsadmin</code> and the owner must have read and write
priveliges on this directory and all of its subdirectories. You can correct this by running the following
privileges on this directory and all of its subdirectories. You can correct this by running the following
script as root.
To give another user access to the files, add them to <code>web</code> group.
<blockquote><pre>
......@@ -289,17 +289,7 @@ We'll need to create a site-wide administrator for your server (like the root
user in UNIX). Please type in the email address, first and last name, and password
for this user.
<p>
<font color=red>Please do not use any non-ASCII characters
(accented characters, Umlaut, Asian etc...)
in the fields below. This will break the installation process.
</font>
<br>
This restriction is only for the screen below. You can modify
the name of the system administrator later.
</p>
<script language=\"javascript\">
<script type=\"text/javascript\">
function updateSystemEmails() {
var form = document.forms\[0\];
......@@ -311,7 +301,7 @@ function updateSystemEmails() {
}
</script>
<form action=\"installer/install\">
<form action=\"installer/install\" method=\"POST\">
<table>
<tr>
......
......@@ -19,7 +19,7 @@ foreach var_name {system_owner admin_owner host_administrator outgoing_sender ne
#
#############
if { [string compare $password $password_confirmation] } {
if {$password ne $password_confirmation } {
install_return 200 "Passwords Don't Match" "
The passwords you've entered don't match. Please <a href=\"javascript:history.back()\">try again</a>.
"
......@@ -51,34 +51,7 @@ if { ![install_good_data_model_p] } {
install_do_packages_install
##############
#
# Load message catalogs
#
#############
# Doing this before restart so that keys are available in init files on startup
ns_write "<p>Loading message catalogs..."
lang::catalog::import -initialize
ns_write " <p>Done.<p>"
##############
#
# Secret tokens
#
#############
ns_write "<p>Generating secret tokens..."
populate_secret_tokens_db
ns_write " <p>Done.<p>"
##############
#
# Admin create
#
#############
if { [empty_string_p $username] } {
if { $username eq "" } {
set username $email
}
......@@ -123,8 +96,39 @@ Please <a href=\"javascript:history.back()\">try again</a>.
rename util_memoize_flush {}
rename util_memoize_flush_saved util_memoize_flush
}
ad_conn -set user_id $user_id
}
# Now process the application bundle if an install.xml file was found.
if { [file exists "[acs_root_dir]/install.xml"] } {
set output [apm::process_install_xml "/install.xml" {}]
ns_write "<p>[join $output "</p><p>"]</p>"
}
##############
#
# Load message catalogs
#
#############
# Doing this before restart so that keys are available in init files on startup
ns_write "<p>Loading message catalogs..."
lang::catalog::import -initialize
ns_write " <p>Done.<p>"
##############
#
# Secret tokens
#
#############
ns_write "<p>Generating secret tokens..."
populate_secret_tokens_db
ns_write " <p>Done.<p>"
##############
#
# System settings
......@@ -145,18 +149,15 @@ foreach { var param } {
host_administrator HostAdministrator
outgoing_sender OutgoingSender
} {
ad_parameter -set [set $var] -package_id $kernel_id $param
parameter::set_value -parameter $param -value [set $var] -package_id $kernel_id
}
# set the Main Site RestrictToSSL parameter
set main_site_id [db_string main_site_id_select {
select package_id from apm_packages
where instance_name = 'Main Site'
}]
set main_site_id [subsite::main_site_id]
ad_parameter -set "acs-admin/*" -package_id $main_site_id RestrictToSSL
ad_parameter -set $new_registrations -package_id $main_site_id NewRegistrationEmailAddress
parameter::set_value -parameter RestrictToSSL -package_id $main_site_id -value "acs-admin/*"
parameter::set_value -parameter NewRegistrationEmailAddress -package_id $main_site_id -value $new_registrations
# We're done - kill the server (will restart if server is setup properly)
ad_schedule_proc -thread t -once t 1 ns_shutdown
......@@ -172,7 +173,7 @@ ns_write "<b>Installation finished</b>
<p> If not, please check your server error log, or contact your system administrator. </p>"
if { ![string equal $post_installation_message ""] } {
if { $post_installation_message ne "" } {
ns_write $post_installation_message
} else {
ns_write "
......
This diff is collapsed.
......@@ -45,7 +45,7 @@ ad_proc -public ad_find_all_files {
# Remember that we've examined the file.
set examined_files($file) 1
if { [empty_string_p $check_file_func] || [eval [list $check_file_func $file]] } {
if { $check_file_func eq "" || [eval [list $check_file_func $file]] } {
# If it's a file, add to our list. If it's a
# directory, add its contents to our list of files to
# examine next time.
......
......@@ -14,7 +14,7 @@ ad_proc -private db_available_pools {{} dbn } {
@author Andrew Piskorski (atp@piskorski.com)
@creation-date 2003/03/16
} {
if { [empty_string_p $dbn] } {
if { $dbn eq "" } {
set dbn [nsv_get {db_default_database} .]
}
return [nsv_get {db_available_pools} $dbn]
......@@ -103,7 +103,7 @@ ad_proc db_bootstrap_set_db_type { errors } {
# in all cases...
nsv_set ad_known_database_types . \
[list [list "oracle" "Oracle8" "Oracle8"] [list "postgresql" "PostgreSQL" "PostgreSQL"]]
[list [list "oracle" "Oracle" "Oracle"] [list "postgresql" "PostgreSQL" "PostgreSQL"]]
#
# Initialize the list of available pools
......@@ -124,7 +124,7 @@ ad_proc db_bootstrap_set_db_type { errors } {
set old_availablepool_p 0
set default_dbn [lindex $database_names 0]
if { [empty_string_p $default_dbn] } {
if { $default_dbn eq "" } {
set default_dbn {default}
set old_availablepool_p 1
......@@ -155,7 +155,7 @@ ad_proc db_bootstrap_set_db_type { errors } {
set dbn_pools [list]
set the_set [ns_configsection $config_path]
if { [string length $the_set] > 0 } {
if { $the_set ne "" } {
for {set i 0} {$i < [ns_set size $the_set]} {incr i} {
if { [string tolower [ns_set key $the_set $i]] == "availablepool" } {
lappend dbn_pools [ns_set value $the_set $i]
......@@ -207,7 +207,7 @@ ad_proc db_bootstrap_set_db_type { errors } {
set bad_pools [list]
set long_error 0
foreach pool $pools {
if { [catch { set db [ns_db gethandle -timeout 15 $pool]}] || ![string compare $db ""] } {
if { [catch { set db [ns_db gethandle -timeout 15 $pool]}] || $db eq "" } {
ns_log Warning "$proc_name: couldn't allocate a handle from database pool \"$pool\"."
lappend bad_pools "<li>OpenACS could not allocate a handle from database pool \"$pool\"."
set long_error 1
......@@ -219,19 +219,25 @@ ad_proc db_bootstrap_set_db_type { errors } {
ns_log Error "$proc_name: RDBMS type could not be determined: $errmsg"
} else {
foreach known_database_type [nsv_get ad_known_database_types .] {
if { ![string compare $driver [lindex $known_database_type 1]] } {
set this_type [lindex $known_database_type 1]
# we do a string match here, because we want to
# match against Oracle, Oracle8, Oracle10, etc..
if { [string match ${this_type}* $driver] } {
set this_suffix [lindex $known_database_type 0]
break
}
}
}
ns_db releasehandle $db
if { [string length $this_suffix] == 0 } {
if { $this_suffix eq "" } {
ns_log Notice "$proc_name: couldn't determine RDBMS type of database pool \"$pool\"."
lappend bad_pools "<li>OpenACS could not determine the RDBMS type associated with
pool \"$pool\"."
set long_error 1
} elseif { [string length [nsv_get ad_database_type .]] == 0 } {
} elseif { [nsv_get ad_database_type .] eq "" } {
nsv_set ad_database_type . $this_suffix
} elseif { ![string match $this_suffix [nsv_get ad_database_type .]] } {
ns_log Notice "$proc_name: Database pool \"$pool\" type \"$this_suffix\" differs from
......@@ -243,7 +249,7 @@ ad_proc db_bootstrap_set_db_type { errors } {
}
}
if { [string length [nsv_get ad_database_type .]] == 0 } {
if { [nsv_get ad_database_type .] eq "" } {
set database_problem "RDBMS type could not be determined for any pool."
ns_log Error "$proc_name: RDBMS type could not be determined for any pool."
}
......
......@@ -19,7 +19,7 @@ nsv_array set apm_reload_watch [list]
nsv_array set apm_package_info [list]
nsv_set apm_properties reload_level 0
proc_doc apm_first_time_loading_p {} {
ad_proc apm_first_time_loading_p {} {
Returns 1 if this is a -procs.tcl file's first time loading, or 0 otherwise.
} {
global apm_first_time_loading_p
......@@ -85,7 +85,7 @@ ad_proc -public apm_guess_file_type { package_key path } {
set dirs_in_pageroot [llength [split [ns_info pageroot] "/"]] ;# See comments by RBM
# Fix to cope with both full and relative paths
if { [string index $path 0] == "/"} {
if { [string index $path 0] eq "/"} {
set components_lesser [lrange $components $dirs_in_pageroot end]
} else {
set components_lesser $components
......@@ -105,7 +105,7 @@ ad_proc -public apm_guess_file_type { package_key path } {
# was being recognized as a datamodel create script for the forums
# package.
if { [string equal $extension ".sql"] } {
if {$extension eq ".sql"} {
if { [lsearch -glob $components "*upgrade-*-*"] >= 0 } {
set type "data_model_upgrade"
} elseif { [regexp -- "^$package_key-(create|drop)\.sql\$" [file tail $path] "" kind] } {
......@@ -113,30 +113,30 @@ ad_proc -public apm_guess_file_type { package_key path } {
} else {
set type "data_model"
}
} elseif { [string equal $extension ".dat"] } {
} elseif {$extension eq ".dat"} {
set type "sql_data"
} elseif { [string equal $extension ".ctl"] } {
} elseif {$extension eq ".ctl"} {
set type "ctl_file"
} elseif { [string equal $extension ".sqlj"] } {
} elseif {$extension eq ".sqlj"} {
set type "sqlj_code"
} elseif { [string equal $extension ".info"] } {
} elseif {$extension eq ".info"} {
set type "package_spec"
} elseif { [string equal $extension ".xql"] } {
} elseif {$extension eq ".xql"} {
set type "query_file"
} elseif { [string equal $extension ".java"] } {
} elseif {$extension eq ".java"} {
set type "java_code"
} elseif { [string equal $extension ".jar"] } {
} elseif {$extension eq ".jar"} {
set type "java_archive"
} elseif { [lsearch $components "doc"] >= 0 } {
set type "documentation"
} elseif { [string equal $extension ".pl"] || \
[string equal $extension ".sh"] || \
} elseif { $extension eq ".pl" || \
$extension eq ".sh" || \
[lsearch $components "bin"] >= 0 } {
set type "shell"
} elseif { [lsearch $components "templates"] >= 0 } {
set type "template"
} elseif { [llength $components] == 1 && \
([string equal $extension ".html"] || [string equal $extension ".adp"]) } {
($extension eq ".html" || $extension eq ".adp") } {
# HTML or ADP file in the top level of a package - assume it's documentation.
set type "documentation"
......@@ -147,10 +147,10 @@ ad_proc -public apm_guess_file_type { package_key path } {
set type "content_page"
} elseif { [lsearch $components_lesser "lib"] >= 0 } {
set type "include_page"
} elseif { [string equal $extension ".tcl"] && [string equal [lindex $components_lesser 0] "tcl"] } {
} elseif { $extension eq ".tcl" && [string equal [lindex $components_lesser 0] "tcl"] } {
# A .tcl file residing under dir .../package_key/tcl/
if { [regexp -- {-(procs|init)(-[0-9a-zA-Z]*)?\.tcl$} [file tail $path] "" kind] } {
if { [string equal [lindex $components end-1] test] } {
if {[lindex $components end-1] eq "test"} {
set type "test_$kind"
} else {
set type "tcl_$kind"
......@@ -197,7 +197,7 @@ ad_proc -public apm_get_package_files {
@see apm_guess_file_type
@see apm_guess_db_type
} {
if { [empty_string_p $package_path] } {
if { $package_path eq "" } {
set package_path [acs_package_root_dir $package_key]
}
......@@ -207,17 +207,16 @@ ad_proc -public apm_get_package_files {
set matching_files [list]
foreach file $files {
set rel_path [string range $file [expr [string length $package_path] + 1] end]
set rel_path [string range $file [expr {[string length $package_path] + 1}] end]
set file_type [apm_guess_file_type $package_key $rel_path]
set file_db_type [apm_guess_db_type $package_key $rel_path]
set type_match_p [expr [empty_string_p $file_types] || [lsearch $file_types $file_type] != -1]
set type_match_p [expr {$file_types eq "" || [lsearch $file_types $file_type] != -1}]
if { $all_db_types_p } {
set db_match_p 1
} else {
set db_match_p [expr [empty_string_p $file_db_type] || [string equal $file_db_type $system_db_type]]
set db_match_p [expr {$file_db_type eq "" || $file_db_type eq $system_db_type}]
}
if { $type_match_p && $db_match_p } {
......@@ -276,7 +275,7 @@ ad_proc -public apm_is_catalog_file { file_path } {
} else {
# Parsing succeeded
set prefix $filename_info(prefix)
if { [empty_string_p $prefix] } {
if { $prefix eq "" } {
# No prefix - this is considered a catalog file
set return_value 1
} else {
......@@ -326,15 +325,15 @@ ad_proc -private apm_guess_db_type { package_key path } {
set file_type [apm_guess_file_type $package_key $path]
if { [string match "data_model*" $file_type] ||
[string match "ctl_file" $file_type] } {
"ctl_file" eq $file_type } {
set sql_index [lsearch $components "sql"]
if { $sql_index >= 0 } {
set db_dir [lindex $components [expr $sql_index + 1]]
if { [string equal $db_dir "common"] } {
set db_dir [lindex $components [expr {$sql_index + 1}]]
if {$db_dir eq "common"} {
return ""
}
foreach known_database_type [db_known_database_types] {
if { [string equal [lindex $known_database_type 0] $db_dir] } {
if {[lindex $known_database_type 0] eq $db_dir} {
return $db_dir
}
}
......@@ -476,8 +475,8 @@ proc apm_bootstrap_load_queries { package_key } {
set file_db_type [apm_guess_db_type $package_key $file]
set file_type [apm_guess_file_type $package_key $file]
if {[string equal $file_type query_file] &&
([empty_string_p $file_db_type] || [string equal $file_db_type $db_type])} {
if {$file_type eq "query_file" &&
($file_db_type eq "" || $file_db_type eq $db_type)} {
db_qd_load_query_file $file
}
}
......@@ -519,7 +518,7 @@ ad_proc -private apm_ignore_file_p { path } {
if { [apm_backup_file_p $tail] } {
return 1
}
if { [string equal $tail "CVS"] } {
if {$tail eq "CVS"} {
return 1
}
return 0
......@@ -546,5 +545,5 @@ ad_proc -private apm_include_file_p { filename } {
Files for which apm_ignore_file_p returns true will be ignored.
Backup files are ignored.
} {
return [expr ![apm_ignore_file_p $filename]]
return [expr {![apm_ignore_file_p $filename]}]
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment