Gå til indhold

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 .git over.
  • 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.

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'],
));

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.

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.