aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2024-11-05 08:10:07 +1000
committerSteve Bennett <steveb@workware.net.au>2024-11-05 08:17:56 +1000
commit50e280a911611a642121fe08f88c79be3fc5991e (patch)
treead0fd61acaa26b3a95c4fb6343035ffb20eb6cbe
parent3a2cfdf696daa0d92c0f2e8d8fc1ff337ba99c62 (diff)
downloadjimtcl-50e280a911611a642121fe08f88c79be3fc5991e.zip
jimtcl-50e280a911611a642121fe08f88c79be3fc5991e.tar.gz
jimtcl-50e280a911611a642121fe08f88c79be3fc5991e.tar.bz2
add support for 'package forget'
Sometimes useful if replacing a package that has already been loaded Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim-package.c18
-rw-r--r--jim_tcl.txt7
-rw-r--r--tests/forget-test.tcl3
-rw-r--r--tests/package.test12
4 files changed, 40 insertions, 0 deletions
diff --git a/jim-package.c b/jim-package.c
index 69af074..18b64fe 100644
--- a/jim-package.c
+++ b/jim-package.c
@@ -148,6 +148,16 @@ int Jim_PackageRequire(Jim_Interp *interp, const char *name, int flags)
return JIM_OK;
}
+static int package_cmd_forget(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ int i;
+
+ for (i = 0; i < argc; i++) {
+ Jim_DeleteHashEntry(&interp->packages, Jim_String(argv[i]));
+ }
+ return JIM_OK;
+}
+
/*
*----------------------------------------------------------------------
*
@@ -216,6 +226,14 @@ static int package_cmd_names(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
static const jim_subcmd_type package_command_table[] = {
{
+ "forget",
+ "package ...",
+ package_cmd_forget,
+ 1,
+ -1,
+ /* Description: Forget that the given packages were loaded */
+ },
+ {
"provide",
"name ?version?",
package_cmd_provide,
diff --git a/jim_tcl.txt b/jim_tcl.txt
index 5ea980a..7b321ef 100644
--- a/jim_tcl.txt
+++ b/jim_tcl.txt
@@ -55,6 +55,7 @@ RECENT CHANGES
Changes since 0.83
~~~~~~~~~~~~~~~~~~
1. `aio` - support for configurable read and write buffering
+2. Add support for `package forget`
Changes between 0.82 and 0.83
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -3661,6 +3662,12 @@ See also `socket`, `pid`, `exec`
package
~~~~~~~
++*package forget* '?name ...?'+
+
+Removes the knowledge that the given packages were loaded. This allows new, replacement
+packages to be loaded. Note that it does not remove any effects of the previous packages
+being loaded.
+
+*package provide* 'name ?version?'+
Indicates that the current script provides the package named +'name'+.
diff --git a/tests/forget-test.tcl b/tests/forget-test.tcl
new file mode 100644
index 0000000..8d4289b
--- /dev/null
+++ b/tests/forget-test.tcl
@@ -0,0 +1,3 @@
+# This is a dummy package used for testing package forget
+
+set forgotten 1
diff --git a/tests/package.test b/tests/package.test
index b8afa18..1484bd6 100644
--- a/tests/package.test
+++ b/tests/package.test
@@ -20,5 +20,17 @@ test package-1.3 {package names} -body {
expr {"stdlib" in [package names]}
} -result 1
+test package-2.1 {package forget} -body {
+ # First pretend the package was loaded
+ package provide forget-test
+ # Now it won't load anything
+ package require forget-test
+ # Now forget it and another unloaded test
+ package forget forget-test missing
+ # And load the local package
+ package require forget-test
+ info exists forgotten
+} -result 1
+
testreport