Preskočiť na obsah

Prechádzač súborov

Každý režim Greph (text, AST, prepisovanie, indexovaný text, indexované AST, AST z vyrovnávacej pamäte, obal rg, obal sg) začína prechodom stromom súborov a vytvorením Greph\Walker\FileList. Prechádzač sa zdieľa, takže všade platia rovnaké príznaky a správanie.

Predvolené správanie

Prechádzač v predvolenom nastavení:

  • Rekurzívne prechádza každý adresár pod zadanými cestami.
  • Na každej úrovni rešpektuje pravidlá .gitignore a .grephignore vrátane vnorených prepísaní pravidiel a negácií.
  • Preskakuje adresár .git.
  • Preskakuje skryté súbory a adresáre (všetko, čo začína na .).
  • Preskakuje binárne súbory (rozpozná ich podľa nulových bajtov v prvých 512 bajtoch súboru).
  • Preskakuje súbory väčšie ako 10 MiB.
  • Nenasleduje symbolické odkazy.

Príznaky na prepísanie nastavení

Príznak Účinok
--no-ignore Prestať rešpektovať .gitignore a .grephignore
--hidden Zahrnúť skryté súbory a adresáre
--type NAME Zahrnúť iba súbory zodpovedajúce pomenovanému aliasu typu
--type-not NAME Vylúčiť súbory zodpovedajúce pomenovanému aliasu typu
--glob GLOB Zahrnúť iba súbory, ktorých cesty zodpovedajú vzoru GLOB. Možno opakovať.

Rovnaké možnosti sú programovo dostupné aj cez Greph\Walker\WalkOptions.

PHP
use Greph\Greph;
use Greph\Walker\FileTypeFilter;
use Greph\Walker\WalkOptions;

$files = Greph::walk('src', new WalkOptions(
    respectIgnore: false,
    includeHidden: true,
    fileTypeFilter: new FileTypeFilter(['php']),
    globPatterns: ['src/**/*.php'],
));

Aliasy typov súborov

Greph obsahuje malú sadu pomenovaných typov súborov. Každý alias sa rozbalí na zoznam prípon:

Alias Prípony
css css, sass, scss
html htm, html, phtml
js cjs, js, mjs
json json
md markdown, md
php inc, php, php3, php4, php5, php7, php8, phpt, phtml
txt txt
ts ts, tsx
xml xml
yaml yaml, yml

Úplný zoznam sa nachádza v Greph\Walker\FileTypeFilter::TYPE_MAP.

Sémantika .gitignore

Greph implementuje porovnávanie gitignore v čistom PHP. Sémantika zodpovedá git check-ignore:

  • Vzory sa vyhodnocujú vzhľadom na adresár, v ktorom sa nachádzajú.
  • Vnorené súbory .gitignore prepisujú nadradené pravidlá.
  • Negácia (!pattern) znova zahrnie predtým vylúčenú cestu.
  • Záverečné / obmedzuje vzor na adresáre.
  • Úvodné / ukotvuje vzor v adresári súboru .gitignore.
  • ** zodpovedá ľubovoľnému počtu segmentov cesty.

.grephignore používa rovnakú syntax a nadväzuje na .gitignore. Je to správne miesto na vylúčenia špecifické pre nástroj, ktoré nechcete vo správe verzií.

Implementácia sa nachádza v Greph\Walker\GitignoreFilter.

Rozpoznávanie binárnych súborov

Prechádzač kontroluje prvých 512 bajtov každého súboru, či neobsahujú nulové bajty. Ak sa nejaké nájdu, súbor sa považuje za binárny a preskočí sa. Zachytí sa tým bežný prípad, keď repozitár obsahuje obrázky, archívy alebo skompilované artefakty v indexovanom adresári.

Ak chcete aj tak vyhľadávať v binárnych súboroch, nastavte skipBinaryFiles: false v príslušnom objekte Options. CLI momentálne neponúka príznak pre toto nastavenie; použite fasádu.

Symbolické odkazy sa predvolene nenasledujú. Ak ich chcete nasledovať, nastavte followSymlinks: true (alebo odovzdajte -L / --follow obalu rg). Prechádzač sleduje navštívené adresáre, takže slučky symbolických odkazov nespôsobia nekonečnú rekurziu.

Maximálna veľkosť súboru

Súbory väčšie ako maxFileSizeBytes (predvolene 10 MiB) sa preskakujú. Chráni to skenovanie pred náhodným načítaním 1 GB súboru denníka do pamäte. Ak potrebujete zahrnúť väčšie vstupy, upravte limit v objekte Options.

Prečo vlastný prechádzač

Greph by mohlo využívať glob() alebo RecursiveDirectoryIterator, no ani jeden nástroj neimplementuje sémantiku gitignore, nerozumie .grephignore a ani jeden sa čisto neintegruje s fondom pracovníkov. Jednorazové napísanie prechádzača a jeho zdieľanie medzi režimami navyše znamená, že každý režim používa presne rovnaké pravidlá filtrovania. To je zásadné pre stratégiu testovania riadeného oracle: porovnávať s grep, ripgrep a ast-grep možno iba pri prechode tou istou sadou súborov ako tieto nástroje.