Pip 修补程序和需求文件的幂等Bash脚本

Pip 修补程序和需求文件的幂等Bash脚本,pip,patch,pypdf,idempotent,requirements.txt,Pip,Patch,Pypdf,Idempotent,Requirements.txt,我有一个python项目,它有自己的需求文件。该项目也有自己的virtualenv,其中一个包是“pyPdf”。这个库有一个bug,我写了一个补丁来修复这个bug --- 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

我有一个python项目,它有自己的需求文件。该项目也有自己的virtualenv,其中一个包是“pyPdf”。这个库有一个bug,我写了一个补丁来修复这个bug

--- 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 venv/local/lib/python2.7/site-packages/pyPdf/pdf.py < pypdf.patch

感谢那些正在寻找类似脚本的人。将脚本保存在projectfolder/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
#/bin/bash-e
BASEDIR=`dirname$0`/。。
如果[!-d“$BASEDIR/venv”];然后
virtualenv$BASEDIR/venv
echo“使用名称venv创建的Virtualenv”
fi
来源$BASEDIR/venv/bin/activate
如果[!-f“$BASEDIR/venv/updated”-o$BASEDIR/requirements.txt-nt$BASEDIR/venv/updated];然后
pip安装-r$BASEDIR/requirements.txt
触摸$BASEDIR/venv/updated
echo“已安装要求”
fi
补丁$BASEDIR/venv/local/lib/python2.7/site-packages/pyPdf/pdf.py-p0-N--干运行--静默<$BASEDIR/pyPdf.patch
如果[$?-等式0];
然后
回显“应用补丁”
#应用补丁
补丁$BASEDIR/venv/local/lib/python2.7/site-packages/pyPdf/pdf.py-p0-N<$BASEDIR/pyPdf.patch
fi

浏览需求文件很简单。我相信它只是在模拟“pip安装-r需求”,即逐行执行“pip安装”。这里提到版本号时,pip已经是幂等的了。我不知道如何做同样的补丁。我尝试过的一种方法是将已更正的文件永久复制到项目目录。对于修补,请对库文件执行“diff”,并仅在存在差异时应用修补程序。我在几分钟前设置了此选项,但不确定这是否是正确的方法。如果有更好的解决方案,将非常感谢您的回复。我不是为您编码,但我会给您一个贴片提示。查看
-R
-dry run
如果可以反转,则表示已应用修补程序。干运行是模拟的,只是文件不会被更改。太棒了,谢谢。这应该可以解决问题。更清洁的解决方案。谢谢
#!/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