Обновление архивов исходных кодов программ из систем контроля версий

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

Обычно исходники всяких программ, скачанных с различных CVS/SVN/GIT храню в архивах вида "название каталога.тип системы контроля версий.7z". Ниже скриптик, который распаковывает такие архивы, обновляет программу в соответствии с синтаксисом соответствующих утилит, после чего пакует архив назад под тем же именем. Может работать с отдельным архивом/архивами или каталогом (в последнем случае обновляются все найденные внутри архивы).

#!/bin/bash
# By Rain ;)

if [ -z "${1}" ]
        then
        echo -e "\e[5;31mError: Please, specify target archive or directory\e[0;0m"
        exit 1
fi

find "${@}" -regextype posix-extended -type f -regex "[[:print:]]*\.(svn|cvs|git)\.7z" |
while read file
        do      
                vcstype="$(sed -r 's/.*\.(.{3})\.7z$/\1/g' <<< ${file/*\//})"
                mywd="${PWD}"
                tmpdir="/tmp/vcsupdate.$RANDOM"
                dirname="$(sed -r 's/(.*)\..{3}\.7z$/\1/g' <<< ${file/*\//})"
                file="$(readlink -f "${file}")"
                
                [ ! -e $tmpdir ] && mkdir $tmpdir || exit 1
                echo -e '\e[35mExtracting files...\e[0m'
                7z x "${file}" -o"${tmpdir}" 1>/dev/null
                cd "${tmpdir}/${dirname}"
                echo -e "\e[35mUpdating sources for \e[36m$file \e[35mfrom \e[36m$vcstype \e[35mrepository.\e[0m"
                case ${vcstype} in
                        svn)
                        svn update;;
                        cvs)
                        cvs update;;
                        git)
                        git pull;;
                esac
                cd ..
                echo -e "\e[31mRemoving old archive \e[36m$file\e[0m"
                rm -f "${file}"
                echo -e "\e[35mCompressing files\e[0m"
                7z a -mx=9 "${file}" ${dirname} 1>/dev/null
                echo -e "\e[31mRemoving old source files\e[0m"
                cd "${mywd}"
                rm -rf $tmpdir
                echo -e "\e[36m$file \e[35mupdated successfully\e[0m"
done