summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormax <max@tclers.tk>2011-10-18 13:03:42 (GMT)
committermax <max@tclers.tk>2011-10-18 13:03:42 (GMT)
commit47b4d47e6ae7022e12935ae3a44b20f2faa26265 (patch)
treebb5a3063c8a46877d555ead210b5cbd650b4a0f7
parentbca0615a494ac0a1746420810731b2a8b70c475e (diff)
downloadtcl-47b4d47e6ae7022e12935ae3a44b20f2faa26265.zip
tcl-47b4d47e6ae7022e12935ae3a44b20f2faa26265.tar.gz
tcl-47b4d47e6ae7022e12935ae3a44b20f2faa26265.tar.bz2
Don't cache the system timezone when it was derived from TCL_TZ or TZ.
-rw-r--r--ChangeLog7
-rw-r--r--library/clock.tcl27
-rw-r--r--tests/clock.test33
3 files changed, 56 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 6cc8e66..50c81b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-10-18 Reinhard Max <max@suse.de>
+
+ * library/clock.tcl (::tcl::clock::GetSystemTimeZone): Cache the
+ time zone only if it was detected by one of the expensive
+ methods. Otherwise after unsetting TCL_TZ or TZ the previous value
+ will still be used.
+
2011-10-15 Venkat Iyer <venkat@comit.com>
* library/tzdata/America/Sitka : Update to Olson's tzdata2011l
* library/tzdata/Pacific/Fiji
diff --git a/library/clock.tcl b/library/clock.tcl
index 8bce49f..2e9cae7 100644
--- a/library/clock.tcl
+++ b/library/clock.tcl
@@ -3076,18 +3076,23 @@ proc ::tcl::clock::GetSystemTimeZone {} {
set timezone $result
} elseif {[set result [getenv TZ]] ne {}} {
set timezone $result
- } elseif { [info exists CachedSystemTimeZone] } {
- set timezone $CachedSystemTimeZone
- } elseif { $::tcl_platform(platform) eq {windows} } {
- set timezone [GuessWindowsTimeZone]
- } elseif { [file exists /etc/localtime]
- && ![catch {ReadZoneinfoFile \
- Tcl/Localtime /etc/localtime}] } {
- set timezone :Tcl/Localtime
- } else {
- set timezone :localtime
}
- set CachedSystemTimeZone $timezone
+ if {![info exists timezone]} {
+ # Cache the time zone only if it was detected by one of the
+ # expensive methods.
+ if { [info exists CachedSystemTimeZone] } {
+ set timezone $CachedSystemTimeZone
+ } elseif { $::tcl_platform(platform) eq {windows} } {
+ set timezone [GuessWindowsTimeZone]
+ } elseif { [file exists /etc/localtime]
+ && ![catch {ReadZoneinfoFile \
+ Tcl/Localtime /etc/localtime}] } {
+ set timezone :Tcl/Localtime
+ } else {
+ set timezone :localtime
+ }
+ set CachedSystemTimeZone $timezone
+ }
if { ![dict exists $TimeZoneBad $timezone] } {
dict set TimeZoneBad $timezone [catch {SetupTimeZone $timezone}]
}
diff --git a/tests/clock.test b/tests/clock.test
index 7937933..917543a 100644
--- a/tests/clock.test
+++ b/tests/clock.test
@@ -35895,6 +35895,39 @@ test clock-38.1 {regression - convertUTCToLocalViaC - east of Greenwich} \
} \
-result {01:00:00}
+test clock-38.2 {make sure TZ is not cached after unset} \
+ -setup {
+ if { [info exists env(TZ)] } {
+ set oldTZ $env(TZ)
+ unset env(TZ)
+ }
+ if { [info exists env(TCL_TZ)] } {
+ set oldTCLTZ $env(TCL_TZ)
+ unset env(TCL_TZ)
+ }
+ } \
+ -body {
+ set t1 [clock format 0]
+ # a time zone that is unlikely to anywhere
+ set env(TZ) "+04:20"
+ set t2 [clock format 0]
+ unset env(TZ)
+ set t3 [clock format 0]
+ expr {$t1 eq $t3 && $t1 ne $t2}
+ } \
+ -cleanup {
+ if { [info exists oldTZ] } {
+ set env(TZ) $oldTZ
+ unset oldTZ
+ }
+ if { [info exists oldTclTZ] } {
+ set env(TCL_TZ) $oldTclTZ
+ unset oldTclTZ
+ }
+ } \
+ -result 1
+
+
test clock-39.1 {regression - synonym timezones} {
clock format 0 -format {%H:%M:%S} -timezone :US/Eastern
} {19:00:00}