Баг websvn

Ставил websvn и нашёл баг (это скорее не баг, а просто недоработка). Некоторые репозитарии не хотели исключаться директивой $config->addExcludedPath, а некоторые, которые были добавлены вручную, повторялись дважды так как их тоже находила $config->parentPath(она загружает все репы и это-го каталога). Как оказалась причина банальна — в коде для исключения нужных репозиториев их сравнивают с заданными, но она могут отличатся и при этом быть одним и тем же. Например "file:///some/path" и "file:///some/path/" уже будут не равны. На скорую руку написал временный патч(сейчас я немного его переделал изначально он работал только с линками file:///). Но как говорится нет ничего более постоянного чем временное, а так скорее оно и будет.
Вот мой патч:

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
--- /include/configclass.php	2011-06-27 12:12:51.000000000 +0300
+++ /include/configclass.php	2012-01-25 22:33:29.000000000 +0200
@@ -712,13 +712,23 @@
 		$this->_parentPaths[] = new ParentPath($path, $group, $pattern, $skipAlreadyAdded, $clientRootURL);
 	}
 
+function getNormalizedRepoPath($path){
+    $res = array();
+    preg_match('#^(svn(\+ssh)?://|file:///|https?://)/*(.*[^/])/*$#i',$path,$res);
+    if(sizeof($res)>=3){
+        $path = $res[1] . preg_replace('/\/+/i','/',$res[3]);
+    }
+
+    return $path;
+}
+
 	function addExcludedPath($path) {
 		$url = 'file:///'.$path;
 		$url = str_replace(DIRECTORY_SEPARATOR, '/', $url);
 		if ($url{strlen($url) - 1} == '/') {
 			$url = substr($url, 0, -1);
 		}
-		$this->_excluded[] = $url;
+		$this->_excluded[] = $this->getNormalizedRepoPath($url);
 	}
 
 	function getRepositories() {
@@ -736,7 +746,7 @@
 					// we have to check if we already have a repo with the same svn name
 					$duplicate = false;
 					foreach ($this->_repositories as $knownRepos) {
-						if ($knownRepos->path == $repo->path && $knownRepos->subpath == $repo->subpath) {
+						if (($this->getNormalizedRepoPath($knownRepos->path) == $this->getNormalizedRepoPath($repo->path)) && ($knownRepos->subpath == $repo->subpath)) {
 							$duplicate = true;
 							break;
 						}

На винде может не работать или работать не совсем правильно, так там разделитель файлов "\" а не "/". Строки "\" я не исключал так как на *nix может быть файл с таким именем.
Для тех кто не верит:
$ echo 'true' > '\'
$ cat '\'
true
$ ls
\

PS. Было-бы лучше нормализовать URL при сканировании, а не при сравнении, но мне пока менять что-то лень.
Потом напишу им в багтрекер.

Запись опубликована в рубрике Заметки с метками , , , . Добавьте в закладки постоянную ссылку.

2 комментария: Баг websvn

  1. bacher09 говорит:

    Сегодня написал об этом в их баг трекер. Сообщение пока там ещё не появилось, но наверно там ведётся премодерация.

  2. bacher09 говорит:

    Теперь он появился в баг трекере.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>