In PrimeFact werden bei jedem kompilieren, neue bzw. geänderte Sourcen generiert. Aber wer hat schon schon Überblick darüber, wann sich was geändert hat. In der Vergangenheit kam immer die Frage: Wann wurde das denn eingestellt? Mhmm…

Nimmt man aber einfach ein Versionskontrollsystem z.B. SVN oder auch GIT. Könnte man doch einfach dort hin die Daten pushen. Somit bekommt man ziemlich leicht eine Änderungshistorie.

Was muss man also machen? Eigentlich ganz einfach. Auch ohne EDT kann man so etwas machen. Dazu benötigt man lediglich ein Dokumentspeicher und dort drin ein Dateiablageort. Einfach einen neuen Ordner auswählen, wo man die Sourcen, die ins GIT kopiert werden, gespeichert werden sollen.

Trägt man nun im Compiler die neue Dokumentenablage ein, werden nun bei jedem erfolgreichen kompilat, die Sourcedateien dort abgespeichert.

Der erste Teil ist geschafft. Nun werden alle Sourcen ein zweites mal in einem separatem Verzeichnis gespeichert. Nun fehlt doch nur noch das einchecken… 🙂

echo off

echo //ins Laufwerk wechseln
C:

echo //commit ins git aufrufen
C:\PF-Ordner\Library\git.src\PrepCommitIntoGitCall.bat
echo off

echo //ins Laufwerk wechseln
C:

echo //ins Verzeichnis wechseln
cd C:\PF-Ordner\Library\git.src\PrimeFact_Sources

echo //added alle fehlenden files hinzufuegen
C:\Tools\git64\cmd\git.exe add -A

echo //Nachricht setzen
C:\Tools\git64\cmd\git.exe commit -m "compiled"

echo //und push
C:\Tools\git64\cmd\git.exe push

Aber wie wird automatisch das commit ausgeführt? Ganz einfach… Man überschreibt einfach den Compiler.

public class SLCompiler : PrimeConfig.Core.Defenition.Compiler
{
    //##* PrimeFact5.PrimeBOB.Definition.OwnMethod d44383b5c96a48f59a4ed94ec86fec98
    [AtUserMethod(Name = "UM_UMSLCommit2Git", Page = "MP_Extended", ShowInProperty = true, ShowInToolbar = false, ShowInRootToolbar = false, ShowInList = false, ShowIcon = true, ToolBarImage = "SL_EXECUTE")]
    public PFUserMethod _UMSLCommit2Git = new PFUserMethod(__UMSLCommit2Git);
    public static void __UMSLCommit2Git(PFObject caller, PFCommandStack cmdstack)
    {
        try
        {
            DirectoryInfo di = new DirectoryInfo(caller.Session.BasePath);
            var folders = di.GetDirectories("git.src");

            if (folders.Length == 1)
            {
                DirectoryInfo digitsrc = folders[0];
                string cmdArgs = digitsrc.FullName + "\\" + GetSystemName() + "CommitIntoGit.bat";

                if (new FileInfo(cmdArgs).Exists)
                {
                    var processInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c" + cmdArgs);

                    processInfo.CreateNoWindow = true;

                    processInfo.UseShellExecute = false;

                    processInfo.RedirectStandardError = true;
                    processInfo.RedirectStandardOutput = true;

                    var process = System.Diagnostics.Process.Start(processInfo);

                    process.Start();

                    process.WaitForExit();

                    string output = process.StandardOutput.ReadToEnd();
                    string error = process.StandardError.ReadToEnd();
                }
            }
        }
        catch (Exception ex)
        {
            caller.Session.LogException(ex);
        }
    }

    /// <summary>
    /// 
    /// </summary>
    public override void BeforeCommit()
    {
        base.BeforeCommit();

        if (_LastCompileDate.DateTimeValue > lastSuccessCompileDate)
        {
            _UMSLCommit2Git.Execute(this, null, Session.UIContainer);
            lastSuccessCompileDate = DateTime.MaxValue;
        }
    }

    DateTime lastSuccessCompileDate = DateTime.MaxValue;

    /// <summary>
    /// 
    /// </summary>
    public override void AfterStartEdit()
    {
        base.AfterStartEdit();
        lastSuccessCompileDate = _LastCompileDate.DateTimeValue;
    }

    /// <summary>
    /// Gibt den Namen des Systems zurück
    /// </summary>
    /// <returns></returns>
    string GetSystemName()
    {
        //Hier muss man selber etwas Logik programmieren, um den Namen des Systems zu erkennen. Beispiel: Anhand des Verzeichnis Namen ;-)
        return "Prep";
    }
}

Nun nur noch im PrimeFact bekanntgeben, das man den Compiler überschrieben hat. Fertig.

Kompiliert man also in PrimeFact die Sourcen, wird nun automatisch gepushed. Super. Nur eine Kleinigkeit noch. Mit den PrimeFact 5.3.1 kamen auch leider die Compilier Info’s. Die stören im GIT bzw. im SVN. Somit müssen diese raus.
Aber auch hier kann man etwas machen. Einfach das DocStoreFile PFObject überschreiben die Dateien abfangen und ändern, bevor diese ins Repository geschrieben werden.

Um die Compiler Info in den Dateien zu entfernen, habe ich mal ein Beitrag erstellt. Hier findet Ihr auch die Methode RemoveTextInFileInfo, die man sich einfach rauskopieren kann.

public class SLDocStoreDestFile : PrimeFrame.Core.DataObjects.DocStoreDestFile
{
    /// <summary>
    /// Schreibt die Dateien
    /// </summary>
    /// <param name="docstoreObjs"></param>
    /// <returns></returns>
    public override List<DocStoreObject> Save(List<DocStoreObject> docstoreObjs)
    {
        var ret = base.Save(docstoreObjs);

        if (this.ID == "5d2b2149e25d4849beddd7fc852ee118" || this._Name.StringValue == "PREP_GITSOURCES_SERVER")
        {
            foreach (DocStoreObject docstoreObj in docstoreObjs)
            {
                try
                {
                    System.IO.FileInfo fi = docstoreObj.file;
                    string special = docstoreObj.specialsubdirectory;
                    string name = docstoreObj.name;

                    System.IO.FileInfo fiSource = new System.IO.FileInfo(this.Directory.FullName + "\\" + docstoreObj.specialsubdirectory + "\\" + docstoreObj.name);
                    RemoveTextInFileInfo(fiSource, "/* Compile Info *", "* End Compile Info */");
                }
                catch (Exception ex)
                {
                    Session.LogException(ex);
                }
            }
        }

        return ret;
    }
}

Auch dies muss im PrimeFact wieder eingetragen werden, das man dieses PFObject überschrieben hat. Ab in die Ableitungseinstellungen und die neue Klasse eintragen.

Nun sollte alles voll automatisiert laufen. Die Sourcen werden automatisch gepushed und mit der aktuellen PrimeFact Version 5.3.3 sogar clean. Hier seht ihr das Resultat.