summaryrefslogtreecommitdiffstats
path: root/data/defscript/installer.kvs
diff options
context:
space:
mode:
Diffstat (limited to 'data/defscript/installer.kvs')
-rw-r--r--data/defscript/installer.kvs169
1 files changed, 169 insertions, 0 deletions
diff --git a/data/defscript/installer.kvs b/data/defscript/installer.kvs
new file mode 100644
index 00000000..f974b7ed
--- /dev/null
+++ b/data/defscript/installer.kvs
@@ -0,0 +1,169 @@
+/*
+ A helper class for installing and parsing files,
+ and generating an uninstallation alias on the fly.
+
+ Example :
+ include "utils/installer.kvs"
+ %installer = $new(installer,0,myinstaller)
+ %installer->$copyFiles(pics,*.png,$file.localdir(pics))
+ %installer->$includeFiles(src,*.kvs)
+ %installer->generateUninstallAlias("foo::uninstall")
+ delete %installer
+ Here, "foo::uninstall" must be called in you uninstall
+ callback script.
+
+ Warnings:
+ 1) Declaration of aliases, popups, etc, in source files
+ (.kvs) must be in a similar format
+ as when you export them directly from kvirc.
+ Example:
+ alias(myalias)
+ defpopup(mypopup)
+ 2) If you use a "defpopup -m" to add an item to an
+ existing popup,this item won't be registered
+ automatically for uninstallation by this installer script.
+ You should typically identify the item you added using
+ the "id" parameter. See this example where the id is
+ "myaddon::myitem":
+ defpopup -m (channeltextview)
+ {
+ item(MyItem)(myaddon::myitem)
+ {
+ ...
+ }
+ }
+ Then, you add this line to you uninstall callback
+ script:
+ delpopupitem channeltextview myaddon::myitem
+*/
+class(installer,object)
+{
+ constructor()
+ {
+ }
+
+ copyFiles($0 = source dir,$1 = file regexp,$2 = target dir)
+ {
+ if(!$file.exists($0))return
+ if($isempty($0))
+ {
+ echo $tr("[Installer] The first argument to \%installer->\$copyfiles must be a source directory")
+ halt
+ }
+
+ if($isempty($1))
+ {
+ echo $tr("[Installer] The second argument to \%installer->\$copyfiles must be a file name or file regexp")
+ halt
+ }
+
+ if($isempty($2))
+ {
+ echo $tr("[Installer] The third argument to \%installer->\$copyfiles must be a destination directory")
+ halt
+ }
+
+ if($file.exists($0))
+ {
+ %files = $file.ls($file.fixpath($0),f,$1)
+ if($length(%files))
+ {
+ @$mkdir($2)
+ foreach(%file,%files)
+ {
+ $this->%lFiles <+ $str.replace($file.fixpath("$2/%file"),"\\\\","\\")
+ file.copy -o $file.fixpath($0/%file) $file.fixpath($2/%file)
+ }
+ }
+ }
+ }
+
+ // Recursive creation of directory
+ mkdir($0 = directory)
+ {
+ if($isempty($0) || $file.exists($0)) return
+ foreach -a (%subdir,$str.split("/",$file.fixpath($0)))
+ {
+ %p <+ %subdir
+ %path = $str.join("/",%p)
+ if(!$file.exists(%path))
+ file.mkdir -q %path
+ }
+ if(!$file.exists($0))
+ {
+ echo $tr("[Installer] Failed to create directory") \"$0\"
+ return
+ }
+ }
+
+ // Parse source files and get what will need to be uninstalled
+ includeFiles($0 = dir, $1 = file regexp)
+ {
+ if($isempty($0))
+ {
+ echo $tr("[Installer] The first argument to \%installer->\$includefiles must be a source directory")
+ halt
+ }
+
+ @$mkdir($0)
+
+ if($1 == "")
+ %szRe = "*.kvs"
+ else
+ %szRe = $1
+
+ %files = $file.ls($file.fixpath($0),f,$1)
+ if($length(%files))
+ {
+ foreach(%file,%files)
+ {
+ $this->%lSources <+ $str.replace($file.fixpath("$0/%file"),"\\\\","\\")
+ include $file.fixpath("$0/%file")
+ }
+ }
+ }
+
+
+ generateUninstallAlias($0 = alias name)
+ {
+ %c = "alias($0)$lf"
+ %c .= "{$lf"
+ if($isset($this->%lFiles))
+ {
+ foreach(%file,$this->%lFiles)
+ {
+ %file =~ s/"^$file.localdir()/(.*)$"/"\$file.localdir(\\1)"/
+ %c .= " file.remove -q \"%file\"$lf";
+ }
+ }
+ if($isset($this->%lSources))
+ {
+ foreach(%file,$this->%lSources){
+ foreach(%line,$file.readlines(%file))
+ if(!$str.isempty(%line)){
+ if($str.match("event(*)",%line,e))
+ %c .= " event -q ("$str.token(1,"()",%line)"){}$lf"
+ else if($str.match("alias(*)",%line,e))
+ %aliases<+$str.token(1,"()",%line)
+ else if($str.match("defpopup(*)",%line,e))
+ %c .= " defpopup("$str.token(1,"()",%line)"){}$lf"
+ else if($str.match("toolbar.create * *",%line,e))
+ %c .= " toolbar.destroy -q "$str.word(1,%line)"$lf"
+ else if($str.match("action.create* (*)",%line,e))
+ %c .= " action.destroy -q "$str.replace($str.token(1,"(,)",%line),,\")"$lf"
+ else if($str.match("class(*)*",%line,e))
+ %c .= " objects.killclass -q "$str.token(1,"(,)",%line)"$lf"
+ }
+ }
+ if($isset(%aliases))
+ foreach(%alias,%aliases)
+ %c .= " alias -q (%alias){}$lf"
+ %c .= " alias -q ($0){}$lf"
+ }
+ %c .= "}"
+ eval %c
+ }
+}
+
+
+