Preskoči na vsebino

Sprehajalnik datotek

Vsak način Greph (besedilo, AST, prepisovanje, indeksirano besedilo, indeksirani AST, predpomnjeni AST, ovojnik rg, ovojnik sg) se začne s pregledom drevesa datotek in ustvarjanjem Greph\Walker\FileList. Sprehajalnik je skupen, zato povsod veljajo iste zastavice in vedenje.

Privzeto delovanje

S privzetimi nastavitvami sprehajalnik:

  • Rekurzivno pregleda vse imenike pod zahtevanimi potmi.
  • Na vseh ravneh upošteva pravila .gitignore in .grephignore, vključno z gnezdenimi preglasitvami in izjemami.
  • Preskoči imenik .git.
  • Preskoči skrite datoteke in imenike (vse, kar se začne z .).
  • Preskoči binarne datoteke (zazna jih po ničelnih bajtih v prvih 512 bajtih datoteke).
  • Preskoči datoteke, večje od 10 MiB.
  • Ne sledi simbolnim povezavam.

Zastavice za preglasitev

Zastavica Učinek
--no-ignore Ne upošteva več .gitignore in .grephignore
--hidden Vključi skrite datoteke in imenike
--type NAME Vključi samo datoteke, ki ustrezajo imenovanemu vzdevku vrste
--type-not NAME Izključi datoteke, ki ustrezajo imenovanemu vzdevku vrste
--glob GLOB Vključi samo datoteke, katerih poti ustrezajo vzorcu GLOB. Zastavico je mogoče ponoviti.

Za programsko uporabo so iste možnosti na voljo prek 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'],
));

Vzdevki vrst datotek

Greph vključuje majhen nabor imenovanih vrst datotek. Vsak vzdevek se razširi v seznam končnic:

Vzdevek Končnice
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

Celoten seznam je v Greph\Walker\FileTypeFilter::TYPE_MAP.

Semantika .gitignore

Greph izvaja ujemanje po pravilih gitignore v čistem PHP. Semantika je usklajena s git check-ignore:

  • Vzorci se vrednotijo glede na imenik, v katerem so zapisani.
  • Gnezdene datoteke .gitignore preglasijo pravila nadrejenih imenikov.
  • Negacija (!pattern) znova vključi prej izključeno pot.
  • Končni / omeji vzorec na imenike.
  • Začetni / zasidra vzorec na imenik datoteke .gitignore.
  • ** se ujema s poljubnim številom segmentov poti.

.grephignore uporablja isto sintakso in je nadgrajen na .gitignore. To je pravo mesto za izključitve, specifične za orodje, ki jih ne želite vključiti v nadzor različic.

Implementacija je v Greph\Walker\GitignoreFilter.

Zaznavanje binarnih datotek

Sprehajalnik preveri prvih 512 bajtov vsake datoteke za ničelne bajte. Če jih najde, datoteko obravnava kot binarno in jo preskoči. Tako zazna pogost primer, ko so v imeniku, vključenem v indeksiranje, slikovne, arhivske ali prevedene datoteke.

Če želite vseeno iskati po binarnih datotekah, nastavite skipBinaryFiles: false na ustreznem objektu Options. CLI trenutno ne ponuja zastavice za to; uporabite fasado.

Sprehajalnik privzeto ne sledi simbolnim povezavam. Če jim želite slediti, nastavite followSymlinks: true (ali posredujte -L / --follow ovoju rg). Sprehajalnik beleži že obiskane imenike, zato zanke simbolnih povezav ne povzročijo neskončne rekurzije.

Največja velikost datoteke

Datoteke, večje od maxFileSizeBytes (privzeto 10 MiB), so preskočene. Tako pregled ne naloži po pomoti 1 GB velike dnevniške datoteke v pomnilnik. Omejitev lahko preglasite v objektu Options, kadar morate obdelati večje vhode.

Zakaj lastni sprehajalnik

Greph bi se lahko zanašal na glob() ali RecursiveDirectoryIterator, vendar nobeden ne izvaja semantike gitignore, nobeden ne razume .grephignore in nobeden se ne poveže gladko s skupino delavcev. Enkratna izdelava sprehajalnika in njegova souporaba med načini pomenita tudi, da vsak način uporablja povsem enaka pravila filtriranja, kar je ključno za strategijo testiranja na podlagi referenčnih rezultatov: primerjava z grep, ripgrep in ast-grep je mogoča samo, če pregledamo isti nabor datotek kot ta orodja.