2014-07-19 62 views
1

我有一個Python項目與自己的需求文件。該項目也有自己的virtualenv,其中一個包是'pyPdf'。這個庫有一個bug,我寫了一個補丁來修復這個bug。瑕疵Bash腳本的補丁和需求文件

--- 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 

我需要寫一個bash腳本做兩件事情與冪等財產(指運行腳本多次應與運行一個單一時間)

1)通過要求文件運行滿足各種庫需求(例如Flask == 0.10.1等,包括git + ssh需求)併爲所有庫進行pip安裝。

2)將補丁應用到pypdf庫。

欣賞這方面的任何線索。請注意'冪等'。

PS:我requirements.txt文件看起來像這樣(我做了PIP安裝 - R的requirements.txt的virtualenv中下安裝程序庫)

Flask==0.10.1 
Jinja2==2.7.3 
... 
pyPdf==1.13 
git+ssh://[email protected]/some-production-library.git 

感謝

+0

瀏覽需求文件是微不足道的。我相信它只是模擬「pip install -r要求」,即逐行執行「pip install」。在這裏提到的版本號已經是冪等的了。 我不知道如何爲補丁做同樣的事情。我嘗試過的一種方法是將更正後的文件永久複製到項目目錄中。對於修補,請對庫文件執行「diff」操作,並且僅在存在diff時應用修補程序。我把它設置了幾分鐘,但不知道這是否是正確的方法。如果有更好的解決方案,將會很感激迴應。 – vestronge

+0

我沒有爲你編碼,但我會給你一個提示補丁。如果Reverse可能,則查看'-R'和'--dry-run',這意味着該補丁已經被應用。空運行是模擬,只有文件不會被改變。 – Tiago

+0

真棒謝謝..這應該解決問題。更清潔的解決方案。謝謝 – vestronge

回答

0

對於那些誰。尋找類似的腳本。將腳本保存到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