Github güncellenen dosya tespiti

Github sitesinde güncellenen dosyanın tespiti python ile mümkün mü acaba?.. ilk aklıma gelen değişim tarihi oldu…klasör içindeki değiştirilmiş dosyaların tarihleri üzerinden yapılabilir veya bildiğiniz başka bir yöntem olabilir…

Evet mümkün. Güncellenmiş betik dosyası ile güncel olmayan betik dosyasının içerikleri karşılaştırılabilir.

yapmak istediğim tam da bu…script veya python ile güncellenmiş dosyanın tarihini çekmeyi ben beceremedim açıkcası…varsa bir örnek çok iyi olur…

pc üzerindeki bir dosyanın eski/yeni edit tarihlerini basit bir kodla görebiliyoruz(kod alıntıdır),

import os.path, time
print(“Last modified: %s” % time.ctime(os.path.getmtime(“e2.txt”)))
print(“Created: %s” % time.ctime(os.path.getctime(“e2.txt”)))

ancak internet sitesindeki güncellenmiş dosyanın tarihini nasıl elde edeceğiz…sorun burada…çözüm aslında çok basitmiş gibi geliyor bana ama,sanırım beynim durdu bu aşamada…bunda etkin olan github ın biraz “gıcık” yapısı olsa gerek …biliyorsunuz .xml, .py gibi dosyaları direk indiremiyorsunuz…endirekt yöntemlerle olabiliyor…klasör indirmek ise zulum…zip olarak indirebiliyorsunuz…ve burada indirdiğiniz tarih görülüyor,edit tarihi değil…

genel amacım, misal klasör içinde on dosyadan ikisi editlenmişse sadece onları indirmek etmek…

Tarihi kullanmanıza gerek yok. Dediğim gibi içerikleri karşılaştırabilirsiniz.
Mesela aşağıdaki kodlarla bir programı güncelliyorum. Programın Update isimli bir menü düğmesi var, bu düğmeye bastığım zaman, şayet GitHub’daki dosya güncellenmişse, güncel betik dosyasının içeriği, güncel olmayan dosyanın içine yazılıyor. Daha sonra program kapatılıyor ve otomatik olarak güncel haliyle geri açılıyor.

def update():
    url_1 = "https://raw.githubusercontent.com/dildeolupbiten/" \
            "TkAstroDb/master/TkAstroDb.py"
    url_2 = "https://raw.githubusercontent.com/dildeolupbiten/" \
            "TkAstroDb/master/README.md"
    data_1 = urllib.urlopen(url=url_1,
                            context=ssl.SSLContext(ssl.PROTOCOL_SSLv23))
    data_2 = urllib.urlopen(url=url_2,
                            context=ssl.SSLContext(ssl.PROTOCOL_SSLv23))
    with open(file="TkAstroDb.py", mode="r", encoding="utf-8") as f:
        var_1 = [i.decode("utf-8") for i in data_1]
        var_2 = [i.decode("utf-8") for i in data_2]
        var_3 = [i for i in f]
        if var_1 == var_3:
            msgbox.showinfo(title="Update",
                            message="Program is up-to-date.")
        else:
            with open(file="README.md", mode="w", encoding="utf-8") \
                    as g:
                for i in var_2:
                    g.write(i)
                    g.flush()
            with open(file="TkAstroDb.py", mode="w", encoding="utf-8") \
                    as h:
                for i in var_1:
                    h.write(i)
                    h.flush()
                msgbox.showinfo(title="Update",
                                message="Program is updated.")              
                if os.name == "posix":
                    subprocess.Popen(["python3", "TkAstroDb.py"])
                    import signal
                    os.kill(os.getpid(), signal.SIGKILL)
                elif os.name == "nt":
                    subprocess.Popen(["python", "TkAstroDb.py"])
                    os.system(f"TASKKILL /F /PID {os.getpid()}")

teşekkürler…bunu test edeceğim…

bu arada biraz önce yukarıdaki kodla yeniden test ettim…güncelleme tarihini görebiliyoruz…önce klasörü zip olarak indirdim…sonra içindeki editli dosyayı kontrol ettim…

print(“Last modified: %s” % time.ctime(os.path.getmtime(“e2.txt”)))

bu kod işe yarıyor…

>>> %cd 'C:\Users\digiteng\Documents\python test'
>>> %Run time.py
Last modified: Mon Jul  1 12:27:05 2019
Created: Mon Jul  1 12:32:31 2019
>>> %Run time.py
Last modified: Mon Jul  1 12:36:37 2019
Created: Mon Jul  1 12:32:31 2019
>>>

Farklı yöntemler deneyebilirsiniz tabi.

Dosyanin kendisini istersen HTTP protokolu header’larinda olabiliyor:

$ curl -v https://www.aib42.net/file/sectioned-file.txt
[...]
< HTTP/1.1 200 OK
[...]
< Last-Modified: Mon, 22 Apr 2019 13:32:00 GMT
[...]

Niye indiremeyelim? https://raw.githubusercontent.com/aib/PyMIDIK/master/pymidik.py
(Last-Modified header’i gelmiyor ama)

GitHub’in tum varolus amaci git repository’lerini tutmak. git, butun bu soylediklerini cok daha fazla detayiyla yapabilen bir arac zaten. Dosyanin her satirinin degistirilme tarihini tutabiliyor, dizini istedigin tarihteki haliyle indirebiliyor.

Senin hatan aleti GitHub’a yazmayi amaclamak. Onun yerine git’e yazarsan, GitHub’dakiler de dahil olmak uzere butun git repository’leriyle calisir.

2 Likes