summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2006-05-11 21:14:50 +0200
committerAndreas Gohr <andi@splitbrain.org>2006-05-11 21:14:50 +0200
commit7421c3cce15c5712b2bfb76cd5dd857771e8b6b8 (patch)
tree94f8835d3a9a260c10900de23b622beda75d72d4
parent4fa2dffce72d182e25295de4947077cf52ba1f2b (diff)
downloadrpg-7421c3cce15c5712b2bfb76cd5dd857771e8b6b8.tar.gz
rpg-7421c3cce15c5712b2bfb76cd5dd857771e8b6b8.tar.bz2
more info is gathered on metaupdate in background indexer
The background indexer now gathers info on contributors and modification dates from the changelog when adding the missing meta info. A new io_grep function was added which might be useful for other parts in the Wiki as well. darcs-hash:20060511191450-7ad00-baba1b48ea03b823c88a480862c612316f159b5a.gz
-rw-r--r--inc/io.php41
-rw-r--r--lib/exe/indexer.php21
2 files changed, 62 insertions, 0 deletions
diff --git a/inc/io.php b/inc/io.php
index ae1a3611c..a44e498a2 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -366,4 +366,45 @@ function io_runcmd($cmd){
return $ret;
}
+/**
+ * Search a file for matching lines
+ *
+ * This is probably not faster than file()+preg_grep() but less
+ * memory intensive because not the whole file needs to be loaded
+ * at once.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $file The file to search
+ * @param string $pattern PCRE pattern
+ * @param int $max How many lines to return (0 for all)
+ * @param bool $baxkref When true returns array with backreferences instead of lines
+ * @return matching lines or backref, false on error
+ */
+function io_grep($file,$pattern,$max=0,$backref=false){
+ $fh = @fopen($file,'r');
+ if(!$fh) return false;
+ $matches = array();
+
+ $cnt = 0;
+ $line = '';
+ while (!feof($fh)) {
+ $line .= fgets($fh, 4096); // read full line
+ if(substr($line,-1) != "\n") continue;
+
+ // check if line matches
+ if(preg_match($pattern,$line,$match)){
+ if($backref){
+ $matches[] = $match;
+ }else{
+ $matches[] = $line;
+ }
+ $cnt++;
+ }
+ if($max && $max == $cnt) break;
+ $line = '';
+ }
+ fclose($fh);
+ return $matches;
+}
+
//Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php
index 05bcb5827..5359e16fc 100644
--- a/lib/exe/indexer.php
+++ b/lib/exe/indexer.php
@@ -91,10 +91,31 @@ function metaUpdate(){
// rendering needed?
if (@file_exists($file)) return false;
+ if (!@file_exists(wikiFN($ID))) return false;
+ require_once(DOKU_INC.'inc/common.php');
require_once(DOKU_INC.'inc/parserutils.php');
+ global $conf;
+
+
+ // gather some additional info from changelog
+ $info = io_grep($conf['changelog'],
+ '/^(\d+)\t(\d+\.\d+\.\d+\.\d+)\t'.preg_quote($ID,'/').'\t([^\t]+)\t([^\t\n]+)/',
+ 0,true);
$meta = array();
+ if(count($info)){
+ $meta['date']['created'] = $info[0][1];
+ foreach($info as $item){
+ if($item[4] != '*'){
+ $meta['date']['modified'] = $item[1];
+ if($item[3]){
+ $meta['contributor'][$item[3]] = $item[3];
+ }
+ }
+ }
+ }
+
$meta = p_render_metadata($ID, $meta);
io_saveFile($file, serialize($meta));