@@ -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
395395pub 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
546552pub 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