All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pratyush Yadav <me@yadavpratyush.com>
To: <git@vger.kernel.org>
Cc: Jonathan Gilbert <JonathanG@iQmetrix.com>,
	Eric Sunshine <sunshine@sunshineco.com>,
	Pratyush Yadav <me@yadavpratyush.com>
Subject: [PATCH v2 2/2] git-gui: create a new namespace for chord script evaluation
Date: Tue, 17 Mar 2020 18:59:21 +0530	[thread overview]
Message-ID: <20200317132921.7222-3-me@yadavpratyush.com> (raw)
In-Reply-To: <20200317132921.7222-1-me@yadavpratyush.com>

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>
---
 lib/chord.tcl | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/chord.tcl b/lib/chord.tcl
index 7de7cba..e21e7d3 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
 		}
 	}
-- 
2.26.0.rc1.11.g30e9940356


  parent reply	other threads:[~2020-03-17 13:29 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-14 22:41 [PATCH v1 0/2] git-gui: reduce Tcl version requirement from 8.6 to 8.5 Pratyush Yadav
2020-03-14 22:41 ` [PATCH v1 1/2] " Pratyush Yadav
2020-03-14 22:41 ` [PATCH v1 2/2] git-gui: create a new namespace for chord script evaluation Pratyush Yadav
2020-03-15 18:54 ` [PATCH v1 0/2] git-gui: reduce Tcl version requirement from 8.6 to 8.5 Eric Sunshine
2020-03-16 15:48   ` Junio C Hamano
2020-03-17 12:49     ` Pratyush Yadav
2020-03-19 15:25       ` Eric Sunshine
2020-03-17 13:29 ` [PATCH v2 " Pratyush Yadav
2020-03-17 13:29   ` [PATCH v2 1/2] " Pratyush Yadav
2020-03-17 13:29   ` Pratyush Yadav [this message]
2020-03-19 15:22   ` [PATCH v2 0/2] " Eric Sunshine
2020-03-19 16:05     ` Pratyush Yadav

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200317132921.7222-3-me@yadavpratyush.com \
    --to=me@yadavpratyush.com \
    --cc=JonathanG@iQmetrix.com \
    --cc=git@vger.kernel.org \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.