forked from pisilinux-rs/yali-rs
main
94 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
af33334b2c |
parted mkpart söz dizimi + canlı autologin çakışması düzeltmeleri
- Manuel bölümleme parted söz dizimi disk etiketine göre seçiliyor (GPT: ad+fs, msdos: primary/logical+fs); etiket parted print'ten okunuyor, boş diske mktable kuruluyor - Yerelleşmiş parted çıktısı P0 veri kaybı yapıyordu: LC_ALL=C ile okunuyor, ayrıştırıcı Türkçe başlığı da tanıyor, mktable öncesi fiziksel bölüm kilidi var - Otomatik mod mkpart 4 argümana geçti (ad + fs türü) - GPT '/' adı sfdisk ile boşaltılıyor (warn-only, kurulumu durdurmaz) - ConfigureAutologinJob: /etc/sddm.conf.d/10-yali-autologin.conf kanonik dosya, hedeften oturum tespiti, kapalıyken canlı config'in ezilmesi (boş User= / lightdm satır temizliği) - Checkbox etiketi: 'Otomatik oturum aç' / 'Log in automatically' - 158 test, 0 uyarı |
||
|
|
546bb79be7 |
fix(partition): P0 veri kaybı — bölüm numaralandırması yanlış modellemiş
## Bulgu
`plan_disk_layout` bölüm numaralarını "başlangıç offset'ine göre
sıralayıp 1'den numaralandırıyordu" varsayımıyla çalışıyordu.
28 Eyl 2026'da canlı ISO'da ölçüldü: **varsayım yanlış.**
## Ölçüm
Kernel bölümü **başlangıç offset'ine göre değil, bölüm tablosu
slotuna göre** adlandırır. msdos ve gpt için ayrı ayrı doğrulandı.
msdos (VM'de, reboot sonrası taze okuma):
/dev/sdc1 = 1 MiB (100 MiB) korunan
/dev/sdc2 = 5001 MiB (1000 MiB) YENİ
/dev/sdc3 = 301 MiB (4700 MiB) korunan — KAYMADI
gpt (host'ta loop + --partscan): GPT giriş dizisi ile LBA sırası
bilerek FARKLI kuruldu (dizi 2 = 5001 MiB, dizi 3 = 301 MiB). Kernel
yine dizi sırasını verdi.
## Etkisi (veri kaybı)
Eski kod `device_map`'i TERS yazıyordu: yeni bölüme `sdX3`, korunan
bölüme `sdX2`. FAZ C mkfs'i KORUNMASI GEREKEN 4700 MiB'lik bölüme
uygulardı — tam olarak `plan_disk_layout`'ın önlemek için yazıldığı
veri kaybı senaryosu.
## Düzeltme
// hayatta kalanlar numaralarını KORUR
let mut taken: BTreeSet<u32> = survivors...;
// her yeni bölüm en küçük BOŞ slotu alır
for p in planned.iter_mut() { let num = ilk boş slot; }
Konum hesabı (first-fit / en büyük boş bölge) DEĞİŞMEDİ — o hâlâ
gerekli. Yalnızca numaralandırma basitleştirildi.
`remapped` tamamen kaldırıldı: hayatta kalan bölüm artık kaymadığı
için hep boş kalıyordu. Ölü durum bırakılmadı; dönüş tipi
`Result<Vec<PlannedCreate>, String>` oldu, FAZ B'deki döngü silindi.
## Uçtan uca doğrulama
Kodun tahmini ile gerçek kernel BİREBİR örtüştü (2 yeni bölüm +
1 silme; slot 2 ve slot 4 — slot 3'ü hayatta kalan bölüm tutuyor):
kernel: p1=1/100 p2=5001/300 p3=301/4700 p4=5301/1000
kod : sdc2 ......... sdc4
## Ders
Bu, `assign_partition_numbers`'ın "en küçük boş slot" kuralının zaten
DOĞRU olduğu anlamına gelir. `plan_disk_layout`'ın bütün varlık
sebebi (offset'e göre yeniden numaralandırma) gerekli değilmiş.
Ölçüm tahminin yerine geçti. 11 test vardı ama hepsi AYNI yanlış
varsayımı paylaşıyordu — testler doğruyu kanıtlamaz, varsayımı
tutarlı kılar. "Kernel şunu yapar" inancı ölçülmeli.
## Testler (150 → 151)
- live_verified_sdc_oversized_new_partition: artık slot 2 bekliyor
- delete_plus_create_renumbers_physical_partitions →
delete_plus_create_keeps_physical_partition_numbers
- deleting_middle_shifts_later_partitions_down →
deleting_a_partition_makes_others_slide (kayma YOK)
- deleting_last_partition_shifts_nothing → ...changes_nothing
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 151/151
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
5f78df981a |
docs(partition): plan_disk_layout varsayımı gerçek parted ile çelişiyor — UYARI
28 Eyl 2026'da canlı ISO'ya SSH ile bağlanıp gerçek davranış ölçüldü. msdos tabloda kernel offset'e göre sıralamıyor, MBR slot numarasını aygıt adı yapıyor. Bu, plan_disk_layout'ın temel varsayımıyla çelişiyor ve tersi durumda FAZ C korunan bölümü biçimlendirir. Düzeltme YAPILMADI: önce GPT davranışı ölçülmeli (sda/sdb GPT) ve kernel tablosu taze okumayla doğrulanmalı (partx yarım çalıştı, reboot/ACPI yetkisiz). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
03cc46098c |
fix(partition): lsblk'in "[SWAP]" biçimi mountpoint'e sızıyordu
Canlı ISO'ya SSH ile bağlanıp GERÇEK `lsblk` çıktısı okunarak
bulundu — tahminle değil:
$ lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT -b --noheadings -l /dev/sdb
sdb1 524288000 vfat /boot/efi
sdb2 1572864000 swap [SWAP] ← köşeli parantezli
sdb3 25168969728 ext4 /
`read_existing_partitions` mountpoint'i doğrudan alıyordu, yani
`CustomPartition::mountpoint = "[SWAP]"` oluyordu.
## İki yere sızıyordu
1. **UI** — tablonun bağlama noktası sütununda `[SWAP]` görünüyordu
2. **MÜKERRER KONTROLÜ** — iki swap'ı olan makinede (Windows diski +
Linux diski = çift önyüklemeli kurulumun tipik hali) ikisi de aynı
`"[SWAP]"` değerini taşıyor ve kullanıcı VAR OLMAYAN bir "mükerrer
bağlama noktası" hatası görüyordu
Bu makinede tek swap olduğu için sorun görünmüyordu. Tek swap'lı
kurulumda hata hiç ortaya çıkmaz — kolayca kaçar.
## Düzeltme
- `normalize_lsblk_mountpoint(raw, fstype)`: `[SWAP]` → `"swap"`.
Yalnızca `FsType::Swap` için; diğer dosya sistemlerinde köşeli
parantezli tuhaf bir çıktı gelirse DOKUNULMAZ (sessizce yutmak,
özgün hatayı gizlemekten daha kötüdür).
- Mükerrer kontrolü artık yalnızca **gerçekten bağlanan** dosya
sistemlerini karşılaştırır: `Swap`/`Lvm`/`LvmLv` hariç.
`mountpoint_required` ile aynı gerekçe — bağlama noktası
semantiği olmayan hiçbir şey karşılaştırılmaz.
## fstab etkilenmedi
Satır `part.mountpoint`'e değil `part.fstype`'e göre yazılıyor
(`FsType::Swap => ("none", "sw", "0", "0")`). Doğrulandı: kurucunun
yazdığı /etc/fstab'ta swap satırı `none`. Yani hata fstab'da değil,
mükerrer kontrolünde görünüyordu.
## Testler (145 → 150)
- `[SWAP]` → `swap` normalleşir
- mount edilmemiş swap (sütun boş) de `swap` olur
- diğer dosya sistemleri değiştirilmez, `[weird]` de dokunulmaz
- ⭐ iki swap mükerrer SAYILMAZ (gerçek lsblk biçimiyle)
- iki gerçek `/` hâlâ mükerrer sayılır (filtre körleştirmiyor)
- iki LVM PV mükerrer sayılmaz
Bir test ilk yazımda kök bölümü içermiyordu ("No root partition"
hattı) — beklenti düzeltildi.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 150/150
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
4f12334dd6 |
fix(partition): silinen alandan açılan "/", boş alan satırını gizlemiyordu
Kullanıcı raporu: "boş alan sorunu geri gelmiş bir alanı sildim boş
alan olarak doğru oku, sonrasında o boş alanı yeni bölüm diyerek /
dizin yaptım biçimlendir seçtim kaydettim ama boş alan duruyor
yerinde, yeni oluşturduğumda duruyor."
## Sebep — koşul YER YER yazılmıştı
Bu tablodaki bir hata üçüncü kez yaşanıyor ve üçü de aynı sebepten:
`has_symbolic` kontrolü satırın YALNIZCA BİR basış yerine eklenmişti.
1. `else if` dalı vardı → tanım varsa satır hiç basılmıyordu
2. `else if` düzeltildi, DÖNGÜ İÇİ basış unutuldu
3. döngü içi de ayrı ayrı yazıldı → yine kaçırılabilir
Senaryo: sdb2 silindi → boş alan DOĞRU göründü → o alandan "Yeni
Bölüm" ile `/` açıldı. `/` "Kalan Alan" olduğu için SEMBOLİKTİR ve
alanın tamamını alır. Ama silinen bölümün yerine basılan satır
sembolik tanımı görmüyordu ve diskin tamamını "boş" göstermeye
devam etti — kullanıcının o satırın sağında gördüğü.
## Düzeltme — koşul tek yerde
let show_free = free_total_mb > 0 && !has_symbolic;
`show_free` artık ÜÇ basış yerinin de ortak koşulu:
döngü içi (silinen grubun sonu), döngü sonu (sonda işaretli), sondaki
`else if` (disk sonu).
Koşulu üç yere ayrı ayrı yazmayı bırakmak bu sınıf hatayı
kaçınılmaz kılıyordu; aynı hatanın üçüncü kez yaşanması bunun
kanıtı.
## Testler (143 → 145)
- ⭐ kullanıcının senaryosu: silinen bölümün yerine sembolik `/`
açıldı → boş alan satırı KAYBOLUR, 2 satır kalır
- aynı senaryo ama SABİT boyutlu bölüm → boş alan satırı kalır ve
miktar doğru düşer (500000 − 50000 = 450000)
İkinci test önemli: satırın kaybolmaması da bir hata olurdu —
sabit boyutlu bölüm gerçekten yer bırakıyor.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 145/145
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
5063d9d9dd |
refactor(partition): disk şeridini kaldır, Aktif Disk ComboBox'ını temala bağla
Kullanıcı isteği: "manuel disk penceresindeki tablonun altındaki /dev/sda sdb gibi seçilileri kaldır. Aktif disk bölümünde seçiyoruz zaten tablonun altında olmasına gerek yok birde aktif disk seçisininde dark temaya göre renklerini ayarla okunması zor halde." ## 1. Disk şeridi kaldırıldı Tablo altındaki tıklanabilir `/dev/sda · 3/20 GB` düğmeleri gitti. Üstteki "Aktif Disk" ComboBox'ı zaten tek ve açık kaynak; iki kaynak olması "hangi disk geçerli" sorusunu belirsizleştiriyordu. ### ⚠️ Şerit sadece çizim değildi Disk değişince `selected_idx` ve `selected_free` sıfırlıyordu. Bu **veri güvenliği** kuralı: `selected_idx` tablo dışındaki gerçek bir bölüm indeksi, tablo ise tek diski gösteriyor. Sıfırlanmazsa yeni disk eski diskin indeksini taşır ve "Sil" YANLIŞ bölümü siler. Sorumluluk **ComboBox'a taşındı** ve `on_disk_changed()` adlı küçük saf yardımcıya bağlandı (tek satırda iki bayrak, ama test edilebilir olsun diye ayrıldı). Taşımamış olsaydım kaldırma işlemi sessizce veri kaybına yol açardı. ## 2. ComboBox rengi düzeltildi Sorunun kaynağı: bu ComboBox **ham** `egui::ComboBox` + `ui.selectable_value` kullanıyordu, yani egui'nin varsayılan stili. Mountpoint ve önyükleyici ComboBox'ları ise zaten projenin `theme::show_combo_box` + `theme::selectable_value` sarmalayıcılarını kullanıyor — disk ComboBox'ı geride kalmıştı. Artık temalı: gradient arkaplan + temaya göre seçilen metin rengi (`combobox_stil_text_color` panel parlaklığına bakar). Yan fayda: ComboBox'taki `println!("Seçilen Disk Değişti: …")` **silindi** (AGENTS.md'de açık maddeydi, GUI'de stdout'a yazıyordu). ## 3. Tautolojik test silindi `disk_strip_lists_every_disk_even_when_one_is_shown` kaldırılan şeridin mantığını satır içinde YENİDEN yazıyordu ve `all()`'ı boş listede çağırıyordu — yani hiçbir şey test etmiyordu. AGENTS.md'de "eski test TUUTOLOJİK'ti" diye not düşülen aynı sınıf. Silindi, yerine taşınan kuralın testi geldi. ## Testler (141 → 143) - disk değişince `selected_idx` / `selected_free` sıfırlanıyor - disk değişmeden seçim korunuyor (her karede sıfırlansa kullanıcı hiçbir satırı seçemezdi) - tablo yalnızca aktif diskin bölümlerini üretiyor `seen_disk_names` de kaldırıldı — şeritle birlikte ölü oldu. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 143/143 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
20f48bdf99 |
refactor(partition): "Biçimlendirmeyi Atla" → olumlu "Biçimlendir"
Kullanıcı isteği: "düzenle penceresindeki biçimlendirmeyi atla
seçeneğini biçimlendir şekline dönüştürsek yani seçili ise
biçimlendirsin şimdiki davranışın tam tersi."
## Neden ters çevirmek daha dürüst
"Biçimlendirmeyi Atla" taranmış bölümlerde SEÇİLİ geliyordu, yani
güvenli durum "varsayılan seçim"di. Risk seçenekte değil, onu
okuyan kullanıcıda: kutu işaretliyse "atla" kelimesinden "veri
silinmez" sonucu çıkarıyor — oysa işaretli olması tam tersi anlama
geliyordu.
Olumlu çerçevede seçim kullanıcıya aittir:
Taranmış bölüm (sda1) → ☐ SEÇİLİ DEĞİL → veri korunur
Kullanıcı tanımı (sda2) → ☑ SEÇİLİ → biçimlendirilir
## Katmanlar
- Model `CustomPartition::skip_format` **KORUNDU** — job'lar
(`jobs/partition.rs:812`, `:963`) ve çok sayıda test kullanıyor,
ayrıca taranmış bölüm için güvenlik bayrağı olarak anlamı doğru
("bu gerçek veri, bozma").
- Diyalog `ManualState::add_skip_format` → **`add_format`** olarak
yeniden adlandırıldı.
Ters çevrim iki yere dağıtılmadı, iki adlandırılmış yardımcıya
bağlandı:
format_checkbox_from(skip_format) -> bool
skip_format_from(add_format) -> bool
## Neden yardımcı şart
Ters çevrim sessizce kaybolursa taranmış bölümler biçimlendirilir
— **veri kaybı**, derleyici de uyarmaz. `!` iki uzak satıra
yazılsaydı birinde unutulabilirdi.
## Testler (138 → 141)
- çift dönüşüm kimliktir (skip_format'ın HER İKİ değeri de denendi)
- taranmış bölüm "Biçimlendir" işaretli GELMİYOR
- kullanıcı tanımı işaretli geliyor
`mp_skip_format` çeviri anahtarı kullanılmaz hale geldiği için iki
locale'den de silindi (ölü anahtar bırakılmadı). 466/466 eşleşiyor.
AGENTS.md'deki "format kutusu seçili görünmeli" notu da tersine
çevrildi: artık seçili OLMAMALI, çünkü seçili olmak "biçimlendir"
demek.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 141/141
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
cedbb6a741 |
fix(partition): düzenlemede bağlama noktası seçilemiyordu
Kullanıcı raporu: "düzenle kısmında bu seferde bağlama noktasını
seçemiyorum."
## Sebep — geçen turda benim eklediğim kod
NTFS için mountpoint'i isteğe bağlı yaparken diyaloga şunu
koymuştum:
if mp_optional {
if matches!(add_mountpoint.as_str(), "/" | "/home" | …) {
add_mountpoint.clear();
}
}
egui `show()` HER KARE (~60 Hz) çağrıldığı için bu blok korumasızdı:
kullanıcı açılır listeden `/home` seçtiği anda bir sonraki karede
değer siliniyor, tekrar seçiliyor, tekrar siliniyordu.
Daha kötüsü `mp_optional` FİZİKSEL bölümlerde de doğru olduğu için
(orijinal mountpoint'i olan bir bölümü düzenlerken) `/`, `/home`,
`/var`, `/tmp`, `/swap`, `/boot`, `/boot/efi` listesinin TAMAMI seçilemez
hale geliyordu.
## Düzeltme — iki koşul birlikte
1. **Yalnızca Ekleme modunda.** Eklemede mountpoint
`suggest_mountpoint`'in ÜRETTİĞİ bir öneridir ve eski kalıntı
olabilir. Düzenlemede bölümün GERÇEK değeridir; silmek kullanıcının
verisini kaybettirirdi.
2. **Yalnızca `add_fstype` DEĞİŞTİĞİ karede.** `ManualState`'e
`add_fstype_prev: Option<usize>` eklendi; "Yeni Bölüm" ve
"Düzenle" butonlarında diyalog açılışında kuruluyor ki ilk karede
yanlışlıkla silinmesin.
(2) olmadan ekleme modunda da aynı sorun yaşanırdı: NTFS seçip
`/home` yazan kullanıcının alanı yine her karede temizlenirdi.
## Aynı sınıf hata: testler ortama bağımlıydı
`is_removable()` gerçek sysfs okuyor. Bu makinede
`/sys/block/sda/removable == 1` olduğu için `/dev/sda` kullanan 3 test
çıkarılabilir sanılıp KIRILDI — o testler **şansa** geçiyormuş.
Şansa geçen test, test olmaktan kötüdür.
Saf katman probu dışarıdan alacak şekilde ayrıldı:
- `sort_disks_with(disks, is_removable)`
- `default_boot_device(root, disks, is_removable, has_partitions)`
Üretim sarmalayıcıları gerçek probu veriyor, testler sabit olanı
(`never_removable`).
## Testler (137 → 138)
- çıkarılabilir aygıt ada göre önde olsa bile sona gider
- dahili diskler yalnızca ada göre sıralanır
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 138/138
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
bd407adab3 |
feat(bootloader): varsayılan aygıt artık mevcut işletim sistemi olan disk
Kullanıcı kararı: "zaten işletim sistemi olan diski seç".
## Neden kök diski değil
BIOS modunda `grub-install` seçilen diskin MBR'sine yazar ve MBR'yi
okuyan aygıt firmware'in açılış sırasındaki ilk diski olmak ZORUNDA:
sda: Windows sdb: PisiLinux (kök burada)
GRUB → sdb firmware sdb'yi açmaz, PisiLinux HİÇ GÖRÜNMEZ
GRUB → sda firmware GRUB'a düşer, GRUB ikisini de listeler
Salt kök diski varsayılan tutmak dual-boot'ta sistemi açılmaz
bırakıyordu. `selected_disk` ise manuel modda "aktif düzenleme
diski" olduğu için /home eklemek için geçilen diske yanlış yönlendiriyordu.
## Kural (default_boot_device, saf + test edilebilir)
1. çıkarılabilir aygıt (ISO'nun USB'i) → ASLA hedef değil
2. kök diski dışında bölümü olan ilk dahili disk → mevcut OS diski
3. kök diski
4. selected_disk (son çare)
"İşletim sistemi kurulu"nun en ucuz ve en güvenilir göstergesi: kök
diski dışında hâlihazırda bölüm tablosu olan disk.
Tek diskli kurulumda 3. adım çalışır → davranış kök diskiyle aynı,
geriye dönük uyum bozulmaz.
## Tespit: alt süreç YOK
`disk_partition_count()` sysfs'ten okuyor
(`/sys/block/<disk>/<disk><N>` girdileri). `lsblk` çağırmak
`on_enter`'da bile gereksiz ve kare başına alt süreç yasağına
ayrık düşüyordu.
## UI
`boot_device_reason` aynı fonksiyonu çağırıp seçimin bu kurala
uyup uymadığını denetler; uyuyorsa gerekçe metni gösterilir. Böylece
sessiz bir varsayılan sürpriz olmaz ve **ikinci bir uygulama olmaz**.
## Testler (129 → 137)
bootloader.rs'de test modülü yoktu, eklendi (8 test):
- mevcut OS diski seçilir (kullanıcının senaryosu)
- tek disk → kök disk
- hiçbir disk bölümlü değil → kök disk
- kök disk "mevcut OS" sayılmaz
- birden çok adayda sıralı ilki seçilir
- kök disk bilinmiyorsa
- liste boşken kök disk kullanılır
- hiçbir şey bilinmiyorsa None
Bir test ilk yazımda yanlış beklenti koydu: liste boşken None bekliyordum,
doğrusu kök diske düşmek (liste yalnızca OS diski arayışı için gerekiyor).
Beklenti düzeltildi.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 137/137
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
c6a1d0fb6f |
fix(bootloader): disk listesini sırala, boot medyasını hedeften ele
Kullanıcı sorusu: "önyükleme adımında ilk disk neyse o seçili olması daha mantıklı değil mi." ## "İlk disk" neden doğru bir kural DEĞİL — iki bulgu ### 1. Liste sıralanmıyor `list_block_devices` ne `lsblk` çıktısını ne `/sys/block` çıktısını sıralıyor. Fallback yolunda liste `read_dir` sırasıyla geliyor, yani **önyüklemeden önyüklemeye değişebilir**. "İlk disk" böylece ne sıralı bir kavram ne de kararlı bir varsayılan. ### 2. ⭐ Boot medyası listede — ve hiçbir yerde filtrelenmiyor `detect_drive_type` "USB" döndürüyor ama o değer **tek bir yerde bile okunmuyor**. Canlı ISO'yu boot ettiğiniz USB `available_disks`'te yer alıyordu. "İlk disk" çok yaygın bir kurulumda boot medyasına denk gelir. Önyükleyici hedefi olarak seçilirse BIOS modunda `grub-install --target=i386-pc <usb>` MBR'yi oraya yazar: kurulum biter, sistem AÇILMAZ. ## Düzeltme - `sort_disks()`: çıkarılabilir aygıtlar SONA, dahililer ada göre. Artık "ilk disk" her zaman bir iç disk. - `disk_sort_key`: bölüm numarası sayısal ayrıştırılır; ada göre sıralama `sda10 < sda2` derdi. - Önyükleyici hedef listesinden çıkarılabilir aygıtlar **elenir**. Liste tamamen çıkarılabilir aygıt olursa eski davranışa düşülür (ComboBox boş kalmasın). - UEFI modunda `bootloader_device_hint_dualboot` ipucu gösterilir: çift önyüklemede hangi aygıtı seçmek gerektiği ekranda hiç yazmıyordu. ## Test sırasında çıkan hata İlk `base_disk_name` yazımı `trim_end_matches(is_ascii_digit)`'ı her yola uyguluyordu: `nvme0n1` → `nvme0n`. Sonuç `/sys/block/nvme0n/ removable` aranıyor, NVMe disk çıkarılabilir sayılmıyordu — yani filtre NVMe'de sessizce çalışmıyordu. Aynı hata `installer::device_to_disk` içinde de var ama o işlev BÖLÜM YOLU içindir ve şu an yalnızca test yardımcısından çağrılıyor; canlı bir hatası yok. Yine de `base_disk_name` kendi ayrıştırıcısını kullanıyor ve bu ayrım notla sabitlendi — "basitleştirilirse" NVMe'ler çıkarılabilir sanılır. ## Testler (124 → 129) - diskler ada göre sıralanır - bölüm numaraları sayısal sıralanır (sda10 > sda2) - NVMe/mmcblk/vda isimleri doğru ayrışır (çıplak + bölümlü) - sıralama anahtarı her iki biçimi de doğru verir - çıkarılabilir aygıtlar sona gider Varsayılan seçimin KÖK diski olarak kalması korundu — bu konuda kullanıcıyla konuşulacak, aşağıdaki soru gönderildi. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 129/129 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
f150ab0002 |
fix(partition): NTFS bölümü bağlama noktası istemiyor
Kullanıcı isteği: "format için ntfs seçtiğim halde bağlama noktası
seçmemi bekliyor bu mantıksız değil mi."
## Neden mantıksız
NTFS Linux'ta bağlanması GEREKEN bir dosya sistemi değil. Tipik
kullanımı Windows ile veri alışverişi: bölüm biçimlendirilir,
sisteme bağlanmaz, kullanıcı elle bağlar ya da dosyayı doğrudan
açar. Zorunlu olması kullanıcıyı anlamsız bir noktaya zorluyordu
("/data" gibi) veya "bağlama noktası boş olamaz" hatası veriyordu.
## Düzeltme
`mountpoint_required` artık `Ntfs` için de `false` döndürüyor:
| FsType | Sonuç |
|---|---|
| `Lvm` | serbest (PV bağlanmaz) |
| `Ntfs` | serbest (bağlanması gerekmez) |
| düzenlenen fiziksel bölüm | serbest ("yalnızca GRUB için") |
| yeni ext4/btrfs/xfs/fat32/swap | zorunlu |
Kurulumda boş bırakıldığında ne olduğu ZATEN doğruydu, değiştirilmedi:
mount atlanır, fstab'a girmez, ama `mkfs.ntfs -f` çalışır
(jobs/partition.rs FAZ C, `FsType::Ntfs`). Yani istenen davranış
zaten altyapıda vardı; yalnızca arayüz gereksiz bir alan zorunluydu.
## Diyalog
NTFS seçilince:
1. Önceki geçersiz öneri kalıntısı (`/`, `/boot/efi`, `swap`, …)
temizleniyor — kullanıcı NTFS'e geçince "/boot/efi" gibi alakasız
bir öneri alıyordu.
2. `mp_mountpoint_optional` ipucu gösteriliyor: boş bırakılırsa
bölüm biçimlendirilir ama başlangıçta bağlanmaz.
## Testler (122 → 124)
- NTFS mountpoint istemez (yeni tanım + düzenleme)
- mountpointsiz NTFS düzeni doğrulamadan geçer (sda1 GRUB-only +
sdb tam kurulum + mountpointsiz NTFS)
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 124/124
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
70f3737f01 |
fix(partition): "Kalan Alan" tanımı alanı boş alandan düşmüyordu
Kullanıcı raporu: "boş alanı gösterdi ve o kısmı yeni bölümden ntfs olarak formatlamasını seçtim ama eklenen bölümün 19.8 gb demesine rağmen bunu boş alandan düşmedi." ## Kök neden `size_mb == 0` bir tanım **"Kalan Alan"** demektir: kurulumda diskin o an kalanının TAMAMINI alır. Bu yüzden sabit boyutlu tanımlarla toplanırken katılmaz (`size_mb` zaten 0). Ama ne tablo ne de kapasite kontrolü bunu biliyordu. Sonuç: 20 GB'lik disk 39 GB kullanıyor gibi görünüyordu — bölüm satırı kalanın tamamını (19.8 GB) gösteriyor, alttaki "Boş Alan" satırı da aynı 19.8 GB'yi gösteriyordu. ## Düzeltme `has_symbolic_remaining(parts, disk)` tek kaynak olarak eklendi (`!delete && size_mb == 0 && orig_device.is_empty()`) ve dört yere bağlandı: - **tablo** (`build_table_rows`): sembolik varsa boş alan satırı çizilmez — o alan o tanıma ait - **çubuk** (`manual_dual_bars`): sembolik varsa serbest segment eklenmez. Zaten doğruydu ama kuralın AYRI kopyası vardı; artık aynı fonksiyona bakıyor, tablo ile çubuk ayrışamaz - **kapasite** (`manual_capacity_error`): sembolik varsa `fixed_mb >= cap_mb` reddedilir ## Kapanan açık madde AGENTS.md'de şu yazıyordu: "`manual_capacity_error` sembolik (`size_mb == 0`) tanımları hesaba katmıyor → `fixed == cap` geçiyor, kurulumda 'yeterli boş alan yok' ile düşüyor." Disk sabit tanımlarla tam doluysa ve bir de "Kalan Alan" tanımı varsa o tanıma 0 byte kalıyordu. Artık `>=` ile reddediliyor. Ayrıca **aynı diskte iki "Kalan Alan" tanımı** reddediliyor: ikisi de kalanın tamamını alır, ikincisine hiç yer kalmaz. Bu da kuruluma başlayıp orada düşmeye yol açan bir durumdu. ## Not `orig_device` dolu (taranmış) 0 boyutlu bölüm sembolik SAYILMAZ: sıfır boyut "kalanın tamamı" anlamına gelmez. Testle sabitlendi. ## Testler (113 → 122) Yeni `symbolic_capacity_tests` (5) + `free_space_tests`'e 4 test: - sembolik tanım boş alan satırını yutar (kullanıcı senaryosu) - sembolik bölümün kendi satırı kalanın tamamını gösterir - sembolik tanım silinince boş alan satırı geri gelir - 0 boyutlu fiziksel bölüm sembolik sayılmaz - dolu disk + sembolik tanım reddedilir - yer olan sembolik tanım geçerli - aynı diskte iki sembolik reddedilir - her diskte birer tane geçerli - sabit tanımlarla tam dolu disk (semboliksiz) yine geçerli Testlerden biri ilk yazımda yanlış beklenti koydu (sembolik silinince 20480 bekliyordum, doğrusu 19980 — sda1'in 500 MB'ı hâlâ kullanımda). Beklenti düzeltildi. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 122/122 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
008c7a57b8 |
docs: AGENTS.md test sayıları ve test modülü listesi
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
ad8bc0c506 |
fix(partition): disk sonundaki boş alan hiç gösterilmiyordu
Kullanıcı raporu: "manuel partitionda boş disk alanı görünmüyor sda nın sda1 var 500mb sda toplamda 20gb 15gb görünmüyor." ## Sebep Boş alan satırı yalnızca İKİ durumda basılıyordu: 1. Silinmek işaretli bölüm varsa (ilk işaretli tanımın konumunda) 2. `all(|p| p.disk != active_disk)` — yani disk HİÇ tanım içermiyorsa Kullanıcının durumu ikisinin de dışında: sda'da sda1 (500 MB) var, silinmiş bölüm YOK, gerisi 15 GB boş. `fs_first` hiç dolmadığı için 1. dal çalışmadı; disk tanım içerdiği için 2. dal da çalışmadı. Sonuç: boş alan satırı hiç oluşmadı. Diskte kaç tanım olduğu ile kaç tanımın SİLİNM İŞARETLİ olduğu karıştırılmıştı. ## Düzeltme `build_table_rows(parts, active_disk, disk_mb)` olarak saf ve test edilebilir bir fonksiyona çıkarıldı (gömülüydü, `TableRow` enum'u da modül seviyesine alındı). Sondaki koşul artık yalnızca `free_total_mb > 0 && !free_row_shown`. `first_idx: None` "seçilemez" DEĞİL demektir; sadece temsil ettiği silinmiş bir tanım yoktur. Tıklanabilir: `global_idx == None` dalı `selected_free` tutuyor ve "Yeni Oluştur" butonunu gösteriyor. ## Test sırasında çıkan İKİNCİ hata `free_row_shown` bayrağını ilk yazdığımda silinmiş bölümler diskte ORTADA kaldığında iki boş alan satırı basılıyordu: biri döngüde (birleşik satır), biri de sonda. Aynı alan iki kez görünür ve toplam diskten büyük izlenimi doğardı. Test (`left: [10000, 10000]`) bunu yakaladı; bayrak eklendi. `cargo check` ayrıca `free_row_shown`'ın sondaki atamasının hiç okunmadığını bildirdi (iki dal birbirini dışlıyor) — o satır silindi. ## Testler (105 → 113) Yeni `free_space_tests` modülü: - sda1 + 15 GB boş, silinen yok → boş alan görünür (kullanıcı senaryosu) - tanım var/olmak arasındaki fark etkilemez - dolu diskte satır çizilmez - silinenler TEK satırda birleşir ve indeksi korur - boş alan toplamı disk kapasitesini aşmaz - silinen bölümün alanı boşa katılır - yalnızca aktif diskin satırları üretilir - disk seçili değilse satır yok Kapasite çubuğu (`manual_dual_bars`) zaten boşluğu doğru gösteriyordu; eksik olan tek yer tablo satırıydı. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 113/113 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
7ff5c4b783 |
fix(execution): kopyalama başlayınca "bekleyin" uyarısını gizle
Kullanıcı isteği: "kurulum başladığında kopyalanan dosyalar
gösterilmeye başladığında kurulum devam ediyor bekleyin uyarısını
kaldır."
`install_in_progress` ("Kurulum devam ediyor, lütfen bekleyin…") İKİ
yerde çiziliyordu:
1. çubuğun yanında, `copy_active` DEĞİLSE
2. altındaki "durum etiketi"nde, `running` olduğu sürece
`running = !finished && !error && (copy_active || install_progress
> 0.0)` olduğu için kopyalama sırasında ikisi de doğruydu: aynı
uyarı ekranda iki kez görünüyordu. Üstelik birinin yanında yüzde ve
kopyalanan dosyanın adı yazılıydı — "bekleyin" demek, ne olduğunu
söyleyen çok daha fazla bilginin üstüne gereksiz bir talimat.
## Değişiklik
`show_wait_notice(running, copy_active)` saf yardımcı; kopyalama
sırasında uyarıyı bastırır.
Kopyalama bitince `CopyFinished` ile `copy_active` false olur ve
uyarı GERİ GELİR: fstab, GRUB, temizlik gibi adımlarda ilerleme
çubuğu yoktur, orada kullanıcının beklemesi gerektiğini bilmesi
doğrudur. Kullanıcı "kopyalama sırasında" dediği için bu adımlar
kapsam dışı bırakıldı.
## Testler (102 → 105)
execution.rs'de test modülü yoktu; eklendi.
- kopyalama sırasında uyarı yok
- kopyalama bitince uyarı geri geliyor
- çalışmıyorken uyarı yok
Not: `execution_description` ("Lütfen bekleyin. Bu işlem birkaç
dakika sürebilir.") başlıkta sabit duruyor. O da "bekleyin" diyor
ama kopyalamanın uzun süreceğini baştan bildiği için anlamlı;
istenirse o da kaldırılabilir.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 105/105
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
948e1d548d |
fix(partition): "yalnızca GRUB için" bölüm mountpoint'siz kaydedilemiyordu
Kullanıcı raporu: "sda1 grub eklenecek o yüzden herhangi bir mount olayı yok ve yine bağlama noktası boş olamaz uyarısı alıyorum." Önceki commit yalnızca `validate_manual_on`'i düzeltmişti. Kaydetme DİYALOĞUNDA ikinci bir kural vardı ve koşulu `!is_pv` idi — yani fiziksel bölüm düzenlenirken de mountpoint zorunluydu. Kullanıcı sda1'i "kuruluma ait değil, yalnızca GRUB için" diye işaretlemek istiyordu ve diyalog kabul etmiyordu. Üstelik iki kural birbirinden farklıydı: validate serbest bırakırken diyalog reddediyor ve kullanıcı hangisinin geçerli olduğunu anlayamıyordu. ## mountpoint_required() — tek kural, iki yerde Kural artık saf bir yardımcıda tanımlı ve HER İKİ yerde de aynen kullanılıyor: - LVM PV → serbest - düzenlenen FİZİKSEL bölüm (orig_device dolu) → serbest - yeni tanım → zorunlu ⚠️ İki yerde ayrı yazılırsa birinde geçen diğerinde reddedilir ve kullanıcı "İleri"ye geçemez. Not yorumla sabitlendi. ## Hata mesajı artık bölümü adıyla söylüyor `mp_error_empty_mountpoint_named` eklendi. Genel mesaj ("Bağlama noktası boş olamaz") ekranda beş bölüm varken hangisinin kastedildiğini belli etmiyordu; bu bir hatanın iki tur turmasına yol açmıştı. ## Ölü i18n anahtarları silindi `rescue_button_tooltip` ve `job_display_manager` kodda KULLANILMIYORDU ve `en.toml`'da karşılıkları yoktu. Proje kuralı gereği çeviri yazmak yerine silindi: sessizleştirmek yerine kökten kaldır. tr/en artık tam eşleşiyor (463/463). ## Testler (98 → 102) - GRUB için ayrılmış fiziksel bölüm boş bırakılabilir - yeni tanımda mountpoint hâlâ zorunlu - LVM PV hiçbir koşulda mountpoint istemez - kullanıcının tam senaryosu (sda GRUB-only + sdb Linux + sdc /home) geçerli kabul ediliyor cargo check --all-targets : 0 hata, 0 uyarı cargo test : 102/102 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
a47c6e52bc |
fix(partition): mount edilmemiş fiziksel bölüm düzeni geçersiz kılıyordu
Kullanıcı raporu: "sdc ise tamamen boş disk bağlama noktası boş olamaz uyarısı veriyor." Kurulum: sda'da Windows (sda1 boot sağlam, mount değil), sdb'de Linux (EFI+swap+kök), sdc tamamen boş. ## Neden oluyordu `read_existing_partitions` mountpoint'i lsblk'in MOUNTPOINT sütunundan okur ve mount edilmemiş bölümlerde bu sütun BOŞTUR. Çift önyüklemeli bir makinede Windows'un boot bölümü her zaman bu durumdadır. Ama `validate_manual_on` boş mountpoint'i TÜM tanımlarda reddediyordu (LVM PV dışında) — kullanıcının hiç dokunmadığı sda1 yüzünden düzen geçersiz oluyordu. Hata hangi bölümden geldiğini de söylemiyordu. ## Düzeltmeler ### 1. Boş mountpoint zorunluluğu yalnızca kullanıcı tanımlarında Boş mountpoint'li FİZİKSEL bölüm "henüz atanmadı" demektir ve iş zincirinde zaten güvenli: mount edilmez (jobs/partition.rs:1111), fstab'a girmez (:1171), `skip_format: true` geldiği için formatlanmaz da. Doğrulama bir şey engellemiyor, sadece kullanıcıyı yanlış yönlendiriyordu. Kural: `orig_device` boş (kullanıcı tanımı) ve LVM PV değilse zorunlu. ### 2. Mükerrer bağlama noktası kontrolü boş değerleri dışlar İki atanmamış bölüm aynı "" değerini taşıdığı için kullanıcı var olmayan bir "mükerrer" hatası görüyor, asıl sorun maskeleniyordu. ### 3. suggest_mountpoint: öneri tüm düzeni görmeli `/`, `/boot/efi` ve `swap` TEKİLDİR. Öneri aktif diske bakıyordu; boş bir ikinci diske geçince o diskte tanım olmadığı için `/boot/efi` öneriyordu — sdb1'de zaten var olan mountpoint'i ikinci kez. Kaydetmeye çalışınca "mükerrer", alanı temizleyince "boş olamaz": iki hata da kullanıcıya hiçbir şey söylemiyordu. Saf ve test edilebilir bir fonksiyona çıkarıldı. Sıra: `/boot/efi` (UEFI) → `/` → `swap` → `/home` → boş. Son adım ikincil (veri) diskler için; sdc'de artık `/home` önerilir. Silinmek işaretli tanımlar sayılmaz. ## Testler (92 → 98) 6 yeni test, kullanıcının senaryosu dahil: - mount edilmemiş fiziksel bölüm düzeni geçersiz kılmaz - birden çok atanmamış bölüm mükerrer sayılmaz - boş ikinci disk /home önerir, mükerrer /boot/efi önermez - öneri aktif diske değil tüm düzene bakar - öneri sırası kök → swap - silinen tanım "alınmış" sayılmaz Mevcut `lvm_pv_may_have_no_mountpoint_but_others_may_not` testi yeni semantiğe göre güncellendi: "normal bölüm" yerine "kullanıcı tanımı" (orig_device boş) reddediliyor. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 98/98 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
3104adbc41 |
refactor(partition): hedef disk seçicisini tamamen kaldır, add_disk alanını sil
Kullanıcı isteği: "yeni bölümde de hedef disk kısmı kalksın, zaten seçilen diskte işlem yapılacak." Önceki commit seçiciyi yalnızca düzenlemeden kaldırmıştı. Şimdi her iki akıştan da kaldırıldı — arayüz zaten "tek disk üzerinde çalışıyor": tablo yalnızca seçili diski gösteriyor, disk şeridi diski değiştiriyor. Diyalogda ikinci bir "aktif disk" kaynağı yalnızca belirsizlik yaratıyordu. ## Davranış ekleme → state.selected_disk düzenleme→ bölümün kendi disk/device alanları (korunur) Başka diske bölüm eklemenin yolu: disk şeridinden o diske geç, sonra "Yeni Bölüm". Çoklu disk kurulumu böylece hâlâ mümkün, hatta daha tutarlı: eklediğin bölümü tabloda gördüğün diske eklersin. ## ManualState::add_disk SİLİNDİ Alan artık gereksizdi ve tam olarak geçmişte bir hatanın kaynağıydı: "Yeni Bölüm" (add_disk = sda) → iptal → sdb'deki bölümü "Düzenle" → kaydet → bölüm /dev/sda'ya taşınıyordu Diyalogda ikinci bir disk kaynağı kalmayınca bu sınıf hata yapısal olarak imkânsız hale geldi. Alan, atamaları ve iki `dialog_disk` fallback dalı kaldırıldı. ## Temizlik - `mp_target_disk`, `mp_target_disk_hint` çeviri anahtarları iki locale'den silindi (kodda kullanılmıyordu) - `mp_active_disk_hint` metni yeni akışı anlatacak şekilde güncellendi - `edit_disk_tests` içindeki `add_disk`'e dayalı iki test yeni davranışa göre yeniden yazıldı cargo check --all-targets : 0 hata, 0 uyarı cargo test : 92/92 geçti Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
d87664d191 |
fix(partition): düzenleme diyaloğundan hedef disk seçicisini kaldır
Kullanıcı isteği: düzenleme penceresinde hedef disk seçicisi gereksiz, çünkü zaten seçili bir bölüm düzenleniyor. ## Değişiklik Hedef disk seçicisi artık yalnızca "Yeni Bölüm" diyaloğunda çiziliyor (`if !is_edit`). Çoklu disk kurulumunun temel ihtiyacı olan "bölümü başka diske koyma" yolu korunuyor — o da seçiciyle ya da disk şeridinden hedef diske geçilerek yapılıyor. ## Kapatılan yan hata (veri yerleşimi) `add_disk` alanı "Yeni Bölüm" akışında aktif diske ayarlanıyordu ama DÜZENLEME butonu bu alanı sıfırlamıyordu. Şu akış bölümü yanlış diske taşıyordu: 1. "Yeni Bölüm" → add_disk = /dev/sda 2. İptal 3. /dev/sdb'deki bir bölüme tıkla → "Düzenle" 4. Kaydet → bölüm /dev/sda'ya taşındı Artık düzenleme butonu `add_disk = part.disk` atıyor ve kaydetme yolu `disk` / `device` / `orig_device` alanlarını olduğu gibi kopyalıyor. Böylece "düzenleme sırasında diski değiştirme" yolu tamamen kapandı. Ayrıca `dialog_disk` hesabındaki `is_edit` dalı sadeleştirildi: artık `add_disk` düzenlemede de dolu olduğu için yedek aramaya gerek yok. ## Testler `edit_disk_tests` (4 yeni): düzenleme bölümün kendi diski kullanır, disk/cihaz yolları korunur, seçici yalnızca eklemede görünür, ekleme akışı başka disk seçebilmeye devam eder. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 92/92 geçti (88 → 92) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
332d5a787f |
fix(partition): mount edilmemiş bölümde "Düzenle" görünsün, create_over kaldırıldı
Kullanıcı iki şey bildirdi:
1. Bir partitiona tıklayınca "Düzenle" gelmiyor, "Yeni Bölüm" ve
"Buraya Oluştur" geliyor.
2. "Yeni Bölüm" ve "Buraya Oluştur" aynı mekanizma değil mi?
Haklı: ikisi de yeni tanım üretiyor.
## Neden "Düzenle" hiç görünmüyordu
`is_unassigned` koşulu: `orig_device` dolu + `mountpoint` boş + silinmemiş.
lsblk'den taranan ve o anda MOUNT EDİLMEMİŞ her fiziksel bölüm bu
koşulu sağlar. Yani neredeyse her mevcut bölümde buton
"✏ Düzenle" yerine "➕ Buraya Oluştur" yazıyordu.
Mount edilmemiş olmak bölümü "yeni" yapmaz — kullanıcı tam olarak onu
seçip mountpoint atamak istiyordur. Düzenlemek zaten o işi yapar.
## Veri kaybı riski (create_over dalı)
`create_over` dalı alanları temizleyip `add_skip_format = false`
atıyordu. Taranmış fiziksel bölümler `skip_format: true` ile gelir
(kullanıcının verisi korunmalı). Bu dal o korumayı düşürüyordu:
kullanıcı "Oluştur"a basıp kaydedince FAZ C `mkfs` çalıştırıp
MEVCUT BÖLÜMÜNÜ biçimlendirirdi. Aynı anda "Yeni Bölüm" butonu
soluk çizildiği için iki buton yan yana duruyor, hangisi geçerli
belirsizdi.
## Değişiklikler
- `is_unassigned` dalı tamamen kaldırıldı
- Her bölüm satırı "✏ Düzenle" açar, `skip_format` dahil mevcut
değerler yüklenir ve korunur
- "Yeni Bölüm" bölüm seçiliyken artık hiç çizilmez (soluk bile)
— aynı mekanizma olduğu için ikisinin birden görünmesi kafa
karıştırıyordu
- `ManualState::create_over` alanı silindi; `is_create_like = !is_edit`
oldu. Ölü durum bırakılmadı.
- Kullanılmayan `mp_create_here` çeviri anahtarı iki locale'den silindi
## Testler
`edit_flow_tests` (3 yeni): mount edilmemiş bölüm hâlâ düzenlenebilir,
düzenleme skip_format'ı korur, düzenleme mountpoint atar, "Yeni Bölüm"
bölüm seçiliyken gizli.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 88/88 geçti (85 → 88)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
b2f35cb4dc |
feat(partition): butonlar seçime göre görünsün
Kullanıcı isteği: "sil ve düzenle herhangi bir partitiona tıklandığında, yeni oluştur ise boş yere tıklandığında görünmeli." ## Seçim durumu ayrıştırıldı `ManualState::selected_free: bool` eklendi. Önceden "Boş Alan" satırının `custom_partitions` içinde karşılığı olmadığı için `selected_idx = None` ile temsil ediliyordu; bu da "hiçbir şey seçili" ile karışıyordu. Artık iki seçim **birbirini dışlıyor**: bölüm satırı tıklanırsa → selected_idx = Some(i), selected_free = false boş alan tıklanırsa → selected_free = true, selected_idx = None aynı satıra tekrar tıklama → seçim kaldırılır (toggle) ## Buton görünürlüğü | Seçim | Görünen | |---|---| | bölüm satırı | ✏ Düzenle + 🗑 Sil | | boş alan satırı | ➕ Yeni Oluştur (vurgulu) | | hiçbiri | ➕ Yeni Oluştur (soluk) | - Düzenle ve Sil artık `if has_selection { ... }` ile SARILMIYOR — bölüm seçili değilse hiç çizilmiyorlar. - Yeni Oluştur `primary_button_enabled(can_create)` kullanıyor: boş alan seçiliyken tam renkli, bölüm seçiliyken soluk. - Boş alan seçildiğinde satır rengi belirgin maviye dönüyor; eski kırmızımsı ton "silinecek alan" izlenimi veriyordu. ## Yan temizlikler - Disk şeridinden disk değiştirilince `selected_free` de sıfırlanıyor (diske özgü bir seçim, yanlış diske taşınmamalı) - Silme onayı kapandığında "Geri Al" sonrası her iki seçim de temizleniyor ## Testler `selection_tests` (6 yeni): üç seçim durumunun buton eşlemesi, varsayılan durum, ve iki seçimin birbirini dışladığı. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 85/85 geçti (79 → 85) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
618bcbc023 |
fix(partition): Düzenle butonu görünmüyordu, butonları tablonun altına taşı
Kullanıcı iki şey bildirdi: disk seçiliyken "Yeni Oluştur" ve "Sil"
var ama "Düzenle" nerede, ve butonlar tablonun altında olmalı.
## 1. Butonlar tabloyu terk etmişti
Sıra şöyleydi:
tablo → disk şeridi → Bölümleme Planı (kapasite çubuğu) → BUTONLAR
"Bölümleme Planı" araya girince butonlar aşağı itildi ve kullanıcı
onları bulamadı. Plan bloğu butonların ARkasına taşındı:
tablo → disk şeridi → BUTONLAR → Bölümleme Planı
Plan bloğu salt görsel bir özet; eylem butonlarının hemen ardında
olması doğru olan yer orası.
## 2. `add_enabled_ui` gradient butonlarda ÇALIŞMIYOR
`Düzenle` ve `Sil`, `ui.add_enabled_ui(...)` sarmalayıcısı içinde
`theme::secondary_button()` / `danger_button()` ile çiziliyordu. Ancak
bu fonksiyonlar kendi `enabled` parametresine **sabit `true`** geçiyor:
pub fn secondary_button(ui, text) -> Response {
secondary_button_enabled(ui, text, true) // ← daima true
}
`add_enabled_ui` yalnızca çocuk widget'ın `Response`'unu etkiler,
butonun `enabled` parametresine ulaşamaz. Sonuç: seçim yokken de
buton TAM RENKLİ ve tıklanabilir görünüyor, tıklayınca da `if`'in
içi çalışmıyor (çünkü tıklama `Response`'a hiç yansımıyor) — yani
kullanıcı ne görüyor ne de bir şey olmadığını anlıyordu.
Artık `theme::secondary_button_enabled(ui, label, can_edit)` ve
`theme::danger_button_enabled(ui, label, has_selection)` kullanılıyor.
`gradient_button` `enabled: false` iken zaten gri gradyan +
`Sense::hover()` uyguladığı için doğru davranış bu.
Düzenleme `can_edit = has_selection && !is_marked_delete` koşuluna bağlı:
silinmek işaretli satırda düzenleme anlamsız, buton gri görünüyor.
Bu tuzak AGENTS.md'ye kalıcı kural olarak eklendi.
## Doğrulama
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 79/79 geçti
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
bee04fb554 |
feat(partition): tablo tek diske odaklansın, disk şeridi ekle
Kullanıcı isteği: manuel bölümlemede tüm disklerin bölüm tabloları tek tabloda listeleniyordu ve bu kafa karışıklığı yaratıyordu. Tablo artık üstteki seçicide hangi disk seçiliyse onun tablosunu gösteriyor. ## 1. Tablo tek diske indirildi `show_manual_partition_table` artık `state.selected_disk`'e ait satırları çiziyor. Satır indeksi `custom_partitions` içinde GLOBAL kaldığı için seçim, silme, düzenleme ve "boş alan" birleşimi değişmeden çalışıyor; yalnızca hangi satırların görüneceği daraldı. Disk başlığındaki "aktif disk" (▶) işareti kaldırıldı: tabloda tek disk olduğunda neyin aktif olduğu zaten belli, işaret gereksiz gürültüydü. ## 2. Disk şeridi — diğer diskler gizlenmiyor Tablodan hemen sonra tıklanabilir bir şerit eklendi. Her disk için `/dev/sdb · 120/500 GB` ve silinecek bölüm varsa sayısı yazılır; tıklanınca o disk seçilir. Böylece odak tek diskte kalırken "sda'da 3 bölüm var" bilgisi kaybolmaz. Disk değişince `manual.selected_idx` sıfırlanır. Bu gerekliydi: indeks global olduğu için sda'da seçili satır, sdb'ye geçildikten sonra da "seçili" kalıyor ve "Sil" yanlış bölümü etkiliyordu. Şerit tek disk vken çizilmez (gürültü olurdu). ## 3. LVM bölümü de diske filtrelendi Tablo tek diske odaklandı ama LVM listeleri tüm diskleri kapsıyordu: sdb seçiliyken sda'nın VG'si listeleniyordu. Artık - VG listesi: yalnızca PV'leri o diskte olan VG'ler - LV listesi: yalnızca VG'si o diskte olan LV'ler - Yeni VG kurulumunda PV'ler yalnızca SEÇİLİ diskin PV'lerinden Sonuncusu AGENTS.md'de kayıtlı açık bir maddeddi: PV'ler tüm disklerden toplanıyordu, sdb'de kurulan bir VG sda'nın PV'lerini de içeriyor ve boyut toplamı yanlış çıkıyordu. Diskte PV yoksa hata mesajı gösteriliyor (`lvm_no_pv_on_disk`). Ayrıca `has_lvm_pvs` artık `delete` işaretli PV'leri saymıyor. ## Testler `table_scope_tests` (3 yeni): tablo satırları yalnızca seçili diske ait, şerit her diski listeler, LVM PV'leri diske göre toplanır. cargo check --all-targets : 0 hata, 0 uyarı cargo test : 79/79 geçti (76 → 79) clippy : 78 uyarı, tamamı stil Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
3b9a128704 |
docs: AGENTS.md — 26 Eylül oturumu, çoklu disk + güvenlik
Bu oturumda yapılan tüm işin kaydı. Yeni ajan oturumları buradan
devam edecek.
## Eklenen ana bölümler
**🚨
|
||
|
|
b6f9af3b40 |
feat(partition): çoklu disk kurulumunda belirsizliği gider, özeti zenginleştir
Önceki commit bölümleme iş mantığını düzeltmişti. Burada `selected_disk`
değişkeninin taşıdığı belirsizlik gideriliyor ve kullanıcı kurulumdan
önce dağılımı tek ekranda görebiliyor.
## 1. selected_disk birden fazla şey ifade ediyordu
Dört ayrı yerde kullanılıyordu: yeni bölümlerin hedefi, çift şeridin
çizildiği disk, GRUB/InstallGrubJob hedefi ve bootloader_device'ın
varsayılanı. Kullanıcı tabloyu gezmek için ComboBox'u sdb'ye çevirince
GRUB da oraya yönlendiriyordu.
- Dış ComboBox'un etiketi "Kurulum Yapılacak Diski Seçin" idi ve bu
yanlış anlam çağrışımı yapıyordu. Artık "Aktif disk" + ne olduğunu
açıklayan bir ipucu metni. (Ayrıca hardcoded Türkçe etiket,
"Disk Seçin" de çeviriye alındı.)
- Yeni bölümlerin hedefi artık diyalogdaki disk seçiciden geliyor
(önceki commit), dolayısıyla dış ComboBox yalnızca vurgulamayı ve
varsayılan öneriyi etkiliyor.
- bootloader_device varsayılanı artık `selected_disk` değil, KÖKün
olduğu disk. partitioned_plan'a, yoksa selected_disk'a düşüyor.
## 2. Özet ekranı
Çoklu disk kurulumunda kullanıcı son durumu görmeli:
- Disk başlıkları kapasiteyi gösteriyor ("/dev/sdb (500 GB)")
- Her diskin altında "— boş: 120.0 GB" satırı
- Disk satırında kök diski "[kök]" etiketiyle işaretleniyor; GRUB
varsayılanı oraya kurulduğu için hangi diske önyükleme yazılacağı
belli olmalı.
Ekranda ⭐ emoji yerine düz metin etiket kullanıldı: setup_fonts
sistem + remixicon yüklüyor, renkli emoji fontu yorum satırında —
emoji kutu (tofu) olarak çıkardı.
## Locale dosyaları
Bu commit sırasında tr.toml/en.toml bozuldu (satır sonuna yapışan
düzenleme) ve rust-i18n proc macro derlemeyi durdurdu. Ayrıştırıcıyla
doğrulandı, `summary_manual_mode` değeri özgün haline döndürüldü.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 76/76 geçti
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
4c68c5018e |
fix(partition): çoklu disk kurulumu — veri kaybı hatası, disk seçici, doğrulama
Kullanıcı Linux bölümlerini ayrı disklere dağıtabilmeli. Veri modeli
(ö. `CustomPartition.disk`) çoklu diski destekliyordu; UI ve job
katmanındaki boşluklar bu işi kullanamaz hale getiriyordu.
## 1. VERİ KAYBI: bölüm numaraları ayrışıyordu (jobs/partition.rs)
Asıl bulgu. Bölüm numarası İKİ AYRI YERDE bağımsız hesaplanıyordu:
- UI: assign_partition_numbers → "en küçük boş slot"
- Job: mkpart + part.device okuması
`parted rm` silinen bölümden sonrakileri kaydırır ve mkpart yeni
bölümü başlangıç offset'ine göre yerleştirir. Aradaki boşluk
istenen boyuta SIĞMADIĞINDA mkpart diskin sonuna yazıyor, kernel yeni
bölüme 3 veriyor — UI ise 2 demişti. FAZ C mkfs'i o aygıta
uyguluyordu, yani kullanıcının KORUMAK İSTEDİĞİ bölüm
biçimlendiriliyordu.
- `plan_disk_layout()`: saf, test edilebilir bir fonksiyon. Diskin
tamamını (fiziksel + yeni) görüp başlangıç offset'ine göre
numaralandırıyor; hem yeni bölümlerin hem de silmeden sonra
KAYAN fiziksel bölümlerin gerçek yollarını döndürüyor.
- FAZ B artık tahmin yürütmüyor, bu planı kullanıyor.
- FAZ C `device_map` üzerinden GERÇEK aygıtı kullanıyor; kayma
olduğunda loglayıp doğru aygıta işliyor.
- `disk_free_regions_mb` (aynı mantığın eski, ayrı kopyası) silindi.
- `disk_total_mb` ve `read_physical_extents` eklendi; artık diskin
gerçek boyutunu sysfs'ten okuyor (önce son bölümün bitişinden
tahmin yürütülüyordu).
11 test, bunların içinde asıl regresyonu kilitleyen:
delete_plus_create_renumbers_physical_partitions,
deleting_on_one_disk_does_not_renumber_another,
layouts_are_independent_per_disk.
## 2. Ekleme diyaloğunda disk seçici YOKTU (steps/partition.rs)
Yeni bölümün diski `state.selected_disk`'e SABİTLENİYORDU ve diyalogda
hiçbir disk kontrolü bulunmuyordu. /home'u sdb'ye koymak isteyen
kullanıcı, kurulumun GRUB hedefini de değiştirmek zorundaydı
(`selected_disk` aynı zamanda `build_custom_job_queue`'un girdisi).
- `ManualState::add_disk` + diyaloga disk seçici
- Düzenlemede de değiştirilebilir: bölümü başka diske taşımanın
yolu. Taşınırsa `orig_device` temizlenir, yoksa job eski diske
işlem yapmayı sürdürürdü.
- Varsayılan öneriler (EFI/root/swap) artık AKTİF diskin durumuna
göre veriliyor; önce her zaman aktif diskin bölüm sayımı
kullanılıyordu, yeni diske geçince alakasız öneri çıkıyordu.
## 3. Hiç bölümü olmayan diskler tabloda GİZLİYDİ (steps/partition.rs)
`seen_disks` yalnızca `custom_partitions` içinden kuruluyordu. Yeni
veya bölüm tablosu olmayan bir disk ne başlık ne boş-alan satırı
gösteriyordu — kullanıcı "sdb'de ne var?" diye bakamıyor, dolayısıyla
oraya bölüm koymanın yolunu da göremiyordu. Artık `available_disks`
taranıyor ve tanımsız disklere boş-alan satırı basılıyor.
Bu satır `first_idx: None` taşıyor: tıklanırsa `selected_idx = 0`
olur ve kullanıcı BAŞKA diskin ilk bölümü seçilmiş olurdu.
## 4. Kapasite doğrulaması yanlış listeyi geziyordu (steps/partition.rs)
`manual_capacity_error` `available_disks` üzerinde yürüyordu; o
listede olmayan diske yapılan tanım hiç kontrol edilmeden geçiyordu.
Artık bölüm tanımlarının kendi `disk` alanından yürüyor.
Ayrıca "disk bağlı değil" ile "kapasite aşıldı" ayrıldı:
validate_manual_on(..., &disks) diskin gerçekten var olduğunu
kontrol ediyor, kapasite hesabı yalnızca bilinen disklerde yapılıyor
(0 MB kapasiteyle "aşıyor" demek yanıltıcıydı).
Yeni kontroller: birden fazla kök (/), disksiz tanım, bağlı olmayan
disk.
## 5. LVM PV mount ediliyordu (jobs/partition.rs)
Diyalog her tanım için mountpoint zorunlu kılıyordu; PV'nin
mountpoint'i vardı, MountCustomPartitionsJob onu mount'lamaya
çalışıyordu ("wrong fs type" → kurulumun tamamı düşüyordu) ve
FstabFromCustomPartitionsJob fstab'a ext4 satırı yazıyordu.
Artık PV mount edilmiyor, fstab'a girmiyor, mountpoint'i de
zorunlu değil.
## 6. prepare_disk seyrek düzende bölüm çözmüyordu (jobs/partition.rs)
`1..=32` numaralandırılıp İLK EKSİK bölümde `break` ediliyordu.
sda1 + sda3 olan bir diskte döngü n=2'de duruyor, sda3 hiç çözülmüyor
→ bağlı kalan bölüm yüzünden `parted mkpart` "device busy" veriyordu.
Artık gerçek bölümler lsblk'den alınıyor.
## 7. GRUB yedek yapılandırması kökü tahmin ediyordu (jobs/bootloader.rs)
generate_minimal_grub_cfg kök aygıtını `is_uefi` ile (3|2) ve seçili
disk üzerinden buluyordu. Manuel modda numaralar
assign_partition_numbers'tan gelir, üstelik kök başka bir diskte
olabilir. Artık `mounted_root_device()` ile mount noktasının arkasındaki
gerçek aygıt soruluyor. BIOS'taki sabit `set root=(hd0,msdos2)` de
gerçek kök aygıtının bölüm numarasından geliyor.
## Testler
+22: 11 plan/numaralandırma, 10 çoklu disk doğrulama, 1 LVM PV.
steps/partition.rs'te disk() ve part() yardımcıları iki test modülü
ortak kullandığı için testutil modülüne taşındı.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 76/76 geçti (55 → 76)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
8d652c3a99 |
refactor: squashfs akışına uygun sihirbazı daralt, DM tespitini çalışma zamanına al
YALI kurulu sistemi ISO'nun squashfs'inden kopyalar (CopyFilesJob rsync).
Bu yüzden ISO'da hangi paketler, ekran yöneticisi ve masaüstü ortamı
varsa kurulum onları ZATEN içerir. Sihirbazın bunları seçmesi
anlamsızdı: kullanıcının seçimi kopyalama sırasında ezilecekti.
## 1. Sihirbaz 13 → 10 adım
LicenseStep, DisplayManagerStep ve NetinstallStep listeden çıkarıldı.
Silinmedi: steps/mod.rs'te tanımlı, derleniyor, hazır. Her biri için
etkinleştirme koşulu mod.rs'te yazılı (netinstall için ayrıca
selected_package_groups doldurulmalı ve InstallExtraPackagesJob
kuyruğa alınmalı). İzin, 22de7d5'in yaptığının tersine SADECE bu üç
modüle ve SADECE belgelenmiş kasıtlı uyku için kondu — modül
dışındaki taze ölü kod yine uyarı üretir.
## 2. ConfigureAutologinJob ISO'nun DM'ini eziyordu
Alanın doc yorumu "yapılandırma ISO'da hazır olduğu için burada
değiştirilmez" diyordu; kod tam tersini yapıyordu. state.display_manager
GlobalState'in SABİT "sddm" varsayılanı (kullanıcı seçemiyor), ona
göre dallanılıyordu. ISO lightdm kullanıyorsa lightdm.conf'a hiç
dokunulmaz, sddm.conf yazılır ve otomatik giriş sessizce çalışmazdı.
- detect_display_manager(): hedefte hangi DM'in kurulu olduğunu
çalışma zamanında arar (/usr/bin/<dm>, yoksa yapılandırma dizini).
Bu iş CopyFilesJob'dan sonra çalıştığı için mount doludur.
- sddm config dizini: /usr/lib/sddm/sddm.conf.d yoksa
/etc/sddm.conf.d deniyor; ikisi de yoksa hata (sessizce yanlış
yere yazmak yerine).
- lightdm'de autologin-session ham DE adıyla ("plasma") yazılıyordu;
sddm/gdm'nin kullandığı .desktop eşlemesi (session_desktop_file)
kullanılıyor. lightdm oturumu dosya adıyla arar, "plasma" ile
oturum açılmazdı.
- DM bulunamazsa hata veriyor (kullanıcıya "elle yapılandırın"
diyebilmeli), eskiden sadece uyarıp geçiyordu.
## 3. Özet ekranı doğru bilgiyi gösteriyor
state.display_manager sabitini olduğu gibi gösteriyordu → ISO
lightdm iken "sddm" yazıyordu. Artık yalnızca kullanıcının gerçekten
belirlediği şey (otomatik giriş açık/kapalı) gösteriliyor ve DM'in
görüntüden geldiği belirtiliyor. Yanındaki hardcoded İngilizce
parçalar ("password protected", "manual login") de t!() altına alındı.
## 4. Cevap dosyasında (auto-install) sabit değerler
JobQueueConfig alanları answer file'dan hiç okunmuyordu; hepsi
main.rs'te yazılmıştı: display_manager "sddm", desktop_environment
"plasma", autologin TRUE, root_password boş, bootloader_timeout 5.
- İsteğe bağlı [system] bölümü eklendi: autologin, bootloader_*
ve kernel_options. [user]'a root_password.
- autologin varsayılanı true → false. Gözetimsiz kurulumda açık
olması, kurulan sistemde konsola erişebilen herkesin kullanıcı adını
görmesini ve oturumu açmasını kolaylaştırıyordu.
- desktop_environment artık SABİT "plasma" değil, GlobalState'in
canlı ortam tespiti. XFCE ISO'sunda Plasma oturumu açılmaya
çalışılıyordu.
- answer-example.toml güncellendi, iki dilde açıklama eklendi.
### Bulunan ve düzeltilen tuzak
SystemConfig #[derive(Default)] ile 0 döndürüyordu. [system] bloğu
dosyada HİÇ YOKSA serde alan bazlı `#[serde(default = "...")]`
anotasyonlarına uğramaz, doğrudan Default::default() çağırır — yani
GRUB bekleme süresi 0 saniye olurdu ve kurulumda bootloader menüsü
hiç görünmezdi. Default elle uygulandı; regresyon testi eklendi.
## 5. Testler
+7: autologin (2), answer file ayrıştırma (4, biri depodaki gerçek
dosyayı ayrıştırıyor, biri varsayılan tuzağını kilitliyor),
wizard (zaten 4'tü).
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 55/55 geçti (47 → 55)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
bf6cf727fe |
feat(P1): sihirbaza 3 eksik adımı bağla, StepRole ekle, çift crate root'u kaldır
## 1. Sihirbaza hiç bağlanmamış 3 adım
- LicenseStep: steps/mod.rs'te HİÇ tanımlı değildi, yani dosya
hiç derlenmiyordu. GlobalState'te license_accepted alanı da yoktu,
bu yüzden tanımlansa bile derlenemezdi. İkisi de eklendi.
Orijinal Python Yali'de bu ekran VAR (yali/gui/ScrLicense.py) ve
sırada info → license → mediaCheck → keyboardSetup; Rust
yeniden yazımında düşmüş. WelcomeStep'ten hemen sonra bağlandı.
Demo modunda kabul zorunlu değil (--demo arayüz testi amacıyla
tıklamadan ilerleyebilmeli).
- DisplayManagerStep: steps/mod.rs:10'da yorum satırıydı. Bu
yüzden state.display_manager kalıcı olarak "sddm" idi ve
kullanıcı SEÇEMİYORDU; masaüstü ortamı da canlı sistemden
gelen değere kilitliydi. Users → Bootloader arasına bağlandı.
- NetinstallStep: yazılmış ama wizard vektöründe yoktu. on_enter
çalışmadığı için selected_package_groups hep boş kalıyor ve
InstallExtraPackagesJob GUI'den HİÇ çalışmıyordu. Bootloader →
Summary arasına bağlandı; #[allow(dead_code)] kaldırıldı.
Sihirbaz 10 → 13 adım.
## 2. Konumsal rol tespiti yerine StepRole (regresyon sınıfının kökü)
main.rs rolü `cur == n_steps - 2` / `cur == n_steps - 1` ile tahmin
ediyordu. Yeni bir adım eklemek bu tespiti sessizce kaydırıyor ve
"Geri" butonu ile bitiş ekranını yanlış adıma bağlıyordu — üstelik
test de yoktu. InstallerStep'a role() eklendi (StepRole: Normal /
Execution / Finish, varsayılan Normal). ExecutionStep ve FinishStep
kendilerini bildiriyor, main.rs tahmin etmiyor.
main.rs'e 4 test: tek bir Execution/Finish olduğu, son ikide
oldukları, Execution öncesi tüm adımların Normal olduğu ve —
en önemlisi — Execution ÖNÜNE adım eklenince rol algısının bozulmadığı.
## 3. Çift crate root (src/lib.rs)
lib.rs main.rs ile aynı 7 modülü tekrar tanımlıyordu. Sonuç: her
modül iki kez tip denetiminden geçiyor, rust_i18n::i18n!("locales")
iki kez çalışıp locales dizinini iki kez gömmeye çalışıyor ve
her test iki hedefte koşuyordu. Kimse yali_rs kütüphanesini
kullanmıyordu. README'deki gerekçe "yedek DLL yapısı" idi — Linux
için anlamsız. Silindi; main.rs tek crate root.
## README
Her iki dilde adım sayısı 10 → 13, akış listeleri güncellendi,
lib.rs satırı çıkarıldı.
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 47/47 (tek hedefte; iki kez koşmuyor)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
c02d732bef |
fix(P1): kare başına alt süreçler, eksik i18n anahtarları, boş kullanıcı adı, GeoIP dil hatası
## 1. Kare başına alt süreç (3 yer)
- installer.rs: WelcomeStep::show her karede detect_existing_linux()
çağırıyordu → blkid -o list, yani saniyede ~60 tam blok aygıt
taraması. Sonuç rescue_available alanında bir kez hesaplanıyor.
- steps/network.rs: `nmcli dev status` show() içinde, kare başına.
status_text alanına alındı; on_enter'da ve tarama/bağlanma
sonrasında tazeleniyor.
## 2. Eksik çeviri anahtarları
- mp_duplicate_mountpoint: iki locale'de de YOKTU → 8633422'de
eklenen duplicate mountpoint kontrolü hata durumunda ekranda
çıplak anahtar gösteriyordu
- job_netinstall, job_setup_lvm: en.toml'da YOKTU → İngilizce
kurulumda çıplak anahtar
- username_empty: aşağıdaki boş kullanıcı adı düzeltmesi için
Doğrulama: 274 kullanılan anahtarın her ikisinde de karşılığı var
(0 eksik). job_* anahtarları t!(job.name()) ile dolaylı kullanılıyor,
doğrulama betiği bunları göremiyor ama mevcut.
## 3. Boş kullanıcı adı doğrulamadan geçiyordu (steps/users.rs)
validate_username("") None (hata yok) dönüyordu. Geçerli bir hostname
ile boş kullanıcı adı sihirbazı geçip CreateUserJob'a ulaşıyor ve
`useradd ""` çalıştırıyordu. Artık hata dönüyor.
username_empty anahtarı iki locale'e de eklendi.
## 4. GeoIP var olmayan dillere geçiyordu (steps/location.rs)
countryCode eşlemesi 8 ülkeyi (de/fr/it/es/ru/nl/pl) 8 dile
bağlıyordu ama locales/ altında yalnızca tr.toml ve en.toml var.
set_locale("de") hata vermez, sessizce kabul edilir ve t!() karşılığı
olmayan her anahtar için anahtarın KENDİSİNİ döndürür — Alman
kullanıcı tüm arayüzü "location_title", "next", "partition" gibi
çıplak metinlerle görüyordu.
- language_for_country() yalnızca gerçekten var olan dilleri döndürüyor
- funct::sanitize_locale() + AVAILABLE_LANGUAGES: set_locale
çağrılarından ÖNCE koruma. Desteklenmeyen kod sessizce yedeğe
düşüyor. 3 çağrı da korumaya alındı.
- ZA (Güney Afrika) bilinçli olarak listede değil: 11 resmî dili var
## Testler
steps/users.rs ve steps/location.rs ve funct.rs'te test modu yoktu.
Eklenenler:
users : 8 test (boş ad, geçerli adlar, yasaklı sistem adları,
başlangıç/karakter kuralları, hostname kuralları,
Türkçe transliterasyon, boş dönmezlik, uzunluk)
location: 4 test (her eşlemenin karşılığı olan locale dosyasına
sahip olduğunu doğrular — asıl regresyon testi)
funct : 3 test (locale koruması + yedeğin kendisi destekleniyor)
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 43/43 geçti (28 → 43)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
d161556c73 |
fix(P0): parola sızıntısı, parted birim hatası, hatalı LUKS cmdline, yutulan hatalar, hata temizliği
Veri kaybı / güvenlik / açılmayan sistem düzeyindeki 7 sorun giderildi.
## 1. Parola düz metin olarak argv'ye geçiyordu (jobs/users.rs)
`sh -c "echo 'user:pass' | chpasswd -c SHA512"` deseni kaldırıldı:
- parola /proc/<pid>/cmdline üzerinden okunabiliyordu
- ' veya $(...) içeren parola komutu bozuyordu
Doğru desen (`set_password_via_chpasswd`, stdin pipe) geri getirildi —
jobs/partition.rs::run_luks_format ile aynı. Yazılan veri yazımdan
sonra sıfırlanıyor. Dosyadaki yorum satırındaki güvenli sürüm de
silinerek tek uygulama bırakıldı.
## 2. parted "MB" birim tuzağı geri gelmişti (jobs/partition.rs:237)
EFI ve swap `{}MiB` geçerken kök bölüm `{}MB` idi. parted "MB"yi ondalık
(10^6) okur, bizim hesaplar ikilidir (2^20): 4609MB = 9001992.1875
sektör → hizasız başlangıç. AGENTS.md bunu KRİTİK not almıştı;
`7209d58` ile düzeltilmiş, sonra regresyona uğramıştı. `{}MiB` yapıldı
ve nedeni yorumla sabitlendi.
## 3. LUKS çekirdek parametresi geçersizdi (jobs/bootloader.rs)
`cryptdevice=UUID=<x>:cryptroot` geçerli bir söz dizimi değil, üstelik
kök bölümü `is_uefi` ile tahmin ediliyordu (UEFI'de 3, BIOS'ta 2) —
manuel modda bu numaralar assign_partition_numbers'tan geldiği için
ilgisiz bir bölümün UUID'si okunabiliyordu. `.unwrap_or_default()`
`UUID=:` üretebiliyordu.
Artık `cryptsetup status` ile mapper'ın arkasındaki GERÇEK aygıt
çalışma zamanında çözülüyor, blkid ile LUKS başlık UUID'si alınıyor,
ve dracut (`rd.luks.uuid=luks-…`) + mkinitcpio (`cryptdevice=…`)
biçimleri birlikte yazılıyor. UUID boş çıkarsa hata verilir; tahmin
yok.
Ayrıca `CRYPTROOT_NAME` sabiti tanımlandı: "cryptroot" 5 yerde
hardcoded'dı, artık tek kaynaktan geliyor.
## 4. Kritik hatalar yutuluyordu (jobs/finish.rs)
- RunComarJob tamamen yorum satırıydı → `pisi configure-pending`
hiç çalışmıyordu, paketlerin post-install betikleri koşmuyordu.
Geri getirildi; "yapılandırılacak paket yok" durumu zararsız sayılıyor.
- ldconfig ve update-environment hataları loglanıp yutuluyordu.
update-environment PisiLinux init finalizasyonudur: yutulursa
kurulum "başarılı" görünür ama sistem açılmaz. Artık fatal.
- CleanupLiveJob'da 10 adet `let _ =`; depo tanımları sessizce
başarısız olabiliyordu (kullanıcı paket kuramaz). Artık fatal.
## 5. Hata durumunda hiç temizlik yapılmıyordu (jobs/mod.rs)
run_all ilk hatada return ediyordu: hedef bölümler bağlı, LUKS
mapper'ları açık, swap aktif kalıyordu. Yeniden başlatma reddediliyor,
elle düzeltmesi dakikalar sürüyordu.
- JobQueue::cleanup listesi eklendi; with_cleanup(...) ile verilen
işler başarıda da hatada da çalışır.
- Yeni EmergencyCleanupJob (jobs/cleanup.rs): tüm mount'lar → LVM
lvchange -an → cryptsetup close (yalnızca hedef diskin
mapper'ları) → swapoff.
- Temizlik de hata verirse bu hatalar asıl hataya eklenip
kullanıcıya "elle ne yapılacak" listesi olarak gösterilir.
## 6. UnmountBindJob /home, /var, /boot'u çözmüyordu (jobs/execution.rs)
Elle yazılmış sabit liste (proc, sys, dev, boot/efi) yalnızca otomatik
modda doğruydu; manuel düzende ek bölümler kurulum bitince bağlı
kalıyordu. Artık /proc/self/mountinfo okunuyor ve mount/ altındaki her
şey en derinden yüzeye çözülüyor — düzen bilinmeye gerek yok.
mountinfo'daki \0NNN oktal kaçışlarını çözen unescape_mount_field ve
mounted_paths_under eklendi.
## 7. Parolasız LUKS kombinasyonu (jobs/partition.rs)
encrypt_root=true + boş parola → kök düz ext4 formatlanıyor, sonra
MountPartitionsJob /dev/mapper/cryptroot'u mount etmeye çalışıp
kurulumu öldürüyordu. Job başında reddediliyor.
## 8. rescue.rs'te iki panik noktası
- &entry.summary[..50]: len() bayt sayar, dilim bayt sınırı ister.
pisi history çıktısı paket adlarından gelir ve Türkçe karakter
içerir (ş/ğ 2 bayt) → sınırda PANİK. chars().take(50) ile değişti.
- parse_pisi_history: '[' ve ']' bağımsız aranıyordu; ']' önce
gelen girdide remainder[start+1..end] PANİK veriyordu. Kapanış
parantez açılıştan sonra aranıyor.
Her ikisi için 5 test eklendi (rescue.rs'te test modu yoktu).
## Doğrulama
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 28/28 geçti (23 + 5 yeni)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|
|
8c6dc08361 |
revert: 22de7d5 — manuel bölümleme arayüzünü 1804 satır geri getir
|
||
|
|
a5d46279b8 | docs: add manual partition fixes summary to AGENTS.md | ||
|
|
8633422c22 | fix: manual partition validation - add duplicate mountpoint check, swap size validation, disk selection in is_complete, and delete flag handling in disk_free_regions_mb | ||
|
|
7e1bf45998 | uptdate yali-rs-15092026 | ||
|
|
22de7d5255 |
Dead code uyarılarını gidermek için #[allow(dead_code)] eklendi
- ManualState struct'ına dead code uyarısı kaldırma eklendi - FsType enum'ına dead code uyarısı kaldırma eklendi (Lvm variant'ı için) - VolumeGroup struct'ına dead code uyarısı kaldırma eklendi - Bu alanlar gelecekte LVM ve gelişmiş bölümleme özellikleri için planlanmış Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> |
||
|
|
75e2b1bf5e |
Tablo sütun başlıkları için translation key'leri eklendi
- Türkçe ve İngilizce dil dosyalarına tablo sütun başlıkları eklendi - column_device, column_mount_point, column_label, column_type, column_format, column_size - Manuel bölümleme tablosunda kullanılan sütun başlıkları için çeviri desteği Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> |
||
|
|
dcd3ec4efb |
Bölümleme tablosu boyut sütunu düzeltmeleri ve disk seçimi UI iyileştirmeleri
- Manuel bölümleme tablosunda boyut sütununun görünmemesi sorunu çözüldü - Disk başlığı kırmızı renk ve kutucuk simge sorunları düzeltildi (c_accent yerine c_text, Unicode ok karakteri) - Disk seçimi için ComboBox bileşeni eklendi (eski Grid tabanlı sistem yerine) - Tablo header hizalamaları düzeltildi (sol/sağ/ortalanmış sütunlar) - Font yüklemesi iyileştirildi (monospace font desteği ve emoji fallback mekanizması) - LVM LV boyut kontrolü sembolik boyutlar için düzeltildi - Disk bölüm numarası formatlama fonksiyonu eklendi (nvme0n1p1 vs sda1 mantığı) Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> |
||
|
|
7209d58ea0 |
fix: parted birim tuzağı — mkpart argümanları MiB sonekine geçti
- parted "MB" sonekini onalık (10^6) okur, hesaplarımız binary (2^20):
3944MB → sektör 7703125 (hizasız) → "en yakın konum" hatası.
Tüm mkpart konumları artık "{}MiB" (tamsayı MiB = 2048 sektör katı).
- Bölümleme Planı şeridi yalnızca seçili disk için gösteriliyor
(state.selected_disk), tüm diskler aynı anda değil.
- AGENTS.md: parted birim tuzağı notu eklendi.
|
||
|
|
0a02f576d4 | docs: ajan notları — çoklu disk/granular bölümleme mimarisi ve yapılacaklar | ||
|
|
5c148472c4 |
feat: çoklu disk desteği ve eski Yali tarzı granular bölümleme işlemleri
- CustomPartition artık disk alanı taşıyor; bölümler diske göre gruplanıyor - Manuel modda TÜM disklerin mevcut bölümleri otomatik listeleniyor - Tablo her disk için kendi sütun başlıklarını gösteriyor - Silinmek işaretli bölümler tek 'Boş Alan' satırında birleşiyor (GParted tarzı); Boş Alan = disk − (korunanlar + yeni tanımlar), 0'a düşerse satır gizlenir - Sil/Geri Al: fiziksel bölümler silinmek İŞARETLENİR (OperationDestroyDevice karşılığı), kullanıcı tanımı olanlar listeden tamamen kalkar - Kurulum job'ları granular modele geçti: mktable ile tüm disk sıfırlanmıyor; rm → boş alana mkpart (sysfs geometrisi) → yalnızca istenenler mkfs. İşlemi olmayan disklere hiç dokunulmaz - Slot ataması parted davranışıyla birebir: silinen numara yeniden kullanılır - 'Kalan alan' sembolik kaldı; boyut kurulum anında boşluktan belirlenir (taşma imkânsız) + kapasite aşımı uyarısı/kilidi eklendi - Özet ekranı ve bölüm planı: disk başına Mevcut/Kurulum Sonrası çift bar, kapasite gösterimleri düzeltildi - Remixicon simge düzeltmesi (hard-drive), mp_* yeni çeviri anahtarları - Testler: slot yeniden kullanımı, kapasite aşımı, disk-bazlı hesaplar (22/22) |
||
|
|
379d32ac38 | fix: manuel girilen bölüm boyutunun mountpoint değişiminde ezilmesi v4.0.3 | ||
|
|
91acde5317 | fix: manuel ve otomatik bölümlemede kök dizin boyutu hesaplama hatası | ||
|
|
fb905d9714 | test: add unit tests for partition step planning & validation | ||
|
|
80e3559d0d |
refactor: split huge jobs/mod.rs into modular files & modernize slideshow
- Split src/jobs/mod.rs into specialized domain files under src/jobs/ (autologin, bootloader, execution, finish, keyboard, location, netinstall, network, partition, users) for better modularity and cleaner architecture. - Integrated chrono-tz and enabled serde features on chrono in Cargo.toml. - Added missing assets (remixicon font, icons, slides images/configs). - Integrated localized slideshow presentation directly into UI, reading configurations from TOML. - Updated Makefile to correctly target and install slideshow files into system directories. - Cleaned up obsolete bin utility slides_test.rs. |
||
|
|
20dc937ab8 | fix: GPU karakter bozulması için repaint throttle; slideshow emoji ikonları; partition auto FS; çeşitli f32 tip düzeltmeleri | ||
|
|
1e920e0717 |
docs: update README, CHANGELOG for slides/ restructure and binary refactor
- README.md: add slides/ directory, src/bin/slides_test.rs, src/lib.rs to project tree; add slides_test usage example - README_en.md: same changes in English - CHANGELOG.md: add v4.0.5 entry (slide migration, slides_test, rsync progress refactor, auto-install CLI output, edit dialog fixes) - CHANGELOG_en.md: same in English |
||
|
|
62000b7c87 |
feat: slide images moved to slides/img/, direct path in TOML, slides_test binary
- Moved 16 slide PNGs from assets/ to slides/img/ - Replaced [icons] mapping section with direct paths in icon field - Added slides_test standalone binary for testing slideshows - Added default-run = "yali-rs" in Cargo.toml to fix cargo run ambiguity - Fixed edit dialog auto-resize and text field wrapping in partition.rs - Updated branding.rs to load external slides from slides/ directory - Removed [slides] section from branding.toml files - Revamped CopyFilesJob with find-based progress tracking (rsync --out-format) - Fixed install progress bar visibility logic - Tweaked auto-install CLI output with sub-progress and current file - Switched language-icon.svg to white fills for dark theme - Minor locale fixes |
||
|
|
3194c4d8a3 | Please provide the files or the diff so I can generate the appropriate commit message for you. | ||
|
|
7621507acd | Please provide the file changes or a description of the modifications you made so I can generate the commit message for you. | ||
|
|
733548da56 | Merge branch yali-rs:main into main |