123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749 |
- <?php
- require_once 'phing/types/selectors/SelectorScanner.php';
- include_once 'phing/util/StringHelper.php';
- include_once 'phing/types/selectors/SelectorUtils.php';
- class DirectoryScanner implements SelectorScanner {
-
- protected $DEFAULTEXCLUDES = array(
- "**/*~",
- "**/#*#",
- "**/.#*",
- "**/%*%",
- "**/CVS",
- "**/CVS/**",
- "**/.cvsignore",
- "**/SCCS",
- "**/SCCS/**",
- "**/vssver.scc",
- "**/.svn",
- "**/.svn/**",
- "**/._*",
- "**/.DS_Store",
- );
-
- protected $basedir;
-
- protected $includes = null;
-
- protected $excludes = null;
-
-
- protected $expandSymbolicLinks = false;
-
- protected $filesIncluded;
-
- protected $filesNotIncluded;
-
- protected $filesExcluded;
-
- protected $dirsIncluded;
-
- protected $dirsNotIncluded;
-
- protected $dirsExcluded;
-
- protected $haveSlowResults = false;
-
- protected $isCaseSensitive = true;
-
- protected $selectors = null;
-
- protected $filesDeselected;
- protected $dirsDeselected;
-
-
- protected $everythingIncluded = true;
-
- function matchPatternStart($pattern, $str, $isCaseSensitive = true) {
- return SelectorUtils::matchPatternStart($pattern, $str, $isCaseSensitive);
- }
-
- function matchPath($pattern, $str, $isCaseSensitive = true) {
- return SelectorUtils::matchPath($pattern, $str, $isCaseSensitive);
- }
-
- function match($pattern, $str, $isCaseSensitive = true) {
- return SelectorUtils::match($pattern, $str, $isCaseSensitive);
- }
-
- function setBasedir($_basedir) {
- $_basedir = str_replace('\\', DIRECTORY_SEPARATOR, $_basedir);
- $_basedir = str_replace('/', DIRECTORY_SEPARATOR, $_basedir);
- $this->basedir = $_basedir;
- }
-
- function getBasedir() {
- return $this->basedir;
- }
-
- function setCaseSensitive($_isCaseSensitive) {
- $this->isCaseSensitive = ($_isCaseSensitive) ? true : false;
- }
-
- function setIncludes($_includes = array()) {
- if (empty($_includes) || is_null($_includes)) {
- $this->includes = null;
- } else {
- for ($i = 0; $i < count($_includes); $i++) {
- $pattern = null;
- $pattern = str_replace('\\', DIRECTORY_SEPARATOR, $_includes[$i]);
- $pattern = str_replace('/', DIRECTORY_SEPARATOR, $pattern);
- if (StringHelper::endsWith(DIRECTORY_SEPARATOR, $pattern)) {
- $pattern .= "**";
- }
- $this->includes[] = $pattern;
- }
- }
- }
-
- function setExcludes($_excludes = array()) {
- if (empty($_excludes) || is_null($_excludes)) {
- $this->excludes = null;
- } else {
- for ($i = 0; $i < count($_excludes); $i++) {
- $pattern = null;
- $pattern = str_replace('\\', DIRECTORY_SEPARATOR, $_excludes[$i]);
- $pattern = str_replace('/', DIRECTORY_SEPARATOR, $pattern);
- if (StringHelper::endsWith(DIRECTORY_SEPARATOR, $pattern)) {
- $pattern .= "**";
- }
- $this->excludes[] = $pattern;
- }
- }
- }
-
-
- function setExpandSymbolicLinks($expandSymbolicLinks)
- {
- $this->expandSymbolicLinks = $expandSymbolicLinks;
- }
-
- function scan() {
-
- if ((empty($this->basedir)) || (!@is_dir($this->basedir))) {
- return false;
- }
- if ($this->includes === null) {
-
- $this->includes = array("**");
- }
- if (is_null($this->excludes)) {
- $this->excludes = array();
- }
- $this->filesIncluded = array();
- $this->filesNotIncluded = array();
- $this->filesExcluded = array();
- $this->dirsIncluded = array();
- $this->dirsNotIncluded = array();
- $this->dirsExcluded = array();
- $this->dirsDeselected = array();
- $this->filesDeselected = array();
-
- if ($this->isIncluded("")) {
- if (!$this->isExcluded("")) {
- if ($this->isSelected("", $this->basedir)) {
- $this->dirsIncluded[] = "";
- } else {
- $this->dirsDeselected[] = "";
- }
- } else {
- $this->dirsExcluded[] = "";
- }
- } else {
- $this->dirsNotIncluded[] = "";
- }
- $this->scandir($this->basedir, "", true);
- return true;
- }
-
- protected function slowScan() {
- if ($this->haveSlowResults) {
- return;
- }
-
- $excl = $this->dirsExcluded;
- $notIncl = $this->dirsNotIncluded;
- for ($i=0, $_i=count($excl); $i < $_i; $i++) {
- if (!$this->couldHoldIncluded($excl[$i])) {
- $this->scandir($this->basedir.$excl[$i], $excl[$i].DIRECTORY_SEPARATOR, false);
- }
- }
- for ($i=0, $_i=count($notIncl); $i < $_i; $i++) {
- if (!$this->couldHoldIncluded($notIncl[$i])) {
- $this->scandir($this->basedir.$notIncl[$i], $notIncl[$i].DIRECTORY_SEPARATOR, false);
- }
- }
- $this->haveSlowResults = true;
- }
-
- function listDir($_dir) {
- $d = dir($_dir);
- $list = array();
- while(($entry = $d->read()) !== false) {
- if ($entry != "." && $entry != "..") {
- $list[] = $entry;
- }
- }
- $d->close();
- return $list;
- }
-
- private function scandir($_rootdir, $_vpath, $_fast) {
-
- if (!is_readable($_rootdir)) {
- return;
- }
-
- $newfiles = self::listDir($_rootdir);
-
- for ($i=0,$_i=count($newfiles); $i < $_i; $i++) {
-
- $file = $_rootdir . DIRECTORY_SEPARATOR . $newfiles[$i];
- $name = $_vpath . $newfiles[$i];
- if (@is_link($file) && !$this->expandSymbolicLinks)
- {
- if ($this->isIncluded($name)) {
- if (!$this->isExcluded($name)) {
- if ($this->isSelected($name, $file)) {
- $this->filesIncluded[] = $name;
- } else {
- $this->everythingIncluded = false;
- $this->filesDeselected[] = $name;
- }
- } else {
- $this->everythingIncluded = false;
- $this->filesExcluded[] = $name;
- }
- } else {
- $this->everythingIncluded = false;
- $this->filesNotIncluded[] = $name;
- }
- }
- else
- if (@is_dir($file)) {
- if ($this->isIncluded($name)) {
- if (!$this->isExcluded($name)) {
- if ($this->isSelected($name, $file)) {
- $this->dirsIncluded[] = $name;
- if ($_fast) {
- $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
- }
- } else {
- $this->everythingIncluded = false;
- $this->dirsDeselected[] = $name;
- if ($_fast && $this->couldHoldIncluded($name)) {
- $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
- }
- }
- } else {
- $this->everythingIncluded = false;
- $this->dirsExcluded[] = $name;
- if ($_fast && $this->couldHoldIncluded($name)) {
- $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
- }
- }
- } else {
- $this->everythingIncluded = false;
- $this->dirsNotIncluded[] = $name;
- if ($_fast && $this->couldHoldIncluded($name)) {
- $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
- }
- }
-
- if (!$_fast) {
- $this->scandir($file, $name.DIRECTORY_SEPARATOR, $_fast);
- }
-
- } elseif (@is_file($file)) {
- if ($this->isIncluded($name)) {
- if (!$this->isExcluded($name)) {
- if ($this->isSelected($name, $file)) {
- $this->filesIncluded[] = $name;
- } else {
- $this->everythingIncluded = false;
- $this->filesDeselected[] = $name;
- }
- } else {
- $this->everythingIncluded = false;
- $this->filesExcluded[] = $name;
- }
- } else {
- $this->everythingIncluded = false;
- $this->filesNotIncluded[] = $name;
- }
- }
- }
- }
-
- protected function isIncluded($_name) {
- for ($i=0, $_i=count($this->includes); $i < $_i; $i++) {
- if (DirectoryScanner::matchPath($this->includes[$i], $_name, $this->isCaseSensitive)) {
- return true;
- }
- }
- return false;
- }
-
- protected function couldHoldIncluded($_name) {
- for ($i = 0; $i < count($this->includes); $i++) {
- if (DirectoryScanner::matchPatternStart($this->includes[$i], $_name, $this->isCaseSensitive)) {
- return true;
- }
- }
- return false;
- }
-
- protected function isExcluded($_name) {
- for ($i = 0; $i < count($this->excludes); $i++) {
- if (DirectoryScanner::matchPath($this->excludes[$i], $_name, $this->isCaseSensitive)) {
- return true;
- }
- }
- return false;
- }
-
- function getIncludedFiles() {
- return $this->filesIncluded;
- }
-
- function getNotIncludedFiles() {
- $this->slowScan();
- return $this->filesNotIncluded;
- }
-
- function getExcludedFiles() {
- $this->slowScan();
- return $this->filesExcluded;
- }
-
- public function getDeselectedFiles() {
- $this->slowScan();
- return $this->filesDeselected;
- }
-
- function getIncludedDirectories() {
- return $this->dirsIncluded;
- }
-
- function getNotIncludedDirectories() {
- $this->slowScan();
- return $this->dirsNotIncluded;
- }
-
- public function getDeselectedDirectories() {
- $this->slowScan();
- return $this->dirsDeselected;
- }
-
-
- function getExcludedDirectories() {
- $this->slowScan();
- return $this->dirsExcluded;
- }
-
- function addDefaultExcludes() {
-
- foreach($this->DEFAULTEXCLUDES as $pattern) {
- $pattern = str_replace('\\', DIRECTORY_SEPARATOR, $pattern);
- $pattern = str_replace('/', DIRECTORY_SEPARATOR, $pattern);
- $this->excludes[] = $pattern;
- }
- }
-
-
- public function setSelectors($selectors) {
- $this->selectors = $selectors;
- }
-
- public function isEverythingIncluded() {
- return $this->everythingIncluded;
- }
-
-
- protected function isSelected($name, $file) {
- if ($this->selectors !== null) {
- $basedir = new PhingFile($this->basedir);
- $file = new PhingFile($file);
- if (!$file->canRead())
- return false;
-
- foreach($this->selectors as $selector) {
- if (!$selector->isSelected($basedir, $name, $file)) {
- return false;
- }
- }
- }
- return true;
- }
- }
|