
# Procházení souborů

Každý režim Greph (text, AST, přepisování, indexovaný text, indexované AST, AST z cache, obal `rg`, obal `sg`) začíná procházením stromu souborů a vytvořením `Greph\Walker\FileList`. Procházeč je sdílený, takže se všude uplatňují stejné příznaky a stejné chování.

## Výchozí chování

Ve výchozím nastavení procházeč:

- Rekurzivně prochází všechny adresáře pod zadanými cestami.
- Na každé úrovni respektuje pravidla `.gitignore` a `.grephignore`, včetně vnořených přepsání a negací.
- Přeskakuje adresář `.git`.
- Přeskakuje skryté soubory a adresáře (všechny začínající na `.`).
- Přeskakuje binární soubory (určené podle nulových bajtů v prvních 512 bajtech souboru).
- Přeskakuje soubory větší než 10 MiB.
- Nenásleduje symbolické odkazy.

## Příznaky pro přepsání chování

| Příznak | Účinek |
|---|---|
| `--no-ignore` | Přestane respektovat `.gitignore` a `.grephignore` |
| `--hidden` | Zahrne skryté soubory a adresáře |
| `--type NAME` | Zahrne pouze soubory odpovídající pojmenovanému aliasu typu |
| `--type-not NAME` | Vyloučí soubory odpovídající pojmenovanému aliasu typu |
| `--glob GLOB` | Zahrne pouze soubory, jejichž cesty odpovídají GLOB. Lze opakovat. |

Stejné možnosti jsou dostupné pro programové použití prostřednictvím `Greph\Walker\WalkOptions`.

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

## Aliasy typů souborů

Greph obsahuje malou sadu pojmenovaných typů souborů. Každý alias odpovídá seznamu přípon:

| Alias | Přípony |
|---|---|
| `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` |

Úplný seznam je v `Greph\Walker\FileTypeFilter::TYPE_MAP`.

## Sémantika .gitignore

Greph implementuje porovnávání gitignore v čistém PHP. Sémantika odpovídá `git check-ignore`:

- Vzory se vyhodnocují relativně k adresáři, ve kterém jsou umístěny.
- Vnořené soubory `.gitignore` přepisují pravidla nadřazených adresářů.
- Negace (`!pattern`) znovu zahrne dříve vyloučenou cestu.
- Závěrečné `/` omezuje vzor na adresáře.
- Počáteční `/` ukotví vzor k adresáři souboru `.gitignore`.
- `**` odpovídá libovolnému počtu částí cesty.

`.grephignore` používá stejnou syntaxi a vrství se nad `.gitignore`. Slouží k výjimkám specifickým pro nástroje, které nechcete zahrnout do správy verzí.

Implementace je v `Greph\Walker\GitignoreFilter`.

## Detekce binárních souborů

Procházeč kontroluje prvních 512 bajtů každého souboru, zda neobsahují nulové bajty. Pokud nějaké najde, považuje soubor za binární a přeskočí ho. Tím zachytí běžný případ, kdy repozitář obsahuje v indexovaném adresáři obrázky, archivy nebo zkompilované artefakty.

Chcete-li přesto prohledávat binární soubory, nastavte `skipBinaryFiles: false` v příslušném objektu `Options`. CLI v současnosti příznak pro tuto možnost nenabízí; použijte fasádu.

## Symbolické odkazy

Symbolické odkazy se ve výchozím nastavení nenásledují. Chcete-li je následovat, nastavte `followSymlinks: true` (nebo předejte `-L` / `--follow` obalu `rg`). Procházeč sleduje navštívené adresáře, aby cykly symbolických odkazů nezpůsobily nekonečnou rekurzi.

## Maximální velikost souboru

Soubory větší než `maxFileSizeBytes` (výchozí hodnota je 10 MiB) se přeskakují. Tím se zabrání nechtěnému načtení 1 GB souboru protokolů do paměti během skenování. Pokud potřebujete zpracovávat větší vstupy, upravte limit v objektu `Options`.

## Proč vlastní procházeč

Greph by mohlo spoléhat na `glob()` nebo `RecursiveDirectoryIterator`, ale ani jedno neimplementuje sémantiku gitignore, nerozumí `.grephignore` a ani jedno se čistě neintegruje s fondem pracovních procesů. Když se procházeč napíše jednou a sdílí mezi režimy, každý režim uplatňuje přesně stejná pravidla filtrování. To je zásadní pro strategii testování řízenou oracle: porovnávat s `grep`, `ripgrep` a `ast-grep` lze pouze při procházení stejné sady souborů, jakou procházejí tyto nástroje.
