summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Pratyush Yadav <me@yadavpratyush.com>2020-03-15 03:08:36 +0530
committerLibravatar Pratyush Yadav <me@yadavpratyush.com>2020-03-17 18:48:54 +0530
commit3891a84ccdad249c426c3e036d4fb086c388b4ce (patch)
tree470c477ade7cf95ad50df51075ef8224d587166d
parentgit-gui: reduce Tcl version requirement from 8.6 to 8.5 (diff)
downloadtgif-3891a84ccdad249c426c3e036d4fb086c388b4ce.tar.xz
git-gui: create a new namespace for chord script evaluation
Evaluating the script in the same namespace as the chord itself creates potential for variable name collision. And in that case the script would unknowingly use the chord's variables. For example, say the script has a variable called 'is_completed', which also exists in the chord's namespace. The script then calls 'eval' and sets 'is_completed' to 1 thinking it is setting its own variable, completely unaware of how the chord works behind the scenes. This leads to the chord never actually executing because it sees 'is_completed' as true and thinks it has already completed. Avoid the potential collision by creating a separate namespace for the script that is a child of the chord's namespace. Signed-off-by: Pratyush Yadav <me@yadavpratyush.com>
-rw-r--r--lib/chord.tcl6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/chord.tcl b/lib/chord.tcl
index 7de7cba8c9..e21e7d3d0b 100644
--- a/lib/chord.tcl
+++ b/lib/chord.tcl
@@ -64,6 +64,7 @@ class SimpleChord {
field notes
field body
field is_completed
+ field eval_ns
# Constructor:
# set chord [SimpleChord::new {body}]
@@ -74,6 +75,7 @@ class SimpleChord {
set notes [list]
set body $i_body
set is_completed 0
+ set eval_ns "[namespace qualifiers $this]::eval"
return $this
}
@@ -83,7 +85,7 @@ class SimpleChord {
# the chord body will be evaluated. This can be used to set variable
# values for the chord body to use.
method eval {script} {
- namespace eval [namespace qualifiers $this] $script
+ namespace eval $eval_ns $script
}
# Method:
@@ -111,7 +113,7 @@ class SimpleChord {
set is_completed 1
- namespace eval [namespace qualifiers $this] $body
+ namespace eval $eval_ns $body
delete_this
}
}