- 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ı
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>
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>
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>
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>
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>
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>
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>
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>
Ö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>
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>
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>
## 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>
- 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>
- 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>
- 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)
- 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.
- 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
- slider maximum value calculated as disk size minus used partitions
- editing mode includes current partition capacity in available space
- size text input now writes back to add_size_str
- formatted MB label shown next to text input
- CHANGELOG.md updated
- Add linear gradient backgrounds to primary/secondary/danger buttons
- Add language selector with flag icons in ComboBox
- Add SVG support via egui_extras feature
- Add cancel confirmation dialog on exit
- Update Yali logo to SVG icon
- Add flag SVGs for all countries
- Improve users step layout with form helpers
- Refactor button API (ui::theme::*_button now takes ui param)