# AGENTS.md — Yali-rs Geliştirme Notları > Ajan oturumları arasında süreklilik için. Son güncelleme: parted MiB düzeltmesi (23 Ağu) ## Proje - PisiLinux kurulum aracı (eski Python Yali'nin Rust/egui yeniden yazımı). - Ana dallar: `main`. Push: `git push origin main`. - Referans kod: `/media/yedekleme/github/erkanisik/yali` (eski Python Yali — storage mimarisi: `yali/storage/{operations,partitioning,devicetree}.py`). ## Mimari Kararlar (2026-08 dönemi) ### Çoklu Disk Manuel Bölümleme - `CustomPartition` alanları (`src/installer.rs`): - `disk`: bölümün ait olduğu disk ("/dev/sda") — gruplama bununla. - `orig_device`: lsblk'tan gelen fiziksel cihaz adı; **boş = kullanıcı tanımı yeni bölüm**. Silme/işaret mantığı buna dayanır. - `delete: bool`: eski Yali `OperationDestroyDevice` karşılığı → kurulumda `parted rm`. - UI (`src/steps/partition.rs`): - Manuel moda girişte TÜM diskler otomatik taranıp listelenir (disk kartına tıklamak artık sadece "yeni bölüm hedef diski" seçer; tanımları sıfırlamaz — merge eder, `orig_device` eşleşmesinde kullanıcı tanımı kazanır). - Tablo `TableRow::Part | TableRow::FreeSpace` enum'u ile kurulur; HER disk grubu kendi sütun başlıklarını çizer (`draw_partition_table_header`). - Silinmek işaretli bölümler ayrı satır çizmez; İLK silinenin konumunda TEK "Boş Alan" satırında birleşir (GParted tarzı). `Boş Alan = disk − (korunan fiziksel + yeni tanımlar)`; 0 ise satır gizlenir. - "Kalan alan" SEMBOLİKTİR (size_mb=0): kaydetme anında sayıya çevrilmez! Tabloda/özetde kapasite olarak gösterilir; gerçek boyut kurulum anında boşluktan alınır. (Somutlaştırma taşmaya yol açtığı için kaldırıldı — swap sonradan büyütülünce kök patlıyordu.) - Slot ataması (`installer::assign_partition_numbers`): parted'ın gerçek davranışını simüle eder — fiziksel (silinmeyen) bölümler numarasını korur, silinenlerin slotu boşalır, yeni tanımlar en küçük boş slotu alır. UI ile job tutarlılığı buradan gelir. ### Granular Kurulum Job'ı (`jobs/partition.rs::CustomPartitionJob`) Eski wipe&rebuild (mktable + hepsini baştan yarat) KALDIRILDI. Yeni fazlar: 1. FAZ A: `delete=true` olanlar `parted rm N` — N, `orig_device`'tan; **büyükten küçüğe** sil (kernel slot kayması). 2. FAZ B: yeni tanımlar `disk_free_regions_mb()` ile sysfs'ten hesaplanan boş bölgelere first-fit yerleşir ("kalan" = en büyük bölge). Sabit boyutlular ÖNCE, sembolikler SONRA (`creates.sort_by_key(size==0)`) işlenir. 3. FAZ C: yalnızca istenenler mkfs (LUKS akışı korundu). - İşlemi olmayan disklere ve `delete=true` satırlara mount/fstab/summary dokunmaz. ### Diğer Düzeltmeler - **parted birim tuzağı (KRİTİK):** parted `"MB"` sonekini **ondalık** (10^6 byte) okur, bizim hesaplar binary (2^20). `mkpart 3944MB` → sektör 7703125 (hizasız, boş alana uymaz) → "Becerebildiğimiz buna en yakın konum..." hatası. ÇÖZÜM: parted'a daima `"{}MiB"` sonekiyle geç (`jobs/partition.rs`, hem otomatik hem CustomPartitionJob). Tamsayı MiB = 2048 sektörün katı → hizalama hatası çıkmaz. UI'da kullanıcıya MB gösterilir ama parted argümanı asla "MB" olmasın. - MB dönüşümleri tek bölme: `x / 1_048_576` (çift `x/1024/1024` hassasiyet kaybı yapardı). - Disk seçiminde `size_gb * 1024` yerine `size_bytes / 1_048_576`. - Mountpoint değişince boyut alanı SADECE boş/"0"/"remaining" ise varsayılanlanır (kullanıcının elle girdiği değer ezilmez). - Simge fontu: `assets/remixicon.ttf` egui fallback fontu (`ui/theme.rs setup_fonts`). Kutucuk görürsen karakter fontta yok demektir — fontTools ile cmap kontrol et: kullanılanlar: EB7B check, EA6B arrow, EC28 trash, EA13 add, EFE0 pencil, EECD lock, ECA1 error, EDFB hard-drive-line, ECB5/B7 eye, F4C6 close. - Alt bar: "Mevcut Durum / Kurulum Sonrası" çift şerit (`manual_dual_bars`, gri segment = boş) — SADECE seçili disk için gösterilir (`state.selected_disk`). ## Bilinen Açıklar / Yapılacaklar - [ ] VM testinde rapor edilen hatalar düzeltilecek (kullanıcı listeleyecek) - [ ] `manual_capacity_error` yalnızca sabit boyutları kontrol eder; LVM PV/LV toplamları ayrıca doğrulanmalı - [ ] Silinmek işaretli bölüm bir VG'nin PV'siyse SetupLvmJob tarafında kontrol yok - [ ] Otomatik mod (erase disk) hâlâ tek disk; çoklu otomatik plan yok - [ ] Debug amaçlı kalan `eprintln!` satırları temizlenebilir ## Test / Derleme - `cargo check` + `cargo test` (22 birim testi; partition modülü ağırlıklı). - VM'de denemek: ISO'yu boot edip manuel bölümlemede sdb üzerindeki senaryolar: sil→boş-alan birleşimi, geri al, kalan alan, farklı diske bölüm ekleme. ## ✅ Düzenlenmiş Manuel Partition Sorunları (18 Eylül 2026) Bu gün, manual partition modundaki 5 kritik sorun düzeltilmiştir: 1. **`manual_capacity_error` birim tutarlılığı** (`src/steps/partition.rs`): - `cap` → `cap_mb`, `fixed` → `fixed_mb` değişken isimleri standardized - `d.size_bytes / 1_048_576` (MiB) ile `defs.iter().map(|p| p.size_mb).sum()` consistently binary MiB (2^20) hesaplaması - `cargo test` ve `cargo check` passed 2. **`disk_free_regions_mb` delete flagı yönetimi** (`src/jobs/partition.rs`): - `.filter(|p| p.delete && !p.orig_device.is_empty())` → `.filter(|p| p.delete)` - Tüm `delete=true` flag'li bölümler (incl. newly defined with empty orig_device) free alan hesaplamasından exclude ediliyor 3. **`validate_manual` ekstra validasyonlar** (`src/steps/partition.rs`): - **Duplicate mountpoint kontrolü**: Aynı mountpoint'ta iki live bölüm tanımlı mı? → hata döndürür - **Swap boyut validasyonu**: 512MB minimum, 8GB maksimum kontrolü eklendi - **Size 0 partition uyarısı**: Boyut 0 ama mountpoint boşsa uyarı mesajı 4. **`is_complete` disk seçim kontrolü** (`src/steps/partition.rs`): - `state.partition_plan.is_some()` → `state.selected_disk.is_some()` eklendi - Kullanıcı disk seçmeden partition tanımları yapmış gibi görünmesini engelledi - `is_complete` false döndürür, kullanıcıya disk seçme hatası verir 5. **Test doğrulaması**: - `cargo check` - başarıyla derlendi (43.22s) - `cargo test` - 1 test passed (parse_progress2_percent) ### Etkilenen Dosyalar - `src/steps/partition.rs` - 3 değişikling (manual_capacity_error, validate_manual, is_complete) - `src/jobs/partition.rs` - 1 değişiklik (disk_free_regions_mb delete flagı) ### Bilinen Açıklar / Yapılacaklar Güncellemesi - [x] `manual_capacity_error` sorunu çözüldü - birim tutarlılığı sağlandı - [ ] `manual_capacity_error` yalnızca sabit boyutları kontrol eder; LVM PV/LV toplamları ayrıca doğrulanmalı (hala open) - [ ] Silinmek işaretli bölüm bir VG'nin PV'siyse SetupLvmJob tarafında kontrol yok - [ ] Otomatik mod (erase disk) hâlâ tek disk; çoklu otomatik plan yok - [ ] Debug amaçlı kalan `eprintln!` satırları temizlenebilir