|
|
|
/*
|
|
|
|
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.tqreplace($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.tqreplace($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.tqreplace($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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|