Skip to content

Commit fb1ef36

Browse files
authored
Merge pull request #18 from intersystems/package-manager-aware
Package manager awareness
2 parents 3eca148 + 0ee080e commit fb1ef36

File tree

10 files changed

+101
-192
lines changed

10 files changed

+101
-192
lines changed

cls/SourceControl/Git/Extension.cls

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Method UserAction(Type As %Integer, Name As %String, InternalName As %String, Se
4141
quit $$$OK
4242
}
4343
set InternalName = ##class(Utils).NormalizeInternalName(InternalName)
44+
set context = ##class(SourceControl.Git.PackageManagerContext).ForInternalName(InternalName)
4445
set ec = ##class(Utils).UserAction(InternalName, Name, .Target, .Action, .Reload)
4546
quit ec
4647
}
@@ -53,6 +54,7 @@ Method AfterUserAction(Type As %Integer, Name As %String, InternalName As %Strin
5354
quit $$$OK
5455
}
5556
set InternalName = ##class(Utils).NormalizeInternalName(InternalName)
57+
set context = ##class(SourceControl.Git.PackageManagerContext).ForInternalName(InternalName)
5658
set ec = ##class(Utils).AfterUserAction(Type, Name, InternalName, .Answer, .Msg, .Reload)
5759
quit ec
5860
}
@@ -133,7 +135,7 @@ Method OnSourceMenuContextItem(itemName As %String, menuItemName As %String, ByR
133135
set Enabled = -1
134136
} elseif $F(itemName,",") > 0 { //if more than one item is selected, we can only add/remove, no diff or blame
135137
set Enabled = $case(menuItemName,"%AddToSC":1,"%RemoveFromSC":1,:-1)
136-
} elseif ##class(Utils).IsInSourceControl(##class(Utils).NormalizeInternalName(itemName)) {
138+
} elseif ##class(Utils).IsInSourceControl(itemName) {
137139
set Enabled = $Case(menuItemName, "%AddToSC":-1,:1)
138140
} else {
139141
set Enabled = $Case(menuItemName, "%AddToSC":1,:-1)
@@ -148,6 +150,9 @@ Method OnSourceMenuContextItem(itemName As %String, menuItemName As %String, ByR
148150
/// this menu item from the list totally, 0 will gray the menu item out and the default 1 will display the menu item as normal.
149151
Method OnMenuItem(MenuName As %String, InternalName As %String, SelectedText As %String, ByRef Enabled As %Boolean, ByRef DisplayName As %String) As %Status
150152
{
153+
set InternalName = ##class(Utils).NormalizeInternalName(InternalName)
154+
set context = ##class(SourceControl.Git.PackageManagerContext).ForInternalName(InternalName)
155+
151156
#dim menu As %String= $Piece(MenuName,",")
152157
#dim name As %String = $Piece(MenuName,",",2)
153158
if menu = "%SourceContext", name = "" {
@@ -170,6 +175,7 @@ Method OnMenuItem(MenuName As %String, InternalName As %String, SelectedText As
170175
/// to load the item from an external format.
171176
Method OnBeforeLoad(InternalName As %String) As %Status
172177
{
178+
set context = ##class(SourceControl.Git.PackageManagerContext).ForInternalName(InternalName)
173179
set InternalName = ##class(Utils).NormalizeInternalName(InternalName)
174180
if ##class(Utils).IsInSourceControl(InternalName) {
175181
quit ##class(Utils).ImportItem(InternalName)
@@ -186,6 +192,7 @@ Method OnAfterSave(InternalName As %String, Object As %RegisteredObject = {$$$NU
186192
set sc = $$$OK
187193
try {
188194
set InternalName = ##class(Utils).NormalizeInternalName(InternalName)
195+
set context = ##class(SourceControl.Git.PackageManagerContext).ForInternalName(InternalName)
189196
if ##class(Utils).IsNamespaceInGit() && ..IsInSourceControl(InternalName) {
190197
set filename = ##class(Utils).FullExternalName(InternalName)
191198
$$$ThrowOnError(##class(Utils).RemoveRoutineTSH(InternalName))
@@ -216,6 +223,7 @@ InternalName'="" && ##class(Utils).IsInSourceControl(##class(Utils).NormalizeInt
216223
/// Called after an item is deleted.
217224
Method OnAfterDelete(InternalName As %String) As %Status
218225
{
226+
set context = ##class(SourceControl.Git.PackageManagerContext).ForInternalName(InternalName)
219227
set InternalName = ##class(Utils).NormalizeInternalName(InternalName)
220228
if ##class(Utils).IsInSourceControl(InternalName) {
221229
quit ##class(Utils).DeleteExternalFile(InternalName)
@@ -240,7 +248,7 @@ Method IsReadOnly(InternalName As %String) As %Boolean
240248
/// Check if another user has committed any changes to the item and return the status
241249
Method GetStatus(InternalName As %String, ByRef IsInSourceControl As %Boolean, ByRef Editable As %Boolean, ByRef IsCheckedOut As %Boolean, ByRef UserCheckedOut As %String) As %Status
242250
{
243-
#; Quit ##super(InternalName,.IsInSourceControl,.Editable,.IsCheckedOut,.UserCheckedOut)
251+
set context = ##class(SourceControl.Git.PackageManagerContext).ForInternalName(InternalName)
244252
set Editable='..IsReadOnly(),IsCheckedOut=1,UserCheckedOut=""
245253
set filename=##class(SourceControl.Git.Utils).FullExternalName(InternalName)
246254
set IsInSourceControl=(filename'=""&&($$$FileExists(filename)))
@@ -250,7 +258,7 @@ Method GetStatus(InternalName As %String, ByRef IsInSourceControl As %Boolean, B
250258
if '$$$FileExists(filename) {
251259
set IsCheckedOut=0
252260
}
253-
do ##class(Utils).GitStatus(.files)
261+
do ##class(SourceControl.Git.Utils).GitStatus(.files)
254262
if $Get(files(InternalName)) '= "" {
255263
///it's in source control, checked out, and should be locked to editing by other users
256264
///find out who has it edited
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
Class SourceControl.Git.PackageManagerContext Extends %ZPM.PackageManager.Core.Singleton
2+
{
3+
4+
Property InternalName As %String;
5+
6+
Property IsInDefaultPackage As %Boolean [ InitialExpression = 0 ];
7+
8+
Property IsInGitEnabledPackage As %Boolean [ InitialExpression = 0 ];
9+
10+
Property Package As %ZPM.PackageManager.Developer.Module [ InitialExpression = {$$$NULLOREF} ];
11+
12+
Property ResourceReference As %ZPM.PackageManager.Developer.ResourceReference [ InitialExpression = {$$$NULLOREF} ];
13+
14+
Method InternalNameSet(InternalName As %String = "") As %Status
15+
{
16+
if (InternalName '= i%InternalName) {
17+
set i%InternalName = InternalName
18+
set ..Package = ##class(%ZPM.PackageManager.Developer.Extension.Utils).FindHomeModule(InternalName,,.resourceReference)
19+
set ..ResourceReference = resourceReference
20+
set ..IsInGitEnabledPackage = $IsObject(..Package) && ##class(%Library.File).DirectoryExists(##class(%Library.File).NormalizeFilename(".git",..Package.Root))
21+
set ..IsInDefaultPackage = $IsObject(..Package) && (##class(%Library.File).NormalizeDirectory(..Package.Root) = ##class(%Library.File).NormalizeDirectory(##class(SourceControl.Git.Utils).TempFolder()))
22+
}
23+
quit $$$OK
24+
}
25+
26+
ClassMethod ForInternalName(InternalName As %String = "") As SourceControl.Git.PackageManagerContext
27+
{
28+
set instance = ..%Get()
29+
set instance.InternalName = InternalName
30+
quit instance
31+
}
32+
33+
Method Dump()
34+
{
35+
write !,"Package manager context: "
36+
write !?4,"InternalName: ",..InternalName
37+
write !?4,"Package: ",$Select($IsObject(..Package):..Package.Name,1:"<none>")
38+
write !?4,"Resource: ",$Select($IsObject(..ResourceReference):..ResourceReference.Name,1:"<none>")
39+
write !?4,"Default? ",$Select(..IsInDefaultPackage:"Yes",1:"No")
40+
write !?4,"Git-enabled? ",$Select(..IsInGitEnabledPackage:"Yes",1:"No"),!
41+
}
42+
43+
}
44+

cls/SourceControl/Git/Utils.cls

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,13 @@ ClassMethod MakeError(msg As %String) As %Status [ CodeMode = expression, Privat
3434
$$$ERROR(8012,"Git",msg)
3535
}
3636

37-
ClassMethod TempFolder() As %String [ CodeMode = expression ]
37+
ClassMethod TempFolder() As %String
3838
{
39-
$Get(@..#Storage@("settings","namespaceTemp"),..DefaultTemp()_$Translate($znspace,"%")_..#Slash)
39+
Set context = ##class(SourceControl.Git.PackageManagerContext).%Get()
40+
If context.IsInGitEnabledPackage {
41+
Quit context.Package.Root
42+
}
43+
Quit $Get(@..#Storage@("settings","namespaceTemp"),..DefaultTemp()_$Translate($znspace,"%")_..#Slash)
4044
}
4145

4246
ClassMethod MappingsNode() As %String [ CodeMode = expression ]
@@ -153,7 +157,7 @@ ClassMethod UserAction(InternalName As %String, MenuName As %String, ByRef Targe
153157
}
154158
} elseif (menuItemName = "%GitWebUI") {
155159
set Action = 2
156-
set Target = "/isc/studio/usertemplates/gitsourcecontrol/webuidriver.csp/"_$namespace
160+
set Target = "/isc/studio/usertemplates/gitsourcecontrol/webuidriver.csp/"_$namespace_"/"_$ZConvert(InternalName,"O","URL")
157161
} elseif (menuItemName = "%Export") || (menuItemName = "%ExportForce") {
158162
write "==export start==",!
159163
set ec = ..ExportAll($case(menuItemName="%ExportForce",1:$$$Force,:0))
@@ -603,20 +607,26 @@ ClassMethod FindInCspFolders(InternalName As %String, ByRef sourceControlItem As
603607
ClassMethod IsInSourceControl(InternalName As %String, ByRef sourceControlItem As %String) As %String
604608
{
605609
#dim isInSourceControl As %Boolean = 1
606-
610+
set sourceControlItem = ""
611+
set context = ##class(SourceControl.Git.PackageManagerContext).%Get()
607612
if $Data(@..#Storage@("items", ..NormalizeExtension(InternalName))) {
608613
set InternalName = ..NormalizeExtension(InternalName)
609614
}
610615

611616
set isInSourceControl = $Data(@..#Storage@("items", InternalName)) > 0
612617
if isInSourceControl {
618+
// Direct reference to namespace-default project
613619
set sourceControlItem = InternalName
614-
}else {
615-
//if no direct reference maybe we have to look in packages, projects or csp-apps ?
616-
//We have three groups of routines
617-
//packages for classes
618-
//projects for everything
619-
//csp-folders for csp and static files
620+
} elseif context.IsInGitEnabledPackage && (InternalName = context.InternalName) {
621+
// Next thing to check is if we're in a package manager-based package
622+
set isInSourceControl = 1
623+
set sourceControlItem = context.ResourceReference.Name
624+
} else {
625+
// If no direct or package reference, look in packages, projects or csp-apps
626+
// We have three groups of routines
627+
// packages for classes
628+
// projects for everything
629+
// csp-folders for csp and static files
620630

621631
#dim type As %String = ..Type(InternalName)
622632
if type = "cls" {
@@ -638,7 +648,6 @@ ClassMethod IsInSourceControl(InternalName As %String, ByRef sourceControlItem A
638648
set isInSourceControl = ..FindInProjects(InternalName, .sourceControlItem)
639649
}
640650
}
641-
//w "checking ", $G(type), " ", InternalName, "=", isInSourceControl, !
642651
quit isInSourceControl
643652
}
644653

@@ -950,8 +959,6 @@ ClassMethod ExportItem(InternalName As %String, expand As %Boolean = 1, force As
950959
write "exporting new version of ", InternalName, " to ", filename,!
951960
$$$QuitOnError($system.OBJ.ExportUDL(InternalName, filename,"-d/diff"))
952961
$$$QuitOnError(..UpdateRoutineTSH(InternalName, $Horolog))
953-
} else {
954-
write !,InternalName, " is not newer than on-disk version, skipping export"
955962
}
956963
}
957964
quit $$$OK
@@ -1163,6 +1170,11 @@ ClassMethod GitStatus(ByRef files)
11631170
ClassMethod Name(InternalName As %String) As %String
11641171
{
11651172
Set InternalName=##class(%Studio.SourceControl.Interface).normalizeName(InternalName)
1173+
Set context = ##class(SourceControl.Git.PackageManagerContext).%Get()
1174+
If (context.IsInGitEnabledPackage) && (InternalName = context.InternalName) && $IsObject(context.ResourceReference) {
1175+
Set relativePath = context.ResourceReference.Processor.OnItemRelativePath(InternalName)
1176+
Quit relativePath
1177+
}
11661178
Set usertype=$system.CLS.IsMthd("%Library.RoutineMgr","UserType")
11671179

11681180
// For an abstract document, use the GetOther() method to try to determine its "real" class

cls/SourceControl/Git/WebUIDriver.cls

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
Class SourceControl.Git.WebUIDriver
22
{
33

4-
ClassMethod HandleRequest(pagePath As %String, Output handled As %Boolean = 0, Output %data As %Stream.Object)
4+
ClassMethod HandleRequest(pagePath As %String, InternalName As %String = "", Output handled As %Boolean = 0, Output %data As %Stream.Object)
55
{
6+
set context = ##class(SourceControl.Git.PackageManagerContext).ForInternalName(InternalName)
67
kill %data
78
#dim %response As %CSP.Response
89
#dim %request As %CSP.Request

csp/webuidriver.csp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
set url = $Piece($Get(%request.CgiEnvs("REQUEST_URI"),$Get(%request.CgiEnvs("HTTP_URL"))),"?")
33
set pagePath = $Piece(url,..#CSPURL,2,*)
44
set namespace = $Piece(pagePath,"/",2)
5-
set resource = $Piece(pagePath,"/",3,*)
6-
set %base = $Piece(url,..#CSPURL,1)_..#CSPURL_"/"_namespace_"/"
5+
set internalName = $ZConvert($Piece(pagePath,"/",3),"I","URL")
6+
set resource = $Piece(pagePath,"/",4,*)
7+
set %base = $Piece(url,..#CSPURL,1)_..#CSPURL_"/"_namespace_"/"_$ZConvert(internalName,"O","URL")_"/"
78

89
new $NAMESPACE
910
set $NAMESPACE = namespace
@@ -39,7 +40,7 @@
3940
}
4041

4142
// Handles HTTP requests to /api/ (everything new) plus things previously sent to the Python backend
42-
do ##class(SourceControl.Git.WebUIDriver).HandleRequest("/"_resource, .handled, .%data)
43+
do ##class(SourceControl.Git.WebUIDriver).HandleRequest("/"_resource, internalName, .handled, .%data)
4344
if handled {
4445
kill %base
4546
quit 1

0 commit comments

Comments
 (0)