* only .pp is needed

This commit is contained in:
Michaël Van Canneyt 2021-08-09 11:49:44 +02:00
parent 5d826cfe3c
commit 352435cb75

View File

@ -1,169 +0,0 @@
program closetodo;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Classes, SysUtils, CustApp, fpjson, gitlabclient,opensslsockets, jsonparser ;
type
{ TCloseTodoApplication }
TCloseTodoApplication = class(TCustomApplication)
private
FConfig : TGitlabConfig;
FClient : TGitLabClient;
FIDS : TStrings;
FQuiet : Boolean;
procedure CloseTodo(aID: int64);
procedure DoClientLog(Sender: TObject; const aMessage: string);
procedure DoResource(Sender: TObject; aPage, aIndex, aCount: Integer; aObject: TJSONObject; aContinue: Boolean);
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure Usage(const aError : String); virtual;
end;
{ TCloseTodoApplication }
procedure TCloseTodoApplication.DoResource(Sender: TObject; aPage, aIndex,
aCount: Integer; aObject: TJSONObject; aContinue: Boolean);
Var
aData : TJSONData;
Msg,aState : String;
aBugID,aBugIID,aProjectID : Int64;
begin
Msg:=Format('[Page %d [%d/%d]: ',[aPage,aIndex,aCount]);
aProjectID:=0;
aBugID:=0;
aBugIID:=0;
aState:='';
aData:=aObject.FindPath('target.state');
if Assigned(aData) then
aState:=aData.AsString;
aData:=aObject.FindPath('project.id');
if Assigned(aData) then
aProjectID:=aData.AsInt64;
aData:=aObject.FindPath('target.id');
if Assigned(aData) then
aBugID:=aData.AsInt64;
aData:=aObject.FindPath('target.iid');
if Assigned(aData) then
aBugIID:=aData.Asint64;
DoClientLog(Self,Msg+Format('Project: %d, bug: %d, bug iid: %d, state : %s',[aProjectID,aBugID,aBugIID,aState]));
if SameText(aState,'closed') then
begin
if (FConfig.ProjectID=0) or (aProjectID=FConfig.ProjectID) then
FIDS.Add(IntToStr(aObject.Get('id',Int64(0))));
end
end;
procedure TCloseTodoApplication.CloseTodo(aID : int64);
Var
aResource : String;
begin
if (aID=-1) then
exit;
aResource:=Format('todos/%d/mark_as_done',[aID]);
Writeln('Posting ',aResource);
FClient.CreateResource(aResource,Nil);
end;
procedure TCloseTodoApplication.DoClientLog(Sender: TObject;
const aMessage: string);
begin
if not FQuiet then
Writeln(aMessage);
end;
procedure TCloseTodoApplication.DoRun;
var
ErrorMsg: String;
ListFN,ConfigFN : String;
I : Integer;
begin
Terminate;
ErrorMsg:=CheckOptions('hc:l:q', ['help','config:','list:','quiet']);
if (ErrorMsg<>'') or HasOption('h','help') then
begin
Usage(ErrorMsg);
Exit;
end;
FQuiet:=HasOption('q','quiet');
ConfigFN:=GetOptionValue('c','config');
if ConfigFN='' then
begin
Usage('Need gitlab config file');
Exit;
end;
if not FileExists(ConfigFN)then
begin
Usage('Gitlab config file "'+ConfigFN+'" does not exist');
Exit;
end;
FConfig.LoadFromFile(ConfigFN,'');
FClient.Config:=FConfig;
ListFN:=GetOptionValue('l','list');
if FileExists(ListFN)then
FIDS.LoadFromFile(ListFN)
else
begin
FClient.ForEachResource('todos',['action','assigned','state','pending'],@DoResource);
FIDS.SaveToFile(ListFN);
end;
For I:=0 to FIDS.Count-1 do
CloseTodo(StrToInt64Def(FIDS[i],-1));
Writeln(Format('Closed %d todos',[FIDS.Count]));
// stop program loop
Terminate;
end;
constructor TCloseTodoApplication.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
FConfig.Reset;
FClient:=TGitLabClient.Create;
FClient.OnLog:=@DoClientLog;
StopOnException:=True;
FIDS:=TStringList.Create;
end;
destructor TCloseTodoApplication.Destroy;
begin
FreeAndNil(FIDS);
FreeAndNil(FClient);
inherited Destroy;
end;
procedure TCloseTodoApplication.Usage(const aError: String);
begin
if (aError<>'') then
Writeln('Error : ',aError);
Writeln('Usage: ', ExeName, ' [options]');
Writeln('Where [Options] is one or more of:');
Writeln('-h --help This help');
Writeln('-c --config=FILE Config file');
Writeln('-l --list=FILE if file exists, read todo IDS from list. If file does not exist, write file after querying gitlab');
Writeln('-q --quiet less messages');
end;
var
Application: TCloseTodoApplication;
begin
Application:=TCloseTodoApplication.Create(nil);
Application.Title:='Close Todos Application';
Application.Run;
Application.Free;
end.