Filgennemløber
Hver Greph-tilstand (tekst, AST, omskrivning, indekseret tekst, indekseret AST, cachelagret AST, rg-wrapper, sg-wrapper) begynder med at gennemgå filtræet og oprette en Greph\Walker\FileList. Gennemløberen deles, så de samme flag og den samme adfærd gælder overalt.
Standardadfærd
Som standard gør gennemløberen følgende:
- Gennemgår rekursivt alle mapper under de angivne stier.
- Overholder
.gitignore- og.grephignore-regler på alle niveauer, inklusive indlejrede tilsidesættelser og negationer. - Springer mappen
.gitover. - Springer skjulte filer og mapper over (alt, der begynder med
.). - Springer binærfiler over (registreres via null bytes i filens første 512 bytes).
- Springer filer over, der er større end 10 MiB.
- Følger ikke symbolske links.
Tilsidesættelsesflag
| Flag | Virkning |
|---|---|
--no-ignore |
Stop med at overholde .gitignore og .grephignore |
--hidden |
Medtag skjulte filer og mapper |
--type NAME |
Medtag kun filer, der matcher det navngivne typealias |
--type-not NAME |
Udeluk filer, der matcher det navngivne typealias |
--glob GLOB |
Medtag kun filer, hvis stier matcher GLOB. Kan gentages. |
De samme indstillinger er tilgængelige via Greph\Walker\WalkOptions til programmatisk brug.
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'],
));
Filtypealiaser
Greph leveres med et lille sæt navngivne filtyper. Hvert alias svarer til en liste over filtypenavne:
| Alias | Filtypenavne |
|---|---|
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 |
Hele listen findes i Greph\Walker\FileTypeFilter::TYPE_MAP.
.gitignore-semantik
Greph implementerer gitignore-matchning i ren PHP. Semantikken stemmer overens med git check-ignore:
- Mønstre evalueres i forhold til den mappe, de ligger i.
- Indlejrede
.gitignore-filer tilsidesætter regler fra overordnede mapper. - Negation (
!pattern) medtager igen en sti, der tidligere var udelukket. - Et afsluttende
/begrænser et mønster til mapper. - Et indledende
/forankrer et mønster til mappen med.gitignore. **matcher et vilkårligt antal stipræfiks.
.grephignore bruger samme syntaks og bygger oven på .gitignore. Her placerer du værktøjsspecifikke udelukkelser, som du ikke ønsker i versionsstyringen.
Implementeringen findes i Greph\Walker\GitignoreFilter.
Registrering af binærfiler
Gennemløberen kontrollerer filens første 512 bytes for null bytes. Hvis nogen findes, behandles filen som binær og springes over. Det fanger det almindelige tilfælde, hvor et repository indeholder billeder, arkiver eller kompilerede artefakter i en indekseret mappe.
Hvis du alligevel vil søge i binærfiler, skal du sætte skipBinaryFiles: false på det relevante Options-objekt. CLI viser i øjeblikket ikke et flag til dette; brug facaden.
Symbolske links
Som standard følges symbolske links ikke. Sæt followSymlinks: true (eller videregiv -L / --follow til rg-wrapperen) for at følge dem. Gennemløberen holder styr på besøgte mapper, så symlink-løkker ikke forårsager uendelig rekursion.
Maksimal filstørrelse
Filer større end maxFileSizeBytes (standard 10 MiB) springes over. Det beskytter scanninger mod utilsigtet at indlæse en logfil på 1 GB i hukommelsen. Tilsidesæt grænsen på Options-objektet, når du skal behandle større input.
Hvorfor en brugerdefineret gennemløber
Greph kunne basere sig på glob() eller RecursiveDirectoryIterator, men ingen af dem implementerer gitignore-semantik, forstår .grephignore eller integrerer problemfrit med arbejderpuljen. Ved at skrive gennemløberen én gang og dele den på tværs af tilstande anvender alle tilstande de samme filtreringsregler, hvilket er afgørende for den oracle-drevne teststrategi: Den eneste måde at sammenligne med grep, ripgrep og ast-grep på er at gennemgå de samme filer, som disse værktøjer gennemgår.