main
parent
cc3b53bc2e
commit
126f95a8d7
@ -1,107 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Composer.
|
|
||||||
*
|
|
||||||
* (c) Nils Adermann <naderman@naderman.de>
|
|
||||||
* Jordi Boggiano <j.boggiano@seld.be>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Composer\Package\Archiver;
|
|
||||||
|
|
||||||
use Symfony\Component\Finder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An exclude filter that processes hgignore files
|
|
||||||
*
|
|
||||||
* @author Nils Adermann <naderman@naderman.de>
|
|
||||||
*/
|
|
||||||
class HgExcludeFilter extends BaseExcludeFilter
|
|
||||||
{
|
|
||||||
const HG_IGNORE_REGEX = 1;
|
|
||||||
const HG_IGNORE_GLOB = 2;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Either HG_IGNORE_REGEX or HG_IGNORE_GLOB
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
protected $patternMode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses .hgignore file if it exist
|
|
||||||
*
|
|
||||||
* @param string $sourcePath
|
|
||||||
*/
|
|
||||||
public function __construct($sourcePath)
|
|
||||||
{
|
|
||||||
parent::__construct($sourcePath);
|
|
||||||
|
|
||||||
$this->patternMode = self::HG_IGNORE_REGEX;
|
|
||||||
|
|
||||||
if (file_exists($sourcePath.'/.hgignore')) {
|
|
||||||
$this->excludePatterns = $this->parseLines(
|
|
||||||
file($sourcePath.'/.hgignore'),
|
|
||||||
array($this, 'parseHgIgnoreLine')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback line parser which process hgignore lines
|
|
||||||
*
|
|
||||||
* @param string $line A line from .hgignore
|
|
||||||
*
|
|
||||||
* @return array{0: string, 1: bool, 2: bool}|null An exclude pattern for filter()
|
|
||||||
*/
|
|
||||||
public function parseHgIgnoreLine($line)
|
|
||||||
{
|
|
||||||
if (preg_match('#^syntax\s*:\s*(glob|regexp)$#', $line, $matches)) {
|
|
||||||
if ($matches[1] === 'glob') {
|
|
||||||
$this->patternMode = self::HG_IGNORE_GLOB;
|
|
||||||
} else {
|
|
||||||
$this->patternMode = self::HG_IGNORE_REGEX;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->patternMode == self::HG_IGNORE_GLOB) {
|
|
||||||
return $this->patternFromGlob($line);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->patternFromRegex($line);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates an exclude pattern for filter() from a hg glob expression
|
|
||||||
*
|
|
||||||
* @param string $line A line from .hgignore in glob mode
|
|
||||||
*
|
|
||||||
* @return array{0: string, 1: bool, 2: bool} An exclude pattern for filter()
|
|
||||||
*/
|
|
||||||
protected function patternFromGlob($line)
|
|
||||||
{
|
|
||||||
$pattern = '#'.substr(Finder\Glob::toRegex($line), 2, -1).'#';
|
|
||||||
$pattern = str_replace('[^/]*', '.*', $pattern);
|
|
||||||
|
|
||||||
return array($pattern, false, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates an exclude pattern for filter() from a hg regexp expression
|
|
||||||
*
|
|
||||||
* @param string $line A line from .hgignore in regexp mode
|
|
||||||
*
|
|
||||||
* @return array{0: string, 1: bool, 2: bool} An exclude pattern for filter()
|
|
||||||
*/
|
|
||||||
public function patternFromRegex($line)
|
|
||||||
{
|
|
||||||
// WTF need to escape the delimiter safely
|
|
||||||
$pattern = '#'.preg_replace('/((?:\\\\\\\\)*)(\\\\?)#/', '\1\2\2\\#', $line).'#';
|
|
||||||
|
|
||||||
return array($pattern, false, true);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Composer.
|
|
||||||
*
|
|
||||||
* (c) Nils Adermann <naderman@naderman.de>
|
|
||||||
* Jordi Boggiano <j.boggiano@seld.be>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Composer\Test\Package\Archiver;
|
|
||||||
|
|
||||||
use Composer\Package\Archiver\HgExcludeFilter;
|
|
||||||
use Composer\Test\TestCase;
|
|
||||||
|
|
||||||
class HgExcludeFilterTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @dataProvider providePatterns
|
|
||||||
*
|
|
||||||
* @param string $ignore
|
|
||||||
* @param mixed[] $expected
|
|
||||||
*/
|
|
||||||
public function testPatternEscape($ignore, $expected)
|
|
||||||
{
|
|
||||||
$filter = new HgExcludeFilter('/');
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $filter->patternFromRegex($ignore));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function providePatterns()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
array('.#', array('#.\\##', false, true)),
|
|
||||||
array('.\\#', array('#.\\\\\\##', false, true)),
|
|
||||||
array('\\.#', array('#\\.\\##', false, true)),
|
|
||||||
array('\\\\.\\\\\\\\#', array('#\\\\.\\\\\\\\\\##', false, true)),
|
|
||||||
array('.\\\\\\\\\\#', array('#.\\\\\\\\\\\\\\##', false, true)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue