/*␊ |
# ***** BEGIN LICENSE BLOCK *****␊ |
# This file is part of InDefero, an open source project management application.␊ |
# Copyright (C) 2008 Céondo Ltd and contributors.␊ |
# Copyright (C) 2010 Céondo Ltd and contributors.␊ |
#␊ |
# InDefero is free software; you can redistribute it and/or modify␊ |
# it under the terms of the GNU General Public License as published by␊ |
|
case 'IDF_Project::created':␊ |
$plug->processMonotoneCreate($params['project']);␊ |
break;␊ |
case 'mtnpostpush.php::run':␊ |
$plug->processSyncTimeline($params);␊ |
break;␊ |
}␊ |
}␊ |
␊ |
|
);␊ |
}␊ |
␊ |
$mtnpostpush = realpath(dirname(__FILE__) . "/../../../scripts/mtn-post-push");␊ |
if (!file_exists($mtnpostpush)) {␊ |
throw new IDF_Scm_Exception(sprintf(␊ |
__('Could not find mtn-post-push script "%s".'), $mtnpostpush␊ |
));␊ |
}␊ |
␊ |
$shortname = $project->shortname;␊ |
$projectpath = sprintf($projecttempl, $shortname);␊ |
if (file_exists($projectpath)) {␊ |
|
//␊ |
// step 3) write monotonerc for access control␊ |
// FIXME: netsync access control is still missing!␊ |
//␊ |
$monotonerc =<<<END␊ |
function get_remote_automate_permitted(key_identity, command, options)␊ |
local read_only_commands = {␊ |
"get_corresponding_path", "get_content_changed", "tags", "branches",␊ |
"common_ancestors", "packet_for_fdelta", "packet_for_fdata",␊ |
"packets_for_certs", "packet_for_rdata", "get_manifest_of",␊ |
"get_revision", "select", "graph", "children", "parents", "roots",␊ |
"leaves", "ancestry_difference", "toposort", "erase_ancestors",␊ |
"descendents", "ancestors", "heads", "get_file_of", "get_file",␊ |
"interface_version", "get_attributes", "content_diff",␊ |
"file_merge", "show_conflicts", "certs", "keys"␊ |
}␊ |
␊ |
for _,v in ipairs(read_only_commands) do␊ |
if (v == command[1]) then␊ |
return true␊ |
end␊ |
end␊ |
// ␊ |
$monotonerc = file_get_contents(dirname(__FILE__) . "/SyncMonotone/monotonerc.tpl");␊ |
$monotonerc = str_replace(␊ |
array("%%MTNPOSTPUSH%%", "%%PROJECT%%"),␊ |
array($mtnpostpush, $shortname),␊ |
$monotonerc␊ |
);␊ |
␊ |
return false␊ |
end␊ |
END;␊ |
$rcfile = $projectpath.'/monotonerc';␊ |
␊ |
if (!file_put_contents($rcfile, $monotonerc, LOCK_EX)) {␊ |
throw new IDF_Scm_Exception(sprintf(␊ |
__('Could not write mtn configuration file "%s"'), $rcfile)␊ |
__('Could not write mtn configuration file "%s"'), $rcfile␊ |
));␊ |
}␊ |
␊ |
|
// have a backup copy of usher.conf around...␊ |
if (!file_put_contents($usher_config, $usher_rc, LOCK_EX)) {␊ |
throw new IDF_Scm_Exception(sprintf(␊ |
__('Could not write usher configuration file "%s"'), $usher_config)␊ |
__('Could not write usher configuration file "%s"'), $usher_config␊ |
));␊ |
}␊ |
␊ |
|
//␊ |
IDF_Scm_Monotone_Usher::reload();␊ |
}␊ |
␊ |
/**␊ |
* Update the timeline after a push␊ |
*␊ |
*/␊ |
public function processSyncTimeline($params)␊ |
{␊ |
$pname = $params['project'];␊ |
try {␊ |
$project = IDF_Project::getOr404($pname);␊ |
} catch (Pluf_HTTP_Error404 $e) {␊ |
Pluf_Log::event(array(␊ |
'IDF_Plugin_SyncMonotone::processSyncTimeline', ␊ |
'Project not found.',␊ |
array($pname, $params)␊ |
));␊ |
return false; // Project not found␊ |
}␊ |
␊ |
Pluf_Log::debug(array(␊ |
'IDF_Plugin_SyncMonotone::processSyncTimeline', ␊ |
'Project found', $pname, $project->id␊ |
));␊ |
IDF_Scm::syncTimeline($project, true);␊ |
Pluf_Log::event(array(␊ |
'IDF_Plugin_SyncMonotone::processSyncTimeline',␊ |
'sync', array($pname, $project->id)␊ |
));␊ |
}␊ |
}␊ |