Idempotent Bash Script для патча и файла требований
У меня есть проект Python с собственным файлом требований. У проекта также есть собственный virtualenv, один из пакетов - pyPdf. В библиотеке есть ошибка, и я написал патч, чтобы исправить ошибку.
--- venv/local/lib/python2.7/site-packages/pyPdf/pdf.py 2014-07-17 17:04:57.000000000 +0530
+++ pypdf_fixer.py 2014-07-19 01:19:53.176877332 +0530
@@ -1726,7 +1726,10 @@
m.update(p_entry)
# 5. Pass the first element of the file's file identifier array to the MD5
# hash function.
- m.update(id1_entry)
+ if isinstance(id1_entry, str):
+ m.update(id1_entry)
+ else:
+ m.update(id1_entry.original_bytes)
# 6. (Revision 3 or greater) If document metadata is not being encrypted,
# pass 4 bytes with the value 0xFFFFFFFF to the MD5 hash function.
if rev >= 3 and not metadata_encrypt:
Позволяет назвать этот файл как pypdf.patch. Я запускаю патч с помощью команды Linux patch.
$ patch venv/local/lib/python2.7/site-packages/pyPdf/pdf.py < pypdf.patch
Мне нужно написать скрипт bash, чтобы сделать 2 вещи со свойством Idempotent (то есть запуск сценария несколько раз должен быть таким же, как запуск его один раз)
1) Запустите файл требований с различными требованиями к библиотеке (пример Flask==0.10.1 и т. Д., Включая требование git+ssh) и выполните установку pip для всех библиотек.
2) Примените патч к библиотеке pypdf.
Цените любые выводы на этом фронте. Просьба принять к сведению "Идемпотентность".
PS: Мой файл needs.txt выглядит следующим образом (для установки библиотек я делаю pip install - r needs.txt в папке virtualenv)
Flask==0.10.1
Jinja2==2.7.3
...
pyPdf==1.13
git+ssh://git@something.co.uk/some-production-library.git
Спасибо
1 ответ
Для тех, кто ищет подобный скрипт. Сохраните скрипт в папке проекта /bin/
#!/bin/bash -e
BASEDIR=`dirname $0`/..
if [ ! -d "$BASEDIR/venv" ]; then
virtualenv $BASEDIR/venv
echo "Virtualenv created with name venv."
fi
source $BASEDIR/venv/bin/activate
if [ ! -f "$BASEDIR/venv/updated" -o $BASEDIR/requirements.txt -nt $BASEDIR/venv/updated ]; then
pip install -r $BASEDIR/requirements.txt
touch $BASEDIR/venv/updated
echo "Requirements installed."
fi
patch $BASEDIR/venv/local/lib/python2.7/site-packages/pyPdf/pdf.py -p0 -N --dry-run --silent < $BASEDIR/pypdf.patch
if [ $? -eq 0 ];
then
echo "applying patch"
#apply the patch
patch $BASEDIR/venv/local/lib/python2.7/site-packages/pyPdf/pdf.py -p0 -N < $BASEDIR/pypdf.patch
fi