#!/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 "$@" ;; 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() { 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 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" [ "$opt_no_submodules" = 1 ] || opts="$opts --recurse-submodules" git ls-files $opts $1 } list_dirents() { if [ -d $1/CVS ]; then list_dirents_cvs $1 return fi git status >/dev/null 2>&1 || { echo "failed to list versioned files in $1: no VCS" >&2 exit 1 } list_dirents_git $1 } set -- `getopt fnzt "$@"` 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 ;; 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 "$@"