repl.sh

download

#!/bin/sh

# DESCR: Refactoring tool, handles CVS
# AUTHOR: Darek Cieslak, cieslakd at gazeta.pl
# USE: repl abd def | sh
#
# In ./.replfilter you can include sed commands to
# delete unwanted filenames. Example:
#
# /images\//d
#
# will ignore all files from images directory

TMP_FILE=$$
REPLFILTER=.replfilter

test -z "$1" -o -z "$2" && {
    echo give from, to strings
    exit 1;
}

sFrom="$1"
sTo="$2"

if ! test -f $REPLFILTER
then
    touch $REPLFILTER
fi

test -d CVS && isCVS=1
test -d .git && isGIT=1

FILES=find . -type f | sed -f $REPLFILTER`

fgrep --count "$sFrom" --recursive $FILES |
awk -v "sFrom=$sFrom" -v "sTo=$sTo" -v "sTmpFile=$TMP_FILE" '
BEGIN {
    FS=":"
}
!/CVS/{
    sFile = $1
    sCount = $2
    if(sCount == 0)
        next

    print "mv " s File " " sTmpFile
    print "sed \"s|" sFrom "|" sTo "|g\" <" s Tmp File " >" sFile
    print "rm " sTmpFile
}


find . -name "*$sFrom*" |
sed -f $REPLFILTER |
awk -v "sFrom=$sFrom" -v "sTo=$sTo" -v "isCVS=$isCVS" \
-v "isGIT=$isGIT" '

{
    sFile = $0
    sNewFile = $0
    gsub(sFrom, sTo, sNewFile);

    print "test -e " s New File " || mv " s File " " sNewFile
    if(isCVS) {
        print "cvs remove " sFile
        print "cvs add " sNewFile
    }
    if(isGIT) {
        print "git-rm -f " sFile
        print "git-add " sNewFile
    }
}

'

(...) Nie ma bowiem łatwych odpowiedzi. Nie istnieje nic takiego jak najlepsze rozwiązanie - zarówno jeśli chodzi o narzędzia, jak i języki czy systemy operacyjne. Są jedynie systemy, które mogą być bardziej odpowiednie w konkretnych okolicznościach.

I tu właśnie do gry wchodzi pragmatyzm. Nie należy przywiązywać się do żadnej określonej metody, ale mieć na tyle rozległą wiedzę i doświadczenie, by w danej sytuacji wybrać dobre rozwiązanie. (...)

Andrew Hunt, David Thomas "Pragmatyczny Programista"