[bug#77523,v4,1/6] system: /etc/profile: Group profile sourcing.

Message ID dc76edab52aa70a440049899d838d2cae44aca4d.1743736516.git.hako@ultrarare.space
State New
Headers
Series system: /etc/profile: Rearrange to avoid search path duplication. |

Commit Message

Hilton Chain April 4, 2025, 3:22 a.m. UTC
* gnu/system.scm (operating-system-etc-service)[profile]: Group sourcing of
all default profiles.
Order Guix Home search paths before the default user profile.
Rename iteration variable to GUIX_PROFILE.

Change-Id: I18eac738a5dfade84da2effdd6211119c6fdd96f
---
 gnu/system.scm | 24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)
  

Comments

宋文武 April 19, 2025, 1:37 a.m. UTC | #1
Hi,

Hilton Chain <hako@ultrarare.space> writes:
> * gnu/system.scm (operating-system-etc-service)[profile]: Group sourcing of
> all default profiles.
> Order Guix Home search paths before the default user profile.

Seems reversed, maybe "Prefer search paths of the default user profile
over the home profile.

> Rename iteration variable to GUIX_PROFILE.
>
> Change-Id: I18eac738a5dfade84da2effdd6211119c6fdd96f
> ---
>  gnu/system.scm | 24 +++++++++---------------
>  1 file changed, 9 insertions(+), 15 deletions(-)
>
> diff --git a/gnu/system.scm b/gnu/system.scm
> index 0d98e5a036..c166222854 100644
> --- a/gnu/system.scm
> +++ b/gnu/system.scm
> @@ -1074,10 +1074,6 @@ (define* (operating-system-etc-service os)
>  # Ignore the default value of 'PATH'.
>  unset PATH
>  
> -# Load the system profile's settings.
> -GUIX_PROFILE=/run/current-system/profile ; \\
> -. /run/current-system/profile/etc/profile
> -
>  # Since 'lshd' does not use pam_env, /etc/environment must be explicitly
>  # loaded when someone logs in via SSH.  See <http://bugs.gnu.org/22175>.
>  # We need 'PATH' to be defined here, for 'cat' and 'cut'.  Do this before
This "We need ... to allow variables to be overridden." comment should
be removed, since it's for the previous "Load the system profile's settings.".


> [...]
> -# Arrange so that ~/.config/guix/current comes first,
> -# and guix-home comes before guix-profile.
> -for profile in \"$HOME/.guix-profile\"        \\
> -               \"$HOME/.guix-home/profile\"   \\
> -               \"$HOME/.config/guix/current\"
> +# Set up environment for all default profiles.
> +for GUIX_PROFILE in \"/run/current-system/profile\" \\
> +                    \"$HOME/.guix-home/profile\"   \\
> +                    \"$HOME/.guix-profile\"        \\
> +                    \"$HOME/.config/guix/current\"
>  do
> -  if [ -f \"$profile/etc/profile\" ]
> +  if [ -f \"$GUIX_PROFILE/etc/profile\" ]
>    then
> -    # Load the user profile's settings.
> -    GUIX_PROFILE=\"$profile\" ; \\
> -    . \"$profile/etc/profile\"
> +    . \"$GUIX_PROFILE/etc/profile\"
>    else
>      # At least define this one so that basic things just work
>      # when the user installs their first package.
> -    export PATH=\"$profile/bin:$PATH\"
> +    export PATH=\"$GUIX_PROFILE/bin:$PATH\"
>    fi
>  done

Since we are here, I think we can append "unset GUIX_PROFILE" after the
for loop to show it no longer needed, and avoid possibly wrong usages.
  

Patch

diff --git a/gnu/system.scm b/gnu/system.scm
index 0d98e5a036..c166222854 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -1074,10 +1074,6 @@  (define* (operating-system-etc-service os)
 # Ignore the default value of 'PATH'.
 unset PATH
 
-# Load the system profile's settings.
-GUIX_PROFILE=/run/current-system/profile ; \\
-. /run/current-system/profile/etc/profile
-
 # Since 'lshd' does not use pam_env, /etc/environment must be explicitly
 # loaded when someone logs in via SSH.  See <http://bugs.gnu.org/22175>.
 # We need 'PATH' to be defined here, for 'cat' and 'cut'.  Do this before
@@ -1086,24 +1082,22 @@  (define* (operating-system-etc-service os)
      -a -z \"$LINUX_MODULE_DIRECTORY\" ]
 then
   . /etc/environment
-  export `cat /etc/environment | cut -d= -f1`
+  export `/run/current-system/profile/bin/cut -d= -f1 < /etc/environment`
 fi
 
-# Arrange so that ~/.config/guix/current comes first,
-# and guix-home comes before guix-profile.
-for profile in \"$HOME/.guix-profile\"        \\
-               \"$HOME/.guix-home/profile\"   \\
-               \"$HOME/.config/guix/current\"
+# Set up environment for all default profiles.
+for GUIX_PROFILE in \"/run/current-system/profile\" \\
+                    \"$HOME/.guix-home/profile\"   \\
+                    \"$HOME/.guix-profile\"        \\
+                    \"$HOME/.config/guix/current\"
 do
-  if [ -f \"$profile/etc/profile\" ]
+  if [ -f \"$GUIX_PROFILE/etc/profile\" ]
   then
-    # Load the user profile's settings.
-    GUIX_PROFILE=\"$profile\" ; \\
-    . \"$profile/etc/profile\"
+    . \"$GUIX_PROFILE/etc/profile\"
   else
     # At least define this one so that basic things just work
     # when the user installs their first package.
-    export PATH=\"$profile/bin:$PATH\"
+    export PATH=\"$GUIX_PROFILE/bin:$PATH\"
   fi
 done