Rev Author Line No. Line
185 miho 1 <?php
2 # vim:et:ts=3:sts=3:sw=3:fdm=marker:
3  
4 // WebSVN - Subversion repository viewing via the web using PHP
5 // Copyright © 2004-2006 Tim Armes, Matt Sicker
6 //
7 // This program is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 2 of the License, or
10 // (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 //
21 // --
22 //
23 // configclass.inc4
24 //
25 // General class for handling configuration options
26  
27 require_once("include/command.inc");
28 require_once("include/auth.inc");
29 require_once("include/version.inc");
30  
31 // Auxillary functions used to sort repositories by name/group
32  
33 // {{{ cmpReps($a, $b)
34  
35 function cmpReps($a, $b)
36 {
37 // First, sort by group
38 $g = strcasecmp($a->group, $b->group);
39 if ($g)
40 return $g;
41  
42 // Same group? Sort by name
43 return strcasecmp($a->name, $b->name);
44 }
45  
46 // }}}
47  
48 // {{{ cmpGroups($a, $b)
49  
50 function cmpGroups($a, $b)
51 {
52 $g = strcasecmp($a->group, $b->group);
53 if ($g)
54 return $g;
55  
56 return 0;
57 }
58  
59 // }}}
60  
61 // {{{ mergesort(&$array, [$cmp_function])
62  
63 function mergesort(&$array, $cmp_function = 'strcmp')
64 {
65 // Arrays of size < 2 require no action
66  
67 if (count($array) < 2)
68 return;
69  
70 // Split the array in half
71 $halfway = count($array) / 2;
72 $array1 = array_slice($array, 0, $halfway);
73 $array2 = array_slice($array, $halfway);
74  
75 // Recurse to sort the two halves
76 mergesort($array1, $cmp_function);
77 mergesort($array2, $cmp_function);
78  
79 // If all of $array1 is <= all of $array2, just append them.
80 if (call_user_func($cmp_function, end($array1), $array2[0]) < 1)
81 {
82 $array = array_merge($array1, $array2);
83 return;
84 }
85  
86 // Merge the two sorted arrays into a single sorted array
87 $array = array();
88 $ptr1 = $ptr2 = 0;
89 while ($ptr1 < count($array1) && $ptr2 < count($array2))
90 {
91 if (call_user_func($cmp_function, $array1[$ptr1], $array2[$ptr2]) < 1)
92 {
93 $array[] = $array1[$ptr1++];
94 }
95 else
96 {
97 $array[] = $array2[$ptr2++];
98 }
99 }
100  
101 // Merge the remainder
102 while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
103 while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
104  
105 return;
106 }
107  
108 // }}}
109  
110 // A Repository configuration class
111  
112 Class Repository
113 {
114 // {{{ Properties
115  
116 var $name;
117 var $svnName;
118 var $path;
119 var $group;
120 var $username;
121 var $password;
122  
123 // Local configuration options must start off unset
124  
125 var $allowDownload;
126 var $minDownloadLevel;
127 var $allowedExceptions = array();
128 var $disallowedExceptions = array();
129 var $rss;
130 var $spaces;
131 var $ignoreSvnMimeTypes;
132 var $ignoreWebSVNContentTypes;
133 var $bugtraq;
134 var $auth;
135 var $contentEnc;
136 var $templatePath;
137  
138 // }}}
139  
140 // {{{ __construct($name, $svnName, $path, [$group, [$username, [$password]]])
141  
142 function Repository($name, $svnName, $path, $group = NULL, $username = NULL, $password = NULL)
143 {
144 $this->name = $name;
145 $this->svnName = $svnName;
146 $this->path = $path;
147 $this->group = $group;
148 $this->username = $username;
149 $this->password = $password;
150 }
151  
152 // }}}
153  
154 // {{{ getDisplayName()
155  
156 function getDisplayName()
157 {
158 if(!empty($this->group))
159 return $this->group.".".$this->name;
160 else
161 return $this->name;
162 }
163  
164 // }}}
165  
166 // {{{ svnParams
167  
168 function svnParams()
169 {
170 if (!empty($this->username))
171 return " --username ".$this->username." --password ".$this->password." ";
172 else
173 return " ";
174 }
175  
176 // }}}
177  
178 // Local configuration accessors
179  
180 // {{{ RSS Feed
181  
182 function hideRSS()
183 {
184 $this->rss = false;
185 }
186  
187 function showRSS()
188 {
189 $this->rss = true;
190 }
191  
192 function getHideRSS()
193 {
194 global $config;
195  
196 if (isset($this->rss))
197 return $this->rss;
198  
199 return $config->getHideRSS();
200 }
201  
202 // }}}
203  
204 // {{{ Download
205  
206 function allowDownload()
207 {
208 $this->allowDownload = true;
209 }
210  
211 function disallowDownload()
212 {
213 $this->allowDownload = false;
214 }
215  
216 function getAllowDownload()
217 {
218 global $config;
219  
220 if (isset($this->allowDownload))
221 return $this->allowDownload;
222  
223 return $config->getAllowDownload();
224 }
225  
226 function setMinDownloadLevel($level)
227 {
228 $this->minDownloadLevel = $level;
229 }
230  
231 function getMinDownloadLevel()
232 {
233 global $config;
234  
235 if (isset($this->minDownloadLevel))
236 return $this->minDownloadLevel;
237  
238 return $config->getMinDownloadLevel();
239 }
240  
241 function addAllowedDownloadException($path)
242 {
243 if ($path{strlen($path) - 1} != "/")
244 $path .= "/";
245  
246 $this->allowedExceptions[] = $path;
247 }
248  
249 function addDisallowedDownloadException($path)
250 {
251 if ($path{strlen($path) - 1} != "/")
252 $path .= "/";
253  
254 $this->disallowedExceptions[] = $path;
255 }
256  
257 function isDownloadAllowed($path)
258 {
259 global $config;
260  
261 // Check global download option
262 if (!$this->getAllowDownload())
263 return false;
264  
265 // Check with access module
266 if (!$this->hasUnrestrictedReadAccess($path))
267 return false;
268  
269 $subs = explode("/", $path);
270 $level = count($subs) - 2;
271 if ($level >= $this->getMinDownloadLevel())
272 {
273 // Level OK, search for disallowed exceptions
274  
275 if ($config->findException($path, $this->disallowedExceptions))
276 return false;
277  
278 if ($config->findException($path, $config->disallowedExceptions))
279 return false;
280  
281 return true;
282 }
283 else
284 {
285 // Level not OK, search for disallowed exceptions
286  
287 if ($config->findException($path, $this->allowedExceptions))
288 return true;
289  
290 if ($config->findException($path, $config->allowedExceptions))
291 return true;
292  
293 return false;
294 }
295 }
296  
297 // }}}
298  
299 // {{{ Templates
300  
301 function setTemplatePath($path)
302 {
303 $lastchar = substr($path, -1, 1);
304 if (!($lastchar == DIRECTORY_SEPARATOR ||
305 $lastchar == '/' ||
306 $lastchar == '\\'))
307 $path .= DIRECTORY_SEPARATOR;
308  
309 $this->templatePath = $path;
310 }
311  
312 function getTemplatePath()
313 {
314 global $config;
315 if (!empty($this->templatePath))
316 return $this->templatePath;
317 else
318 return $config->getTemplatePath();
319 }
320  
321 // }}}
322  
323 // {{{ Tab expansion
324  
325 function expandTabsBy($sp)
326 {
327 $this->spaces = $sp;
328 }
329  
330 function getExpandTabsBy()
331 {
332 global $config;
333  
334 if (isset($this->spaces))
335 return $this->spaces;
336  
337 return $config->getExpandTabsBy();
338 }
339  
340 // }}}
341  
342 // {{{ MIME-Type Handing
343  
344 function ignoreSvnMimeTypes()
345 {
346 $this->ignoreSvnMimeTypes = true;
347 }
348  
349 function useSvnMimeTypes()
350 {
351 $this->ignoreSvnMimeTypes = false;
352 }
353  
354 function getIgnoreSvnMimeTypes()
355 {
356 global $config;
357  
358 if (isset($this->ignoreSvnMimeTypes))
359 return $this->ignoreSvnMimeTypes;
360  
361 return $config->getIgnoreSvnMimeTypes();
362 }
363  
364 function ignoreWebSVNContentTypes()
365 {
366 $this->ignoreWebSVNContentTypes = true;
367 }
368  
369 function useWebSVNContentTypes()
370 {
371 $this->ignoreWebSVNContentTypes = false;
372 }
373  
374 function getIgnoreWebSVNContentTypes()
375 {
376 global $config;
377  
378 if (isset($this->ignoreWebSVNContentTypes))
379 return $this->ignoreWebSVNContentTypes;
380  
381 return $config->getIgnoreWebSVNContentTypes();
382 }
383  
384 // }}}
385  
386 // {{{ Issue Tracking
387  
388 function useBugtraqProperties()
389 {
390 $this->bugtraq = true;
391 }
392  
393 function ignoreBugtraqProperties()
394 {
395 $this->bugtraq = false;
396 }
397  
398 function getBugtraq()
399 {
400 global $config;
401  
402 if (isset($this->bugtraq))
403 return $this->bugtraq;
404  
405 return $config->getBugtraq();
406 }
407  
408 // }}}
409  
410 // {{{ Encodings
411  
412 function setContentEncoding($contentEnc)
413 {
414 $this->contentEnc = $contentEnc;
415 }
416  
417 function getContentEncoding()
418 {
419 global $config;
420  
421 if (isset($this->contentEnc))
422 return $this->contentEnc;
423  
424 return $config->getContentEncoding();
425 }
426  
427 // }}}
428  
429 // {{{ Authentication
430  
431 function useAuthenticationFile($file)
432 {
433 if (is_readable($file))
434 $this->auth =& new Authentication($file);
435 else
436 die('Unable to read authentication file "'.$file.'"');
437 }
438  
439 function hasReadAccess($path, $checkSubFolders = false)
440 {
441 global $config;
442  
443 $a = null;
444 if (isset($this->auth))
445 $a =& $this->auth;
446 else
447 $a =& $config->getAuth();
448  
449 if (!empty($a))
450 return $a->hasReadAccess($this->svnName, $path, $checkSubFolders);
451  
452 // No auth file - free access...
453 return true;
454 }
455  
456 function hasUnrestrictedReadAccess($path)
457 {
458 global $config;
459  
460 $a = null;
461 if (isset($this->auth))
462 $a =& $this->auth;
463 else
464 $a =& $config->getAuth();
465  
466 if (!empty($a))
467 return $a->hasUnrestrictedReadAccess($this->svnName, $path);
468  
469 // No auth file - free access...
470 return true;
471 }
472  
473 // }}}
474  
475 }
476  
477 // The general configuration class
478  
479 Class Config
480 {
481 // {{{ Properties
482  
483 // Tool path locations
484  
485 var $svnlook = "svnlook";
486 var $svn = "svn --non-interactive --config-dir /tmp";
487 var $svn_noparams = "svn --config-dir /tmp";
488 var $diff = "diff";
489 var $enscript ="enscript";
490 var $sed = "sed";
491 var $gzip = "gzip";
492 var $tar = "tar";
493  
494 // Other configuration items
495  
496 var $treeView = true;
497 var $flatIndex = true;
498 var $openTree = false;
499 var $serverIsWindows = false;
500 var $phpCompatEnabled = false;
501 var $cacheResults = false;
502 var $multiViews = false;
503 var $useEnscript = false;
504 var $allowDownload = false;
505 var $minDownloadLevel = 0;
506 var $allowedExceptions = array();
507 var $disallowedExceptions = array();
508 var $rss = true;
509 var $spaces = 8;
510 var $bugtraq = false;
511 var $auth = "";
512  
513 var $templatePath = "./templates/Standard/";
514 var $phpCompatPath = './include/PHP/Compat.php';
515  
516 var $ignoreSvnMimeTypes = false;
517 var $ignoreWebSVNContentTypes = false;
518  
519 var $subversionMajorVersion = "";
520 var $subversionMinorVersion = "";
521  
522 // Default character encodings
523 var $inputEnc = ""; // Encoding of output returned from command line
524 var $contentEnc = ""; // Encoding of repository content
525 var $outputEnc = "UTF-8"; // Encoding of web page. Now forced to UTF-8
526  
527 var $quote = "'";
528 var $pathSeparator = ":";
529  
530 var $_repositories;
531  
532 // }}}
533  
534 // {{{ __construct()
535  
536 function Config()
537 {
538 }
539  
540 // }}}
541  
542 // {{{ Repository configuration
543  
544 function addRepository($name, $url, $group = NULL, $username = NULL, $password = NULL)
545 {
546 $url = str_replace(DIRECTORY_SEPARATOR, "/", $url);
547  
548 if ($url{strlen($url) - 1} == "/")
549 $url = substr($url, 0, -1);
550  
551 $svnName = substr($url, strrpos($url, "/") + 1);
552 $this->_repositories[] = new Repository($name, $svnName, $url, $group, $username, $password);
553 }
554  
555 function getRepositories()
556 {
557 return $this->_repositories;
558 }
559  
560 function &findRepository($name)
561 {
562 foreach ($this->_repositories as $index => $rep)
563 {
564 if (strcmp($rep->getDisplayName(), $name) == 0)
565 {
566 $repref =& $this->_repositories[$index];
567 return $repref;
568 }
569 }
570  
571 print "ERROR: Unable to find repository '$name'";
572 exit;
573 }
574  
575 // }}}
576  
577 // {{{ setServerIsWindows
578 //
579 // The server is running on Windows
580  
581 function setServerIsWindows()
582 {
583 $this->serverIsWindows = true;
584  
585 // Try to set the input encoding intelligently
586  
587 $cp = 0;
588 if ($cp = @shell_exec("CHCP"))
589 {
590 $cp = trim(substr($cp, strpos($cp, ":") + 1));
591 settype($cp, "integer");
592 }
593  
594 // Use the most sensible default value if that failed
595 if ($cp == 0) $cp = 850;
596  
597 // We assume, as a default, that the encoding of the repository contents is
598 // in iso-8859-1, to be compatible with compilers and the like.
599 $this->setInputEncoding("CP$cp", "iso-8859-1");
600  
601 // On Windows machines, use double quotes around command line parameters
602 $this->quote = '"';
603  
604 // On Windows, semicolon separates path entries in a list rather than colon.
605 $this->pathSeparator = ";";
606 }
607  
608 // }}}
609  
610 // {{{ setPHPCompatEnabled
611 //
612 // Used for PHP4
613  
614 function setPHPCompatEnabled() {
615 $this->phpCompatEnabled = true;
616 }
617  
618 function isPHPCompatEnabled() {
619 return $this->phpCompatEnabled;
620 }
621  
622 // }}}
623  
624 // {{{ Caching
625  
626 // setCachingOn
627 //
628 // Set result caching on
629  
630 function setCachingOn()
631 {
632 $this->cacheResults = true;
633 }
634  
635 function isCachingOn()
636 {
637 return $this->cacheResults;
638 }
639  
640 // }}}
641  
642 // {{{ MultiViews
643  
644 // useMultiViews
645 //
646 // Use MultiViews to access the repository
647  
648 function useMultiViews()
649 {
650 $this->multiViews = true;
651 }
652  
653 function getUseMultiViews()
654 {
655 return $this->multiViews;
656 }
657  
658 // }}}
659  
660 // {{{ Enscript
661  
662 // useEnscript
663 //
664 // Use Enscript to colourise listings
665  
666 function useEnscript()
667 {
668 $this->useEnscript = true;
669 }
670  
671 function getUseEnscript()
672 {
673 return $this->useEnscript;
674 }
675  
676 // }}}
677  
678 // {{{ RSS
679  
680 // offerRSS
681 //
682 // Use Enscript to colourise listings
683  
684 function hideRSS($myrep = 0)
685 {
686 if (empty($myrep))
687 $this->rss = false;
688 else
689 {
690 $repo =& $this->findRepository($myrep);
691 $repo->hideRSS();
692 }
693 }
694  
695 function getHideRSS()
696 {
697 return $this->rss;
698 }
699  
700 // }}}
701  
702 // {{{ Downloads
703  
704 // allowDownload
705 //
706 // Allow download of tarballs
707  
708 function allowDownload($myrep = 0)
709 {
710 if (empty($myrep))
711 $this->allowDownload = true;
712 else
713 {
714 $repo =& $this->findRepository($myrep);
715 $repo->allowDownload();
716 }
717 }
718  
719 function disallowDownload($myrep = 0)
720 {
721 if (empty($myrep))
722 $this->allowDownload = false;
723 else
724 {
725 $repo =& $this->findRepository($myrep);
726 $repo->disallowDownload();
727 }
728 }
729  
730 function getAllowDownload()
731 {
732 return $this->allowDownload;
733 }
734  
735 function setMinDownloadLevel($level, $myrep = 0)
736 {
737 if (empty($myrep))
738 $this->minDownloadLevel = $level;
739 else
740 {
741 $repo =& $this->findRepository($myrep);
742 $repo->setMinDownloadLevel($level);
743 }
744 }
745  
746 function getMinDownloadLevel()
747 {
748 return $this->minDownloadLevel;
749 }
750  
751 function addAllowedDownloadException($path, $myrep = 0)
752 {
753 if ($path{strlen($path) - 1} != "/")
754 $path .= "/";
755  
756 if (empty($myrep))
757 $this->allowedExceptions[] = $path;
758 else
759 {
760 $repo =& $this->findRepository($myrep);
761 $repo->addAllowedDownloadException($path);
762 }
763 }
764  
765 function addDisallowedDownloadException($path, $myrep = 0)
766 {
767 if ($path{strlen($path) - 1} != "/")
768 $path .= "/";
769  
770 if (empty($myrep))
771 $this->disallowedExceptions[] = $path;
772 else
773 {
774 $repo =& $this->findRepository($myrep);
775 $repo->addDisallowedDownloadException($path);
776 }
777 }
778  
779 function findException($path, $exceptions)
780 {
781 foreach ($exceptions As $key => $exc)
782 {
783 if (strncmp($exc, $path, strlen($exc)) == 0)
784 return true;
785 }
786  
787 return false;
788 }
789  
790 // }}}
791  
792 // {{{ getURL
793 //
794 // Get the URL to a path name based on the current config
795  
796 function getURL($rep, $path, $op)
797 {
798 $base = $_SERVER["SCRIPT_NAME"];
799  
800 if ($this->multiViews)
801 {
802 // Remove the .php
803 if (eregi(".php$", $base))
804 {
805 // Remove the .php
806 $base = substr($base, 0, -4);
807 }
808  
809 if ($path && $path{0} != "/") $path = "/".$path;
810  
811 $url = $base;
812  
813 if (is_object($rep))
814 {
815 $url .= "/".$rep->getDisplayName().str_replace('%2F', '/', urlencode($path));
816  
817 if ($op != "dir" && $op != "file")
818 $url .= "?op=$op&amp;";
819 else
820 $url .= "?";
821 }
822  
823 return $url;
824 }
825 else
826 {
827 switch ($op)
828 {
829 case "dir":
830 $fname = "listing.php";
831 break;
832  
833 case "file":
834 $fname = "filedetails.php";
835 break;
836  
837 case "log":
838 $fname = "log.php";
839 break;
840  
841 case "diff":
842 $fname = "diff.php";
843 break;
844  
845 case "blame":
846 $fname = "blame.php";
847 break;
848  
849 case "form":
850 $fname = "form.php";
851 break;
852  
853 case "rss":
854 $fname = "rss.php";
855 break;
856  
857 case "dl":
858 $fname = "dl.php";
859 break;
860  
861 case "comp":
862 $fname = "comp.php";
863 break;
864 }
865  
866 if ($rep == -1)
867 return $fname."?path=".urlencode($path)."&amp;";
868 else
869 return $fname."?repname=".urlencode($rep->getDisplayName())."&amp;path=".urlencode($path)."&amp;";
870 }
871 }
872  
873 // }}}
874  
875 // {{{ Paths and Commands
876  
877 // setPath
878 //
879 // Set the location of the given path
880  
881 function setPath(&$var, $path, $name, $params = "")
882 {
883 $lastchar = substr($path, -1, 1);
884 $isDir = ($lastchar == DIRECTORY_SEPARATOR ||
885 $lastchar == "/" ||
886 $lastchar == "\\");
887  
888 if (!$isDir)
889 {
890 $path .= DIRECTORY_SEPARATOR;
891 }
892  
893 // On a windows machine we need to put spaces around the entire command
894 // to allow for spaces in the path
895 if ($this->serverIsWindows)
896 $var = "\"$path$name\"";
897 else
898 $var = "$path$name";
899  
900 $var .= " ".$params;
901 }
902  
903 // setSVNCommandPath
904 //
905 // Define the location of the svn and svnlook commands
906  
907 function setSVNCommandPath($path)
908 {
909 $this->setPath($this->svn, $path, "svn", "--non-interactive --config-dir /tmp");
910 $this->setPath($this->svn_noparams, $path, "svn", " --config-dir /tmp");
911 $this->setPath($this->svnlook, $path, "svnlook");
912 }
913  
914 function getSvnCommand()
915 {
916 return $this->svn;
917 }
918  
919 function getCleanSvnCommand()
920 {
921 return $this->svn_noparams;
922 }
923  
924 function getSvnlookCommand()
925 {
926 return $this->svnlook;
927 }
928  
929 // setDiffPath
930 //
931 // Define the location of the diff command
932  
933 function setDiffPath($path)
934 {
935 $this->setPath($this->diff, $path, "diff");
936 }
937  
938 function getDiffCommand()
939 {
940 return $this->diff;
941 }
942  
943 // setEnscriptPath
944 //
945 // Define the location of the enscript command
946  
947 function setEnscriptPath($path)
948 {
949 $this->setPath($this->enscript, $path, "enscript");
950 }
951  
952 function getEnscriptCommand()
953 {
954 return $this->enscript;
955 }
956  
957 // setSedPath
958 //
959 // Define the location of the sed command
960  
961 function setSedPath($path)
962 {
963 $this->setPath($this->sed, $path, "sed");
964 }
965  
966 function getSedCommand()
967 {
968 return $this->sed;
969 }
970  
971 // setTarPath
972 //
973 // Define the location of the tar command
974  
975 function setTarPath($path)
976 {
977 $this->setPath($this->tar, $path, "tar");
978 }
979  
980 function getTarCommand()
981 {
982 return $this->tar;
983 }
984  
985 // setGzipPath
986 //
987 // Define the location of the GZip command
988  
989 function setGzipPath($path)
990 {
991 $this->setPath($this->gzip, $path, "gzip");
992 }
993  
994 function getGzipCommand()
995 {
996 return $this->gzip;
997 }
998  
999 // Templates
1000  
1001 function setTemplatePath($path, $myrep = 0)
1002 {
1003 if (empty($myrep))
1004 {
1005 $lastchar = substr($path, -1, 1);
1006 if (!($lastchar == DIRECTORY_SEPARATOR ||
1007 $lastchar == '/' ||
1008 $lastchar == '\\'))
1009 $path .= DIRECTORY_SEPARATOR;
1010  
1011 $this->templatePath = $path;
1012 }
1013 else
1014 {
1015 $repo =& $this->findRepository($myrep);
1016 $repo->setTemplatePath($path);
1017 }
1018 }
1019  
1020 function getTemplatePath()
1021 {
1022 return $this->templatePath;
1023 }
1024  
1025 // PHP Compat file (from PEAR)
1026  
1027 function setPHPCompatPath($path)
1028 {
1029 $this->setPath($this->phpCompatPath, $path, 'Compat.php');
1030 }
1031  
1032 function getPHPCompatFile()
1033 {
1034 return trim($this->phpCompatPath);
1035 }
1036  
1037 // }}}
1038  
1039 // {{{ parentPath
1040 //
1041 // Automatically set up the repositories based on a parent path
1042  
1043 function parentPath($path, $group = NULL)
1044 {
1045 if ($handle = @opendir($path))
1046 {
1047 // For each file...
1048 while (false !== ($file = readdir($handle)))
1049 {
1050 // That's also a non hidden directory
1051 if (is_dir($path.DIRECTORY_SEPARATOR.$file) && $file{0} != ".")
1052 {
1053 // And that contains a db directory (in an attempt to not include
1054 // non svn repositories.
1055  
1056 if (is_dir($path.DIRECTORY_SEPARATOR.$file.DIRECTORY_SEPARATOR."db"))
1057 {
1058 // We add the repository to the list
1059 $this->addRepository($file, "file:///".$path.DIRECTORY_SEPARATOR.$file, $group);
1060 }
1061 }
1062 }
1063 closedir($handle);
1064 }
1065  
1066 // Sort the repositories into alphabetical order
1067  
1068 if (!empty($this->_repositories))
1069 usort($this->_repositories, "cmpReps");
1070 }
1071  
1072 // }}}
1073  
1074 // {{{ Encoding functions
1075  
1076 function setInputEncoding($systemEnc)
1077 {
1078 $this->inputEnc = $systemEnc;
1079  
1080 if (!isset($this->contentEnc))
1081 $this->contentEnc = $systemEnc;
1082 }
1083  
1084 function getInputEncoding()
1085 {
1086 return $this->inputEnc;
1087 }
1088  
1089 function setContentEncoding($contentEnc, $myrep = 0)
1090 {
1091 if (empty($myrep))
1092 $this->contentEnc = $contentEnc;
1093 else
1094 {
1095 $repo =& $this->findRepository($myrep);
1096 $repo->setContentEncoding($contentEnc);
1097 }
1098 }
1099  
1100 function getContentEncoding()
1101 {
1102 return $this->contentEnc;
1103 }
1104  
1105 // }}}
1106  
1107 // {{{ Tab expansion functions
1108  
1109 function expandTabsBy($sp, $myrep = 0)
1110 {
1111 if (empty($myrep))
1112 $this->spaces = $sp;
1113 else
1114 {
1115 $repo =& $this->findRepository($myrep);
1116 $repo->expandTabsBy($sp);
1117 }
1118 }
1119  
1120 function getExpandTabsBy()
1121 {
1122 return $this->spaces;
1123 }
1124  
1125 // }}}
1126  
1127 // {{{ Misc settings
1128  
1129 function ignoreSvnMimeTypes()
1130 {
1131 $this->ignoreSvnMimeTypes = true;
1132 }
1133  
1134 function getIgnoreSvnMimeTypes()
1135 {
1136 return $this->ignoreSvnMimeTypes;
1137 }
1138  
1139 function ignoreWebSVNContentTypes()
1140 {
1141 $this->ignoreWebSVNContentTypes = true;
1142 }
1143  
1144 function getIgnoreWebSVNContentTypes()
1145 {
1146 return $this->ignoreWebSVNContentTypes;
1147 }
1148  
1149 function useBugtraqProperties($myrep = 0)
1150 {
1151 if (empty($myrep))
1152 $this->bugtraq = true;
1153 else
1154 {
1155 $repo =& $this->findRepository($myrep);
1156 $repo->useBugtraqProperties();
1157 }
1158 }
1159  
1160 function getBugtraq()
1161 {
1162 return $this->bugtraq;
1163 }
1164  
1165 function useAuthenticationFile($file, $myrep = 0)
1166 {
1167 if (empty($myrep))
1168 {
1169 if (is_readable($file))
1170 $this->auth = new Authentication($file);
1171 else
1172 {
1173 echo "Unable to read authentication file '$file'";
1174 exit;
1175 }
1176 }
1177 else
1178 {
1179 $repo =& $this->findRepository($myrep);
1180 $repo->useAuthenticationFile($file);
1181 }
1182 }
1183  
1184 function &getAuth()
1185 {
1186 return $this->auth;
1187 }
1188  
1189 function useTreeView()
1190 {
1191 $this->treeView = true;
1192 }
1193  
1194 function getUseTreeView()
1195 {
1196 return $this->treeView;
1197 }
1198  
1199 function useFlatView()
1200 {
1201 $this->treeView = false;
1202 }
1203  
1204 function useTreeIndex($open)
1205 {
1206 $this->flatIndex = false;
1207 $this->openTree = $open;
1208 }
1209  
1210 function getUseFlatIndex()
1211 {
1212 return $this->flatIndex;
1213 }
1214  
1215 function getOpenTree()
1216 {
1217 return $this->openTree;
1218 }
1219  
1220 // setSubversionMajorVersion
1221 //
1222 // Set subversion major version
1223  
1224 function setSubversionMajorVersion($subversionMajorVersion)
1225 {
1226 $this->subversionMajorVersion = $subversionMajorVersion;
1227 }
1228  
1229 function getSubversionMajorVersion()
1230 {
1231 return $this->subversionMajorVersion;
1232 }
1233  
1234 // setSubversionMinorVersion
1235 //
1236 // Set subversion minor version
1237  
1238 function setSubversionMinorVersion($subversionMinorVersion)
1239 {
1240 $this->subversionMinorVersion = $subversionMinorVersion;
1241 }
1242  
1243 function getSubversionMinorVersion()
1244 {
1245 return $this->subversionMinorVersion;
1246 }
1247  
1248 // }}}
1249  
1250 // {{{ Sort the repostories
1251 //
1252 // This function sorts the repositories by group name. The contents of the
1253 // group are left in there original order, which will either be sorted if the
1254 // group was added using the parentPath function, or defined for the order in
1255 // which the repositories were included in the user's config file.
1256 //
1257 // Note that as of PHP 4.0.6 the usort command no longer preserves the order
1258 // of items that are considered equal (in our case, part of the same group).
1259 // The mergesort function preserves this order.
1260  
1261 function sortByGroup()
1262 {
1263 if (!empty($this->_repositories))
1264 mergesort($this->_repositories, "cmpGroups");
1265 }
1266  
1267 // }}}
1268 }
1269 ?>