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.pyArtık html çıktımızı şu şekilde üretebiliriz.
diff -u -r /Users/husonet/Downloads/pythontr/ pythontr/ |./difftohtml.py >v1-v2.htmlPdf 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