1
inherit Service.Service;
3
void call_service(object user, mixed args, void|int id)
8
void install_spm(object spmModule, string pname)
10
object fp = connection->send_cmd(0, "get_module", "filepath:tree");
11
object packages = fp->path_to_object("/packages");
12
werror("Updating %O\n", pname);
13
if ( objectp(packages) ) {
15
object tfs = Filesystem.Tar("spms/"+pname);
16
if ( !objectp(tfs) ) {
17
werror(": " + pname + " not a valid SPM !\n");
20
mixed xml = tfs->open("package.xml", "r");
21
string packageXML = xml->read();
23
mapping config =spmModule->spm_check_configuration(packageXML);
24
werror("CONFIG = %O\n", config);
25
mapping pmod = connection->send_cmd(0, "get_module", config->name);
27
pmod = connection->send_cmd(0, "get_module", "package:"+config->name);
28
if ( objectp(pmod) ) {
29
if ( spmModule->spm_version_value(config->version) <= spmModule->spm_version_value(pmod->get_version()) ) {
30
werror("Found installed module with version %O, skipping installation !\n", pmod->get_version());
34
werror("Found installed module - updating to %O (previous version %O)\n",
35
config->version, pmod->get_version());
39
Stdio.File file = Stdio.File("spms/"+pname, "r");
40
object package = packages->get_object_byname(pname);
41
if ( !objectp(package) ) {
42
object docfactory = connection->get_variable("Document.factory");
43
package = docfactory->execute( (["name": pname, ]));
44
package->move(packages);
46
package->set_content(file->read());
47
spmModule->install_spm(package, fp->path_to_object("/"));
50
error("Failed to install - no /packages found on server");
53
static void check_spms()
55
object _spm = connection->send_cmd( 0, "get_module", "SPM" );
57
werror("Failed to find SPM Module !\n");
58
array directory = get_dir("spms");
59
foreach ( directory, string file ) {
60
werror("file = %O\n", file);
61
if ( sscanf(file, "%*s.spm") ) {
62
install_spm(_spm, file);
65
call_out(check_spms, 30);
70
werror("cwd = " + getcwd() + "\n");
74
static private void got_kill(int sig) {
78
int main(int argc, array argv)
80
signal(signum("QUIT"), got_kill);