r78928 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r78927‎ | r78928 | r78929 >
Date:21:49, 23 December 2010
Author:demon
Status:ok
Tags:
Comment:
Revert r78903, r78904, r78905, r78906 (changing opendir() to use sfFinder class) per CR and wikitech-l objections.
It's arguable whether the code is cleaner either way, and adding all this code for the (relatively few) places we do file listings just isn't worth it.
Modified paths:
  • /trunk/phase3/includes/AutoLoader.php (modified) (history)
  • /trunk/phase3/includes/filerepo/ForeignAPIFile.php (modified) (history)
  • /trunk/phase3/includes/filerepo/LocalFile.php (modified) (history)
  • /trunk/phase3/includes/libs/sfFinder.php (deleted) (history)
  • /trunk/phase3/languages/Language.php (modified) (history)

Diff [purge]

Index: trunk/phase3/includes/filerepo/LocalFile.php
@@ -599,9 +599,19 @@
600600 $dir = $this->getThumbPath();
601601
602602 if ( is_dir( $dir ) ) {
603 - $files = array_map( 'basename', sfFinder::type('file')->maxdepth(0)->discard('.*')->in($dir) );
 603+ $handle = opendir( $dir );
 604+
 605+ if ( $handle ) {
 606+ while ( false !== ( $file = readdir( $handle ) ) ) {
 607+ if ( $file { 0 } != '.' ) {
 608+ $files[] = $file;
 609+ }
 610+ }
 611+
 612+ closedir( $handle );
 613+ }
604614 }
605 -
 615+
606616 return $files;
607617 }
608618
Index: trunk/phase3/includes/filerepo/ForeignAPIFile.php
@@ -168,9 +168,16 @@
169169 $files = array();
170170 $dir = $this->getThumbPath( $this->getName() );
171171 if ( is_dir( $dir ) ) {
172 - $files = array_map( 'basename', sfFinder::type('file')->maxdepth(0)->discard('.*')->in($dir) );
 172+ $handle = opendir( $dir );
 173+ if ( $handle ) {
 174+ while ( false !== ( $file = readdir($handle) ) ) {
 175+ if ( $file{0} != '.' ) {
 176+ $files[] = $file;
 177+ }
 178+ }
 179+ closedir( $handle );
 180+ }
173181 }
174 -
175182 return $files;
176183 }
177184
Index: trunk/phase3/includes/AutoLoader.php
@@ -476,10 +476,7 @@
477477 # includes/libs
478478 'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
479479 'Spyc' => 'includes/libs/spyc.php',
480 - 'sfFinder' => 'includes/libs/sfFinder.php',
481 - 'sfGlobToRegex' => 'includes/libs/sfFinder.php',
482 - 'sfNumberCompare' => 'includes/libs/sfFinder.php',
483 -
 480+
484481 # includes/media
485482 'BitmapHandler' => 'includes/media/Bitmap.php',
486483 'BitmapHandler_ClientOnly' => 'includes/media/Bitmap_ClientOnly.php',
Index: trunk/phase3/includes/libs/sfFinder.php
@@ -1,824 +0,0 @@
2 -<?php
3 -
4 -/*
5 - * This file is part of the symfony package.
6 - * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
7 - *
8 - * For the full copyright and license information, please view the LICENSE
9 - * file that was distributed with this source code.
10 - */
11 -
12 -
13 -/**
14 - *
15 - * Allow to build rules to find files and directories.
16 - *
17 - * All rules may be invoked several times, except for ->in() method.
18 - * Some rules are cumulative (->name() for example) whereas others are destructive
19 - * (most recent value is used, ->maxdepth() method for example).
20 - *
21 - * All methods return the current sfFinder object to allow easy chaining:
22 - *
23 - * $files = sfFinder::type('file')->name('*.php')->in(.);
24 - *
25 - * Interface loosely based on perl File::Find::Rule module.
26 - *
27 - * @license http://www.opensource.org/licenses/mit-license.php MIT License
28 - * @author Fabien Potencier <fabien.potencier@symfony-project.com>
29 - * @version SVN: $Id: sfFinder.class.php 30528 2010-08-04 16:25:14Z fabien $
30 - */
31 -class sfFinder
32 -{
33 - protected $type = 'file';
34 - protected $names = array();
35 - protected $prunes = array();
36 - protected $discards = array();
37 - protected $execs = array();
38 - protected $mindepth = 0;
39 - protected $sizes = array();
40 - protected $maxdepth = 1000000;
41 - protected $relative = false;
42 - protected $follow_link = false;
43 - protected $sort = false;
44 - protected $ignore_version_control = true;
45 -
46 - /**
47 - * Sets maximum directory depth.
48 - *
49 - * Finder will descend at most $level levels of directories below the starting point.
50 - *
51 - * @param int $level
52 - * @return sfFinder current sfFinder object
53 - */
54 - public function maxdepth($level)
55 - {
56 - $this->maxdepth = $level;
57 -
58 - return $this;
59 - }
60 -
61 - /**
62 - * Sets minimum directory depth.
63 - *
64 - * Finder will start applying tests at level $level.
65 - *
66 - * @param int $level
67 - * @return sfFinder current sfFinder object
68 - */
69 - public function mindepth($level)
70 - {
71 - $this->mindepth = $level;
72 -
73 - return $this;
74 - }
75 -
76 - public function get_type()
77 - {
78 - return $this->type;
79 - }
80 -
81 - /**
82 - * Sets the type of elements to returns.
83 - *
84 - * @param string $name directory or file or any (for both file and directory)
85 - * @return sfFinder new sfFinder object
86 - */
87 - public static function type($name)
88 - {
89 - $finder = new self();
90 - return $finder->setType($name);
91 - }
92 - /**
93 - * Sets the type of elements to returns.
94 - *
95 - * @param string $name directory or file or any (for both file and directory)
96 - * @return sfFinder Current object
97 - */
98 - public function setType($name)
99 - {
100 - $name = strtolower($name);
101 -
102 - if (substr($name, 0, 3) === 'dir')
103 - {
104 - $this->type = 'directory';
105 -
106 - return $this;
107 - }
108 - if ($name === 'any')
109 - {
110 - $this->type = 'any';
111 -
112 - return $this;
113 - }
114 -
115 - $this->type = 'file';
116 -
117 - return $this;
118 - }
119 -
120 - /*
121 - * glob, patterns (must be //) or strings
122 - */
123 - protected function to_regex($str)
124 - {
125 - if (preg_match('/^(!)?([^a-zA-Z0-9\\\\]).+?\\2[ims]?$/', $str))
126 - {
127 - return $str;
128 - }
129 -
130 - return sfGlobToRegex::glob_to_regex($str);
131 - }
132 -
133 - protected function args_to_array($arg_list, $not = false)
134 - {
135 - $list = array();
136 - $nbArgList = count($arg_list);
137 - for ($i = 0; $i < $nbArgList; $i++)
138 - {
139 - if (is_array($arg_list[$i]))
140 - {
141 - foreach ($arg_list[$i] as $arg)
142 - {
143 - $list[] = array($not, $this->to_regex($arg));
144 - }
145 - }
146 - else
147 - {
148 - $list[] = array($not, $this->to_regex($arg_list[$i]));
149 - }
150 - }
151 -
152 - return $list;
153 - }
154 -
155 - /**
156 - * Adds rules that files must match.
157 - *
158 - * You can use patterns (delimited with / sign), globs or simple strings.
159 - *
160 - * $finder->name('*.php')
161 - * $finder->name('/\.php$/') // same as above
162 - * $finder->name('test.php')
163 - *
164 - * @param list a list of patterns, globs or strings
165 - * @return sfFinder Current object
166 - */
167 - public function name()
168 - {
169 - $args = func_get_args();
170 - $this->names = array_merge($this->names, $this->args_to_array($args));
171 -
172 - return $this;
173 - }
174 -
175 - /**
176 - * Adds rules that files must not match.
177 - *
178 - * @see ->name()
179 - * @param list a list of patterns, globs or strings
180 - * @return sfFinder Current object
181 - */
182 - public function not_name()
183 - {
184 - $args = func_get_args();
185 - $this->names = array_merge($this->names, $this->args_to_array($args, true));
186 -
187 - return $this;
188 - }
189 -
190 - public function notName() {
191 - $args = func_get_args();
192 - return call_user_func_array( array( $this, 'not_name' ), $args );
193 - }
194 -
195 - /**
196 - * Adds tests for file sizes.
197 - *
198 - * $finder->size('> 10K');
199 - * $finder->size('<= 1Ki');
200 - * $finder->size(4);
201 - *
202 - * @param list a list of comparison strings
203 - * @return sfFinder Current object
204 - */
205 - public function size()
206 - {
207 - $args = func_get_args();
208 - $numargs = count($args);
209 - for ($i = 0; $i < $numargs; $i++)
210 - {
211 - $this->sizes[] = new sfNumberCompare($args[$i]);
212 - }
213 -
214 - return $this;
215 - }
216 -
217 - /**
218 - * Traverses no further.
219 - *
220 - * @param list a list of patterns, globs to match
221 - * @return sfFinder Current object
222 - */
223 - public function prune()
224 - {
225 - $args = func_get_args();
226 - $this->prunes = array_merge($this->prunes, $this->args_to_array($args));
227 -
228 - return $this;
229 - }
230 -
231 - /**
232 - * Discards elements that matches.
233 - *
234 - * @param list a list of patterns, globs to match
235 - * @return sfFinder Current object
236 - */
237 - public function discard()
238 - {
239 - $args = func_get_args();
240 - $this->discards = array_merge($this->discards, $this->args_to_array($args));
241 -
242 - return $this;
243 - }
244 -
245 - /**
246 - * Ignores version control directories.
247 - *
248 - * Currently supports Subversion, CVS, DARCS, Gnu Arch, Monotone, Bazaar-NG, GIT, Mercurial
249 - *
250 - * @param bool $ignore falase when version control directories shall be included (default is true)
251 - *
252 - * @return sfFinder Current object
253 - */
254 - public function ignore_version_control($ignore = true)
255 - {
256 - $this->ignore_version_control = $ignore;
257 -
258 - return $this;
259 - }
260 -
261 - public function ignoreVersionControl($ignore = true)
262 - {
263 - return $this->ignore_version_control($ignore);
264 - }
265 -
266 - public function ignoreVC($ignore = true)
267 - {
268 - return $this->ignore_version_control($ignore);
269 - }
270 -
271 - /**
272 - * Returns files and directories ordered by name
273 - *
274 - * @return sfFinder Current object
275 - */
276 - public function sort_by_name()
277 - {
278 - $this->sort = 'name';
279 -
280 - return $this;
281 - }
282 -
283 - public function sortByName()
284 - {
285 - return $this->sort_by_name();
286 - }
287 -
288 - /**
289 - * Returns files and directories ordered by type (directories before files), then by name
290 - *
291 - * @return sfFinder Current object
292 - */
293 - public function sort_by_type()
294 - {
295 - $this->sort = 'type';
296 -
297 - return $this;
298 - }
299 -
300 - public function sortByType()
301 - {
302 - return $this->sort_by_type();
303 - }
304 -
305 - /**
306 - * Executes function or method for each element.
307 - *
308 - * Element match if functino or method returns true.
309 - *
310 - * $finder->exec('myfunction');
311 - * $finder->exec(array($object, 'mymethod'));
312 - *
313 - * @param mixed function or method to call
314 - * @return sfFinder Current object
315 - */
316 - public function exec()
317 - {
318 - $args = func_get_args();
319 - $numargs = count($args);
320 - for ($i = 0; $i < $numargs; $i++)
321 - {
322 - if (is_array($args[$i]) && !method_exists($args[$i][0], $args[$i][1]))
323 - {
324 - throw new MWException(sprintf('method "%s" does not exist for object "%s".', $args[$i][1], $args[$i][0]));
325 - }
326 - if (!is_array($args[$i]) && !function_exists($args[$i]))
327 - {
328 - throw new MWException(sprintf('function "%s" does not exist.', $args[$i]));
329 - }
330 -
331 - $this->execs[] = $args[$i];
332 - }
333 -
334 - return $this;
335 - }
336 -
337 - /**
338 - * Returns relative paths for all files and directories.
339 - *
340 - * @return sfFinder Current object
341 - */
342 - public function relative()
343 - {
344 - $this->relative = true;
345 -
346 - return $this;
347 - }
348 -
349 - /**
350 - * Symlink following.
351 - *
352 - * @return sfFinder Current object
353 - */
354 - public function follow_link()
355 - {
356 - $this->follow_link = true;
357 -
358 - return $this;
359 - }
360 -
361 - public function followLink() {
362 - return $this->follow_link();
363 - }
364 -
365 - /**
366 - * Searches files and directories which match defined rules.
367 - *
368 - * @return array list of files and directories
369 - */
370 - public function in()
371 - {
372 - $files = array();
373 - $here_dir = getcwd();
374 -
375 - $finder = clone $this;
376 -
377 - if ($this->ignore_version_control)
378 - {
379 - $ignores = array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg');
380 -
381 - $finder->discard($ignores)->prune($ignores);
382 - }
383 -
384 - // first argument is an array?
385 - $numargs = func_num_args();
386 - $arg_list = func_get_args();
387 - if ($numargs === 1 && is_array($arg_list[0]))
388 - {
389 - $arg_list = $arg_list[0];
390 - $numargs = count($arg_list);
391 - }
392 -
393 - for ($i = 0; $i < $numargs; $i++)
394 - {
395 - $dir = realpath($arg_list[$i]);
396 -
397 - if (!is_dir($dir))
398 - {
399 - continue;
400 - }
401 -
402 - $dir = str_replace('\\', '/', $dir);
403 -
404 - // absolute path?
405 - if (!self::isPathAbsolute($dir))
406 - {
407 - $dir = $here_dir.'/'.$dir;
408 - }
409 -
410 - $new_files = str_replace('\\', '/', $finder->search_in($dir));
411 -
412 - if ($this->relative)
413 - {
414 - $new_files = str_replace(rtrim($dir, '/').'/', '', $new_files);
415 - }
416 -
417 - $files = array_merge($files, $new_files);
418 - }
419 -
420 - if ($this->sort === 'name')
421 - {
422 - sort($files);
423 - }
424 -
425 - return array_unique($files);
426 - }
427 -
428 - protected function search_in($dir, $depth = 0)
429 - {
430 - if ($depth > $this->maxdepth)
431 - {
432 - return array();
433 - }
434 -
435 - $dir = realpath($dir);
436 -
437 - if ((!$this->follow_link) && is_link($dir))
438 - {
439 - return array();
440 - }
441 -
442 - $files = array();
443 - $temp_files = array();
444 - $temp_folders = array();
445 - if (is_dir($dir) && is_readable($dir))
446 - {
447 - $current_dir = opendir($dir);
448 - while (false !== $entryname = readdir($current_dir))
449 - {
450 - if ($entryname == '.' || $entryname == '..') continue;
451 -
452 - $current_entry = $dir.DIRECTORY_SEPARATOR.$entryname;
453 - if ((!$this->follow_link) && is_link($current_entry))
454 - {
455 - continue;
456 - }
457 -
458 - if (is_dir($current_entry))
459 - {
460 - if ($this->sort === 'type')
461 - {
462 - $temp_folders[$entryname] = $current_entry;
463 - }
464 - else
465 - {
466 - if (($this->type === 'directory' || $this->type === 'any') && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->exec_ok($dir, $entryname))
467 - {
468 - $files[] = $current_entry;
469 - }
470 -
471 - if (!$this->is_pruned($dir, $entryname))
472 - {
473 - $files = array_merge($files, $this->search_in($current_entry, $depth + 1));
474 - }
475 - }
476 - }
477 - else
478 - {
479 - if (($this->type !== 'directory' || $this->type === 'any') && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->size_ok($dir, $entryname) && $this->exec_ok($dir, $entryname))
480 - {
481 - if ($this->sort === 'type')
482 - {
483 - $temp_files[] = $current_entry;
484 - }
485 - else
486 - {
487 - $files[] = $current_entry;
488 - }
489 - }
490 - }
491 - }
492 -
493 - if ($this->sort === 'type')
494 - {
495 - ksort($temp_folders);
496 - foreach($temp_folders as $entryname => $current_entry)
497 - {
498 - if (($this->type === 'directory' || $this->type === 'any') && ($depth >= $this->mindepth) && !$this->is_discarded($dir, $entryname) && $this->match_names($dir, $entryname) && $this->exec_ok($dir, $entryname))
499 - {
500 - $files[] = $current_entry;
501 - }
502 -
503 - if (!$this->is_pruned($dir, $entryname))
504 - {
505 - $files = array_merge($files, $this->search_in($current_entry, $depth + 1));
506 - }
507 - }
508 -
509 - sort($temp_files);
510 - $files = array_merge($files, $temp_files);
511 - }
512 -
513 - closedir($current_dir);
514 - }
515 -
516 - return $files;
517 - }
518 -
519 - protected function match_names($dir, $entry)
520 - {
521 - if (!count($this->names)) return true;
522 -
523 - // Flags indicating that there was attempts to match
524 - // at least one "not_name" or "name" rule respectively
525 - // to following variables:
526 - $one_not_name_rule = false;
527 - $one_name_rule = false;
528 -
529 - foreach ($this->names as $args)
530 - {
531 - list($not, $regex) = $args;
532 - $not ? $one_not_name_rule = true : $one_name_rule = true;
533 - if (preg_match($regex, $entry))
534 - {
535 - // We must match ONLY ONE "not_name" or "name" rule:
536 - // if "not_name" rule matched then we return "false"
537 - // if "name" rule matched then we return "true"
538 - return $not ? false : true;
539 - }
540 - }
541 -
542 - if ($one_not_name_rule && $one_name_rule)
543 - {
544 - return false;
545 - }
546 - else if ($one_not_name_rule)
547 - {
548 - return true;
549 - }
550 - else if ($one_name_rule)
551 - {
552 - return false;
553 - }
554 - return true;
555 - }
556 -
557 - protected function size_ok($dir, $entry)
558 - {
559 - if (0 === count($this->sizes)) return true;
560 -
561 - if (!is_file($dir.DIRECTORY_SEPARATOR.$entry)) return true;
562 -
563 - $filesize = filesize($dir.DIRECTORY_SEPARATOR.$entry);
564 - foreach ($this->sizes as $number_compare)
565 - {
566 - if (!$number_compare->test($filesize)) return false;
567 - }
568 -
569 - return true;
570 - }
571 -
572 - protected function is_pruned($dir, $entry)
573 - {
574 - if (0 === count($this->prunes)) return false;
575 -
576 - foreach ($this->prunes as $args)
577 - {
578 - $regex = $args[1];
579 - if (preg_match($regex, $entry)) return true;
580 - }
581 -
582 - return false;
583 - }
584 -
585 - protected function is_discarded($dir, $entry)
586 - {
587 - if (0 === count($this->discards)) return false;
588 -
589 - foreach ($this->discards as $args)
590 - {
591 - $regex = $args[1];
592 - if (preg_match($regex, $entry)) return true;
593 - }
594 -
595 - return false;
596 - }
597 -
598 - protected function exec_ok($dir, $entry)
599 - {
600 - if (0 === count($this->execs)) return true;
601 -
602 - foreach ($this->execs as $exec)
603 - {
604 - if (!call_user_func_array($exec, array($dir, $entry))) return false;
605 - }
606 -
607 - return true;
608 - }
609 -
610 - public static function isPathAbsolute($path)
611 - {
612 - if ($path{0} === '/' || $path{0} === '\\' ||
613 - (strlen($path) > 3 && ctype_alpha($path{0}) &&
614 - $path{1} === ':' &&
615 - ($path{2} === '\\' || $path{2} === '/')
616 - )
617 - )
618 - {
619 - return true;
620 - }
621 -
622 - return false;
623 - }
624 -}
625 -
626 -/**
627 - * Match globbing patterns against text.
628 - *
629 - * if match_glob("foo.*", "foo.bar") echo "matched\n";
630 - *
631 - * // prints foo.bar and foo.baz
632 - * $regex = glob_to_regex("foo.*");
633 - * for (array('foo.bar', 'foo.baz', 'foo', 'bar') as $t)
634 - * {
635 - * if (/$regex/) echo "matched: $car\n";
636 - * }
637 - *
638 - * sfGlobToRegex implements glob(3) style matching that can be used to match
639 - * against text, rather than fetching names from a filesystem.
640 - *
641 - * based on perl Text::Glob module.
642 - *
643 - * @package symfony
644 - * @subpackage util
645 - * @author Fabien Potencier <fabien.potencier@gmail.com> php port
646 - * @author Richard Clamp <richardc@unixbeard.net> perl version
647 - * @copyright 2004-2005 Fabien Potencier <fabien.potencier@gmail.com>
648 - * @copyright 2002 Richard Clamp <richardc@unixbeard.net>
649 - * @version SVN: $Id$
650 - */
651 -class sfGlobToRegex
652 -{
653 - protected static $strict_leading_dot = true;
654 - protected static $strict_wildcard_slash = true;
655 -
656 - public static function setStrictLeadingDot($boolean)
657 - {
658 - self::$strict_leading_dot = $boolean;
659 - }
660 -
661 - public static function setStrictWildcardSlash($boolean)
662 - {
663 - self::$strict_wildcard_slash = $boolean;
664 - }
665 -
666 - /**
667 - * Returns a compiled regex which is the equiavlent of the globbing pattern.
668 - *
669 - * @param string $glob pattern
670 - * @return string regex
671 - */
672 - public static function glob_to_regex($glob)
673 - {
674 - $first_byte = true;
675 - $escaping = false;
676 - $in_curlies = 0;
677 - $regex = '';
678 - $sizeGlob = strlen($glob);
679 - for ($i = 0; $i < $sizeGlob; $i++)
680 - {
681 - $car = $glob[$i];
682 - if ($first_byte)
683 - {
684 - if (self::$strict_leading_dot && $car !== '.')
685 - {
686 - $regex .= '(?=[^\.])';
687 - }
688 -
689 - $first_byte = false;
690 - }
691 -
692 - if ($car === '/')
693 - {
694 - $first_byte = true;
695 - }
696 -
697 - if ($car === '.' || $car === '(' || $car === ')' || $car === '|' || $car === '+' || $car === '^' || $car === '$')
698 - {
699 - $regex .= "\\$car";
700 - }
701 - elseif ($car === '*')
702 - {
703 - $regex .= ($escaping ? '\\*' : (self::$strict_wildcard_slash ? '[^/]*' : '.*'));
704 - }
705 - elseif ($car === '?')
706 - {
707 - $regex .= ($escaping ? '\\?' : (self::$strict_wildcard_slash ? '[^/]' : '.'));
708 - }
709 - elseif ($car === '{')
710 - {
711 - $regex .= ($escaping ? '\\{' : '(');
712 - if (!$escaping) ++$in_curlies;
713 - }
714 - elseif ($car === '}' && $in_curlies)
715 - {
716 - $regex .= ($escaping ? '}' : ')');
717 - if (!$escaping) --$in_curlies;
718 - }
719 - elseif ($car === ',' && $in_curlies)
720 - {
721 - $regex .= ($escaping ? ',' : '|');
722 - }
723 - elseif ($car === '\\')
724 - {
725 - if ($escaping)
726 - {
727 - $regex .= '\\\\';
728 - $escaping = false;
729 - }
730 - else
731 - {
732 - $escaping = true;
733 - }
734 -
735 - continue;
736 - }
737 - else
738 - {
739 - $regex .= $car;
740 - }
741 - $escaping = false;
742 - }
743 -
744 - return '#^'.$regex.'$#';
745 - }
746 -
747 - public static function globToRegex($glob) {
748 - return self::glob_to_regex($glob);
749 - }
750 -
751 -}
752 -
753 -/**
754 - * Numeric comparisons.
755 - *
756 - * sfNumberCompare compiles a simple comparison to an anonymous
757 - * subroutine, which you can call with a value to be tested again.
758 -
759 - * Now this would be very pointless, if sfNumberCompare didn't understand
760 - * magnitudes.
761 -
762 - * The target value may use magnitudes of kilobytes (k, ki),
763 - * megabytes (m, mi), or gigabytes (g, gi). Those suffixed
764 - * with an i use the appropriate 2**n version in accordance with the
765 - * IEC standard: http://physics.nist.gov/cuu/Units/binary.html
766 - *
767 - * based on perl Number::Compare module.
768 - *
769 - * @author Fabien Potencier <fabien.potencier@gmail.com> php port
770 - * @author Richard Clamp <richardc@unixbeard.net> perl version
771 - * @copyright 2004-2005 Fabien Potencier <fabien.potencier@gmail.com>
772 - * @copyright 2002 Richard Clamp <richardc@unixbeard.net>
773 - * @see http://physics.nist.gov/cuu/Units/binary.html
774 - * @version SVN: $Id$
775 - */
776 -class sfNumberCompare
777 -{
778 - protected $test = '';
779 -
780 - public function __construct($test)
781 - {
782 - $this->test = $test;
783 - }
784 -
785 - public function test($number)
786 - {
787 - if (!preg_match('{^([<>]=?)?(.*?)([kmg]i?)?$}i', $this->test, $matches))
788 - {
789 - throw new MWException(sprintf('don\'t understand "%s" as a test.', $this->test));
790 - }
791 -
792 - $target = array_key_exists(2, $matches) ? $matches[2] : '';
793 - $magnitude = array_key_exists(3, $matches) ? $matches[3] : '';
794 - if (strtolower($magnitude) === 'k') $target *= 1000;
795 - if (strtolower($magnitude) === 'ki') $target *= 1024;
796 - if (strtolower($magnitude) === 'm') $target *= 1000000;
797 - if (strtolower($magnitude) === 'mi') $target *= 1024*1024;
798 - if (strtolower($magnitude) === 'g') $target *= 1000000000;
799 - if (strtolower($magnitude) === 'gi') $target *= 1024*1024*1024;
800 -
801 - $comparison = array_key_exists(1, $matches) ? $matches[1] : '==';
802 - if ($comparison === '==' || $comparison == '')
803 - {
804 - return ($number == $target);
805 - }
806 - if ($comparison === '>')
807 - {
808 - return ($number > $target);
809 - }
810 - if ($comparison === '>=')
811 - {
812 - return ($number >= $target);
813 - }
814 - if ($comparison === '<')
815 - {
816 - return ($number < $target);
817 - }
818 - if ($comparison === '<=')
819 - {
820 - return ($number <= $target);
821 - }
822 -
823 - return false;
824 - }
825 -}
Index: trunk/phase3/languages/Language.php
@@ -476,14 +476,14 @@
477477
478478 global $IP;
479479 $names = array();
480 -
481 - foreach( sfFinder::type('file')->maxdepth(0)->in( "$IP/languages/messages" ) as $file ) {
 480+ $dir = opendir( "$IP/languages/messages" );
 481+ while ( false !== ( $file = readdir( $dir ) ) ) {
482482 $code = self::getCodeFromFileName( $file, 'Messages' );
483483 if ( $code && isset( $allNames[$code] ) ) {
484484 $names[$code] = $allNames[$code];
485485 }
486486 }
487 -
 487+ closedir( $dir );
488488 return $names;
489489 }
490490

Past revisions this follows-up on

RevisionCommit summaryAuthorDate
r78903Per discussion on mailing list, modifying some uses of opendir()/readdir()/cl...soxred9318:20, 23 December 2010
r78904Followup to r78903: Forgot to svn addsoxred9318:22, 23 December 2010
r78905Followup to r78903: Add SVN propssoxred9318:24, 23 December 2010
r78906Followup to r78903: Add proper SVN infosoxred9318:28, 23 December 2010

Status & tagging log