
# 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.

## 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.
