Merge pull request #11 from bessl/patch-2
[gitphp.git] / include / Util.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
<?php
/**
 * Utility function class
 *
 * @author Christopher Han <xiphux@gmail.com>
 * @copyright Copyright (c) 2010 Christopher Han
 * @package GitPHP
 */
class GitPHP_Util
{
 
        /**
         * Adds a trailing slash to a directory path if necessary
         *
         * @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)
         * @return string path with a trailing slash
         */
        public static function AddSlash($path, $filesystem = true)
        {
                if (empty($path))
                        return $path;
 
                $end = substr($path, -1);
 
                if (!(( ($end == '/') || ($end == ':')) || ($filesystem && GitPHP_Util::IsWindows() && ($end == '\\')))) {
                        if (GitPHP_Util::IsWindows() && $filesystem) {
                                $path .= '\\';
                        } else {
                                $path .= '/';
                        }
                }
 
                return $path;
        }
 
        /**
         * Tests if this is running on windows
         *
         * @return bool true if on windows
         */
        public static function IsWindows()
        {
                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
         *
         * @return bool true if on 64 bit
         */
        public static function Is64Bit()
        {
                return (strpos(php_uname('m'), '64') !== false);
        }
 
        /**
         * Turn a string into a filename-friendly slug
         *
         * @param string $str string to slugify
         * @return string slug
         */
        public static function MakeSlug($str)
        {
                $from = array(
                        '/'
                );
                $to = array(
                        '-'
                );
                return str_replace($from, $to, $str);
        }
 
        /**
         * Get the filename of a given path
         *
         * Based on Drupal's basename
         *
         * @param string $path path
         * @param string $suffix optionally trim this suffix
         * @return string filename
         */
        public static function BaseName($path, $suffix = null)
        {
                $sep = '/';
                if (GitPHP_Util::IsWindows()) {
                        $sep .= '\\';
                }
 
                $path = rtrim($path, $sep);
 
                if (!preg_match('@[^' . preg_quote($sep) . ']+$@', $path, $matches)) {
                        return '';
                }
 
                $filename = $matches[0];
 
                if ($suffix) {
                        $filename = preg_replace('@' . preg_quote($suffix, '@') . '$@', '', $filename);
                }
                return $filename;
        }
 
        /**
         * Provides a geshi language for a given filename
         *
         * @param string $filename file name
         * @return string language
         */
        public static function GeshiFilenameToLanguage($filename)
        {
                if (strncasecmp($filename, 'Makefile', 8) === 0) {
                        return 'make';
                }
 
                return null;
        }
 
        /**
         * Recurses into a directory and lists files inside
         *
         * @param string $dir directory
         * @return string[] array of filenames
         */
        public static function ListDir($dir)
        {
                $files = array();
                if ($dh = opendir($dir)) {
                        while (($file = readdir($dh)) !== false) {
                                if (($file == '.') || ($file == '..')) {
                                        continue;
                                }
                                $fullFile = $dir . '/' . $file;
                                if (is_dir($fullFile)) {
                                        $subFiles = GitPHP_Util::ListDir($fullFile);
                                        if (count($subFiles) > 0) {
                                                $files = array_merge($files, $subFiles);
                                        }
                                } else {
                                        $files[] = $fullFile;
                                }
                        }
                }
                return $files;
        }
 
        /**
         * Get the base install url (without index)
         *
         * @param boolean $full true to return full url (include protocol and hostname)
         * @return string base url
         */
        public static function BaseUrl($full = false)
        {
                $baseurl = $_SERVER['SCRIPT_NAME'];
                if (substr_compare($baseurl, 'index.php', -9) === 0)
                        $baseurl = dirname($baseurl);
                if ($full) {
                        $baseurl = $_SERVER['HTTP_HOST'] . $baseurl;
                        if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'))
                                $baseurl = 'https://' . $baseurl;
                        else
                                $baseurl = 'http://' . $baseurl;
                }
                if (GitPHP_Util::IsWindows())
                        $baseurl = rtrim($baseurl, "\\");
                return rtrim($baseurl, "/");
        }
 
        /**
         * Tests whether a function is allowed to be called
         *
         * @param string $function functio name
         * @return true if allowed
         */
        public static function FunctionAllowed($function)
        {
                if (empty($function))
                        return false;
 
                $disabled = @ini_get('disable_functions');
                if (!$disabled) {
                        // no disabled functions
                        // or ini_get is disabled so we can't reliably figure this out
                        return true;
                }
 
                $disabledlist = explode(', ', $disabled);
                return !in_array($function, $disabledlist);
        }
 
}
 
comments