removed the top-level directory
This commit is contained in:
		
							
								
								
									
										157
									
								
								pecl-svn/examples/hook_emailcommit.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										157
									
								
								pecl-svn/examples/hook_emailcommit.php
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,157 @@ | ||||
| <?php | ||||
|  | ||||
|  | ||||
| /*  | ||||
|   example email on commit hook script | ||||
|   usage: | ||||
|   php ..path..to..this..file../hook_emailcommit.php "$REPOS" "$REV" who@gets.it >> /tmp/svnlog  | ||||
|    | ||||
|   Features: | ||||
|     - emails diff to email address | ||||
|     - adds error messages if it's a PHP file. | ||||
|     - sends popup messages to author on errors (using /hooks/popup.ini) | ||||
|       (use www.realpoup.it for winxp boxes) | ||||
|        | ||||
|   TODO:  | ||||
|     - write bindings for diff so that it doesnt have to use the command line.. | ||||
|    | ||||
|  | ||||
| */ | ||||
| dl('svn.so'); | ||||
|  | ||||
| class Subversion_EmailCommit { | ||||
|  | ||||
|     var $repos; | ||||
|     var $rev; | ||||
|     var $email; //who gets the commit messages. | ||||
|      | ||||
|     function start($args) { | ||||
|         print_r($args); | ||||
|         list( $cmd , $this->repos, $this->rev , $this->email ) = $args;  | ||||
|          | ||||
|         if ($this->repos{0} == '/') { | ||||
|             $this->repos = $this->repos = 'file://'. $this->repos; | ||||
|         } | ||||
|          | ||||
|         $this->rev  = (int) $this->rev; | ||||
|         $last = $this->rev -1 ; | ||||
|         // techncially where the diff is!? | ||||
|         require_once 'System.php'; | ||||
|         $svn = System::which('svn','/usr/bin/svn'); | ||||
|          | ||||
|         $cmd = "$svn diff -r{$last}:{$this->rev} $this->repos"; | ||||
|         $this->log = svn_log($this->repos, $this->rev,  $this->rev-1, 0, SVN_DISCOVER_CHANGED_PATHS); | ||||
|          | ||||
|         $syntax = $this->checkSyntax(); | ||||
|         //echo $cmd; | ||||
|          | ||||
|          | ||||
|         $diff = `$cmd`; | ||||
|         $diff = $this->log[0]['msg'] ."\n\n". $diff; | ||||
|          | ||||
|          | ||||
|         if ($syntax) { | ||||
|             $diff = $syntax ."\n\n". $diff; | ||||
|         } | ||||
|          | ||||
|         | ||||
|         $bits = explode('@', $this->email); | ||||
|          | ||||
|         $headers['From']    = "{$this->log[0]['author']} <{$this->log[0]['author']}@{$bits[1]}>"; | ||||
|         $headers['To']      = $this->email; | ||||
|         $headers['Subject'] = "[SVN {$bits[1]}] ". | ||||
|             ($syntax ? "ERROR!" : "") .  | ||||
|             $this->getFilenames() . " ({$this->rev})"; | ||||
|              | ||||
|         $headers['Date']    = date('r'); | ||||
|         $headers['X-Mailer']  = 'svn hook'; | ||||
|         // Create the mail object using the Mail::factory method | ||||
|         require_once 'Mail.php'; | ||||
|         $mail_object =& Mail::factory('smtp', $params); | ||||
|         $mail_object->send($this->email, $headers, $diff);  | ||||
|          | ||||
|         $this->sendPopup($syntax); | ||||
|          | ||||
|     } | ||||
|      | ||||
|     function sendPopup($syntax) { | ||||
|         if (!$syntax) { | ||||
|              | ||||
|             return; | ||||
|         } | ||||
|         if (substr($this->repos,0,strlen("file://")) != "file://") { | ||||
|         //    echo "repos is not file://"; | ||||
|             return; | ||||
|         } | ||||
|         $file = substr($this->repos,strlen("file://")) . '/hooks/popup.ini'; | ||||
|         if (!file_exists($file)) { | ||||
|         //    echo "$file does not exist"; | ||||
|             return; | ||||
|         } | ||||
|         $ar = parse_ini_file($file); | ||||
|         //print_r($ar); | ||||
|         if (!isset($ar[$this->log[0]['author']])) { | ||||
|             // no ip for this author. | ||||
|             echo "no match for author"; | ||||
|             return; | ||||
|         } | ||||
|         $ip = $ar[$this->log[0]['author']]; | ||||
|         $cmd = "/usr/bin/smbclient -M {$this->log[0]['author']} -I  {$ip}"; | ||||
|         //echo $cmd; | ||||
|         $fh = popen($cmd,'w'); | ||||
|         fwrite($fh, $data); | ||||
|         // end | ||||
|         fwrite($fh,chr(04)); | ||||
|         fclose($fh);  | ||||
|     } | ||||
|      | ||||
|      | ||||
|      | ||||
|      | ||||
|     function checkSyntax() | ||||
|     { | ||||
|         $ret = ''; | ||||
|         $ar = $this->log; | ||||
|         foreach($ar[0]['paths'] as $action) { | ||||
|             if (!in_array($action['action'],array('M','A'))) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (!preg_match('#\.php$#', $action['path'])) { | ||||
|                 continue; | ||||
|             } | ||||
|             $tmp = ini_get('session.save_path') . '/'.uniqid('tmp_php.').'.php'; | ||||
|              | ||||
|             $this->writeFile($tmp ,  | ||||
|                     svn_cat($this->repos . $action['path'],$this->rev)); | ||||
|              | ||||
|             $data = $data = `/usr/bin/php -l $tmp`; | ||||
|             unlink($tmp); | ||||
|             if (preg_match('/^No syntax errors/',$data)) { | ||||
|                 continue; | ||||
|             } | ||||
|             $ret .= "Error in {$action['path']}\n".$data; | ||||
|         } | ||||
|         return strlen($ret) ? $ret : false;  | ||||
|               | ||||
|     } | ||||
|      | ||||
|     function writeFile($target,$data)  | ||||
|     { | ||||
|         $fh = fopen($target,'w'); | ||||
|         fwrite($fh, $data); | ||||
|         fclose($fh); | ||||
|     } | ||||
|      | ||||
|     function getFileNames() | ||||
|     { | ||||
|         $ar = $this->log; | ||||
|         if (count($ar[0]['paths']) > 1) { | ||||
|             return "Multiple Files"; | ||||
|         } | ||||
|         return $ar[0]['paths'][0]['path']; | ||||
|     } | ||||
|       | ||||
| } | ||||
| ini_set('memory_limit','64M'); | ||||
| $x = new Subversion_EmailCommit; | ||||
| $x->start($_SERVER['argv']); | ||||
		Reference in New Issue
	
	Block a user