Skip to content

Commit 378c277

Browse files
update --runtime to --os-release
1 parent d8fd441 commit 378c277

3 files changed

Lines changed: 151 additions & 139 deletions

File tree

src/commands/ext.rs

Lines changed: 82 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -391,53 +391,57 @@ pub fn refresh_extensions_direct(output: &OutputManager) {
391391
refresh_extensions(output);
392392
}
393393

394-
/// Enable extensions for a specific runtime version
394+
/// Enable extensions for a specific OS release version
395395
pub fn enable_extensions(
396-
runtime_version: Option<&str>,
396+
os_release_version: Option<&str>,
397397
extensions: &[&str],
398398
config: &Config,
399399
output: &OutputManager,
400400
) {
401-
// Determine the runtime version to use
402-
let version_id = if let Some(version) = runtime_version {
401+
// Determine the OS release version to use
402+
let version_id = if let Some(version) = os_release_version {
403403
version.to_string()
404404
} else {
405405
read_os_version_id()
406406
};
407407

408408
output.info(
409409
"Enable Extensions",
410-
&format!("Enabling extensions for runtime version: {version_id}"),
410+
&format!("Enabling extensions for OS release version: {version_id}"),
411411
);
412412

413413
// Get the extensions directory from config
414414
let extensions_dir = config.get_extensions_dir();
415415

416-
// Determine runtime directory based on test mode
417-
let runtime_dir = if std::env::var("AVOCADO_TEST_MODE").is_ok() {
416+
// Determine os-releases directory based on test mode
417+
let os_releases_dir = if std::env::var("AVOCADO_TEST_MODE").is_ok() {
418418
let temp_base = std::env::var("TMPDIR").unwrap_or_else(|_| "/tmp".to_string());
419-
format!("{temp_base}/avocado/runtime/{version_id}")
419+
format!("{temp_base}/avocado/os-releases/{version_id}")
420420
} else {
421-
format!("/var/lib/avocado/runtime/{version_id}")
421+
format!("/var/lib/avocado/os-releases/{version_id}")
422422
};
423423

424-
// Create the runtime directory if it doesn't exist
425-
if let Err(e) = fs::create_dir_all(&runtime_dir) {
424+
// Create the os-releases directory if it doesn't exist
425+
if let Err(e) = fs::create_dir_all(&os_releases_dir) {
426426
output.error(
427427
"Enable Extensions",
428-
&format!("Failed to create runtime directory '{runtime_dir}': {e}"),
428+
&format!("Failed to create os-releases directory '{os_releases_dir}': {e}"),
429429
);
430430
std::process::exit(1);
431431
}
432432

433-
// Sync the parent directory to ensure the runtime directory is persisted
434-
if let Err(e) = sync_directory(Path::new(&runtime_dir).parent().unwrap_or(Path::new("/"))) {
433+
// Sync the parent directory to ensure the os-releases directory is persisted
434+
if let Err(e) = sync_directory(
435+
Path::new(&os_releases_dir)
436+
.parent()
437+
.unwrap_or(Path::new("/")),
438+
) {
435439
output.progress(&format!("Warning: Failed to sync parent directory: {e}"));
436440
}
437441

438442
output.step(
439443
"Enable",
440-
&format!("Created runtime directory: {runtime_dir}"),
444+
&format!("Created os-releases directory: {os_releases_dir}"),
441445
);
442446

443447
// Process each extension
@@ -462,10 +466,10 @@ pub fn enable_extensions(
462466
continue;
463467
};
464468

465-
// Create symlink in runtime directory
469+
// Create symlink in os-releases directory
466470
let target_path = format!(
467471
"{}/{}",
468-
runtime_dir,
472+
os_releases_dir,
469473
Path::new(&source_path)
470474
.file_name()
471475
.unwrap()
@@ -497,12 +501,12 @@ pub fn enable_extensions(
497501
}
498502
}
499503

500-
// Sync the runtime directory to ensure all symlinks are persisted to disk
504+
// Sync the os-releases directory to ensure all symlinks are persisted to disk
501505
if success_count > 0 {
502-
if let Err(e) = sync_directory(Path::new(&runtime_dir)) {
506+
if let Err(e) = sync_directory(Path::new(&os_releases_dir)) {
503507
output.error(
504508
"Enable Extensions",
505-
&format!("Failed to sync runtime directory to disk: {e}"),
509+
&format!("Failed to sync os-releases directory to disk: {e}"),
506510
);
507511
std::process::exit(1);
508512
}
@@ -519,7 +523,9 @@ pub fn enable_extensions(
519523
} else {
520524
output.success(
521525
"Enable Extensions",
522-
&format!("Successfully enabled {success_count} extension(s) for runtime {version_id}"),
526+
&format!(
527+
"Successfully enabled {success_count} extension(s) for OS release {version_id}"
528+
),
523529
);
524530
}
525531
}
@@ -542,39 +548,39 @@ fn sync_directory(dir_path: &Path) -> Result<(), SystemdError> {
542548
Ok(())
543549
}
544550

545-
/// Disable extensions for a specific runtime version
551+
/// Disable extensions for a specific OS release version
546552
pub fn disable_extensions(
547-
runtime_version: Option<&str>,
553+
os_release_version: Option<&str>,
548554
extensions: Option<&[&str]>,
549555
all: bool,
550556
_config: &Config,
551557
output: &OutputManager,
552558
) {
553-
// Determine the runtime version to use
554-
let version_id = if let Some(version) = runtime_version {
559+
// Determine the OS release version to use
560+
let version_id = if let Some(version) = os_release_version {
555561
version.to_string()
556562
} else {
557563
read_os_version_id()
558564
};
559565

560566
output.info(
561567
"Disable Extensions",
562-
&format!("Disabling extensions for runtime version: {version_id}"),
568+
&format!("Disabling extensions for OS release version: {version_id}"),
563569
);
564570

565-
// Determine runtime directory based on test mode
566-
let runtime_dir = if std::env::var("AVOCADO_TEST_MODE").is_ok() {
571+
// Determine os-releases directory based on test mode
572+
let os_releases_dir = if std::env::var("AVOCADO_TEST_MODE").is_ok() {
567573
let temp_base = std::env::var("TMPDIR").unwrap_or_else(|_| "/tmp".to_string());
568-
format!("{temp_base}/avocado/runtime/{version_id}")
574+
format!("{temp_base}/avocado/os-releases/{version_id}")
569575
} else {
570-
format!("/var/lib/avocado/runtime/{version_id}")
576+
format!("/var/lib/avocado/os-releases/{version_id}")
571577
};
572578

573-
// Check if runtime directory exists
574-
if !Path::new(&runtime_dir).exists() {
579+
// Check if os-releases directory exists
580+
if !Path::new(&os_releases_dir).exists() {
575581
output.error(
576582
"Disable Extensions",
577-
&format!("Runtime directory '{runtime_dir}' does not exist"),
583+
&format!("OS releases directory '{os_releases_dir}' does not exist"),
578584
);
579585
std::process::exit(1);
580586
}
@@ -583,10 +589,10 @@ pub fn disable_extensions(
583589
let mut error_count = 0;
584590

585591
if all {
586-
// Disable all extensions by removing all symlinks in the runtime directory
592+
// Disable all extensions by removing all symlinks in the os-releases directory
587593
output.step("Disable", "Removing all extensions");
588594

589-
match fs::read_dir(&runtime_dir) {
595+
match fs::read_dir(&os_releases_dir) {
590596
Ok(entries) => {
591597
for entry in entries {
592598
match entry {
@@ -628,7 +634,7 @@ pub fn disable_extensions(
628634
Err(e) => {
629635
output.error(
630636
"Disable Extensions",
631-
&format!("Failed to read runtime directory '{runtime_dir}': {e}"),
637+
&format!("Failed to read os-releases directory '{os_releases_dir}': {e}"),
632638
);
633639
std::process::exit(1);
634640
}
@@ -637,8 +643,8 @@ pub fn disable_extensions(
637643
// Disable specific extensions
638644
for ext_name in ext_names {
639645
// Check for both directory and .raw file symlinks
640-
let symlink_dir = format!("{}/{}", runtime_dir, ext_name);
641-
let symlink_raw = format!("{}/{}.raw", runtime_dir, ext_name);
646+
let symlink_dir = format!("{}/{}", os_releases_dir, ext_name);
647+
let symlink_raw = format!("{}/{}.raw", os_releases_dir, ext_name);
642648

643649
let mut found = false;
644650

@@ -685,7 +691,7 @@ pub fn disable_extensions(
685691
if !found {
686692
output.error(
687693
"Disable Extensions",
688-
&format!("Extension '{ext_name}' is not enabled for runtime {version_id}"),
694+
&format!("Extension '{ext_name}' is not enabled for OS release {version_id}"),
689695
);
690696
error_count += 1;
691697
}
@@ -699,12 +705,12 @@ pub fn disable_extensions(
699705
std::process::exit(1);
700706
}
701707

702-
// Sync the runtime directory to ensure all removals are persisted to disk
708+
// Sync the os-releases directory to ensure all removals are persisted to disk
703709
if success_count > 0 {
704-
if let Err(e) = sync_directory(Path::new(&runtime_dir)) {
710+
if let Err(e) = sync_directory(Path::new(&os_releases_dir)) {
705711
output.error(
706712
"Disable Extensions",
707-
&format!("Failed to sync runtime directory to disk: {e}"),
713+
&format!("Failed to sync os-releases directory to disk: {e}"),
708714
);
709715
std::process::exit(1);
710716
}
@@ -721,7 +727,9 @@ pub fn disable_extensions(
721727
} else {
722728
output.success(
723729
"Disable Extensions",
724-
&format!("Successfully disabled {success_count} extension(s) for runtime {version_id}"),
730+
&format!(
731+
"Successfully disabled {success_count} extension(s) for OS release {version_id}"
732+
),
725733
);
726734
}
727735
}
@@ -1299,38 +1307,38 @@ fn scan_extensions_from_all_sources_with_verbosity(
12991307
}
13001308
}
13011309

1302-
// 2. Second priority: Runtime-specific extensions (/var/lib/avocado/runtime/<VERSION_ID>)
1303-
// Check runtime directory to see which extensions are explicitly enabled
1304-
let runtime_extensions_dir = if std::env::var("AVOCADO_TEST_MODE").is_ok() {
1310+
// 2. Second priority: OS release-specific extensions (/var/lib/avocado/os-releases/<VERSION_ID>)
1311+
// Check os-releases directory to see which extensions are explicitly enabled
1312+
let os_releases_extensions_dir = if std::env::var("AVOCADO_TEST_MODE").is_ok() {
13051313
let temp_base = std::env::var("TMPDIR").unwrap_or_else(|_| "/tmp".to_string());
1306-
format!("{temp_base}/avocado/runtime/{version_id}")
1314+
format!("{temp_base}/avocado/os-releases/{version_id}")
13071315
} else {
1308-
format!("/var/lib/avocado/runtime/{version_id}")
1316+
format!("/var/lib/avocado/os-releases/{version_id}")
13091317
};
13101318

13111319
if verbose {
13121320
println!(
1313-
"Scanning runtime extensions in {runtime_extensions_dir} (VERSION_ID: {version_id})"
1321+
"Scanning OS release extensions in {os_releases_extensions_dir} (VERSION_ID: {version_id})"
13141322
);
13151323
}
13161324

1317-
// Check if runtime directory exists
1318-
if !Path::new(&runtime_extensions_dir).exists() {
1325+
// Check if os-releases directory exists
1326+
if !Path::new(&os_releases_extensions_dir).exists() {
13191327
if verbose {
1320-
println!("Runtime directory {runtime_extensions_dir} does not exist, skipping");
1328+
println!("OS releases directory {os_releases_extensions_dir} does not exist, skipping");
13211329
}
13221330
// Only warn in non-test mode
13231331
if std::env::var("AVOCADO_TEST_MODE").is_err() {
1324-
eprintln!("Warning: No extensions are enabled for VERSION_ID '{version_id}'. Directory not found: {runtime_extensions_dir}");
1332+
eprintln!("Warning: No extensions are enabled for VERSION_ID '{version_id}'. Directory not found: {os_releases_extensions_dir}");
13251333
}
13261334
} else {
1327-
// Scan runtime directory for symlinks or extensions
1328-
if let Ok(runtime_extensions) = scan_directory_extensions(&runtime_extensions_dir) {
1329-
for ext in runtime_extensions {
1335+
// Scan os-releases directory for symlinks or extensions
1336+
if let Ok(os_releases_extensions) = scan_directory_extensions(&os_releases_extensions_dir) {
1337+
for ext in os_releases_extensions {
13301338
if !extension_map.contains_key(&ext.name) {
13311339
if verbose {
13321340
println!(
1333-
"Found runtime extension: {} at {}",
1341+
"Found OS release extension: {} at {}",
13341342
ext.name,
13351343
ext.path.display()
13361344
);
@@ -1345,9 +1353,9 @@ fn scan_extensions_from_all_sources_with_verbosity(
13451353
}
13461354
}
13471355

1348-
// Also scan for .raw files in runtime directory (symlinks to actual extensions)
1349-
if let Ok(runtime_raw_files) = scan_raw_files(&runtime_extensions_dir) {
1350-
for (ext_name, ext_version, ext_path) in runtime_raw_files {
1356+
// Also scan for .raw files in os-releases directory (symlinks to actual extensions)
1357+
if let Ok(os_releases_raw_files) = scan_raw_files(&os_releases_extensions_dir) {
1358+
for (ext_name, ext_version, ext_path) in os_releases_raw_files {
13511359
use std::collections::hash_map::Entry;
13521360
match extension_map.entry(ext_name.clone()) {
13531361
Entry::Vacant(entry) => {
@@ -1360,7 +1368,7 @@ fn scan_extensions_from_all_sources_with_verbosity(
13601368
) {
13611369
if verbose {
13621370
println!(
1363-
"Found runtime raw extension: {} at {}",
1371+
"Found OS release raw extension: {} at {}",
13641372
ext.name,
13651373
ext.path.display()
13661374
);
@@ -1371,7 +1379,7 @@ fn scan_extensions_from_all_sources_with_verbosity(
13711379
Entry::Occupied(_) => {
13721380
if verbose {
13731381
println!(
1374-
"Skipping runtime raw extension {} (higher priority version preferred)",
1382+
"Skipping OS release raw extension {} (higher priority version preferred)",
13751383
ext_name
13761384
);
13771385
}
@@ -1381,19 +1389,19 @@ fn scan_extensions_from_all_sources_with_verbosity(
13811389
}
13821390
}
13831391

1384-
// 3. Third priority: Regular directory extensions (skip if already have HITL or runtime version)
1385-
// IMPORTANT: If a runtime directory exists, we do NOT fall back to the base extensions directory
1386-
// This ensures that explicitly disabled extensions (removed from runtime) are not merged
1387-
let runtime_dir_exists = Path::new(&runtime_extensions_dir).exists();
1392+
// 3. Third priority: Regular directory extensions (skip if already have HITL or OS release version)
1393+
// IMPORTANT: If an os-releases directory exists, we do NOT fall back to the base extensions directory
1394+
// This ensures that explicitly disabled extensions (removed from os-releases) are not merged
1395+
let os_releases_dir_exists = Path::new(&os_releases_extensions_dir).exists();
13881396

13891397
if verbose {
13901398
println!("Scanning directory extensions in {extensions_dir}");
13911399
}
13921400

1393-
if !runtime_dir_exists {
1394-
// Only scan base directory if no runtime directory exists (backward compatibility)
1401+
if !os_releases_dir_exists {
1402+
// Only scan base directory if no os-releases directory exists (backward compatibility)
13951403
if verbose {
1396-
println!("No runtime directory found, scanning base extensions directory");
1404+
println!("No OS releases directory found, scanning base extensions directory");
13971405
}
13981406
if let Ok(dir_extensions) = scan_directory_extensions(&extensions_dir) {
13991407
for ext in dir_extensions {
@@ -1415,18 +1423,18 @@ fn scan_extensions_from_all_sources_with_verbosity(
14151423
}
14161424
}
14171425
} else if verbose {
1418-
println!("Runtime directory exists, skipping base extensions directory (use enable/disable to manage extensions)");
1426+
println!("OS releases directory exists, skipping base extensions directory (use enable/disable to manage extensions)");
14191427
}
14201428

14211429
// 4. Fourth priority: Raw file extensions (skip if already have directory version)
1422-
// IMPORTANT: Same as above - only scan if no runtime directory exists
1430+
// IMPORTANT: Same as above - only scan if no os-releases directory exists
14231431
if verbose {
14241432
println!("Scanning raw file extensions in {extensions_dir}");
14251433
}
14261434

1427-
if !runtime_dir_exists {
1435+
if !os_releases_dir_exists {
14281436
if verbose {
1429-
println!("No runtime directory found, scanning base raw files");
1437+
println!("No OS releases directory found, scanning base raw files");
14301438
}
14311439
let raw_files = scan_raw_files(&extensions_dir)?;
14321440

@@ -1475,7 +1483,7 @@ fn scan_extensions_from_all_sources_with_verbosity(
14751483
}
14761484
}
14771485
} else if verbose {
1478-
println!("Runtime directory exists, skipping base raw files (use enable/disable to manage extensions)");
1486+
println!("OS releases directory exists, skipping base raw files (use enable/disable to manage extensions)");
14791487
}
14801488

14811489
// Convert map to vector

0 commit comments

Comments
 (0)