Skip to content

Commit aa9a3b0

Browse files
author
César Cardoso
committed
feature/add-clean-and-build
1 parent 742b661 commit aa9a3b0

9 files changed

Lines changed: 201 additions & 17 deletions

Package/C4DWizard.dpk

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ contains
129129
C4D.Wizard.IDE.ShortCut.KeyboardBinding in '..\Src\IDE\ShortCut\C4D.Wizard.IDE.ShortCut.KeyboardBinding.pas',
130130
C4D.Wizard.UsesOrganization.ListOfUses in '..\Src\UsesOrganization\C4D.Wizard.UsesOrganization.ListOfUses.pas',
131131
C4D.Wizard.FormatSource.View in '..\Src\FormatSource\C4D.Wizard.FormatSource.View.pas' {C4DWizardFormatSourceView},
132-
C4D.Wizard.Notes.View in '..\Src\Notes\C4D.Wizard.Notes.View.pas' {C4DWizardNotesView};
132+
C4D.Wizard.Notes.View in '..\Src\Notes\C4D.Wizard.Notes.View.pas' {C4DWizardNotesView},
133+
C4D.Wizard.Utils.OTA.Codex in '..\Src\Utils\C4D.Wizard.Utils.OTA.Codex.pas';
133134

134135
end.

Package/C4DWizard.dproj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@
291291
<Form>C4DWizardNotesView</Form>
292292
<FormType>dfm</FormType>
293293
</DCCReference>
294+
<DCCReference Include="..\Src\Utils\C4D.Wizard.Utils.OTA.Codex.pas"/>
294295
<RcItem Include="Img\C4D_Logo.bmp">
295296
<ResourceType>BITMAP</ResourceType>
296297
<ResourceId>C4D_Logo</ResourceId>
@@ -419,6 +420,10 @@
419420
<ResourceType>BITMAP</ResourceType>
420421
<ResourceId>c4d_notes</ResourceId>
421422
</RcItem>
423+
<RcItem Include="Img\c4d_clean_and_start.bmp">
424+
<ResourceType>BITMAP</ResourceType>
425+
<ResourceId>c4d_clean_and_start</ResourceId>
426+
</RcItem>
422427
<BuildConfiguration Include="Release">
423428
<Key>Cfg_2</Key>
424429
<CfgParent>Base</CfgParent>
@@ -451,6 +456,12 @@
451456
<DeployFile LocalName="C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl\C4DWizard.bpl" Configuration="Release" Class="ProjectOutput"/>
452457
<DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule"/>
453458
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule"/>
459+
<DeployFile LocalName="C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl\C4DWizard.bpl" Configuration="Debug" Class="ProjectOutput">
460+
<Platform Name="Win32">
461+
<RemoteName>C4DWizard.bpl</RemoteName>
462+
<Overwrite>true</Overwrite>
463+
</Platform>
464+
</DeployFile>
454465
<DeployClass Name="AdditionalDebugSymbols">
455466
<Platform Name="OSX32">
456467
<Operation>1</Operation>
1.3 KB
Binary file not shown.

Src/Consts/C4D.Wizard.Consts.pas

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,15 @@ TC4DConsts = class
151151
TOOL_BAR_BUILD_NAME = 'C4DToolBarBuild';
152152
TOOL_BAR_BUILD_CAPTION = 'C4D Build';
153153
TOOL_BAR_BUILD_TOOL_BUTTON_BuildAllGroup_NAME = 'C4DToolButtonBuildAllGroup';
154+
TOOL_BAR_BUILD_TOOL_BUTTON_BuildAllGroup_CAPTION = 'Build all group projects';
155+
TOOL_BAR_BUILD_TOOL_BUTTON_CleanAndBuild_NAME = 'C4DToolButtonCleanAndBuild';
156+
TOOL_BAR_BUILD_TOOL_BUTTON_CleanAndBuild_CAPTION = 'Clean and build current project';
154157
TOOL_BAR_BUILD_TOOL_BUTTON_BuildInRelease_NAME = 'C4DToolButtonBuildInRelease';
158+
TOOL_BAR_BUILD_TOOL_BUTTON_BuildInRelease_CAPTION = 'Build Project In Release';
155159
TOOL_BAR_BUILD_COMBOBOX_NAME = 'C4DToolComboBoxNameCurrentBuild';
160+
TOOL_BAR_BUILD_COMBOBOX_HINT = 'Alter Build Configuration';
156161
TOOL_BAR_BUILD_TOOL_BUTTON_REFRESH_NAME = 'C4DToolButtonBuildRefresh';
162+
TOOL_BAR_BUILD_TOOL_BUTTON_REFRESH_CAPTION = 'Get Current Build Configuration';
157163
//TOOLBAR BUILD INI
158164
TOOL_BAR_BUILD_INI_Visible = 'Visible';
159165

@@ -170,6 +176,9 @@ TC4DConsts = class
170176

171177
STR_CMD_COMMANDS = 'CMD Commands';
172178
STR_MENU_MASTER_ONLY = 'Menu Master Only';
179+
180+
//ProjectCommands
181+
COMMAND_ProjectCleanCommand = 'ProjectCleanCommand';
173182
end;
174183

175184
implementation

Src/IDE/ImageListMain/C4D.Wizard.IDE.ImageListMain.pas

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ TC4DWizardIDEImageListMain = class
3636
FImgIndexBuildGroup: Integer;
3737
FImgIndexVerifyDocument: Integer;
3838
FImgIndexNotes: Integer;
39+
FImgIndexCleanAndStart: Integer;
3940
constructor Create;
4041
public
4142
property ImgIndexC4D_Logo: Integer read FImgIndexC4D_Logo;
@@ -65,6 +66,7 @@ TC4DWizardIDEImageListMain = class
6566
property ImgIndexBuildGroup: Integer read FImgIndexBuildGroup;
6667
property ImgIndexVerifyDocument: Integer read FImgIndexVerifyDocument;
6768
property ImgIndexNotes: Integer read FImgIndexNotes;
69+
property ImgIndexCleanAndStart: Integer read FImgIndexCleanAndStart;
6870
class function GetInstance: TC4DWizardIDEImageListMain;
6971
end;
7072

@@ -112,6 +114,7 @@ constructor TC4DWizardIDEImageListMain.Create;
112114
FImgIndexBuildGroup := TC4DWizardUtilsOTA.AddImgIDEResourceName('c4d_build_group');
113115
FImgIndexVerifyDocument := TC4DWizardUtilsOTA.AddImgIDEResourceName('c4d_verify_document');
114116
FImgIndexNotes := TC4DWizardUtilsOTA.AddImgIDEResourceName('c4d_notes');
117+
FImgIndexCleanAndStart := TC4DWizardUtilsOTA.AddImgIDEResourceName('c4d_clean_and_start');
115118
end;
116119

117120
initialization

Src/IDE/ToolBars/C4D.Wizard.IDE.ToolBars.Build.pas

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,25 @@ TC4DWizardIDEToolBarsBuild = class
2020
FINTAServices: INTAServices;
2121
FToolBarBuild: TToolBar;
2222
FToolButtonBuildAllGroup: TToolButton;
23+
FToolButtonCleanAndBuild: TToolButton;
2324
FToolButtonBuildInRelease: TToolButton;
2425
FToolButtonRefresh: TToolButton;
2526
FComboBox: TComboBox;
2627
procedure NewToolBarBuild;
27-
procedure OnC4DToolButtonBuildRefreshClick(Sender: TObject);
28-
procedure OnC4DToolButtonBuildInReleaseClick(Sender: TObject);
2928
procedure RemoveToolBarBuild;
30-
procedure AddButtonRefreshBuild;
31-
procedure AddButtonBuildInRelease;
3229
procedure AddComboBoxBuild;
3330
procedure FillComboBoxBuild;
3431
function GetReferenceToolBar: string;
3532
function GetIniFile: TIniFile;
3633
procedure ComboBoxClick(Sender: TObject);
3734
procedure AddButtonBuildAllGroup;
3835
procedure OnC4DToolButtonBuildAllGroupClick(Sender: TObject);
36+
procedure AddButtonCleanAndBuild;
37+
procedure OnC4DToolButtonCleanAndBuildClick(Sender: TObject);
38+
procedure AddButtonBuildInRelease;
39+
procedure OnC4DToolButtonBuildInReleaseClick(Sender: TObject);
40+
procedure AddButtonRefreshBuild;
41+
procedure OnC4DToolButtonBuildRefreshClick(Sender: TObject);
3942
protected
4043
constructor Create;
4144
public
@@ -149,6 +152,7 @@ procedure TC4DWizardIDEToolBarsBuild.NewToolBarBuild;
149152
FToolBarBuild.AutoSize := True;
150153

151154
Self.AddButtonBuildAllGroup;
155+
Self.AddButtonCleanAndBuild;
152156
Self.AddButtonBuildInRelease;
153157
Self.AddButtonRefreshBuild;
154158
Self.AddComboBoxBuild;
@@ -180,7 +184,7 @@ procedure TC4DWizardIDEToolBarsBuild.AddButtonBuildAllGroup;
180184

181185
FToolButtonBuildAllGroup := TToolButton.Create(FToolBarBuild);
182186
FToolButtonBuildAllGroup.Parent := FToolBarBuild;
183-
FToolButtonBuildAllGroup.Caption := 'Build all group projects';
187+
FToolButtonBuildAllGroup.Caption := TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_BuildAllGroup_CAPTION;
184188
FToolButtonBuildAllGroup.Hint := FToolButtonBuildAllGroup.Caption;
185189
FToolButtonBuildAllGroup.ShowHint := True;
186190
FToolButtonBuildAllGroup.Name := TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_BuildAllGroup_NAME;
@@ -192,6 +196,26 @@ procedure TC4DWizardIDEToolBarsBuild.AddButtonBuildAllGroup;
192196
FToolButtonBuildAllGroup.AutoSize := True;
193197
end;
194198

199+
procedure TC4DWizardIDEToolBarsBuild.AddButtonCleanAndBuild;
200+
begin
201+
FToolButtonCleanAndBuild := TToolButton(FToolBarBuild.FindComponent(TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_CleanAndBuild_NAME));
202+
if(FToolButtonCleanAndBuild <> nil)then
203+
FToolButtonCleanAndBuild.Free;
204+
205+
FToolButtonCleanAndBuild := TToolButton.Create(FToolBarBuild);
206+
FToolButtonCleanAndBuild.Parent := FToolBarBuild;
207+
FToolButtonCleanAndBuild.Caption := TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_CleanAndBuild_CAPTION;
208+
FToolButtonCleanAndBuild.Hint := FToolButtonCleanAndBuild.Caption;
209+
FToolButtonCleanAndBuild.ShowHint := True;
210+
FToolButtonCleanAndBuild.Name := TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_CleanAndBuild_NAME;
211+
FToolButtonCleanAndBuild.Style := tbsButton;
212+
FToolButtonCleanAndBuild.ImageIndex := TC4DWizardIDEImageListMain.GetInstance.ImgIndexCleanAndStart;
213+
FToolButtonCleanAndBuild.Visible := True;
214+
FToolButtonCleanAndBuild.Left := FToolButtonBuildAllGroup.Left + FToolButtonBuildAllGroup.Width;
215+
FToolButtonCleanAndBuild.OnClick := OnC4DToolButtonCleanAndBuildClick;
216+
FToolButtonCleanAndBuild.AutoSize := True;
217+
end;
218+
195219
procedure TC4DWizardIDEToolBarsBuild.AddButtonBuildInRelease;
196220
begin
197221
FToolButtonBuildInRelease := TToolButton(FToolBarBuild.FindComponent(TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_BuildInRelease_NAME));
@@ -200,14 +224,14 @@ procedure TC4DWizardIDEToolBarsBuild.AddButtonBuildInRelease;
200224

201225
FToolButtonBuildInRelease := TToolButton.Create(FToolBarBuild);
202226
FToolButtonBuildInRelease.Parent := FToolBarBuild;
203-
FToolButtonBuildInRelease.Caption := 'Build Project In Release';
227+
FToolButtonBuildInRelease.Caption := TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_BuildInRelease_CAPTION;
204228
FToolButtonBuildInRelease.Hint := FToolButtonBuildInRelease.Caption;
205229
FToolButtonBuildInRelease.ShowHint := True;
206230
FToolButtonBuildInRelease.Name := TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_BuildInRelease_NAME;
207231
FToolButtonBuildInRelease.Style := tbsButton;
208232
FToolButtonBuildInRelease.ImageIndex := TC4DWizardIDEImageListMain.GetInstance.ImgIndexPlayBlue;
209233
FToolButtonBuildInRelease.Visible := True;
210-
FToolButtonBuildInRelease.Left := FToolButtonBuildAllGroup.Left + FToolButtonBuildAllGroup.Width;
234+
FToolButtonBuildInRelease.Left := FToolButtonCleanAndBuild.Left + FToolButtonCleanAndBuild.Width;
211235
FToolButtonBuildInRelease.OnClick := OnC4DToolButtonBuildInReleaseClick;
212236
FToolButtonBuildInRelease.AutoSize := True;
213237
end;
@@ -220,7 +244,7 @@ procedure TC4DWizardIDEToolBarsBuild.AddButtonRefreshBuild;
220244

221245
FToolButtonRefresh := TToolButton.Create(FToolBarBuild);
222246
FToolButtonRefresh.Parent := FToolBarBuild;
223-
FToolButtonRefresh.Caption := 'Get Current Build Configuration';
247+
FToolButtonRefresh.Caption := TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_REFRESH_CAPTION;
224248
FToolButtonRefresh.Hint := FToolButtonRefresh.Caption;
225249
FToolButtonRefresh.ShowHint := True;
226250
FToolButtonRefresh.Name := TC4DConsts.TOOL_BAR_BUILD_TOOL_BUTTON_REFRESH_NAME;
@@ -240,7 +264,7 @@ procedure TC4DWizardIDEToolBarsBuild.AddComboBoxBuild;
240264

241265
FComboBox := TComboBox.Create(FToolBarBuild);
242266
FComboBox.Parent := FToolBarBuild;
243-
FComboBox.Hint := 'Alter Build Configuration';
267+
FComboBox.Hint := TC4DConsts.TOOL_BAR_BUILD_COMBOBOX_HINT;
244268
FComboBox.ShowHint := True;
245269
FComboBox.Name := TC4DConsts.TOOL_BAR_BUILD_COMBOBOX_NAME;
246270
FComboBox.Style := csDropDownList;
@@ -278,7 +302,7 @@ procedure TC4DWizardIDEToolBarsBuild.OnC4DToolButtonBuildAllGroupClick(Sender: T
278302
begin
279303
LIOTAProjectGroup := (BorlandIDEServices as IOTAModuleServices).MainProjectGroup; //TC4DWizardUtilsOTA.GetCurrentProjectGroup
280304
if(LIOTAProjectGroup = nil)then
281-
raise Exception.Create('Nenhum grupo selecionado');
305+
raise Exception.Create('No groups selected');
282306

283307
LClearMessages := True;
284308
for LContProjetos := 0 to Pred(LIOTAProjectGroup.ProjectCount)do
@@ -290,6 +314,31 @@ procedure TC4DWizardIDEToolBarsBuild.OnC4DToolButtonBuildAllGroupClick(Sender: T
290314
end;
291315
end;
292316

317+
procedure TC4DWizardIDEToolBarsBuild.OnC4DToolButtonCleanAndBuildClick(Sender: TObject);
318+
var
319+
LIOTAProject: IOTAProject;
320+
LCurrentBinaryPath: string;
321+
begin
322+
LIOTAProject := TC4DWizardUtilsOTA.GetCurrentProject;
323+
if(LIOTAProject = nil)then
324+
Exit;
325+
326+
if(TC4DWizardUtils.FileNameIsC4DWizardDPROJ(LIOTAProject.FileName))then
327+
TC4DWizardUtils.ShowMsgAndAbort('Cannot clean or build on project: ' + TC4DConsts.C4D_WIZARD_DPROJ);
328+
329+
LCurrentBinaryPath := TC4DWizardUtilsOTA.GetBinaryPathCurrent;
330+
if(FileExists(LCurrentBinaryPath))then
331+
if(TC4DWizardUtils.ProcessWindowsExists(ExtractFileName(LCurrentBinaryPath), LCurrentBinaryPath))then
332+
TC4DWizardUtils.ShowMsgAndAbort('Operations not allowed, the application is already running.');
333+
334+
if(not TC4DWizardUtilsOTA.CleanCurrentProject)then
335+
TC4DWizardUtils.ShowMsgAndAbort('Unable to clean the project');
336+
337+
LIOTAProject
338+
.ProjectBuilder
339+
.BuildProject(cmOTABuild, True, True);
340+
end;
341+
293342
procedure TC4DWizardIDEToolBarsBuild.OnC4DToolButtonBuildInReleaseClick(Sender: TObject);
294343
var
295344
LIOTAProject: IOTAProject;

Src/Utils/C4D.Wizard.Utils.CnWizard.pas

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
{ CnPack For Delphi/C++Builder }
77
{ 中国人自己的开放源码第三方开发包 }
88
{ (C)Copyright 2001-2023 CnPack 开发组 }
9-
{ 网站地址:http://www.cnpack.org }
10-
{ 电子邮件:master@cnpack.org }
9+
{ 网站地址:http://www.cnpack.org }
10+
{ 电子邮件:master@cnpack.org }
1111
{******************************************************************************}
1212

1313
unit C4D.Wizard.Utils.CnWizard;
@@ -22,9 +22,6 @@ interface
2222
ToolsAPI,
2323
Vcl.Forms;
2424

25-
const
26-
SCnIDEPathMacro = '$(DELPHI)';
27-
2825
function CnOtaGetCurrentProject: IOTAProject;
2926
function CnOtaGetProjectGroup: IOTAProjectGroup;
3027
function QuerySvcs(const Instance: IUnknown; const Intf: TGUID; out Inst): Boolean;
@@ -46,6 +43,9 @@ procedure ExploreDir(const APath: string; ShowDir: Boolean = True);
4643

4744
implementation
4845

46+
const
47+
SCnIDEPathMacro = '$(DELPHI)';
48+
4949
function CnOtaGetCurrentProject: IOTAProject;
5050
var
5151
IProjectGroup: IOTAProjectGroup;
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
unit C4D.Wizard.Utils.OTA.Codex;
2+
3+
{******************************************************************************}
4+
{ Unit Note: }
5+
{ This file is partly derived from Codex expert for Delphi IDE }
6+
{ }
7+
{ Codex author: }
8+
{ https://github.com/DelphiWorlds/Codex }
9+
{******************************************************************************}
10+
11+
interface
12+
13+
uses
14+
System.SysUtils,
15+
System.Classes,
16+
Vcl.Forms,
17+
Vcl.ActnList,
18+
ToolsAPI;
19+
20+
type
21+
TC4DWizardUtilsOTACodex = class
22+
public
23+
class function ExecuteIDEAction(const AActionName: string): Boolean;
24+
class function FindActionGlobal(const AActionName: string; out AAction: TCustomAction): Boolean;
25+
class function FindComponentGlobal(const AComponentName: string; out AComponent: TComponent): Boolean;
26+
class function FindComponentRecurse(const AParent: TComponent; const AComponentName: string;
27+
out AComponent: TComponent): Boolean;
28+
end;
29+
30+
implementation
31+
32+
class function TC4DWizardUtilsOTACodex.ExecuteIDEAction(const AActionName: string): Boolean;
33+
var
34+
LAction: TCustomAction;
35+
begin
36+
Result := False;
37+
if Self.FindActionGlobal(AActionName, LAction) then
38+
begin
39+
LAction.Execute;
40+
Result := True;
41+
end;
42+
end;
43+
44+
class function TC4DWizardUtilsOTACodex.FindActionGlobal(const AActionName: string;
45+
out AAction: TCustomAction): Boolean;
46+
var
47+
LComponent: TComponent;
48+
begin
49+
Result := False;
50+
if Self.FindComponentGlobal(AActionName, LComponent) and (LComponent is TCustomAction) then
51+
begin
52+
AAction := TCustomAction(LComponent);
53+
Result := True;
54+
end;
55+
end;
56+
57+
class function TC4DWizardUtilsOTACodex.FindComponentGlobal(const AComponentName: string;
58+
out AComponent: TComponent): Boolean;
59+
var
60+
I: Integer;
61+
begin
62+
Result := False;
63+
for I := 0 to Pred(Screen.FormCount) do
64+
begin
65+
if Self.FindComponentRecurse(Screen.Forms[I], AComponentName, AComponent) then
66+
begin
67+
Result := True;
68+
Break;
69+
end;
70+
end;
71+
if not Result then
72+
begin
73+
for I := 0 to Pred(Screen.DataModuleCount) do
74+
begin
75+
if Self.FindComponentRecurse(Screen.DataModules[I], AComponentName, AComponent) then
76+
begin
77+
Result := True;
78+
Break;
79+
end;
80+
end;
81+
end;
82+
end;
83+
84+
class function TC4DWizardUtilsOTACodex.FindComponentRecurse(const AParent: TComponent;
85+
const AComponentName: string; out AComponent: TComponent): Boolean;
86+
var
87+
I: Integer;
88+
begin
89+
AComponent := AParent.FindComponent(AComponentName);
90+
Result := AComponent <> nil;
91+
if not Result then
92+
begin
93+
for I := 0 to AParent.ComponentCount - 1 do
94+
begin
95+
if Self.FindComponentRecurse(AParent.Components[I], AComponentName, AComponent) then
96+
begin
97+
Result := True;
98+
Break;
99+
end;
100+
end;
101+
end;
102+
end;
103+
104+
end.

Src/Utils/C4D.Wizard.Utils.OTA.pas

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ TC4DWizardUtilsOTA = class
2020
class function EditorAsstring(AIOTAModule: IOTAModule): string;
2121
class procedure DoCloseFile(AInfoFile: TC4DWizardInfoFile);
2222
public
23+
class function CleanCurrentProject: Boolean;
2324
class function CurrentProjectIsC4DWizardDPROJ: Boolean;
2425
class function CurrentModuleIsReadOnly: Boolean;
2526
class procedure CloseFilesOpened(AC4DWizardExtensions: TC4DExtensionsOfFiles);
@@ -88,7 +89,13 @@ implementation
8889
C4D.Wizard.LogFile,
8990
C4D.Wizard.Model.Files.Loop,
9091
C4D.Wizard.Utils,
91-
C4D.Wizard.Utils.OTA.BinaryPath;
92+
C4D.Wizard.Utils.OTA.BinaryPath,
93+
C4D.Wizard.Utils.OTA.Codex;
94+
95+
class function TC4DWizardUtilsOTA.CleanCurrentProject: Boolean;
96+
begin
97+
Result := TC4DWizardUtilsOTACodex.ExecuteIDEAction(TC4DConsts.COMMAND_ProjectCleanCommand);
98+
end;
9299

93100
class function TC4DWizardUtilsOTA.CurrentProjectIsC4DWizardDPROJ: Boolean;
94101
var

0 commit comments

Comments
 (0)