Seite 1 von 3

git: Dateidatum der neusten Datei erhalten?

Verfasst: Montag 19. April 2010, 13:58
von jens
Weiß jemand, wie man von Python aus am einfachsten an Datum/Uhrzeit der neusten Datei in einem git repo kommt?

Verfasst: Montag 19. April 2010, 17:06
von cofi
Was meinst du damit genau? Wie ist die Situation?

Ansonsten ist der timestamp truegerisch, weil git ihn beim Branchwechsel etc aktualisiert (bzw die Datei).

Verfasst: Dienstag 20. April 2010, 10:04
von jens
Eigentlich geht es mir darum, einen Zusatz im Versionstring zu haben. Ich hatte sonst immer das gemacht:

Code: Alles auswählen

__version__ = (0, 1, 6)

try:
    from django.utils.version import get_svn_revision
except ImportError:
    pass
else:
    path = os.path.split(os.path.abspath(__file__))[0]
    svn_revision = get_svn_revision(path)
    if svn_revision != u'SVN-unknown':
        svn_revision = svn_revision.replace("-", "").lower()
        __version__ += (svn_revision,)


VERSION_STRING = '.'.join(str(part) for part in __version__)
Mit git geht das natürlich nicht. Den Versionsstring mit einem hash zu verzieren ist aber doof. Drum Frage ich mich, ob ich nicht Datum/Uhrzeit der neusten Datei ermitteln kann.

Verfasst: Dienstag 20. April 2010, 10:41
von Defnull
Was du eigentlich willst, ist also das Datum des letzten commits?

Code: Alles auswählen

$ git log --format="%cd" master~..master
Sat Apr 17 09:35:23 2010 +0200

$ git log --format="%cD" master~..master
Sat, 17 Apr 2010 09:35:23 +0200

$ git log --format="%cr" master~..master
3 days ago

$ git log --format="%ci" master~..master
2010-04-17 09:35:23 +0200

$ git log --format="%ct" master~..master
1271489723

Verfasst: Dienstag 20. April 2010, 11:59
von jens
Jep, das hilft doch schon mal weiter, danke!

Verfasst: Dienstag 20. April 2010, 12:48
von lunar
@Jens: Der Hash ist allerdings aussagekräftiger, weil eindeutig. Du musst auch nicht den kompletten Hash nutzen. Schon die ersten Dutzend Zeichen sind innerhalb eines Repos meist eindeutig.

Für den Entwickler ist der Vorteil, dass er dann den Commit, auf den sich die Version bezieht, wirklich genau auswählen kann.

Verfasst: Dienstag 20. April 2010, 13:06
von jens
Einverstanden, aber wie komme ich an den hash dran?

So:

Code: Alles auswählen

git log --format="%h" master~..master 
(Kann gerad nicht testen, mache ich später ;))

Verfasst: Dienstag 20. April 2010, 13:53
von lunar
Jo, alternativ:

Code: Alles auswählen

git log --format='%h' -1 master

Verfasst: Dienstag 20. April 2010, 14:03
von Leonidas
Ich würde letzten Tag plus Hash verwenden. Also irgendwie sowas:

``0.1-post-fbdc94e``

Dann weiß auch ein normaler User, dass der Hash nach dem Release 0.1 (der Tag ist dann '0.1') kommt. Und bei der getaggten Revision natürlich das ``post`` fallen lassen.

Verfasst: Dienstag 20. April 2010, 14:39
von Defnull
"git describe" könnte auch interessant sein: "The command finds the most recent tag that is reachable from a commit. If the tag points to the commit, then only the tag is shown. Otherwise, it suffixes the tag name with the number of additional commits on top of the tagged object and the abbreviated object name of the most recent commit."

Code: Alles auswählen

mahe@s10300-fab8:/home/mahe/coding/bottle$ git describe
0.6.4-280-g0d463f7

Verfasst: Dienstag 20. April 2010, 15:19
von Leonidas
Ja, das sieht so ähnlich aus wie das was mir vorschweben würde. Vielleicht noch den Tag filtern, nach nem Tag der wie eine Versionsnummer ausschaut, aber sonst eigentlich ziemlich optimal.

Verfasst: Mittwoch 21. April 2010, 12:53
von jens
Bei einem "git describe" kommt nur:
fatal: No names found, cannot describe anything.
das geht aber: git log --format='%h' -1 master

Verfasst: Mittwoch 21. April 2010, 13:08
von jens
vorschlag:

Code: Alles auswählen

# coding:utf-8

import subprocess
import warnings


__version__ = (0, 0, 1)


VERSION_STRING = '.'.join(str(part) for part in __version__)


try:
    process = subprocess.Popen(
       ["git", "log", "--format='%h'", "-1", "master"],
       stdout = subprocess.PIPE
    )
except Exception, err:
    warnings.warn("Can't get git hash: %s" % err)
else:
    process.wait()
    returncode = process.returncode
    if returncode == 0:
        output = process.stdout.readline().strip().strip("'")
        if len(output) != 7:
            warnings.warn("Can't get git hash, output was: %r" % output)
        else:
            VERSION_STRING += ".git-%s" % output
    else:
        warnings.warn("Can't get git hash, returncode was: %s" % returncode)


if __name__ == "__main__":
    print VERSION_STRING
Bin noch nicht so eingearbeitet in git. Aber 'master' ist der Name des branches und kann sich ändern, oder nicht?

Verfasst: Mittwoch 21. April 2010, 13:25
von Leonidas
jens hat geschrieben:Bei einem "git describe" kommt nur:
fatal: No names found, cannot describe anything.
Hast du denn Tags?

Verfasst: Mittwoch 21. April 2010, 13:29
von jens
Bisher offensichtlich nicht ;)
Git ist Neuland...

Verfasst: Mittwoch 21. April 2010, 13:32
von Leonidas
jens hat geschrieben:Bisher offensichtlich nicht ;)
Git ist Neuland...
Dann brauchst du dich auch nicht wundern, denn ``git describe`` gibt ja ``NEUESTER_TAG-REVISIONS_SEIT_TAG-LETZTER_COMMIT_HASH`` aus. Wenn es keinen Tag gibt, wo sollte dann ``NEUESTER_TAG`` herkommen?

Verfasst: Mittwoch 21. April 2010, 13:40
von cofi
jens hat geschrieben:Bin noch nicht so eingearbeitet in git. Aber 'master' ist der Name des branches und kann sich ändern, oder nicht?
Ja. Aehnlich `default` bei Hg.

Verfasst: Mittwoch 21. April 2010, 16:50
von lunar
Der aktuelle Entwicklungszweig kann sich natürlich ändern, insofern ist es eigentlich nicht wirklich sinnvoll, "master" hart zu kodieren. Sinnvoller ist eigentlich "HEAD", denn das bezieht sich immer auf den Commit, auf dem die Änderungen des Arbeitsverzeichnisses basieren, also der Vater des nächsten Commits.

"git describe" ist natürlich das beste.

Verfasst: Mittwoch 21. April 2010, 17:32
von jens
Ah. Dann nehme ich ersrnal HEAD statt master,

Wenn "describe" auch ohne tags funktionieren würde, dann wäre ich dabei ;)

Verfasst: Mittwoch 21. April 2010, 18:55
von Leonidas
jens hat geschrieben:Wenn "describe" auch ohne tags funktionieren würde, dann wäre ich dabei ;)
Tuts doch auch, siehe dessen Dokumentation.