Как заставить PHPUnit исключать каталоги .svn в пределах тестового пути? - PullRequest
2 голосов
/ 18 января 2012

Как получить PHPUnit из phpunit.xml, чтобы он не осуществлял поиск в каталогах .svn? В больших проектах это становится все более серьезной проблемой по мере увеличения количества каталогов .svn.

Моя текущая конфигурация:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="phpunit_bootstrap.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    syntaxCheck="true"
    verbose="true"
    strict="true">
    <filter>
        <whitelist addUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./phpunit/</directory>
            <exclude>
                <directory>./phpunit/.svn</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

Это, кажется, игнорируется, как при запуске strace -e open phpunit phpunit/ Я вижу:

open("phpunit/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
open("phpunit/.svn", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 4
open("phpunit/.svn/tmp", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 5
open("phpunit/.svn/tmp/prop-base", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 6
open("phpunit/.svn/tmp/text-base", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 6
open("phpunit/.svn/tmp/props", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 6
open("phpunit/.svn/prop-base", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 5
open("phpunit/.svn/text-base", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 5
open("phpunit/.svn/props", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 5

Возможно ли занести в черный список каталоги .svn? Желательно с директивой подстановочного знака, поэтому мне не нужно указывать абсолютный путь к каждому .svn dir (например, <directory>.svn</directory>)

Ответы [ 2 ]

3 голосов
/ 20 января 2012

В настоящее время нет способа заставить PHPUnit не проверять каталоги, соответствующие определенному выражению, или игнорировать скрытые каталоги.

Так что в настоящее время вам придется <exclude> каждый svn dir.

Просто чтобы повторить то, что указано в комментариях: Это проблема только при работе с очень медленными файловыми системами, которые занимают много времени для вызовов stat и read.

Вот почему я предполагаю, что варианты использования настолько ограничены, что встраивание .svn ignore в phpunit не имеет смысла, особенно потому, что более новые версии svn больше не помещают каталоги везде. (См. Возможное решение 2)

Возможные решения:

Список всех исключений

Возможно, написание небольшого сценария, который генерирует теги исключения из файлов, не является большой проблемой

find . | grep -e ".svn$" | sed 's/^/<directory>/' | sed 's/$/<\/directory>/'

даст вам список всех включаемых тегов, например, для вставки. Или используйте небольшой скрипт на основе domDocument для обновления файла на месте:)

Обновление до Subversion 1.7.

При этом все метаданные будут храниться в одном каталоге в корне проекта, поэтому в папке project/tests не будет файлов для сканирования phpunit и устранения проблемы.

1 голос
/ 25 марта 2012

Это может быть излишним, но я действительно хотел лучшего решения.

Вот патч для вашего файла php \ PEAR \ File \ Iterator \ Factory.php, который является причиной всей этой медленностиОн пропускает каталоги, которые не начинаются с буквы или цифры.Принято с здесь .

108,110c108
<                     new RecursiveIteratorIterator(
<                       new RecursiveDirectoryIterator($path)
<                     ),
---
>                       new RecursiveIteratorIterator(new RecursiveRegexIterator(new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS), '=\\\\[a-zA-Z0-9]='), true),
...