Files
ioccc/bin/sgi.sh
T
Landon Curt Noll d98a29a940 improve how the C locale is set
In conjunction with changes made to "the other repo",
we now set:

export LANG="C"
export LC_CTYPE="C"
export LC_NUMERIC="C"
export LC_TIME="C"
export LC_COLLATE="C"
export LC_MONETARY="C"
export LC_MESSAGES="C"
export LC_PAPER="C"
export LC_NAME="C"
export LC_ADDRESS="C"
export LC_TELEPHONE="C"
export LC_MEASUREMENT="C"
export LC_IDENTIFICATION="C"
export LC_ALL="C"

instead of just "$LC_ALL", "$LANG", "$LC_NUMERIC".
2025-03-14 17:59:04 -07:00

128 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# sgi.sh - sort .gitignore canonically from stdin to stdout
#
# We canonicalize .gitignore lines as follows:
#
# We print lines # in the order they appear, 1st.
# We dictionary sort with lines starting with * 2nd.
# We dictionary sort with lines starting with ! 3rd.
# We dictionary sort with lines starting with / 4th.
# We dictionary sort all other lines 5th.
#
# For each step past the 1st step, we remove duplicate lines.
#
# Example usage in vim with a keyboard macro <escape>f:
#
# :map ^[f 1G!G../../bin/sgi.sh^M
#
# or via .vimrc:
#
# " sort the entire .gitignore file using ../../bin/sgi.sh
# :map ^[f 1G!G../../bin/sgi.sh^M
#
# NOTE: The ^[ above is ((Escape)) and ^M is ((Control-M)).
#
# Example usage in shell:
#
# rm -f t && ../../bin/sgi.sh < .gitignore > t && mv -f t .gitignore
#
# Copyright (c) 2024 by Landon Curt Noll. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby granted,
# provided that the above copyright, this permission notice and text
# this comment, and the disclaimer below appear in all of the following:
#
# supporting documentation
# source copies
# source works derived from this source
# binaries derived from this source or from derived source
#
# LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
# EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# chongo (Landon Curt Noll, http://www.isthe.com/chongo/index.html) /\oo/\
#
# Share and enjoy! :-)
# IOCCC requires use of C locale
#
export LANG="C"
export LC_CTYPE="C"
export LC_NUMERIC="C"
export LC_TIME="C"
export LC_COLLATE="C"
export LC_MONETARY="C"
export LC_MESSAGES="C"
export LC_PAPER="C"
export LC_NAME="C"
export LC_ADDRESS="C"
export LC_TELEPHONE="C"
export LC_MEASUREMENT="C"
export LC_IDENTIFICATION="C"
export LC_ALL="C"
# load stdin into a temporary gitignore file
#
export VERSION="2.0.0 2025-03-13"
NAME=$(basename "$0")
export NAME
export TMP_GITIGNORE=".tmp.$NAME.GITIGNORE.$$.tmp"
trap 'rm -f $TMP_GITIGNORE; exit' 0 1 2 3 15
rm -f "$TMP_GITIGNORE"
if [[ -e $TMP_GITIGNORE ]]; then
echo "$0: ERROR: cannot remove temporary gitignore file: $TMP_GITIGNORE" 1>&2
exit 10
fi
cat > "$TMP_GITIGNORE"
if [[ ! -e $TMP_GITIGNORE ]]; then
echo "$0: ERROR: cannot create temporary gitignore file: $TMP_GITIGNORE" 1>&2
exit 11
fi
# step 0: print .gitignore comment lines in order
#
grep '^#' "$TMP_GITIGNORE"
# print unique lines from the following 5 steps to stdout
#
# These 5 types of .gitignore lines are printed in
# step order as part of our .gitignore canonization.
#
{
# step 1: print * lines, sorted by dictionary
#
grep '^\*' "$TMP_GITIGNORE" | LC_ALL=C sort -d
# step 2: print ! lines, sorted by dictionary
#
grep '^!' "$TMP_GITIGNORE" | LC_ALL=C sort -d
# step 3: print . lines, sorted by dictionary
#
grep '^\.' "$TMP_GITIGNORE" | LC_ALL=C sort -d
# step 4: print / lines, sorted by dictionary
#
grep '^/' "$TMP_GITIGNORE" | LC_ALL=C sort -d
# step 5: print all other lines, sorted by dictionary
#
grep '^[^#*!./]' "$TMP_GITIGNORE" | LC_ALL=C sort -d
} | uniq
# All Done!!! All Done!!! -- Jessica Noll, Age 2
#
exit 0