Pythontr

husonet | Tarih: 14.12.2022

Farklı dosyaların karşılaştırılması ve çıktılarının oluşturulması

Dosya ve klasörlerin karşılaştırılması ve düzgün olarak çıktılarının oluşturulması

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


Pdf oluşturmak için gerekli paketler. En başarılı ve basit bulduğum ise weasyprint
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