
# Failipuus liikuja

Iga Greph režiim (tekst, AST, ümberkirjutus, indekseeritud tekst, indekseeritud AST, vahemällu salvestatud AST, `rg` ümbris, `sg` ümbris) alustab failipuu läbimisest ja `Greph\Walker\FileList` koostamisest. Läbija on ühine, seega kehtivad samad lipud ja käitumine kõikjal.

## Vaikekäitumine

Vaikimisi teeb läbija järgmist:

- Läbib rekursiivselt kõik kataloogid määratud asukohtade all.
- Järgib igal tasemel `.gitignore` ja `.grephignore` reegleid, sealhulgas pesastatud ülekirjutusi ja eitusreegleid.
- Jätab vahele kataloogi `.git`.
- Jätab vahele peidetud failid ja kataloogid (kõik, mis algab märgiga `.`).
- Jätab vahele binaarfailid (tuvastatakse faili esimese 512 baidi nullbaitide järgi).
- Jätab vahele failid, mis on suuremad kui 10 MiB.
- Ei järgi sümbollinke.

## Ülekirjutuslipud

| Lipp | Mõju |
|---|---|
| `--no-ignore` | Eirab reegleid `.gitignore` ja `.grephignore` |
| `--hidden` | Kaasab peidetud failid ja kataloogid |
| `--type NAME` | Kaasab ainult failid, mis vastavad nimetatud tüübialiasele |
| `--type-not NAME` | Jätab välja failid, mis vastavad nimetatud tüübialiasele |
| `--glob GLOB` | Kaasab ainult failid, mille tee vastab GLOB-mustrile. Korduskasutatav. |

Sama valikute komplekt on programmipõhiseks kasutuseks saadaval ka `Greph\Walker\WalkOptions` kaudu.

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

## Failitüübi aliased

Greph sisaldab väikest valikut nimetatud failitüüpe. Iga alias vastab laiendite loendile:

| Alias | Laiendid |
|---|---|
| `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` |

Täieliku loendi leiate failist `Greph\Walker\FileTypeFilter::TYPE_MAP`.

## .gitignore'i semantika

Greph rakendab gitignore'i sobitamist puhtalt PHP-s. Semantika vastab `git check-ignore` käitumisele:

- Mustreid hinnatakse nende asukohakataloogi suhtes.
- Pesastatud failid `.gitignore` tühistavad ülemkataloogi reeglid.
- Eitus (`!pattern`) kaasab uuesti varem välja jäetud tee.
- Lõpus olev `/` piirab mustri kataloogidega.
- Alguses olev `/` seob mustri faili `.gitignore` kataloogiga.
- `**` vastab suvalisele arvule teelõikudele.

`.grephignore` kasutab sama süntaksit ja lisandub `.gitignore` peale. See sobib tööriistapõhiste välistuste jaoks, mida te ei soovi versioonihaldusesse lisada.

Teostus asub kataloogis `Greph\Walker\GitignoreFilter`.

## Binaarfailide tuvastamine

Läbija kontrollib iga faili esimeses 512 baidis nullbaitide olemasolu. Kui neid leidub, käsitatakse faili binaarfailina ja jäetakse vahele. Nii leitakse levinud juhtumid, kus hoidla indekseeritud kataloogis leidub pilte, arhiive või kompileeritud faile.

Binaarfailide otsimiseks määrake vastava `Options` objekti väärtuseks `skipBinaryFiles: false`. CLI seda lippu praegu ei paku; kasutage fassaadi.

## Sümbollingid

Vaikimisi sümbollinke ei järgita. Nende järgimiseks määrake `followSymlinks: true` või edastage `-L` / `--follow` ümbrisele `rg`. Läbija jälgib külastatud katalooge, et sümbollingid ei põhjustaks lõputut rekursiooni.

## Faili maksimaalne suurus

Failid, mis on suuremad kui `maxFileSizeBytes` (vaikimisi 10 MiB), jäetakse vahele. Nii ei loeta kogemata 1 GB logifaili mällu. Suuremate sisendite katmiseks muutke piirangut objektis `Options`.

## Miks kasutada kohandatud läbijat

Greph võiks kasutada `glob()` või `RecursiveDirectoryIterator`, kuid kumbki ei rakenda gitignore'i semantikat, ei tunne `.grephignore` ega integreeru hästi tööprotsesside kogumiga. Läbija ühekordne kirjutamine ja jagamine eri režiimide vahel tähendab ka seda, et igas režiimis rakenduvad täpselt samad filtreerimisreeglid. See on võrdluspõhise testimise jaoks hädavajalik: ainus viis võrrelda `grep`, `ripgrep` ja `ast-grep` tulemusi on läbida sama failikogum, mida need tööriistad läbivad.
