
# Dosya Gezgini

Her Greph modu (text, AST, rewrite, indexed text, indexed AST, cached AST, `rg` wrapper, `sg` wrapper), dosya ağacını tarayıp bir `Greph\Walker\FileList` oluşturarak başlar. Tarayıcı ortaktır; bu nedenle aynı bayraklar ve davranışlar her yerde geçerlidir.

## Varsayılan davranış

Tarayıcı, varsayılan olarak şunları yapar:

- İstenen yolların altındaki her dizini özyinelemeli olarak tarar.
- İç içe geçişler ve olumsuzlama kuralları da dahil olmak üzere, her düzeyde `.gitignore` ve `.grephignore` kurallarına uyar.
- `.git` dizinini atlar.
- Gizli dosya ve dizinleri (`.` ile başlayan her şeyi) atlar.
- İkili dosyaları (dosyanın ilk 512 baytındaki null baytlarla algılanır) atlar.
- 10 MiB'tan büyük dosyaları atlar.
- Sembolik bağlantıları izlemez.

## Geçersiz kılma bayrakları

| Bayrak | Etkisi |
|---|---|
| `--no-ignore` | `.gitignore` ve `.grephignore` kurallarını uygulamayı durdurur |
| `--hidden` | Gizli dosya ve dizinleri dahil eder |
| `--type NAME` | Yalnızca adı verilen tür takma adıyla eşleşen dosyaları dahil eder |
| `--type-not NAME` | Adı verilen tür takma adıyla eşleşen dosyaları hariç tutar |
| `--glob GLOB` | Yalnızca yolları GLOB ile eşleşen dosyaları dahil eder. Tekrarlanabilir. |

Aynı seçenekler, programatik kullanım için `Greph\Walker\WalkOptions` üzerinden sunulur.

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

## Dosya türü takma adları

Greph, adlandırılmış küçük bir dosya türü kümesi sunar. Her takma ad, bir uzantı listesine karşılık gelir:

| Takma ad | Uzantılar |
|---|---|
| `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` |

Tam liste `Greph\Walker\FileTypeFilter::TYPE_MAP` içinde bulunur.

## .gitignore semantiği

Greph, gitignore eşleştirmesini saf PHP ile uygular. Semantik, `git check-ignore` ile uyumludur:

- Desenler, bulundukları dizine göre değerlendirilir.
- İç içe geçmiş `.gitignore` dosyaları üst dizindeki kuralları geçersiz kılar.
- Olumsuzlama (`!pattern`), daha önce hariç tutulan bir yolu yeniden dahil eder.
- Sondaki `/`, deseni dizinlerle sınırlar.
- Baştaki `/`, deseni `.gitignore` dizinine sabitler.
- `**`, herhangi sayıda yol segmentiyle eşleşir.

`.grephignore` aynı söz dizimini kullanır ve `.gitignore` üzerine eklenir. Sürüm kontrolüne dahil etmek istemediğiniz araca özgü hariç tutma kuralları için doğru yerdir.

Uygulama `Greph\Walker\GitignoreFilter` içinde bulunur.

## İkili dosya algılama

Tarayıcı, her dosyanın ilk 512 baytında null bayt olup olmadığını kontrol eder. Varsa dosya ikili olarak değerlendirilir ve atlanır. Böylece dizinlenen bir dizinde depo içindeki görüntü, arşiv veya derlenmiş dosyalar bulunması gibi yaygın durumlar yakalanır.

İkili dosyaları yine de aramak için ilgili `Options` nesnesinde `skipBinaryFiles: false` ayarını belirtin. CLI şu anda bunun için bir bayrak sunmuyor; facade'i kullanın.

## Sembolik bağlantılar

Sembolik bağlantılar varsayılan olarak izlenmez. Bunları izlemek için `followSymlinks: true` ayarını belirleyin veya `rg` wrapper'ında `-L` / `--follow` değerlerini iletin. Tarayıcı, ziyaret edilen dizinleri takip eder; böylece sembolik bağlantı döngüleri sonsuz özyinelemeye yol açmaz.

## En büyük dosya boyutu

`maxFileSizeBytes` değerinden büyük dosyalar (varsayılan 10 MiB) atlanır. Böylece 1 GB'lık bir günlük dosyasının yanlışlıkla belleğe alınmasına karşı taramalar korunur. Daha büyük girdileri kapsamanız gerektiğinde `Options` nesnesindeki sınırı değiştirin.

## Neden özel bir tarayıcı

Greph, `glob()` veya `RecursiveDirectoryIterator` kullanabilirdi; ancak bunların hiçbiri gitignore semantiğini uygulamaz, `.grephignore` biçimini tanımaz veya worker havuzuyla sorunsuz biçimde bütünleşir. Tarayıcının bir kez yazılıp modlar arasında paylaşılması, her modun tamamen aynı filtreleme kurallarını uygulamasını da sağlar. Bu, oracle odaklı test stratejisi için kritik önemdedir: `grep`, `ripgrep` ve `ast-grep` ile karşılaştırma yapmanın tek yolu, bu araçların taradığı dosyaların aynısını taramaktır.
