Bazı durumlarda dosya ve klasör içindeki dosyaların karşılaştırılması ihtiyacı duyarız. Bunu bir version kontrol sistemiyle 'GIT' gibi yapmamız gayet kolay olur fakat bu işlemi konsol üzerinde bağımsızda yapmamızı gerektiren durumlarda oluşabilir.
Not: Geliştirme ortamım mac olduğu için gerekli paketleri mac'e uygun olarak yapacağım.
Peki konuyu çok uzatmadan senaryomuza geçelim. Bir uygulamamazın farklı zamanlarda yedeklerimizi aldığımızı yada sunucu üzerindeki kodlarla çalışma yaptığımız kodlar üzerindeki farklılıkları çıkarmamızın gerektiğini düşünelim.
Aşağıdaki kod tam olarak işimizi görecektir.
diff -u -r /Users/husonet/Downloads/pythontr/ pythontr/
Kodun çıktısı üzerinde gezinmek isteyebiliriz. Bu noktada ydiff paketi işimizi görüyor.
diff -u -r /Users/husonet/Downloads/pythontr/ pythontr/ |ydiff
Çıktımızı html olarak üretelim. Bu kısımda kaynak olarak bu makaleden convert diff output colorized html [linuxjournal.com] yararlandım.
vim difftohtml.py #!/bin/bash # # Convert diff output to colorized HTML. cat <<XX <html> <head> <title>Colorized Diff</title> </head> <style> body { font-size: 10px; } .diffdiv { border: solid 1px black; } .comment { color: gray; } .diff { color: #8A2BE2; } .minus3 { color: blue; } .plus3 { color: maroon; } .at2 { color: lime; } .plus { color: green; background: #E7E7E7; } .minus { color: red; background: #D7D7D7; } .only { color: purple; } </style> <body> <pre> XX echo -n '<span class="comment">' first=1 diffseen=0 lastonly=0 OIFS=$IFS IFS=' ' # The -r option keeps the backslash from being an escape char. read -r s while [[ $? -eq 0 ]] do # Get beginning of line to determine what type # of diff line it is. t1=${s:0:1} t2=${s:0:2} t3=${s:0:3} t4=${s:0:4} t7=${s:0:7} # Determine HTML class to use. if [[ "$t7" == 'Only in' ]]; then cls='only' if [[ $diffseen -eq 0 ]]; then diffseen=1 echo -n '</span>' else if [[ $lastonly -eq 0 ]]; then echo "</div>" fi fi if [[ $lastonly -eq 0 ]]; then echo "<div class='diffdiv'>" fi lastonly=1 elif [[ "$t4" == 'diff' ]]; then cls='diff' if [[ $diffseen -eq 0 ]]; then diffseen=1 echo -n '</span>' else echo "</div>" fi echo "<div class='diffdiv'>" lastonly=0 elif [[ "$t3" == '+++' ]]; then cls='plus3' lastonly=0 elif [[ "$t3" == '---' ]]; then cls='minus3' lastonly=0 elif [[ "$t2" == '@@' ]]; then cls='at2' lastonly=0 elif [[ "$t1" == '+' ]]; then cls='plus' lastonly=0 elif [[ "$t1" == '-' ]]; then cls='minus' lastonly=0 else cls= lastonly=0 fi # Convert &, <, > to HTML entities. s=$(sed -e 's/\&/\&/g' -e 's/</\</g' -e 's/>/\>/g' <<<"$s") if [[ $first -eq 1 ]]; then first=0 else echo fi # Output the line. if [[ "$cls" ]]; then echo -n '<span class="'${cls}'">'${s}'</span>' else echo -n ${s} fi read -r s done IFS=$OIFS if [[ $diffseen -eq 0 && $onlyseen -eq 0 ]]; then echo -n '</span>' else echo "</div>" fi echo cat <<XX </pre> </body> </html> XX
Yetkilerimizi verelim
chmod u+x difftohtml.py
Artık html çıktımızı şu şekilde üretebiliriz.
diff -u -r /Users/husonet/Downloads/pythontr/ pythontr/ |./difftohtml.py >v1-v2.html
pip install weasyprint weasyprint v1-v2.html v1-v2.pdf ibrew install basictex pandoc v1-v2.html -t latex -o v1-v3.pdf --variable colorlinks=true --pdf-engine=/Library/TeX/texbin/pdflatex ibrew install wkhtmltopdf pandoc v1-v2.html -t html5 -o v1-v2.pdf
Yorumlar