Skip to content

Commit 4a27980

Browse files
authored
Merge pull request #14 from intersystems/pull-event-inversion-of-control
Pull event inversion of control
2 parents 17e4b95 + 6a66fc5 commit 4a27980

File tree

8 files changed

+111
-22
lines changed

8 files changed

+111
-22
lines changed

cls/SourceControl/Git/Change.cls

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,4 @@ ClassMethod RefreshUncommitted(Display = 1, IncludeRevert = 0) As %Status
8181
}
8282

8383
}
84+

cls/SourceControl/Git/Extension.cls

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
Import SourceControl.Git
22

3+
/// Main source control extension class, configured namespace-wide to enable use via VSCode and Studio
34
Class SourceControl.Git.Extension Extends %Studio.Extension.Base
45
{
56

@@ -307,3 +308,4 @@ Method GetStatus(InternalName As %String, ByRef IsInSourceControl As %Boolean, B
307308
}
308309

309310
}
311+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/// Base class for all event handlers for git pull commands.
2+
/// Subclasses may override to perform an incremental load/compile, take no action, do a zpm "load", etc.
3+
Class SourceControl.Git.PullEventHandler Extends %RegisteredObject
4+
{
5+
6+
Parameter NAME [ Abstract ];
7+
8+
Parameter DESCRIPTION [ Abstract ];
9+
10+
/// Local git repo root directory
11+
Property LocalRoot As %String(MAXLEN = "");
12+
13+
/// Modified files (integer-subscripted array, with path relative to repo root)
14+
Property ModifiedFiles [ MultiDimensional ];
15+
16+
/// Modified items (InternalName format - e.g., SourceControl.Git.PullEventHandler.CLS)
17+
/// Array is subscripted by item name
18+
Property ModifiedItems [ MultiDimensional ];
19+
20+
Method OnPull() As %Status [ Abstract ]
21+
{
22+
}
23+
24+
}
25+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
Include SourceControl.Git
2+
3+
Class SourceControl.Git.PullEventHandler.Default Extends SourceControl.Git.PullEventHandler
4+
{
5+
6+
Parameter NAME = "Default";
7+
8+
Parameter DESCRIPTION = "Performs an incremental load and compile of all changes pulled.";
9+
10+
Method OnPull() As %Status
11+
{
12+
set loadSC = $$$OK
13+
set nFiles = 0
14+
for i=1:1:$Get(..ModifiedFiles) {
15+
if $Data(files(i))#2 {
16+
set internalName = ##class(SourceControl.Git.Utils).NameToInternalName(..ModifiedFiles(i))
17+
if (internalName = "") {
18+
write files(i), " was not imported into the database and will not be compiled. ", !
19+
} else {
20+
set compilelist(internalName) = ""
21+
set nFiles = nFiles + 1
22+
set loadSC = $$$ADDSC(loadSC,##class(SourceControl.Git.Utils).ImportItem(internalName, 1))
23+
}
24+
}
25+
}
26+
27+
if (nFiles = 0) {
28+
write "Nothing to compile.",!
29+
quit $$$OK
30+
}
31+
32+
Quit $System.OBJ.CompileList(.compilelist, "cukb")
33+
}
34+
35+
}
36+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
Class SourceControl.Git.PullEventHandler.PackageManager Extends SourceControl.Git.PullEventHandler
2+
{
3+
4+
Parameter NAME = "Package Manager";
5+
6+
Parameter DESCRIPTION = "Does zpm ""load <repo root>""";
7+
8+
/// Subclasses may override to customize behavior on pull.
9+
Method OnPull() As %Status
10+
{
11+
Quit ##class(%ZPM.PackageManager).Shell("load "_..LocalRoot)
12+
}
13+
14+
}
15+

cls/SourceControl/Git/Utils.cls

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ ClassMethod MappingsNode() As %String [ CodeMode = expression ]
5151
$Name(@..#Storage@("settings","mappings"))
5252
}
5353

54+
ClassMethod PullEventClass() As %String [ CodeMode = expression ]
55+
{
56+
$Get(@..#Storage@("settings","pullEventClass"), ##class(SourceControl.Git.PullEventHandler.Default).%ClassName(1))
57+
}
58+
5459
ClassMethod GitBinExists() As %Boolean
5560
{
5661
#if $system.Version.GetOS()'="Windows"
@@ -116,6 +121,7 @@ ClassMethod UpdateSettings(ByRef settings) As %Status
116121
set @..#Storage@("settings","user",$username,"gitUserName") = settings("gitUserName")
117122
set @..#Storage@("settings","user",$username,"gitUserEmail") = settings("gitUserEmail")
118123
set @..#Storage@("settings","ssh","privateKeyFile") = settings("privateKeyFile")
124+
set @..#Storage@("settings","pullEventClass") = settings("pullEventClass")
119125

120126
quit $$$OK
121127
}
@@ -337,34 +343,25 @@ ClassMethod Pull(remote As %String = "origin") As %Status
337343
if (sc=1){
338344
do errStream.OutputToDevice()
339345
do outStream.OutputToDevice()
340-
quit $$$ERROR(5001, "Not compiled. Fix errors before compiling.")
346+
quit $$$ERROR(5001, "Pull event handler not called. Fix errors before compiling.")
341347
}
342348
write !
343349
do outStream.OutputToDevice()
344350
write !
345-
346-
set nFiles = 0
347-
for i=1:1:$g(files)
348-
{
349-
if ($DATA(files(i))) {
350-
set internalName = ..NameToInternalName(files(i))
351-
if (internalName = "") {
352-
write files(i), " was not imported into the database and will not be compiled. ", !
353-
}
354-
else{
355-
set compilelist(internalName) = ""
356-
set nFiles = nFiles + 1
357-
set ec = ..ImportItem(internalName, $$$Force)
351+
352+
set event = $classmethod(..PullEventClass(),"%New")
353+
set event.LocalRoot = ..TempFolder()
354+
merge event.ModifiedFiles = files
355+
for i=1:1:$Get(files) {
356+
if $Data(files(i))#2 {
357+
set internalName = ##class(SourceControl.Git.Utils).NameToInternalName(..ModifiedFiles(i))
358+
if (internalName '= "") {
359+
set event.ModifiedItems(internalName) = ""
358360
}
359361
}
360362
}
361-
362-
if (nFiles = 0){
363-
write "Nothing to compile.",!
364-
quit $$$OK
365-
}
366-
Do $System.OBJ.CompileList(.compilelist, "cukb")
367-
quit $$$OK
363+
364+
quit event.OnPull()
368365
}
369366

370367
ClassMethod IsNamespaceInGit() As %Boolean [ CodeMode = expression ]
@@ -1347,3 +1344,4 @@ ClassMethod NameToInternalName(Name, IgnorePercent = 1, IgnoreNonexistent = 1) A
13471344
}
13481345

13491346
}
1347+

cls/SourceControl/Git/WebUIDriver.cls

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,3 +202,4 @@ ClassMethod Uncommitted() As %SystemBase
202202
}
203203

204204
}
205+

csp/gitprojectsettings.csp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
set $namespace = namespace
2121
if $Data(%request.Data("gitsettings",1)) {
2222
kill settings
23-
for param="gitBinPath","defaultTemp","namespaceTemp","groupByFolder","privateKeyFile","gitUserName","gitUserEmail" {
23+
for param="gitBinPath","defaultTemp","namespaceTemp","groupByFolder","privateKeyFile","pullEventClass","gitUserName","gitUserEmail" {
2424
set settings(param) = $Get(%request.Data(param,1))
2525
}
2626
do ##class(SourceControl.Git.Utils).UpdateSettings(.settings)
@@ -30,6 +30,7 @@
3030
set namespaceTemp = ##class(SourceControl.Git.Utils).TempFolder()
3131
set groupByFolder = ##class(SourceControl.Git.Utils).GroupByFolder()
3232
set privateKeyFile = ##class(SourceControl.Git.Utils).PrivateKeyFile()
33+
set pullEventClass = ##class(SourceControl.Git.Utils).PullEventClass()
3334
set gitUserName = ##class(SourceControl.Git.Utils).GitUserName()
3435
set gitUserEmail = ##class(SourceControl.Git.Utils).GitUserEmail()
3536
set:defaultTemp="" defaultTemp = "c:\temp\"
@@ -73,6 +74,16 @@
7374
</div>
7475
</div>
7576

77+
<div class="form-group row">
78+
<label for="pullEventClass" class="col-sm-4 col-form-label">Pull Event Class</label>
79+
<div class="col-sm-8">
80+
<select class="form-control" id="pullEventClass" name="pullEventClass">
81+
<option value="SourceControl.Git.PullEventHandler.Default" #($Case(pullEventClass,"SourceControl.Git.PullEventHandler.Default":"selected",:""))#>Default</option>
82+
<option value="SourceControl.Git.PullEventHandler.PackageManager" #($Case(pullEventClass,"SourceControl.Git.PullEventHandler.PackageManager":"selected",:""))#>PackageManager</option>
83+
</select>
84+
</div>
85+
</div>
86+
7687
<!--
7788
<div class="form-group row">
7889
<label for="groupByFolder" class="col-sm-4 col-form-label">Group all items by folders</label>

0 commit comments

Comments
 (0)