SciTE - neues Skript für Timestamp / Versionierung

  • Ich hatte ja bereits ein Skript (AutoStampSaveVersion) zum Einfügen eines TimeStamp und dem Erstellen eines Versionsbackups gefertigt.

    Das habe ich nun nochmal komplett überarbeitet. Wesentliche Funktionen, die auch für andere Skripte nutzbar sind, habe ich in das Modul "CommonTools.lua" ausgelagert.

    Das Skript kommt ohne die shell.dll aus (falls vorhanden - und von der verwendeten SciTE-Version ladbar - wird sie aber genutzt).

    Einige Properties haben neue Namen und Wirkungsweisen, hier mal mein Properties-Block für TimeStamp:


    Es wird also die gewünschte Zeile für den TimeStamp des Dateityps angegeben. Sollte die Datei noch leer sein landet der TimeStamp in Zeile 1, wird beim Speichern der Datei mit Inhalt dann aber verschoben, falls anders angegeben.

    Es werden jetzt die korrekten EOL für die aktuelle Datei ausgelesen und verwendet. Dadurch stimmt nun auch die Cursorposition nach dem Speichern.

    Wenn die Datei ein Coding-Cookie enthält, welches beim Einfügen des TimeStamp aus dem Erkennungsbereich (Zeile 1 & 2) verschoben wurde, wird das Cookie in die Zeile 2 verschoben.

    Der TimeStamp kann grundsätzlich in jeder Zeile stehen. Falls ein Cooding-Cooking vorhanden ist und dieses sich in der Zielzeile des TimeStamp befindet, genießt das Coding-Cookie Priorität und der TimeStamp wird danach platziert.

    Beim Speichern sprang die Ansicht immer zur Cursorposition - jetzt bleibt sie unverändert.


    Nochmals kurz zur Installation (ausführlich habe ich das in einem eigenen Post beschrieben):

    - Moduldatei "CommonTools.lua" speichern (in eigenem Lua-Skripte Ordner - diesen dann in der "SciTEStartup.lua" den package.path zufügen - oder in "..\SciTE\Lua"

    - "TimeStampBackup.lua" speichern

    - Die Datei muss beim SciTE-Start geladen werden, dazu diese in der "SciTEStartup.lua" eintragen (LoadLuaFile).


    Wie geht's?

    - Bei jedem Speichern wird der TimeStamp in der vordefinierten Zeile eingetragen/aktualisiert

    - Ist der Dateityp für das Backup registriert, wird beim ersten Speichern der TimeStamp mit der Versionsnummer "v 0.1" eingetragen und die Datei als Backup mit dieser Version gespeichert.

    - Möchte man für die aktuelle Datei das Backup vermeiden, obwohl es für den Dateityp aktiv ist, muss man an die erste Position im Editor ein Asterisk * eintragen (wird beim Speichern wieder entfernt). Es wird dann nur der TimeStamp ohne Versionierung eingetragen.

    - Um ein erneutes Speichern eines Backups zu erreichen, muss hinter den vorhandenen TimeStamp ein Marker gesetzt werden:

    • "v" Beim Speichern wird die SubVersion hochgezählt, die Mainversion wird beibehalten.

    • "V" Beim Speichern wird die MainVersion hochgezählt, die Subversion wird zurück auf "0" gesetzt.

    • "n" Eine neue Versionsnummer wird von Hand vergeben, indem man die vorhandene vor dem Speichern überschreibt (z.B. für Versionssprung)

    - Soll eine Datei, die nur einen TimeStamp enthält ohne Versionsnummer jetzt in das Backup übernommen werden, braucht einfach nur die Zeile mit dem TimeStamp gelöscht werden.



  • Sehr schön...


    Edit: Bekomme folgenden Fehler angezeigt...

    f:\\AutoIt\\AutoIt3_LuaScripts\TimeStampBackup.lua:76: bad argument #1 to 'PositionFromLine' (number expected, got nil)

    Hatte TimeStamp.Type.Line nicht eingefügt...


    Jetzt nervt mich nur, dass die AutoIt3Wrapper_GUI die eingefügten Zeilen an den Anfang des Scripts setzt und der TimeStamp dann nicht mehr in der gewünschten Zeile steht.

    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseX64=y
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ;-- TIME_STAMP   2021-10-10 17:11:16   v 0.1


    Ich würde gerne Verzeichnisse/Dateinamen angeben, bei denen kein TimeStamp eingefügt und auch kein Backup gemacht wird. Das hatte ich mir in der alten Version eingebaut.

    Bsp.:

    Exclude.Dirs=c:\Program Files, c:\Program Files (x86), m:

    Exclude.Files=^e_.*, ^Test.*, Exclude.lua

  • Edit: Bekomme folgenden Fehler angezeigt...

    f:\\AutoIt\\AutoIt3_LuaScripts\TimeStampBackup.lua:76: bad argument #1 to 'PositionFromLine' (number expected, got nil)

    OK, das kann nur passieren wenn "'TimeStamp.Type.Line'" nicht gesetzt ist. Da muss ich wohl die Fehlerabfrage erweitern.

    Jetzt nervt mich nur, dass die AutoIt3Wrapper_GUI die eingefügten Zeilen an den Anfang des Scripts setzt und der TimeStamp dann nicht mehr in der gewünschten Zeile steht.

    Ja, das stimmt - ist nervig. Ich reagiere ja auf "OnBeforeSave". Anscheinend nutzt der Wrapper auch das Event. Somit muss ich mal versuchen, ob ich zusätzlich "OnSave" auswerten kann um auf Einträge des Wrappers zu reagieren. Ich hoffe nur, dass sich da nichts beißt und ich in einem Loop lande. :P

    Ich würde gerne Verzeichnisse/Dateinamen angeben, bei denen kein TimeStamp eingefügt und auch kein Backup gemacht wird. Das hatte ich mir in der alten Version eingebaut.

    Werde ich mit aufnehmen in der nächsten Version.

    Zudem, denke ich, musst du dein Script Au3OptMustDeclareVars.lua anpassen... denn das verschiebt den TimeStamp evtl. wieder in die erste Zeile, oder in eine andere, falls beim Speichern bereits Text eingegeben wurde.

    Da hast du leider Recht.

  • Bei CommonTools.FolderExists prüfst du ja nicht wirklich, ob _Folder ein Verzeichnis ist... weil du kein BitAND in Lua hast?


    Habe hier zwei Quellen...

    1.) https://github.com/pubnub/lua/…ster/common/BinDecHex.lua


    2.) http://www.dialectronics.com/Lua/code/BinDecHex.shtml

    Den Link habe ich hier gefunden: http://lua-users.org/wiki/BitwiseOperators


  • Bei CommonTools.FolderExists prüfst du ja nicht wirklich, ob _Folder ein Verzeichnis ist... weil du kein BitAND in Lua hast?

    Ich prüfe nicht über die Attribute, sondern (genauso wirksam) über try-and error, indem ich versuche eine Datei in diesem Ordner zum Schreiben zu öffnen:

    Lua
    local file = _folder..'/CommonTools_Folder.Exists'
    local fh = io.open(file, 'w+') -- try to write to passed folder
    if fh ~= nil then fh:close() os.remove(file) return true
    else return false end


    Apropos Bit-Library - ich hatte mir mal eine etwas veraltete Biblothek auf neuere Lua-Syntax angepasst (dort wurde noch table.getn verwendet) und funktional etwas erweitert:

  • Ich prüfe nicht über die Attribute...

    Hehe, habe das zwar gesehen und dachte, damit testest du, ob du Schreibzugriff in dem Verzeichnis hast... war wohl doch schon zu müde. ;)

    Das geht natürlich auch und man erspart sich ein require...


    LuaBit werde ich mir aber auch mal genauer anschauen... da fehlen lediglich die x2x Funktionen.


    Ich hoffe nur, dass sich da nichts beißt und ich in einem Loop lande.

    An was man alles denken muss... :D


    In Au3OptMustDeclareVars.lua habe ich in folgender Zeile ein \n eingefügt, weil ich den TimeStamp 'freistehend' haben möchte, wenn er nicht in der ersten Zeile steht... evtl. willst du das ja übernehmen.

    editor:InsertText(e, "\nOpt('MustDeclareVars', 1)\n") -- in Zeile hinter TimeStamp (und Leerzeile) einfügen

    Du meinst sicher unter... 8o


    PS: Machst du eigentlich noch was mit Nim?