İçeriğe geç

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