forked from pisilinux-rs/yali-rs
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:
@@ -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**:
|
`orig_device` dolu (taranmış) 0 boyutlu bölüm sembolik **DEĞİLDİR**:
|
||||||
sıfır boyut "kalanın tamamı" anlamına gelmez.
|
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
|
### `selected_disk` hâlâ 3 yerde kullanılıyor
|
||||||
1. Tablo hangi diski gösteriyor + `manual_dual_bars`
|
1. Tablo hangi diski gösteriyor + `manual_dual_bars`
|
||||||
2. Diyaloğun varsayılan hedefi
|
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 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)
|
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`)
|
`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ı
|
içine modüller eklendi. Çoklu test modülü paylaşılan yardımcıları
|
||||||
`steps/partition.rs::testutil` altındadır (`disk()`, `part()`).
|
`steps/partition.rs::testutil` altındadır (`disk()`, `part()`).
|
||||||
|
|||||||
@@ -296,6 +296,7 @@ job_mount_custom = "Mounting manual partitions"
|
|||||||
# ── Extra Localization / i18n ─────────────────────────────
|
# ── Extra Localization / i18n ─────────────────────────────
|
||||||
mp_delete_confirm_title = "Delete Partition"
|
mp_delete_confirm_title = "Delete Partition"
|
||||||
mp_error_empty_mountpoint = "Mount point cannot be empty."
|
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_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_plan_valid = "✓ Partition plan is valid. You can proceed."
|
||||||
mp_select_disk_first = "← Select a disk first."
|
mp_select_disk_first = "← Select a disk first."
|
||||||
|
|||||||
@@ -260,6 +260,7 @@ job_mount_custom = "Manuel bölümler bağlanıyor"
|
|||||||
# ── Ek Yerelleştirme / i18n ──────────────────────────────────
|
# ── Ek Yerelleştirme / i18n ──────────────────────────────────
|
||||||
mp_delete_confirm_title = "Bölümü Sil"
|
mp_delete_confirm_title = "Bölümü Sil"
|
||||||
mp_error_empty_mountpoint = "Bağlama noktası boş olamaz."
|
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_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_plan_valid = "Bölüm planı geçerli. İleri tuşuna basabilirsiniz."
|
||||||
mp_select_disk_first = "← Önce bir disk seçin."
|
mp_select_disk_first = "← Önce bir disk seçin."
|
||||||
|
|||||||
+103
-5
@@ -474,7 +474,7 @@ fn validate_manual_on(
|
|||||||
|
|
||||||
/// Bir tanımın bağlama noktası BOŞ olmak zorunda mı?
|
/// 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:
|
/// serbesttir:
|
||||||
///
|
///
|
||||||
/// 1. **LVM PV** — üzerinde mantıksal hacimler yaşar, kendisi
|
/// 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ı
|
/// 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
|
/// çift önyüklemeli kurulumda Windows'un boot bölümünü "yalnızca
|
||||||
/// GRUB için, mount edilmeyecek" diye işaretlemek isteyebilir.
|
/// 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ı
|
/// Yeni bir tanımda (`None` ya da `orig_device` boş) ZORUNLUDUR:
|
||||||
/// "ne işe yarayacak" diye sormadan kaydedemez.
|
/// kullanıcı "ne işe yarayacak" diye sormadan kaydedemez.
|
||||||
///
|
///
|
||||||
/// ⚠️ Bu kural hem `validate_manual_on`'da hem de kaydetme diyaloğunda
|
/// ⚠️ Bu kural hem `validate_manual_on`'da hem de kaydetme diyaloğunda
|
||||||
/// aynen uygulanmalı — birinde serbest olan diğerinde reddediliyorsa
|
/// aynen uygulanmalı — birinde serbest olan diğerinde reddediliyorsa
|
||||||
/// kullanıcı "İleri"ye geçemez.
|
/// kullanıcı "İleri"ye geçemez.
|
||||||
fn mountpoint_required(editing: Option<&CustomPartition>, fstype: &FsType) -> bool {
|
fn mountpoint_required(editing: Option<&CustomPartition>, fstype: &FsType) -> bool {
|
||||||
if *fstype == FsType::Lvm {
|
// Kendisi bağlanmayan / bağlanması gerekmeyen dosya sistemleri
|
||||||
return false;
|
match fstype {
|
||||||
|
FsType::Lvm => return false,
|
||||||
|
FsType::Ntfs => return false,
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
match editing {
|
match editing {
|
||||||
None => true,
|
None => true,
|
||||||
@@ -1966,6 +1976,46 @@ impl PartitionStep {
|
|||||||
self.manual.add_fstype = idx(FsType::Fat32);
|
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.add_space(6.0);
|
||||||
ui.separator();
|
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
|
/// 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İ
|
/// 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.
|
/// olmalı — GRUB için ayrılmış bölüm yüzünden reddedilmemeli.
|
||||||
|
|||||||
Reference in New Issue
Block a user