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á
.gitignorea.grephignorevrá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.
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
.gitignoreprepisujú 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
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.