
# Fájlbejáró

Minden Greph mód (szöveg, AST, átírás, indexelt szöveg, indexelt AST, gyorsítótárazott AST, `rg`-burkoló, `sg`-burkoló) a fájlfa bejárásával és egy `Greph\Walker\FileList` létrehozásával kezdődik. A bejáró közös, ezért mindenhol ugyanazok a jelzők és viselkedések érvényesek.

## Alapértelmezett működés

Alapértelmezés szerint a bejáró:

- Rekurzívan bejárja a megadott útvonalak alatti összes könyvtárat.
- Minden szinten figyelembe veszi a `.gitignore` és a `.grephignore` szabályait, a beágyazott felülírásokat és tagadásokat is.
- Kihagyja a `.git` könyvtárat.
- Kihagyja a rejtett fájlokat és könyvtárakat (amelyek neve `.` karakterrel kezdődik).
- Kihagyja a bináris fájlokat (felismerésük a fájl első 512 bájtjában található nullbájtok alapján történik).
- Kihagyja a 10 MiB-nál nagyobb fájlokat.
- Nem követi a szimbolikus hivatkozásokat.

## Felülbíráló jelzők

| Jelző | Hatás |
|---|---|
| `--no-ignore` | Figyelmen kívül hagyja a `.gitignore` és `.grephignore` szabályait |
| `--hidden` | Beveszi a rejtett fájlokat és könyvtárakat |
| `--type NAME` | Csak a megadott típusaliasnak megfelelő fájlokat veszi be |
| `--type-not NAME` | Kihagyja a megadott típusaliasnak megfelelő fájlokat |
| `--glob GLOB` | Csak az útvonaluk alapján a GLOB mintára illeszkedő fájlokat veszi be. Ismételhető. |

Programozott használat esetén ugyanezek a beállítások a `Greph\Walker\WalkOptions` útján érhetők el.

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

## Fájltípus-aliasok

A Greph néhány névvel ellátott fájltípust tartalmaz. Minden alias kiterjesztések listájára oldódik fel:

| Alias | Kiterjesztések |
|---|---|
| `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` |

A teljes lista itt található: `Greph\Walker\FileTypeFilter::TYPE_MAP`.

## A .gitignore működése

A Greph tiszta PHP megvalósítással végzi a gitignore-egyeztetést. A működése összhangban van a `git check-ignore` működésével:

- A minták értelmezése a könyvtárhoz viszonyítva történik, amelyben szerepelnek.
- A beágyazott `.gitignore` fájlok felülírják a szülő könyvtár szabályait.
- A tagadás (`!pattern`) újra bevon egy korábban kihagyott útvonalat.
- A záró `/` a mintát könyvtárakra korlátozza.
- A kezdő `/` a minta érvényét a `.gitignore` könyvtárára korlátozza.
- A `**` tetszőleges számú útvonalszegmensre illeszkedik.

A `.grephignore` ugyanazt a szintaxist használja, és a `.gitignore` fölé épül. Itt adhatja meg azokat az eszközspecifikus kizárásokat, amelyeket nem szeretne verziókezelésben tárolni.

A megvalósítás helye: `Greph\Walker\GitignoreFilter`.

## Bináris fájlok felismerése

A bejáró minden fájl első 512 bájtját ellenőrzi nullbájtok után kutatva. Ha talál ilyet, a fájlt binárisnak tekinti és kihagyja. Ez felismeri azt a gyakori esetet, amikor egy tárház indexelt könyvtára képeket, archívumokat vagy lefordított fájlokat tartalmaz.

Ha mégis keresni szeretne bináris fájlokban, állítsa be a `skipBinaryFiles: false` értékét a megfelelő `Options` objektumban. A CLI jelenleg nem tesz elérhetővé ehhez jelzőt; használja a homlokzatot.

## Szimbolikus hivatkozások

Alapértelmezés szerint a program nem követi a szimbolikus hivatkozásokat. Követésükhöz állítsa be a `followSymlinks: true` értékét (vagy adja át a `-L` / `--follow` értéket a `rg` burkolónak). A bejáró nyilvántartja a már meglátogatott könyvtárakat, így a szimbolikus hivatkozások hurkai nem okoznak végtelen rekurziót.

## Maximális fájlméret

A `maxFileSizeBytes` méretnél nagyobb fájlokat a program kihagyja (az alapértelmezés 10 MiB). Ezzel megelőzhető, hogy egy vizsgálat véletlenül egy 1 GB-os naplófájlt töltsön a memóriába. Ha nagyobb bemeneteket is fel kell dolgoznia, írja felül a korlátot a `Options` objektumban.

## Miért egyedi a bejáró

A Greph használhatná a `glob()` vagy a `RecursiveDirectoryIterator` eszközt, de egyik sem valósítja meg a gitignore működését, egyik sem ismeri a `.grephignore` formátumot, és egyik sem illeszkedik megfelelően a munkafolyamat-készlethez. Az egyszer megírt, a módok között megosztott bejáró azt is biztosítja, hogy minden mód pontosan ugyanazokat a szűrési szabályokat alkalmazza; ez kulcsfontosságú az oracle-vezérelt tesztelési stratégiában, mert a `grep`, a `ripgrep` és a `ast-grep` csak ugyanazon fájlkészlet bejárásával hasonlítható össze, mint amelyet ezek az eszközök is bejárnak.
