jw-pkg/scripts/scm.sh
Jan Lindemann e55793f61a scm.sh ls-files: Support -a (all files)
scm.sh ls-files by defaults does not list the VSC metadata files.
Passing -a includes them in the output.

Signed-off-by: Jan Lindemann <jan@janware.com>
2025-12-01 11:29:53 +01:00

190 lines
2.9 KiB
Bash

#!/bin/bash
cmd_mv()
{
local from="$1"
local to="$2"
case $scm in
cvs)
cp "$from" "$to"
cvs add "$to"
cvs remove -f "$from"
;;
git)
git mv "$from" "$to"
;;
esac
}
cmd_commit()
{
C=''
for i in "$@"; do
C="$C \"${i//\"/\\\"}\""
done
eval $scm commit "$C"
}
cmd_add()
{
$scm add "$@"
}
cmd_rm()
{
case $scm in
cvs)
cvs remove "$@"
;;
git)
git rm "$@"
;;
esac
}
cmd_clean()
{
case $scm in
cvs)
while [ "${1:0:1}" = - ]; do
shift
done
set +e
local file
for file in $@; do
if ! grep -q "/$file/" CVS/Entries; then
rm -f $file
fi
done
;;
git)
git clean -x "$@"
;;
esac
}
cmd_ls_files()
{
filter_deleted()
{
local rc_file="$1"
shift
local cand
for cand in "$@"; do
grep -q "^R ./$cand/" $rc_file && continue
echo $cand
done
}
output_find()
{
local find_opts f
[ "$zero_terminate" = 1 ] && find_opts="-print0"
find "$@" $find_opts
}
output()
{
if [ "$zero_terminate" = 1 ]; then
echo -en "$*\x00"
else
echo "$*"
fi
}
list_dirents_cvs()
{
local dirs=`sed '/^D\// !d; s%^D/%%; s%/.*%%' $1/CVS/Entries`
dirs="`filter_deleted $1/CVS/Entries $dirs`"
local cands
if [ -f $1/CVS/Entries.Log ]; then
cands="`sed '/^A D\// !d; s%^A D/%%; s%/.*%%' $1/CVS/Entries.Log`"
dirs="$dirs `filter_deleted $1/CVS/Entries.Log $cands`"
fi
local files=`sed '/^\// !d; s%/%%; s%/.*%%; s%^%%' $1/CVS/Entries`
files="`filter_deleted $1/CVS/Entries $files`"
local d f
for f in $files; do
output "$1/$f"
done
if [ "$include_vcs_files" = 1 -a -d CVS ]; then
output_find "$1/CVS"
fi
for d in $dirs; do
[ "$opt_only_regular_files" = 1 ] || output $1/$d
list_dirents_cvs $1/$d
done
}
list_dirents_git()
{
local opts="$git_ls_files_opts"
git --version | grep -q "version *1" && opt_no_submodules=1
[ "$opt_no_submodules" = 1 ] || opts="$opts --recurse-submodules"
git ls-files --recurse-submodules $opts $1
if [ "$include_vcs_files" = 1 -a -d .git ]; then
output_find .git
fi
}
list_dirents()
{
if [ -d $1/CVS ]; then
list_dirents_cvs $1
return
fi
git -C $1 status >/dev/null 2>&1 || {
echo "failed to list versioned files in $(realpath $1): no VCS" >&2
exit 1
}
list_dirents_git $1
}
set -- `getopt fnzta "$@"`
while [ "$1" != -- ]; do
case $1 in
-f)
opt_only_regular_files=1
;;
-n)
opt_no_submodules=1
;;
-z)
zero_terminate=1
git_ls_files_opts="$git_ls_files_opts -z"
opt_sort="$opt_sort -z"
;;
-t)
text_files=1
;;
-a)
include_vcs_files=1
;;
esac
shift
done
shift
proj_dir="$1"
[ "$proj_dir" ] && cd $proj_dir
if [ "$text_files" ]; then
list_dirents . | sort $opt_sort | xargs file -N | grep ":.*text" | cut -d: -f1
else
list_dirents . | sort $opt_sort
fi
}
# ------- here we go
export LANG=POSIX
myname=`basename $0`
cmd=cmd_${1//-/_}
shift
if [ -d "CVS" ]; then
scm=cvs
else
scm=git
fi
$cmd "$@"