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
ich immer das Datum der Basisrevision habe,
ich sofort sehen kann, ob es aus einer Version im Repository erzeugt wurde oder aus modifizierten Quellen (eine Zeile mehr),
ich bei einer Änderung ungefähr sehe, wann das geändert worden ist.