[Pmwiki-users] autodetect diff and patch

Patrick R. Michaud pmichaud at pobox.com
Thu Jul 3 16:54:38 CDT 2003


Actually, I recommend against automatically running the `which diff`/
`which patch` command to determine the location of the diff(1) 
program--that's a bit of an expensive command to be running on every 
execution of PmWiki (i.e., every time that a PmWiki page is accessed).
Plus a lot of system administrators will be wary of executing programs
where a full path isn't specified--lots of room for some trojan horsing
to take place there.

I will release a version of PmWiki with the locations of diff(1) and
patch(1) as configuration variables (but not automatically located); I'll 
also set up an option that makes it easy to have PmWiki search for the
locations of diff/patch if they aren't available.

Many thanks for the excellent suggestion.

Pm


On Thu, Jul 03, 2003 at 02:04:27PM -0700, jdkim at socrates.Berkeley.EDU wrote:
> Okay, with the following patch, pmwiki will try to detect the location of
> diff and patch.  But if it fails, you can still set the variable in
> local.php.  For some reason, when I run "which patch" from within a php
> code, it returns /usr/bin/patch, even though the same command returns
> /usr/local/bin/patch when run in shell.
> 
> 
> *** pmwiki-old.php	Thu Jul  3 12:55:04 2003
> --- pmwiki.php	Thu Jul  3 13:45:52 2003
> ***************
> *** 33,38 ****
> --- 33,40 ----
>   $ScriptUrl = 'http://'.$HTTP_SERVER_VARS['HTTP_HOST'];
>   $ScriptUrl .= $HTTP_SERVER_VARS['SCRIPT_NAME'];
>   $ScriptDir = preg_replace("#/[^/]*\$#","",$ScriptUrl,1);
> + $SysDiff = trim(`which diff`);
> + $SysPatch = trim(`which patch`);
>   $WikiImgUrl = "$ScriptDir/pmwiki-50.gif";
>   $DiffKeepDays = 3650;
>   $WikiDir = "wiki.d";
> ***************
> *** 425,431 ****
>   }
> 
>   function Diff($oldtext,$newtext) {
> !   global $WikiDir;
>     $tempold = tempnam($WikiDir,"old");
>     if ($oldfp = fopen($tempold,"w")) {
>       fputs($oldfp,$oldtext);
> --- 427,433 ----
>   }
> 
>   function Diff($oldtext,$newtext) {
> !   global $WikiDir, $SysDiff;
>     $tempold = tempnam($WikiDir,"old");
>     if ($oldfp = fopen($tempold,"w")) {
>       fputs($oldfp,$oldtext);
> ***************
> *** 436,448 ****
>       fputs($newfp,$newtext);
>       fclose($newfp);
>     }
> !   @$diff = `/usr/bin/diff $tempold $tempnew`;
>     @unlink($tempold); @unlink($tempnew);
>     return $diff;
>   }
> 
>   function Patch($page,$restore) {
> !   global $WikiDir;
>     Lock(2);
>     $txtfile = tempnam($WikiDir,"txt");
>     $patfile = tempnam($WikiDir,"pat");
> --- 438,450 ----
>       fputs($newfp,$newtext);
>       fclose($newfp);
>     }
> !   @$diff = `$SysDiff $tempold $tempnew`;
>     @unlink($tempold); @unlink($tempnew);
>     return $diff;
>   }
> 
>   function Patch($page,$restore) {
> !   global $WikiDir, $SysPatch;
>     Lock(2);
>     $txtfile = tempnam($WikiDir,"txt");
>     $patfile = tempnam($WikiDir,"pat");
> ***************
> *** 458,464 ****
>         fputs($patfp,$v);
>         fclose($patfp);
>       }
> !     $diff = `/usr/bin/patch $txtfile $patfile 2>/dev/null`;
>     }
>     $text = implode('',file($txtfile));
>     @unlink($txtfile); @unlink($patfile);
> --- 460,466 ----
>         fputs($patfp,$v);
>         fclose($patfp);
>       }
> !     $diff = `$SysPatch $txtfile $patfile 2>/dev/null`;
>     }
>     $text = implode('',file($txtfile));
>     @unlink($txtfile); @unlink($patfile);
> ___
> 
> John Kim
> 
> 
> 
> _______________________________________________
> Pmwiki-users mailing list
> Pmwiki-users at pmichaud.com
> http://pmichaud.com/mailman/listinfo/pmwiki-users_pmichaud.com
> 




More information about the pmwiki-users mailing list