Fix root domains on Windows servers
[gitphp.git] / include / Util.class.php
blob:a/include/Util.class.php -> blob:b/include/Util.class.php
<?php <?php
/** /**
* Utility function class * Utility function class
* *
* @author Christopher Han <xiphux@gmail.com> * @author Christopher Han <xiphux@gmail.com>
* @copyright Copyright (c) 2010 Christopher Han * @copyright Copyright (c) 2010 Christopher Han
* @package GitPHP * @package GitPHP
*/ */
class GitPHP_Util class GitPHP_Util
{ {
   
/** /**
* Adds a trailing slash to a directory path if necessary * Adds a trailing slash to a directory path if necessary
* *
* @param string $path path to add slash to * @param string $path path to add slash to
* @param boolean $filesystem true if this is a filesystem path (to also check for backslash for windows paths) * @param boolean $filesystem true if this is a filesystem path (to also check for backslash for windows paths)
* @return string path with a trailing slash * @return string path with a trailing slash
*/ */
public static function AddSlash($path, $filesystem = true) public static function AddSlash($path, $filesystem = true)
{ {
if (empty($path)) if (empty($path))
return $path; return $path;
   
$end = substr($path, -1); $end = substr($path, -1);
   
if (!(( ($end == '/') || ($end == ':')) || ($filesystem && GitPHP_Util::IsWindows() && ($end == '\\')))) { if (!(( ($end == '/') || ($end == ':')) || ($filesystem && GitPHP_Util::IsWindows() && ($end == '\\')))) {
if (GitPHP_Util::IsWindows() && $filesystem) { if (GitPHP_Util::IsWindows() && $filesystem) {
$path .= '\\'; $path .= '\\';
} else { } else {
$path .= '/'; $path .= '/';
} }
} }
   
return $path; return $path;
} }
   
/** /**
* Tests if this is running on windows * Tests if this is running on windows
* *
* @return bool true if on windows * @return bool true if on windows
*/ */
public static function IsWindows() public static function IsWindows()
{ {
return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
} }
   
  public static function NullFile()
  {
  return self::IsWindows() ? 'NUL' : '/dev/null';
  }
   
/** /**
* Tests if this is a 64 bit machine * Tests if this is a 64 bit machine
* *
* @return bool true if on 64 bit * @return bool true if on 64 bit
*/ */
public static function Is64Bit() public static function Is64Bit()
{ {
return (strpos(php_uname('m'), '64') !== false); return (strpos(php_uname('m'), '64') !== false);
} }
   
/** /**
* Turn a string into a filename-friendly slug * Turn a string into a filename-friendly slug
* *
* @param string $str string to slugify * @param string $str string to slugify
* @return string slug * @return string slug
*/ */
public static function MakeSlug($str) public static function MakeSlug($str)
{ {
$from = array( $from = array(
'/' '/&'
); );
$to = array( $to = array(
'-' '--'
); );
return str_replace($from, $to, $str); return str_replace($from, $to, $str);
} }
   
/** /**
* Get the filename of a given path * Get the filename of a given path
* *
* Based on Drupal's basename * Based on Drupal's basename
* *
* @param string $path path * @param string $path path
* @param string $suffix optionally trim this suffix * @param string $suffix optionally trim this suffix
* @return string filename * @return string filename
*/ */
public static function BaseName($path, $suffix = null) public static function BaseName($path, $suffix = null)
{ {
$sep = '/'; $sep = '/';
if (GitPHP_Util::IsWindows()) { if (GitPHP_Util::IsWindows()) {
$sep .= '\\'; $sep .= '\\';
} }
   
$path = rtrim($path, $sep); $path = rtrim($path, $sep);
   
if (!preg_match('@[^' . preg_quote($sep) . ']+$@', $path, $matches)) { if (!preg_match('@[^' . preg_quote($sep) . ']+$@', $path, $matches)) {
return ''; return '';
} }
   
$filename = $matches[0]; $filename = $matches[0];
   
if ($suffix) { if ($suffix) {
$filename = preg_replace('@' . preg_quote($suffix, '@') . '$@', '', $filename); $filename = preg_replace('@' . preg_quote($suffix, '@') . '$@', '', $filename);
} }
return $filename; return $filename;
} }
   
/** /**
* Provides a geshi language for a given filename * Provides a geshi language for a given filename
* *
* @param string $filename file name * @param string $filename file name
* @return string language * @return string language
*/ */
public static function GeshiFilenameToLanguage($filename) public static function GeshiFilenameToLanguage($filename)
{ {
if (strncasecmp($filename, 'Makefile', 8) === 0) { if (strncasecmp($filename, 'Makefile', 8) === 0) {
return 'make'; return 'make';
} }
   
return null; return null;
} }
   
/** /**
* Recurses into a directory and lists files inside * Recurses into a directory and lists files inside
* *
* @param string $dir directory * @param string $dir directory
* @return string[] array of filenames * @return string[] array of filenames
*/ */
public static function ListDir($dir) public static function ListDir($dir)
{ {
$files = array(); $files = array();
if ($dh = opendir($dir)) { if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) { while (($file = readdir($dh)) !== false) {
if (($file == '.') || ($file == '..')) { if (($file == '.') || ($file == '..')) {
continue; continue;
} }
$fullFile = $dir . '/' . $file; $fullFile = $dir . '/' . $file;
if (is_dir($fullFile)) { if (is_dir($fullFile)) {
$subFiles = GitPHP_Util::ListDir($fullFile); $subFiles = GitPHP_Util::ListDir($fullFile);
if (count($subFiles) > 0) { if (count($subFiles) > 0) {
$files = array_merge($files, $subFiles); $files = array_merge($files, $subFiles);
} }
} else { } else {
$files[] = $fullFile; $files[] = $fullFile;
} }
} }
} }
return $files; return $files;
} }
   
/** /**
* Get the base install url (without index) * Get the base install url (without index)
* *
* @param boolean $full true to return full url (include protocol and hostname) * @param boolean $full true to return full url (include protocol and hostname)
* @return string base url * @return string base url
*/ */
public static function BaseUrl($full = false) public static function BaseUrl($full = false)
{ {
$baseurl = $_SERVER['SCRIPT_NAME']; $baseurl = $_SERVER['SCRIPT_NAME'];
if (substr_compare($baseurl, 'index.php', -9) === 0) if (substr_compare($baseurl, 'index.php', -9) === 0)
$baseurl = dirname($baseurl); $baseurl = dirname($baseurl);
if ($full) { if ($full) {
$baseurl = $_SERVER['HTTP_HOST'] . $baseurl; $baseurl = $_SERVER['HTTP_HOST'] . $baseurl;
if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'))
$baseurl = 'https://' . $baseurl; $baseurl = 'https://' . $baseurl;
else else
$baseurl = 'http://' . $baseurl; $baseurl = 'http://' . $baseurl;
} }
if (GitPHP_Util::IsWindows()) if (GitPHP_Util::IsWindows())
$baseurl = rtrim($baseurl, "\\"); $baseurl = rtrim($baseurl, "\\");
return rtrim($baseurl, "/"); return rtrim($baseurl, "/");
} }
   
/** /**
* Tests whether a function is allowed to be called * Tests whether a function is allowed to be called
* *
* @param string $function functio name * @param string $function functio name
* @return true if allowed * @return true if allowed
*/ */
public static function FunctionAllowed($function) public static function FunctionAllowed($function)
{ {
if (empty($function)) if (empty($function))
return false; return false;
   
$disabled = @ini_get('disable_functions'); $disabled = @ini_get('disable_functions');
if (!$disabled) { if (!$disabled) {
// no disabled functions // no disabled functions
// or ini_get is disabled so we can't reliably figure this out // or ini_get is disabled so we can't reliably figure this out
return true; return true;
} }
   
$disabledlist = explode(', ', $disabled); $disabledlist = explode(', ', $disabled);
return !in_array($function, $disabledlist); return !in_array($function, $disabledlist);
} }
   
} }
   
comments