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

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

14.12.2022 11:32:43

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


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

yazar husonet

Yorumlar

Bu içerik için sizde yorum yapabilirsiniz!
anasayfa | makaleler | haberler | dosyalar | linkler | hakkımızda