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>
This commit is contained in:
Erkan IŞIK
2026-09-27 21:34:48 +03:00
parent cedbb6a741
commit 20f48bdf99
4 changed files with 144 additions and 13 deletions
+41 -4
View File
@@ -465,6 +465,42 @@ mountpoint'i olan bölümü düzenlerken) liste **tamamen kilitlenmişti**.
> (removable gibi) sorgulanmadığından emin ol. Sorgulanıyorsa probu
> dışarıdan al.
### ⭐ "Biçimlendir" kutusu — olumlu çerçeve
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"*.
| Katman | Alan | Değer |
|---|---|---|
| Model (`CustomPartition`) | `skip_format` | taranmış bölüm = `true` (**korunur**) |
| Diyalog (`ManualState`) | `add_format` | **`skip_format`'ın TERSİ** |
İki yönlü dönüşüm iki adlandırılmış yardımcıda:
`format_checkbox_from(skip)` / `skip_format_from(format)`. Elle `!`
yazılmaz; `format_checkbox_and_skip_format_are_exact_inverses` testi
çift bağı sabitler.
**Neden ters çevirdik.** "Biçimlendirmeyi Atla" taranmış bölümlerde
**seçili** geliyordu, yani güvenli durum "varsayılan seçim"di. Risk
seçeneğin kendisinde değil, seçenekte risk olduğunu sezmeden okuyan
kullanıcıda: "Atla" işaretliyse veri silinecek diye düşünürken
tam tersi oluyordu. Olumlu çerçevede **seçim kullanıcıya aittir**:
```
Taranmış bölüm (sda1) → "Biçimlendir" ☐ SEÇİLİ DEĞİL → veri korunur
Kullanıcı tanımı (sda2) → "Biçimlendir" ☑ SEÇİLİ → biçimlendirilir
```
> ⚠️ Ters çevrim sessizce kaybolursa taranmış bölümler
> biçimlendirilir — **veri kaybı**. Bu yüzden dönüşüm `!` olarak
> iki yere dağıtılmadı, adlandırılmış çift fonksiyona bağlandı ve
> `format_checkbox_and_skip_format_are_exact_inverses` testi
> `skip_format` için **her iki** değeri de dener.
`mp_skip_format` çeviri anahtarı kullanılmaz hale geldiği için iki
locale'den de **silindi** (ölü anahtar bırakılmadı).
### `selected_disk` hâlâ 3 yerde kullanılıyor
1. Tablo hangi diski gösteriyor + `manual_dual_bars`
2. Diyaloğun varsayılan hedefi
@@ -603,7 +639,8 @@ nedeni yorumla sabitlendi. Log bile "MiB" derken argüman "MB" gönderiyordu.
2. O dal `skip_format = false` atıyordu. Taranmış fiziksel bölümler
`skip_format: true` ile gelir (verisi korunmalı) — sıfırlanırsa
kurulumda mkfs çalıştırıp **kullanıcının verisini bozardı**.
Artık her bölüm satırı "✏ Düzenle" açar ve `skip_format` dahil
Artık her bölüm satırı "✏ Düzenle" açar ve `skip_format` (diyalogda
**"Biçimlendir"**, aşağıya bak) dahil
mevcut değerleri korur. `ManualState::create_over` alanı da silindi
(ölü durum bırakılmadı). `edit_flow_tests` bunu sabitler.
- Locale: `locales/` altında yalnızca `tr.toml` ve `en.toml` **var**.
@@ -624,11 +661,11 @@ nedeni yorumla sabitlendi. Log bile "MiB" derken argüman "MB" gönderiyordu.
```
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 138/138 (test modülü sayısı arttıkça güncel tut)
cargo test : 141/141 (test modülü sayısı arttıkça güncel tut)
cargo clippy : ~77 uyarı, tamamı stil (collapsed_if, replace zinciri)
```
Bu oturumda 1 → 138 test. Test modülü olmayan dosyalar (`users.rs`,
Bu oturumda 1 → 141 test. Test modülü olmayan dosyalar (`users.rs`,
`location.rs`, `rescue.rs`, `funct.rs`, `autoinstall/mod.rs`, `main.rs`)
içine modüller eklendi. Çoklu test modülü paylaşılan yardımcıları
`steps/partition.rs::testutil` altındadır (`disk()`, `part()`).
@@ -723,7 +760,7 @@ senaryoları dene:
|---|---|
| `src/jobs/partition.rs` | `plan_disk_layout`, `PhysicalExtent`, `PlannedCreate`, `disk_total_mb`, `read_physical_extents`, `device_map`; `disk_free_regions_mb` silindi |
| `src/jobs/cleanup.rs` | **YENİ** — `EmergencyCleanupJob` |
| `src/steps/partition.rs` | **tek diske odaklı tablo + disk şeridi** (diyalogda disk seçicisi yok), **seçime göre görünen butonlar** (`selected_free`), diske filtreli LVM, `validate_manual_on`, `manual_capacity_error`, `mountpoint_required`, `suggest_mountpoint`, `has_symbolic_remaining`, `build_table_rows`; `multidisk_tests`, `table_scope_tests`, `free_space_tests`, `symbolic_capacity_tests`, `selection_tests`, `edit_flow_tests`, `edit_disk_tests`, `testutil` |
| `src/steps/partition.rs` | **tek diske odaklı tablo + disk şeridi** (diyalogda disk seçicisi yok), **seçime göre görünen butonlar** (`selected_free`), diske filtreli LVM, `validate_manual_on`, `manual_capacity_error`, `mountpoint_required`, `suggest_mountpoint`, `has_symbolic_remaining`, `build_table_rows`, `format_checkbox_from`, `skip_format_from`; `multidisk_tests`, `table_scope_tests`, `free_space_tests`, `symbolic_capacity_tests`, `selection_tests`, `edit_flow_tests`, `edit_disk_tests`, `testutil` |
| `src/jobs/users.rs` | `set_password_via_chpasswd` (stdin pipe) |
| `src/jobs/bootloader.rs` | `CRYPTROOT_NAME`, `luks_backing_device`, `mounted_root_device` |
| `src/jobs/finish.rs` | `RunComarJob` geri geldi; `ldconfig`/`update-environment`/depo fatal |
+1 -1
View File
@@ -251,7 +251,7 @@ mp_fs_btrfs = "btrfs"
mp_fs_xfs = "xfs"
mp_fs_fat32 = "FAT32 (EFI)"
mp_fs_swap = "swap"
mp_skip_format = "Skip Formatting (preserve existing data)"
mp_format_partition = "Format (existing data will be erased)"
mp_size_gb = "%{n} GB"
mp_size_mb = "%{n} MB"
+1 -1
View File
@@ -215,7 +215,7 @@ mp_fs_btrfs = "btrfs"
mp_fs_xfs = "xfs"
mp_fs_fat32 = "FAT32 (EFI)"
mp_fs_swap = "takas (swap)"
mp_skip_format = "Biçimlendirmeyi Atla (mevcut veri korunur)"
mp_format_partition = "Biçimlendir (mevcut veri silinir)"
mp_size_gb = "%{n} GB"
mp_size_mb = "%{n} MB"
+101 -7
View File
@@ -362,7 +362,19 @@ struct ManualState {
/// Genel hata mesajı
error: Option<String>,
/// Biçimlendirme atlansın mı?
add_skip_format: bool,
/// Diyalog: "Biçimlendir" kutusu.
///
/// ⚠️ Model alanı `skip_format` ile **TERS** ilişkilidir. İki yönlü
/// dönüşüm `format_checkbox_from` / `skip_format_from` ile
/// adlandırılmış yardımcılarda; burada elle `!` yazılmaz.
///
/// Neden olumlu çerçeve: "Biçimlendir" seçiliyse veri silinir,
/// işareti KULLANICI koyar. "Biçimlendirmeyi Atla" ise taranmış
/// bölümlerde seçili geliyordu, yani güvenli durum "varsayılan
/// seçim"di; bu, seçenekte risk olduğunu sezmeden "atla"yı
/// okuyan kullanıcı için yanıltıcıydı. Tersi daha dürüst:
/// seçim yoksa biçimlendirilmez.
add_format: bool,
/// Yeni VG adı (LVM)
add_vg_name: String,
@@ -577,6 +589,27 @@ fn validate_manual_on(
// Çoklu disk yardımcıları
// ─────────────────────────────────────────────
/// `CustomPartition::skip_format` → diyalogdaki "Biçimlendir" kutusu.
///
/// ⚠️ Ters çevirme **tek yerde, adlandırılmış** olarak yapılır.
/// `skip_format` modelde güvenlik bayrağı olarak kalıyor (job'lar
/// kullanıyor): taranmış bölümler `true` gelir, yani "bu gerçek veri,
/// bozma". Kullanıcıya gösterilen metin ise olumlu çerçevede
/// ("Biçimlendir") — "Biçimlendirmeyi Atla" iki kez olumsuzlamak
/// hem belirsiz hem de "atla" seçili geldiği için veri korunması
/// normalden ayrışmıyordu.
fn format_checkbox_from(skip_format: bool) -> bool {
!skip_format
}
/// Diyalogdaki "Biçimlendir" kutusu → `CustomPartition::skip_format`.
///
/// Yukarıdaki `format_checkbox_from` ile **ters-çevrim çifti**;
/// ikisi birlikte `!` işlemini tek yerde toplar.
fn skip_format_from(format_checked: bool) -> bool {
!format_checked
}
/// Bir tanımın bağlama noktası BOŞ olmak zorunda mı?
///
/// Boş bırakmak "bu bölüm kuruluma ait değil" demektir. Üç durumda
@@ -1784,7 +1817,9 @@ impl PartitionStep {
// Öneri ile uyumlu fstype yüklendi; geçiş sayılmasın.
self.manual.add_fstype_prev = Some(self.manual.add_fstype);
// Yeni bölümler varsayılan olarak biçimlendirilir
self.manual.add_skip_format = false;
// Yeni tanım: biçimlendirilecek (taranmış bölüm
// değil, kullanıcı yeni alan açıyor).
self.manual.add_format = true;
}
// ✏ Düzenle — YALNIZCA bir bölüm satırı seçiliyken görünür.
@@ -1827,7 +1862,11 @@ impl PartitionStep {
self.manual.add_fstype_prev = Some(self.manual.add_fstype);
self.manual.add_encrypt = part.encrypt;
self.manual.add_luks_password = part.luks_password.clone();
self.manual.add_skip_format = part.skip_format;
// `skip_format` → "Biçimlendir" kutusu (ters).
// Taranmış bölümlerde `skip_format = true` yani
// kutu İŞARETLİ DEĞİL → "biçimlendirme" seçili
// değil, veri korunur. Doğru.
self.manual.add_format = format_checkbox_from(part.skip_format);
}
}
}
@@ -2199,8 +2238,9 @@ impl PartitionStep {
}
ui.add_space(6.0);
ui.checkbox(&mut self.manual.add_skip_format,
egui::RichText::new(t!("mp_skip_format")).color(egui::Color32::from_rgb(128, 128, 128)));
ui.checkbox(&mut self.manual.add_format,
egui::RichText::new(t!("mp_format_partition"))
.color(egui::Color32::from_rgb(128, 128, 128)));
ui.add_space(8.0);
ui.separator();
@@ -2260,7 +2300,7 @@ impl PartitionStep {
} else if is_edit {
if let Some(idx) = self.manual.edit_idx {
if idx < state.custom_partitions.len() {
let skip_format = self.manual.add_skip_format;
let skip_format = skip_format_from(self.manual.add_format);
// Disk ve cihaz yolu KORUNUR.
//
// Düzenleme disk değiştirmediği için
@@ -2299,7 +2339,7 @@ impl PartitionStep {
encrypt,
luks_password,
luks_name: String::new(),
skip_format: self.manual.add_skip_format,
skip_format: skip_format_from(self.manual.add_format),
delete: false,
});
assign_partition_numbers(&mut state.custom_partitions);
@@ -3181,6 +3221,60 @@ mod tests {
assert_eq!(format_number_thousands(7000000), "7.000.000");
}
// ── Biçimlendirme kutusu (skip_format ⇄ add_format) ─────────
use super::testutil::part as p;
/// Ters çevrim çifti birbirinin tersi olmalı — iki yönlü dönüşüm
/// kaybolursa "Biçimlendir" kutusu sessizce ters çalışır ve
/// taranmış bölümler biçimlendirilir.
#[test]
fn format_checkbox_and_skip_format_are_exact_inverses() {
for skip in [true, false] {
assert_eq!(
skip_format_from(format_checkbox_from(skip)),
skip,
"çift dönüşüm kimliği bozuyor (skip_format={})",
skip
);
}
// Somut karşılıklar
assert!(!format_checkbox_from(true), "skip=true → 'Biçimlendir' seçili DEĞİL");
assert!(format_checkbox_from(false), "skip=false → 'Biçimlendir' seçili");
assert!(skip_format_from(false), "kutu seçili değil → skip=true (veri korunur)");
assert!(!skip_format_from(true), "kutu seçili → skip=false (biçimlendirilir)");
}
/// Taranmış fiziksel bölüm düzenlendiğinde kutu **İŞARETLİ
/// OLMAMALI** — verisi korunacak.
///
/// AGENTS.md'deki ISO kontrol listesinde bu tersine dönmüştü:
/// "format kutusu seçili görünmeli (skip_format koruması)".
/// Artık seçili OLMAMALI — çünkü seçili olmak "biçimlendir"
/// demek.
#[test]
fn scanned_partition_opens_with_format_unchecked() {
let mut scanned = p("/dev/sda1", 512, FsType::Ntfs, "");
scanned.skip_format = true; // taranmış → korunmalı
let checkbox = format_checkbox_from(scanned.skip_format);
assert!(
!checkbox,
"taranmış bölüm 'Biçimlendir' işaretli gelmemeli, yoksa veri silinir"
);
}
/// Kullanıcı tanımı (yeni bölüm) düzenlendiğinde kutu **İŞARETLİ**
/// olmalı — kullanıcı o alanı kendisi açtı, biçimlendirilecek.
#[test]
fn user_definition_opens_with_format_checked() {
let mut mine = p("/dev/sdc1", 0, FsType::Ext4, "/home");
mine.orig_device = String::new();
mine.skip_format = false; // yeni tanım → biçimlendirilecek
assert!(
format_checkbox_from(mine.skip_format),
"kullanıcı tanımı 'Biçimlendir' işaretli gelmeli"
);
}
// ── sort_disks / disk_sort_key ────────────────────────────
/// Disk listesi kararlı olmalı: "ilk disk" kavramı ve varsayılan