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>
This commit is contained in:
Erkan IŞIK
2026-09-27 18:28:03 +03:00
parent 70f3737f01
commit f150ab0002
4 changed files with 131 additions and 7 deletions
+26 -2
View File
@@ -323,6 +323,30 @@ kalanın tamamını alır, ikincisine hiç yer kalmaz.
`orig_device` dolu (taranmış) 0 boyutlu bölüm sembolik **DEĞİLDİR**:
sıfır boyut "kalanın tamamı" anlamına gelmez.
### ⭐ Bağlanmayan dosya sistemleri — mountpoint isteğe bağlı
`mountpoint_required(editing, fstype)` üç dosya sisteminde `false`
döndürür:
| FsType | Neden |
|---|---|
| `Lvm` | PV'nin kendisi bağlanmaz, üzerinde LV'ler yaşar |
| **`Ntfs`** | **Linux'ta bağlanması GEREKEN bir dosya sistemi değil** |
| düzenlenen fiziksel bölüm | "yalnızca GRUB için" işaretlemesi |
NTFS'te zorunluluk kullanıcıya anlamsız geliyordu: *"format için ntfs
seçtiğim halde bağlama noktası seçmemi bekliyor bu mantıksız değil
mi"*. Tipik kullanım Windows ile veri alışverişi — bölüm biçimlendirilir
ama sisteme bağlanmaz, kullanıcı elle bağlar veya dosyayı doğrudan açar.
Boş bırakıldığında kurulumda ne olduğu **mevcut ve doğru**: mount
atlanır (`jobs/partition.rs:1111`), fstab'a girmez (`:1171`), ama
`mkfs.ntfs -f` **çalışır** (FAZ C, `FsType::Ntfs`).
Diyalogda NTFS seçilince:
1. geçersiz öneri kalıntısı (`/`, `/boot/efi`, `swap`…) **temizlenir**
2. `mp_mountpoint_optional` ipucu gösterilir
### `selected_disk` hâlâ 3 yerde kullanılıyor
1. Tablo hangi diski gösteriyor + `manual_dual_bars`
2. Diyaloğun varsayılan hedefi
@@ -482,11 +506,11 @@ nedeni yorumla sabitlendi. Log bile "MiB" derken argüman "MB" gönderiyordu.
```
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 122/122 (test modülü sayısı arttıkça güncel tut)
cargo test : 124/124 (test modülü sayısı arttıkça güncel tut)
cargo clippy : ~77 uyarı, tamamı stil (collapsed_if, replace zinciri)
```
Bu oturumda 1 → 122 test. Test modülü olmayan dosyalar (`users.rs`,
Bu oturumda 1 → 124 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()`).
+1
View File
@@ -296,6 +296,7 @@ job_mount_custom = "Mounting manual partitions"
# ── Extra Localization / i18n ─────────────────────────────
mp_delete_confirm_title = "Delete Partition"
mp_error_empty_mountpoint = "Mount point cannot be empty."
mp_mountpoint_optional = "Mount point is optional. Leave it empty to format the partition without mounting it at boot — useful for exchanging data with Windows."
mp_error_empty_mountpoint_named = "Mount point cannot be empty: {device}. Pick a mount point from the list, or mark the partition for deletion and continue."
mp_plan_valid = "✓ Partition plan is valid. You can proceed."
mp_select_disk_first = "← Select a disk first."
+1
View File
@@ -260,6 +260,7 @@ job_mount_custom = "Manuel bölümler bağlanıyor"
# ── Ek Yerelleştirme / i18n ──────────────────────────────────
mp_delete_confirm_title = "Bölümü Sil"
mp_error_empty_mountpoint = "Bağlama noktası boş olamaz."
mp_mountpoint_optional = "Bağlama noktası isteğe bağlı. Boş bırakırsanız bölüm biçimlendirilir ama sistem başlangıcında bağlanmaz; Windows'tan erişmek için kullanılır."
mp_error_empty_mountpoint_named = "Bağlama noktası boş olamaz: {device}. Listeden bir bağlama noktası seçin ya da bölümü \"Sil\" işaretleyip geçin."
mp_plan_valid = "Bölüm planı geçerli. İleri tuşuna basabilirsiniz."
mp_select_disk_first = "← Önce bir disk seçin."
+103 -5
View File
@@ -474,7 +474,7 @@ fn validate_manual_on(
/// Bir tanımın bağlama noktası BOŞ olmak zorunda mı?
///
/// Boş bırakmak "bu bölüm kuruluma ait değil" demektir. İki durumda
/// Boş bırakmak "bu bölüm kuruluma ait değil" demektir. Üç durumda
/// serbesttir:
///
/// 1. **LVM PV** — üzerinde mantıksal hacimler yaşar, kendisi
@@ -482,16 +482,26 @@ fn validate_manual_on(
/// 2. **Düzenlenen FİZİKSEL bölüm** (`orig_device` dolu) — kullanıcı
/// çift önyüklemeli kurulumda Windows'un boot bölümünü "yalnızca
/// GRUB için, mount edilmeyecek" diye işaretlemek isteyebilir.
/// 3. **NTFS** — Linux tarafında bağlanması GEREKEN bir dosya sistemi
/// değildir. Kullanıcı çoğunlukla Windows ile veri alışverişi
/// için biçimlendirir ve sisteme bağlamaz; elle bağlar veya
/// dosyayı doğrudan açar. Zorunlu olması anlamsızdı ve
/// kullanıcıyı "/data" gibi uydurma bir noktaya zorluyordu
/// (rapor: "ntfs seçtiğim halde bağlama noktası seçmemi bekliyor
/// bu mantıksız değil mi").
///
/// Yeni bir tanımda (`None` ya da `orig_device` boş) ZORUNLUDUR: kullanıcı
/// "ne işe yarayacak" diye sormadan kaydedemez.
/// Yeni bir tanımda (`None` ya da `orig_device` boş) ZORUNLUDUR:
/// kullanıcı "ne işe yarayacak" diye sormadan kaydedemez.
///
/// ⚠️ Bu kural hem `validate_manual_on`'da hem de kaydetme diyaloğunda
/// aynen uygulanmalı — birinde serbest olan diğerinde reddediliyorsa
/// kullanıcı "İleri"ye geçemez.
fn mountpoint_required(editing: Option<&CustomPartition>, fstype: &FsType) -> bool {
if *fstype == FsType::Lvm {
return false;
// Kendisi bağlanmayan / bağlanması gerekmeyen dosya sistemleri
match fstype {
FsType::Lvm => return false,
FsType::Ntfs => return false,
_ => {}
}
match editing {
None => true,
@@ -1966,6 +1976,46 @@ impl PartitionStep {
self.manual.add_fstype = idx(FsType::Fat32);
}
// NTFS seçildiğinde mountpoint'i TEMİZLE ve ne
// olacağını söyle.
//
// 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".
//
// NTFS Linux'ta bağlanması gereken bir dosya sistemi
// DEĞİLDİR; çoğunlukla Windows ile veri alışverişi
// için biçimlendirilir. Önceden öneri ("/boot/efi",
// "/" gibi) geçerli bir noktaya çevriliyor ve
// kullanıcı anlamsız bir seçim yapmak zorunda
// kalıyordu — ya da "boş olamaz" hatası alıyordu.
let fstype_now = FS_OPTIONS
.get(self.manual.add_fstype)
.map(|x| x.1.clone())
.unwrap_or(FsType::Ext4);
let mp_optional = !mountpoint_required(
if self.manual.editing {
self.manual.edit_idx
.and_then(|i| state.custom_partitions.get(i))
} else {
None
},
&fstype_now,
);
if mp_optional {
// Önceki öneri ("/boot/efi", "/", "swap"…) geçersiz
// bir kalıntı olurdu; temizleniyor.
if matches!(self.manual.add_mountpoint.as_str(),
"/" | "/boot" | "/boot/efi" | "/home" | "/var" | "/tmp" | "swap") {
self.manual.add_mountpoint.clear();
}
ui.label(
egui::RichText::new(t!("mp_mountpoint_optional"))
.size(11.0)
.color(crate::ui::theme::c_text_dim()),
);
}
ui.add_space(6.0);
ui.separator();
@@ -3373,6 +3423,54 @@ mod multidisk_tests {
);
}
/// NTFS'in mountpoint'i isteğe bağlıdır — bağlanması gereken bir
/// dosya sistemi değildir.
///
/// 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."
#[test]
fn ntfs_does_not_require_a_mountpoint() {
let mut new_def = p("/dev/sda", "/dev/sda2", 19_000, FsType::Ntfs, "");
new_def.orig_device = String::new();
assert!(
!mountpoint_required(None, &FsType::Ntfs),
"yeni NTFS tanımı mountpointsiz kaydedilebilmeli"
);
assert!(
!mountpoint_required(Some(&new_def), &FsType::Ntfs),
"yeni NTFS tanımı mountpointsiz kaydedilebilmeli"
);
}
/// Mountpointsiz NTFS düzeni doğrulamadan geçmeli.
///
/// Windows ile veri alışverişi için biçimlendirilen bölüm sisteme
/// bağlanmaz; yine de kurulum geçerli sayılmalı.
#[test]
fn mountless_ntfs_layout_passes_validation() {
let disks = vec![disk("/dev/sda", 250), disk("/dev/sdb", 500)];
let parts = vec![
// GRUB için ayrılmış, bağlanmayacak
p("/dev/sda", "/dev/sda1", 512, FsType::Fat32, ""),
p("/dev/sdb", "/dev/sdb1", 1_024, FsType::Fat32, "/boot/efi"),
p("/dev/sdb", "/dev/sdb2", 8_192, FsType::Swap, "swap"),
p("/dev/sdb", "/dev/sdb3", 400_000, FsType::Ext4, "/"),
];
// NTFS tanımı mountpointsiz
let mut ntfs = p("/dev/sda", "/dev/sda2", 0, FsType::Ntfs, "");
ntfs.orig_device = String::new();
ntfs.mountpoint = String::new();
let mut all = parts;
all.push(ntfs);
assert_eq!(
validate_manual_on(&all, &[], true, &disks),
None,
"mountpointsiz NTFS düzeni geçerli olmalı: {:?}",
validate_manual_on(&all, &[], true, &disks)
);
}
/// Kullanıcının tam senaryosu: sda'da Windows (sda1 yalnızca GRUB
/// için, mount edilmeyecek), sdb'de Linux, sdc boş. Düzen GEÇERLİ
/// olmalı — GRUB için ayrılmış bölüm yüzünden reddedilmemeli.