User Tools

Site Tools


cvs2rss.php

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
cvs2rss.php [2006/11/13 13:40]
209.8.22.198
cvs2rss.php [2006/11/13 14:32] (current)
andi old revision restored
Line 1: Line 1:
 +====== CVS2RSS ======
  
 +Sometimes you want to monitor changes in a CVS server were you have access to install a script like [[http://rebma.cit.cornell.edu/~bs235/projects/cvs2rss/|this one]]. This is when the following script comes in handy. It fetches the needed data from the remote CVS server and converts it to RSS to read in your RSS reader.
 +
 +You need the [[http://www.bitfolge.de/rsscreator-en.html|feedcreator class]] and the cvs commandline utility. 
 +
 +<code php>
 +<?php
 +//you need the feedcreator class from http://www.bitfolge.de/rsscreator-en.html
 +include("feedcreator.class.php");
 +
 +$CVS_BIN  = '/usr/bin/cvs'; #Path to the binary
 +$CVS_ROOT = ':pserver:anonymous@cvs.sourceforge.net:/cvsroot/videodb'; #The CVS root
 +$CVS_REP  = 'videodb'; #The repository in the above root
 +$CVS_DATE = '1 days ago'; #This is to limit the amount of data returned (CVS Date Syntax)
 +$CVS_LINK = 'http://cvs.sourceforge.net/viewcvs.py/videodb/'; #The URL to WebCVS of the project
 +$FILE     = 'cvs-videodb.xml'; #were to cache the resulting feed
 +
 +//Create the feed object
 +$rss = new UniversalFeedCreator();
 +$rss->useCached();
 +$rss->title = "CVS commits for $CVS_REP";
 +$rss->description = "Autogenerated RSS feed for all $CVS_REP commits $CVS_DATE";
 +$rss->link = "$CVS_LINK";
 +#$rss->syndicationURL = ; //FIXME
 +
 +//make params safe
 +$CVS_ROOT = escapeshellarg($CVS_ROOT);
 +$CVS_REP  = escapeshellarg($CVS_REP);
 +$CVS_DATE = escapeshellarg($CVS_DATE);
 +
 +//fetch data
 +$changes = cvs_commits();
 +
 +//add items if any
 +foreach($changes as $change){
 +  $fields = preg_split('!\s+!',$change);
 +
 +  ($fields[7] == 'CVSROOT') ? $dir = '' : $dir = $fields[7];
 +
 +  $file = $dir.'/'.$fields[6];
 +
 +  $item = new FeedItem();
 +  $item->title  = $file.' '.cvs_flags($fields[0]);
 +  $item->link   = $CVS_LINK.$file.'?rev='.$fields[5];
 +  $item->author = $fields[4];
 +  $item->date   = strtotime($fields[1].' '.$fields[2].' '.$fields[3]);
 +  $item->description = cvs_details($file,$fields[5]);
 +  $rss->addItem($item);
 +
 +}
 +
 +
 +$rss->saveFeed("RSS2.0", $FILE);
 +//endof main
 +
 +
 +
 +// fetch commit data
 +function cvs_commits(){
 +  global $CVS_BIN;
 +  global $CVS_ROOT;
 +  global $CVS_REP;
 +  global $CVS_DATE;
 +
 +  $changes = array();
 +  $cmd = "$CVS_BIN -d $CVS_ROOT history -c -a -l -p $CVS_REP -D $CVS_DATE";
 +  $changes = split("\n",shell_exec($cmd));
 +
 +  if(count($changes) == 0 || $changes[0] == 'No records selected.'){
 +    return array();
 +  }
 +  return $changes;
 +}
 +
 +// fetch file description
 +function cvs_details($file,$rev){
 +  global $CVS_BIN;
 +  global $CVS_ROOT;
 +
 +  @set_time_limit(30); //reset execution time
 +
 +  $file = escapeshellarg($file);
 +  $cmd  = "$CVS_BIN -d $CVS_ROOT rlog -r$rev $file";
 +
 +  $out = shell_exec($cmd);
 +
 +  if(preg_match('!description:(.*)$!s',$out,$matches)){
 +    $out = trim($matches[1]);
 +    $out = trim($out,'=-');
 +    $out = nl2br($out);
 +  }
 +  return $out;
 +}
 +
 +
 +// realname for cvs flags
 +function cvs_flags($flag){
 +  switch ($flag){
 +    case 'O': return 'checked out';
 +    case 'T': return 'tagged';
 +    case 'F': return 'released';
 +    case 'W': return 'removed from form entries';
 +    case 'U': return 'overwritten';
 +    case 'G': return 'merged';
 +    case 'C': return 'merged with conflicts';
 +    case 'M': return 'modified';
 +    case 'A': return 'added';
 +    case 'R': return 'removed file';
 +    case 'E': return 'exported';
 +  }
 +}
 +
 +?>
 +</code>
cvs2rss.php.txt ยท Last modified: 2006/11/13 14:32 by andi