1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
5 public $pagename = null;
6 public $filename = null;
7 public $version = null;
11 function __get($name) {
12 if ($name == 'content') {
13 $this->content = stream_get_contents($this->file->cat());
14 return $this->content;
18 static function commitNow() {
19 /* force any delayed push to invoke right now */
21 putenv("MTRACK_WIKI_COMMIT=");
24 static function loadByPageName($name) {
25 $w = new MTrackWikiItem($name);
32 static function getWC() {
33 if (self::$wc === null) {
34 self::getRepoAndRoot($repo);
35 self::$wc = $repo->getWorkingCopy();
40 static function getRepoAndRoot(&$repo) {
41 $repo = MTrackRepo::loadByName('default/wiki');
42 return $repo->getDefaultRoot();
45 function __construct($name, $version = null) {
46 $this->pagename = $name;
47 $this->filename = self::getRepoAndRoot($repo) . $name;
48 $suf = MTrackConfig::get('core', 'wikifilenamesuffix');
50 $this->filename .= $suf;
53 if ($version !== null) {
54 $this->file = $repo->file($this->filename, 'rev', $version);
56 $this->file = $repo->file($this->filename);
58 if ($this->file && $repo->history($this->filename, 1)) {
59 $this->version = $this->file->rev;
65 function save(MTrackChangeset $changeset) {
67 $lfilename = $this->pagename;
68 $suf = MTrackConfig::get('core', 'wikifilenamesuffix');
73 if (!strlen(trim($this->content))) {
74 if ($wc->file_exists($lfilename)) {
76 $wc->delFile($lfilename);
79 if (!$wc->file_exists($lfilename)) {
81 $elements = explode('/', $lfilename);
83 while (count($elements) > 1) {
84 $ent = array_shift($elements);
86 $base = join(DIRECTORY_SEPARATOR, $accum);
87 if (!$wc->file_exists($base)) {
88 if (!mkdir($wc->getDir() . DIRECTORY_SEPARATOR . $base)) {
90 "unable to mkdir(" . $wc->getDir() .
91 DIRECTORY_SEPARATOR . "$base)");
94 } else if (!is_dir($wc->getDir() . DIRECTORY_SEPARATOR . $base)) {
95 throw new Exception("$base is not a dir; cannot create $lfilename");
98 file_put_contents($wc->getDir() . DIRECTORY_SEPARATOR . $lfilename,
100 $wc->addFile($lfilename);
102 file_put_contents($wc->getDir() . DIRECTORY_SEPARATOR . $lfilename,
106 /* use an env var to signal to the commit hook that it does not
107 * need to make a changeset for this commit */
108 putenv("MTRACK_WIKI_COMMIT=1");
109 $wc->commit($changeset);
112 static function index_item($object)
114 list($ignore, $ident) = explode(':', $object, 2);
115 $w = MTrackWikiItem::loadByPageName($ident);
117 MTrackSearchDB::add("wiki:$w->pagename", array(
118 'wiki' => $w->content,
122 static function _get_parent_for_acl($objectid) {
123 if (preg_match("/^(wiki:.*)\/([^\/]+)$/", $objectid, $M)) {
126 if (preg_match("/^wiki:.*$/", $objectid, $M)) {
133 class MTrackWikiCommitListener implements IMTrackCommitListener {
134 function vetoCommit($msg, $files, $actions) {
138 function postCommit($msg, $files, $actions) {
139 /* is this affecting the wiki? */
141 $suf = MTrackConfig::get('core', 'wikifilenamesuffix');
142 foreach ($files as $name) {
143 list($repo, $fname) = explode('/', $name, 2);
144 if ($repo == 'wiki') {
145 if ($suf && substr($fname, -strlen($suf)) == $suf) {
146 $fname = substr($fname, 0, -strlen($suf));
151 /* MTRACK_WIKI_COMMIT is set by MTrackWikiItem when it commits,
152 * so we check for the absence of it to determine if mtrack has
153 * recorded a changeset record */
154 if (count($wiki) && getenv("MTRACK_WIKI_COMMIT") != "1") {
155 /* wiki being changed outside of the MTrackWikiItem class, so
156 * let's create a changeset record for the search engine to
157 * pick up and index this change */
158 foreach ($wiki as $name) {
159 $CS = MTrackChangeset::begin("wiki:$name", $msg);
166 static function register() {
167 $l = new MTrackWikiCommitListener;
168 MTrackCommitChecker::registerListener($l);
173 MTrackSearchDB::register_indexer('wiki', array('MTrackWikiItem', 'index_item'));
174 MTrackWikiCommitListener::register();
175 MTrackACL::registerAncestry('wiki', array('MTrackWikiItem', '_get_parent_for_acl'));