Skip to content

Commit

Permalink
Add/GitHub actions (#43)
Browse files Browse the repository at this point in the history
* add github-actions

* add fpGUI

* add librsvg2-dev

* move fpGUI

* move fpGUI

* add fptest

* add VirtualTreeViewV5
  • Loading branch information
theavege authored Jan 25, 2025
1 parent 0e6a2e2 commit 9a29753
Show file tree
Hide file tree
Showing 8 changed files with 288 additions and 3 deletions.
7 changes: 7 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
224 changes: 224 additions & 0 deletions .github/workflows/make.pas
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
//castle-engine.io/modern_pascal

program Make;
{$mode objfpc}{$H+}

uses
Classes,
SysUtils,
StrUtils,
FileUtil,
LazFileUtils,
Zipper,
fphttpclient,
RegExpr,
openssl,
LazUTF8,
opensslsockets,
eventlog,
Process;

function OutLog(const Knd: TEventType; const Msg: string): string;
begin
case Knd of
etError: Result := #27'[31m%s'#27'[0m';
etInfo: Result := #27'[32m%s'#27'[0m';
etDebug: Result := #27'[33m%s'#27'[0m';
end;
Writeln(stderr, UTF8ToConsole(Result.Format([Msg])));
end;

function AddPackage(const Path: string): string;
begin
with TRegExpr.Create do
begin
Expression :=
{$IFDEF MSWINDOWS}
'(cocoa|x11|_template)'
{$ELSE}
'(cocoa|gdi|_template)'
{$ENDIF}
;
if not Exec(Path) then
if RunCommand('lazbuild', ['--add-package-link', Path], Result, [poStderrToOutPut]) then
OutLog(etDebug, 'Add package:'#9 + Path)
else
begin
ExitCode += 1;
OutLog(etError, Result);
end;
Free;
end;
end;

function SelectString(const Input, Reg: string): string;
var
Line: string;
begin
Result := EmptyStr;
with TRegExpr.Create do
begin
Expression := Reg;
for Line in Input.Split(LineEnding) do
if Exec(Line) then
Result += Line + LineEnding;
Free;
end;
end;

function RunTest(const Path: String): string;
begin
OutLog(etDebug, #9'run:'#9 + Path);
if RunCommand(Path, ['--all', '--format=plain'], Result, [poStderrToOutPut]) then
OutLog(etInfo, #9'success!')
else
begin
ExitCode += 1;
OutLog(etError, Result);
end;
end;

function AddDDL(const Path: String): string;
const
LibPath: string = '/usr/lib/';
begin
OutLog(etDebug, #9'add:'#9 + Path);
if not FileExists(LibPath + ExtractFileName(Path)) then
if RunCommand('sudo', ['bash', '-c', 'cp %s %s; ldconfig --verbose'.Format([Path, LibPath])], Result, [poStderrToOutPut]) then
OutLog(etInfo, #9'success!')
else
begin
ExitCode += 1;
OutLog(etError, Result);
end;
end;

function BuildProject(const Path: string): string;
var
Text: string;
begin
OutLog(etDebug, 'Build from:'#9 + Path);
if RunCommand('lazbuild',
['--build-all', '--recursive', '--no-write-project', Path], Result, [poStderrToOutPut]) then
begin
Result := SelectString(Result, 'Linking').Split(' ')[2].Replace(LineEnding, EmptyStr);
OutLog(etInfo, #9'to:'#9 + Result);
Text := ReadFileToString(Path.Replace('.lpi', '.lpr'));
if Text.Contains('program') and Text.Contains('consoletestrunner') then
RunTest(Result)
else if Text.Contains('library') and Text.Contains('exports') then
AddDDL(Result)
end
else
begin
ExitCode += 1;
OutLog(etError, SelectString(Result, '(Fatal|Error):'));
end;
end;

function DownloadFile(const Uri: string): string;
var
OutFile: TStream;
begin
InitSSLInterface;
Result := GetTempFileName;
OutFile := TFileStream.Create(Result, fmCreate or fmOpenWrite);
with TFPHttpClient.Create(nil) do
begin
try
AddHeader('User-Agent', 'Mozilla/5.0 (compatible; fpweb)');
AllowRedirect := True;
Get(Uri, OutFile);
OutLog(etDebug, 'Download from %s to %s'.Format([Uri, Result]));
finally
Free;
OutFile.Free;
end;
end;
end;

procedure UnZip(const ZipFile, ZipPath: string);
begin
with TUnZipper.Create do
begin
try
FileName := ZipFile;
OutputPath := ZipPath;
Examine;
UnZipAllFiles;
OutLog(etDebug, 'Unzip from'#9 + ZipFile + #9'to'#9 + ZipPath);
DeleteFile(ZipFile);
finally
Free;
end;
end;
end;

function InstallOPM(const Path: string): string;
begin
Result :=
{$IFDEF MSWINDOWS}
GetEnvironmentVariable('APPDATA') + '\.lazarus\onlinepackagemanager\packages\'
{$ELSE}
GetEnvironmentVariable('HOME') + '/.lazarus/onlinepackagemanager/packages/'
{$ENDIF}
+ Path;
if not DirectoryExists(Result) then
begin
if ForceDirectories(Result) then
UnZip(DownloadFile('https://packages.lazarus-ide.org/%s.zip'.Format([Path])), Result);
end;
end;

function BuildAll(const Dependencies: array of string): string;
var
List: TStringList;
DT: TDateTime;
begin
DT := Time;
if FileExists('.gitmodules') then
if RunCommand('git', ['submodule', 'update', '--init', '--recursive',
'--force', '--remote'], Result, [poStderrToOutPut]) then
OutLog(etInfo, Result)
else
begin
ExitCode += 1;
OutLog(etError, Result);
end;
List := FindAllFiles(GetCurrentDir, '*.lpk');
try
for Result in Dependencies do
List.AddStrings(FindAllFiles(InstallOPM(Result), '*.lpk'));
for Result in List do
AddPackage(Result);
List := FindAllFiles(GetCurrentDir, '*.lpi');
List.Sort;
for Result in List do
if not Result.Contains(DirectorySeparator + 'use' + DirectorySeparator) then
BuildProject(Result);
finally
List.Free;
end;
if not RunCommand('delp', ['-r', GetCurrentDir], Result, [poStderrToOutPut]) then
OutLog(etError, Result);
OutLog(etDebug, 'Duration:'#9 + FormatDateTime('hh:nn:ss', Time - DT));
case ExitCode of
0: OutLog(etInfo, 'Errors:'#9 + ExitCode.ToString);
else
OutLog(etError, 'Errors:'#9 + ExitCode.ToString);
end;
end;

begin
try
if ParamCount > 0 then
case ParamStr(1) of
'build': BuildAll(['MultiLog', 'VampyreImaging', 'VirtualTreeViewV5', 'Synapse40.1']);
else
OutLog(etError, ParamStr(1));
end;
except
on E: Exception do
OutLog(etError, E.ClassName + #9 + E.Message);
end;
end.
42 changes: 42 additions & 0 deletions .github/workflows/make.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
name: Make

on:
schedule:
- cron: '0 0 1 * *'
push:
branches:
- "**"
pull_request:
branches:
- master
- main

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ${{ matrix.os }}
timeout-minutes: 120
strategy:
matrix:
os:
- ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: true

- name: Build
shell: bash
run: |
set -xeuo pipefail
sudo bash -c '
apt-get update
apt-get install -y lazarus librsvg2-dev
' >/dev/null
instantfpc -Fu/usr/lib/lazarus/*/components/lazutils \
.github/workflows/make.pas build
13 changes: 11 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
[submodule "luicomponents/tests/jsonschema/JSON-Schema-Test-Suite"]
path = luicomponents/tests/jsonschema/JSON-Schema-Test-Suite
url = https://github.com/json-schema-org/JSON-Schema-Test-Suite.git
path = luicomponents/tests/jsonschema/JSON-Schema-Test-Suite
url = https://github.com/json-schema-org/JSON-Schema-Test-Suite.git
[submodule "use/fpGUI"]
path = use/fpGUI
url = [email protected]:graemeg/fpGUI.git
[submodule "use/fptest"]
path = use/fptest
url = [email protected]:graemeg/fptest.git
[submodule "use/handlebars.pascal"]
path = use/handlebars.pascal
url = [email protected]:blikblum/handlebars.pascal.git
2 changes: 1 addition & 1 deletion luicomponents/tests/jsonschema/JSON-Schema-Test-Suite
1 change: 1 addition & 0 deletions use/fpGUI
Submodule fpGUI added at a2b7f8
1 change: 1 addition & 0 deletions use/fptest
Submodule fptest added at 6e2545
1 change: 1 addition & 0 deletions use/handlebars.pascal
Submodule handlebars.pascal added at 3b9830

0 comments on commit 9a29753

Please sign in to comment.