ad3eeaedc5
From >6 to <1 second.
100 lines
2.0 KiB
Bash
Executable File
100 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Find out the maximum supported filename length and print it.
|
|
#
|
|
# Part of the gocryptfs test suite
|
|
# https://nuetzlich.net/gocryptfs/
|
|
|
|
set -eu
|
|
MYNAME=$(basename "$0")
|
|
|
|
if [[ $# -ne 1 || $1 == -* ]]; then
|
|
echo "Usage: $MYNAME DIRECTORY"
|
|
exit 1
|
|
fi
|
|
|
|
# Only show live progress if connected to a termial
|
|
# https://stackoverflow.com/a/911213/1380267
|
|
INTERACTIVE=0
|
|
if [[ -t 1 ]] ; then
|
|
INTERACTIVE=1
|
|
fi
|
|
|
|
cd "$1"
|
|
echo "Testing $PWD"
|
|
|
|
echo -n " Maximum filename length: "
|
|
# Add one character at a time until we hit an error
|
|
NAME=""
|
|
while true ; do
|
|
NEXT="${NAME}x"
|
|
if [[ -e $NEXT ]]; then
|
|
echo "error: file $PWD/$NEXT already exists"
|
|
exit 1
|
|
fi
|
|
echo -n 2> /dev/null > $NEXT || break
|
|
rm $NEXT
|
|
NAME="$NEXT"
|
|
done
|
|
echo "${#NAME}"
|
|
|
|
# Set to 0 if undefined
|
|
: ${QUICK:=0}
|
|
|
|
if [[ $QUICK -ne 1 ]]; then
|
|
echo -n " Maximum dirname length: "
|
|
# Add one character at a time until we hit an error
|
|
NAME=""
|
|
while true ; do
|
|
NEXT="${NAME}x"
|
|
mkdir $NEXT 2> /dev/null || break
|
|
rmdir $NEXT
|
|
NAME="$NEXT"
|
|
done
|
|
MAX_DIRNAME=${#NAME}
|
|
echo "${#NAME}"
|
|
fi
|
|
|
|
if [[ $QUICK -eq 1 ]]; then
|
|
CHARS_TODO=100
|
|
else
|
|
CHARS_TODO="1 10 100 $MAX_DIRNAME"
|
|
fi
|
|
|
|
for CHARS_PER_SUBDIR in $CHARS_TODO ; do
|
|
echo -n " Maximum path length with $(printf %3d $CHARS_PER_SUBDIR) chars per subdir: "
|
|
if [[ $INTERACTIVE -eq 1 ]] ; then
|
|
echo -n " "
|
|
fi
|
|
# Trick from https://stackoverflow.com/a/5349842/1380267
|
|
SUBDIR=$(printf 'x%.0s' $(seq 1 $CHARS_PER_SUBDIR))
|
|
mkdir "$SUBDIR"
|
|
P=$SUBDIR
|
|
# Create a deep path, one $SUBDIR at a time, until we hit an error
|
|
while true ; do
|
|
NEXT="$P/$SUBDIR"
|
|
mkdir "$NEXT" 2> /dev/null || break
|
|
P=$NEXT
|
|
if [[ $INTERACTIVE -eq 1 ]] ; then
|
|
echo -n -e "\b\b\b\b"
|
|
printf %4d ${#P}
|
|
fi
|
|
done
|
|
# Then add one character at a time until we hit an error
|
|
NAME=""
|
|
while true ; do
|
|
NEXT="${NAME}x"
|
|
touch "$P/$NEXT" 2> /dev/null || break
|
|
NAME=$NEXT
|
|
done
|
|
if [[ $NAME != "" ]] ; then
|
|
P=$P/$NAME
|
|
fi
|
|
if [[ $INTERACTIVE -eq 1 ]] ; then
|
|
echo -n -e "\b\b\b\b"
|
|
fi
|
|
printf %4d ${#P}
|
|
echo
|
|
rm -R "$SUBDIR"
|
|
done
|