weidner/archives/2011/11/20/

Versionsverwaltung mit Monotone - Revision revisited

In dem Artikel zu benutzerdefinierten Befehlen bin ich auf die Möglichkeiten eingegangen das Versionsverwaltungssystem monotone mit der eingebauten Scriptsprache Lua zu erweitern.

Dabei hatte ich als Beispiel für die Definition von eigenen Befehlen das Einbetten der aktuellen Revision in einen Text genommen, wie ich es auch in meinen Büchern verwende.

Genau genommen verwende ich es nicht (mehr) so, denn der in dem Artikel gezeigte Code hatte doch einige Probleme, die ich inzwischen bereinigt habe. Da war zum einen, dass aktuelle und Basisversion immer auf zwei Zeilen ausgegeben werden, auch wenn diese identisch sind, weil an dem Text nichts geändert wurde. Noch weniger gefiel mir, das als Datum immer das Tagesdatum genommen wurde. Das ist zwar korrekt, wenn gegenüber der Basisversion im Repository etwas geändert wurde. Wenn aber nichts geändert wurde, möchte ich da lieber das Datum des Eincheckens im Repository haben.

Also habe ich mich drangesetzt, und die Datei lua/revision.lua noch einmal überarbeitet:

--  revision.lua -- Monotone extension command "mtn revision"
--  usage: mtn --rcfile revision.lua revision

register_command(
    "revision", "",
    "Print info about actual revision.",
    "Determines the base revision and whether the current " ..
    "revision is different. Prints the information " ..
    "suitable for inclusion into restructured text.",
    "command_revision"
)   

function say(abc) io.stdout:write(abc .. "\n") end

function certdate(certtext)
    local date = string.match(certtext,'name "date"%s+value "[^"]+"')
    date = string.match(date,"[0-9-]+")
    return date
end

function command_revision()
    rc, txt = mtn_automate("get_base_revision_id")
    base_rev = string.match(txt,"%x+")
    if nil == base_rev then
        base_rev = ""
    end
    input, output, pid = spawn_pipe("mtn", "ls", "changed")
    res, rc = wait(pid)
    changed = output:read('*a')
    rc, txt = mtn_automate("certs",base_rev)
    base_date = certdate(txt)

    say(":Autor: Mathias Weidner")
    say(":Revision: (" .. base_date .. ") " .. base_rev)
    if 0 < string.len(changed) or "" == base_rev then
        rc, txt = mtn_automate("get_current_revision_id")
        curr_rev = string.match(txt,"%x+")
        say(":Aktuell: (" .. os.date('%Y-%m-%d') .. ") " .. curr_rev)
    end
    say(":Lizenz: CC BY-SA 3.0 (Creative Commons)")
end

Hier fällt als erstes die hinzugekommen Funktion certdate() auf. Diese macht nichts anderes, als die Ausgabe von mtn automate cert certstring zu untersuchen und das Datum aus dem Datumszertifikat (name "date") herauszufischen. Die andere auffällige Änderung ist in der Funktion command_revision() selbst. Dort wird das aktuelle Zertifikat (und Tagesdatum) nur ausgegeben, wenn etwas geändert wurde (mtn ls changed), oder, wenn noch gar keine Basisrevision vorhanden ist, weil noch nichts eingecheckt wurde.

Diese Erweiterung verwende ich wie gehabt:

$ mtn --rcfile revision.lua revision > revision.txt

Die Ausgabe sieht dann in etwa so aus:

:Autor: Mathias Weidner
:Revision: (2011-11-20) a2f4811479b0456c552cf9ed658bbf3c300a4075
:Lizenz: CC BY-SA 3.0 (Creative Commons)

und bei einer Änderung:

:Autor: Mathias Weidner
:Revision: (2011-11-20) a2f4811479b0456c552cf9ed658bbf3c300a4075
:Aktuell: (2011-11-20) 3a3c95aa3fcf36ac7d2f359d6b5a7a8e8ea1e303
:Lizenz: CC BY-SA 3.0 (Creative Commons)

Dieses Format gefällt mir besser, weil

Posted 2011-11-20
Tags: