commit:     93275ac104ad6999f9c4551ceb150c047fca1979
Author:     Kerin Millar <kfm <AT> plushkava <DOT> net>
AuthorDate: Sat Jul 12 04:53:01 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Tue Jul 22 22:25:40 2025 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=93275ac1

phase-functions.sh: reorder hard-coded array elements to optimise for legibility

Presently, the "phase-functions.sh" unit defines the following four
array variables in the global scope.

- PORTAGE_MUTABLE_FILTERED_VARS
- PORTAGE_SAVED_READONLY_VARS
- PORTAGE_READONLY_METADATA
- PORTAGE_READONLY_VARS

It also defines the following three array variables as local to the
__filter_readonly_variables() function.

- binpkg_untrusted_vars
- filtered_sandbox_vars
- bash_vars

The elements contained by all of these arrays are hard-coded and are
presented in ascending lexicographical order. However, I have found that
sequences of identifiers can be rendered more legible by being in
descending order of length. At the same time, maintaining an
alphabetical order makes it easier to identify a particular element
while perusing longer sequences. With both of these considerations in
mind, I devised a simple algorithm that sorts in a manner threefold:

1) by ascending lexicographical order of that which matches ^_*[[:alpha:]]
2) by descending order or element length, in characters
3) by asending lexicographical order

I found the results to be quite satisfactory. As such, this commit
reorders the elements of the aforementioned array variables in
accordance with this algorithm. The improvement in legibility is most
notable in the case of the 'portage_readonly_vars' variable. For
reference, a perl implementation of this algorithm is shown beneath.

#!/usr/bin/perl
while (readline *STDIN) {
        push @words, m/\S+/g;
}
@words = sort {
        ($c1, $c2) = map { m/^(_*\p{PosixAlpha})/ ? $1 : '' } $a, $b;
        $c1 cmp $c2 || length $b <=> length $a || $a cmp $b;
} @words;
print "@words\n";

Signed-off-by: Kerin Millar <kfm <AT> plushkava.net>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 bin/phase-functions.sh | 74 +++++++++++++++++++++++++-------------------------
 1 file changed, 37 insertions(+), 37 deletions(-)

diff --git a/bin/phase-functions.sh b/bin/phase-functions.sh
index ed64024da5..d2de289996 100644
--- a/bin/phase-functions.sh
+++ b/bin/phase-functions.sh
@@ -9,35 +9,35 @@
 # when portage is upgrading itself.
 
 portage_readonly_metadata=(
-       BDEPEND DEFINED_PHASES DEPEND DESCRIPTION EAPI HOMEPAGE IDEPEND
-       INHERITED IUSE REQUIRED_USE KEYWORDS LICENSE PDEPEND RDEPEND REPOSITORY
-       RESTRICT SLOT SRC_URI
+       BDEPEND DEFINED_PHASES DESCRIPTION DEPEND EAPI HOMEPAGE INHERITED
+       IDEPEND IUSE KEYWORDS LICENSE PDEPEND REQUIRED_USE REPOSITORY RESTRICT
+       RDEPEND SRC_URI SLOT
 )
 
 portage_readonly_vars=(
-       D EBUILD EBUILD_PHASE EBUILD_PHASE_FUNC EBUILD_SH_ARGS ED EMERGE_FROM
-       EROOT FILESDIR MERGE_TYPE PM_EBUILD_HOOK_DIR PORTAGE_ACTUAL_DISTDIR
-       PORTAGE_ARCHLIST PORTAGE_BASHRC PORTAGE_BINPKG_FILE
-       PORTAGE_BINPKG_TAR_OPTS PORTAGE_BINPKG_TMPFILE PORTAGE_BIN_PATH
-       PORTAGE_BUILDDIR PORTAGE_BUILD_GROUP PORTAGE_BUILD_USER
-       PORTAGE_COLORMAP PORTAGE_CONFIGROOT PORTAGE_DEBUG PORTAGE_DEPCACHEDIR
-       PORTAGE_EBUILD_EXIT_FILE PORTAGE_EBUILD_EXTRA_SOURCE
-       PORTAGE_ECLASS_LOCATIONS PORTAGE_EXPLICIT_INHERIT PORTAGE_GID
-       PORTAGE_GRPNAME PORTAGE_INST_GID PORTAGE_INST_UID
-       PORTAGE_INTERNAL_CALLER PORTAGE_IPC_DAEMON PORTAGE_IUSE
-       PORTAGE_LOG_FILE PORTAGE_OVERRIDE_EPREFIX PORTAGE_PROPERTIES
-       PORTAGE_PYM_PATH PORTAGE_PYTHON PORTAGE_PYTHONPATH PORTAGE_REPO_NAME
-       PORTAGE_REPOSITORIES PORTAGE_RESTRICT PORTAGE_SIGPIPE_STATUS
-       PORTAGE_TMPDIR PORTAGE_UPDATE_ENV PORTAGE_USERNAME PORTAGE_VERBOSE
-       PORTAGE_WORKDIR_MODE PORTAGE_XATTR_EXCLUDE REPLACING_VERSIONS
-       REPLACED_BY_VERSION T WORKDIR __PORTAGE_HELPER
-       __PORTAGE_TEST_HARDLINK_LOCKS portage_mutable_filtered_vars
+       D EBUILD_PHASE_FUNC EBUILD_SH_ARGS EBUILD_PHASE EMERGE_FROM EBUILD
+       EROOT ED FILESDIR MERGE_TYPE PORTAGE_EBUILD_EXTRA_SOURCE
+       PORTAGE_EBUILD_EXIT_FILE PORTAGE_ECLASS_LOCATIONS
+       PORTAGE_EXPLICIT_INHERIT PORTAGE_OVERRIDE_EPREFIX
+       PORTAGE_BINPKG_TAR_OPTS PORTAGE_INTERNAL_CALLER PORTAGE_ACTUAL_DISTDIR
+       PORTAGE_BINPKG_TMPFILE PORTAGE_SIGPIPE_STATUS PORTAGE_XATTR_EXCLUDE
+       PORTAGE_REPOSITORIES PORTAGE_WORKDIR_MODE PORTAGE_BINPKG_FILE
+       PORTAGE_BUILD_GROUP PORTAGE_DEPCACHEDIR PM_EBUILD_HOOK_DIR
+       PORTAGE_BUILD_USER PORTAGE_CONFIGROOT PORTAGE_IPC_DAEMON
+       PORTAGE_PROPERTIES PORTAGE_PYTHONPATH PORTAGE_UPDATE_ENV
+       PORTAGE_REPO_NAME PORTAGE_ARCHLIST PORTAGE_BIN_PATH PORTAGE_BUILDDIR
+       PORTAGE_COLORMAP PORTAGE_INST_GID PORTAGE_INST_UID PORTAGE_LOG_FILE
+       PORTAGE_PYM_PATH PORTAGE_RESTRICT PORTAGE_USERNAME PORTAGE_GRPNAME
+       PORTAGE_VERBOSE PORTAGE_BASHRC PORTAGE_PYTHON PORTAGE_TMPDIR
+       PORTAGE_DEBUG PORTAGE_IUSE PORTAGE_GID REPLACED_BY_VERSION
+       REPLACING_VERSIONS T WORKDIR __PORTAGE_TEST_HARDLINK_LOCKS
+       __PORTAGE_HELPER portage_mutable_filtered_vars
        portage_saved_readonly_vars portage_readonly_metadata
        portage_readonly_vars
 )
 
 portage_saved_readonly_vars=(
-       A CATEGORY P PF PN PR PV PVR
+       A CATEGORY PVR PF PN PR PV P
 )
 
 # Variables that portage sets but doesn't mark readonly.
@@ -100,28 +100,28 @@ __filter_readonly_variables() {
        # Incorporate other variables that are known to either be set by or be
        # able to influence bash. This list was last updated for bash-5.3.
        bash_vars+=(
-               BASH_COMPAT BASH_ENV BASH_LOADABLES_PATH BASH_REMATCH
-               BASH_TRAPSIG BASH_XTRACEFD CDPATH CHILD_MAX COLUMNS COMPREPLY
-               COMP_CWORD COMP_KEY COMP_LINE COMP_POINT COMP_TYPE COMP_WORDS
-               COPROC ENV EXECIGNORE FCEDIT FIGNORE FUNCNAME FUNCNEST
-               GLOBIGNORE GLOBSORT HISTCONTROL HISTFILE HISTFILESIZE
-               HISTIGNORE HISTSIZE HISTTIMEFORMAT HOME HOSTFILE IGNOREEOF
-               INPUTRC INSIDE_EMACS LINES MAIL MAILCHECK MAILPATH MAPFILE
-               OLDPWD OPTARG PIPESTATUS POSIXLY_CORRECT PROMPT_COMMAND
-               PROMPT_DIRTRIM PS0 PS1 PS2 PS3 READLINE_ARGUMENT READLINE_LINE
-               READLINE_MARK READLINE_POINT REPLY TIMEFORMAT TMOUT TMPDIR
-               auto_resume histchars
+               BASH_LOADABLES_PATH BASH_XTRACEFD BASH_REMATCH BASH_TRAPSIG
+               BASH_COMPAT BASH_ENV COMP_CWORD COMP_POINT COMP_WORDS CHILD_MAX
+               COMPREPLY COMP_LINE COMP_TYPE COMP_KEY COLUMNS CDPATH COPROC
+               EXECIGNORE ENV FUNCNAME FUNCNEST FIGNORE FCEDIT GLOBIGNORE
+               GLOBSORT HISTTIMEFORMAT HISTFILESIZE HISTCONTROL HISTIGNORE
+               HISTFILE HISTSIZE HOSTFILE HOME INSIDE_EMACS IGNOREEOF INPUTRC
+               LINES MAILCHECK MAILPATH MAPFILE MAIL OLDPWD OPTARG
+               POSIXLY_CORRECT PROMPT_COMMAND PROMPT_DIRTRIM PIPESTATUS PS0
+               PS1 PS2 PS3 READLINE_ARGUMENT READLINE_POINT READLINE_LINE
+               READLINE_MARK REPLY TIMEFORMAT TMPDIR TMOUT auto_resume
+               histchars
 
                # Exported functions bear this prefix.
                "BASH_FUNC_.*"
        )
        filtered_sandbox_vars=(
-               SANDBOX_ACTIVE SANDBOX_BASHRC SANDBOX_DEBUG_LOG
-               SANDBOX_DISABLED SANDBOX_LIB SANDBOX_LOG SANDBOX_ON
+               SANDBOX_DEBUG_LOG SANDBOX_DISABLED SANDBOX_ACTIVE
+               SANDBOX_BASHRC SANDBOX_LIB SANDBOX_LOG SANDBOX_ON
        )
        # Untrusted due to possible application of package renames to binpkgs
        binpkg_untrusted_vars=(
-               CATEGORY P PF PN PR PV PVR
+               CATEGORY PVR PF PN PR PV P
        )
        misc_garbage_vars=(
                _portage_filter_opts
@@ -165,8 +165,8 @@ __filter_readonly_variables() {
        fi
        if has --filter-locale "$@"; then
                filtered_vars+=(
-                       LANG LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY
-                       LC_NUMERIC LC_PAPER LC_TIME
+                       LC_MESSAGES LC_MONETARY LC_COLLATE LC_NUMERIC LC_CTYPE
+                       LC_PAPER LC_TIME LC_ALL LANG
                )
        fi
        if has --allow-extra-vars "$@"; then

Reply via email to