Skip to content

Commit f296f28

Browse files
committed
fix: no longer use variadic args because argument stack runs out of room
1 parent 093ec2e commit f296f28

File tree

5 files changed

+45
-4
lines changed

5 files changed

+45
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Fixed
1111
- Fixed Import All deploying changes to files in a CSP application (#828)
12+
- Fixed an error when discarding a large number of changes through the Web UI (#845)
1213

1314
## [2.13.0] - 2025-08-20
1415

cls/SourceControl/Git/Utils.cls

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1866,8 +1866,14 @@ ClassMethod RunGitCommand(command As %String, Output errStream, Output outStream
18661866
quit ..RunGitCommandWithInput(command,,.errStream,.outStream,args...)
18671867
}
18681868

1869-
ClassMethod RunGitCommandWithInput(command As %String, inFile As %String = "", Output errStream, Output outStream, args...) As %Integer
1869+
ClassMethod RunGitCommandWithInput(command As %String, inFile As %String = "", Output errStream, Output outStream, pArgs...) As %Integer
18701870
{
1871+
// pArgs may be a variable number of arguments or a single multidimensional array
1872+
if ($get(pArgs) = 1) && ($data(pArgs(1)) >= 10) {
1873+
merge args = pArgs(1)
1874+
} else {
1875+
merge args = pArgs
1876+
}
18711877
// Special case: git --version is used internally even when the settings incorporated here may be invalid/unspecified.
18721878
set tempFolder = ..TempFolder()
18731879
if (command '= "--version") {

cls/SourceControl/Git/WebUIDriver.cls

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ ClassMethod HandleRequest(pagePath As %String, InternalName As %String = "", Out
264264

265265
set inFile = ""
266266
if (gitCmd = "stash") {
267-
set st = ##class(SourceControl.Git.Utils).RunGitAndHandleMerge("-c",inFile, .resolver, .succeeded, .returnCode, .errStream, .outStream, argsArr...)
267+
set st = ##class(SourceControl.Git.Utils).RunGitAndHandleMerge("-c",inFile, .resolver, .succeeded, .returnCode, .errStream, .outStream, .argsArr)
268268

269269
set %data = ##class(%Stream.TmpCharacter).%New()
270270
set changeTerminators = (%data.LineTerminator '= $char(13,10))
@@ -287,7 +287,7 @@ ClassMethod HandleRequest(pagePath As %String, InternalName As %String = "", Out
287287
do %data.Write("Git-Return-Code: " _ returnCode) // No ending newline expected
288288
do %data.Rewind()
289289
} else {
290-
set returnCode = ##class(SourceControl.Git.Utils).RunGitCommandWithInput("-c", inFile, .errStream, .outStream, argsArr...)
290+
set returnCode = ##class(SourceControl.Git.Utils).RunGitCommandWithInput("-c", inFile, .errStream, .outStream, .argsArr)
291291
do ..ConvertGitOutput(.outStream,.errStream,returnCode,.%data)
292292
}
293293
set handled = 1

test/UnitTest/SourceControl/Git/AbstractTest.cls

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ Property InitialExtension As %String [ InitialExpression = {##class(%Studio.Sour
55

66
Property SourceControlGlobal [ MultiDimensional ];
77

8+
Property TempGitRepoPath As %String;
9+
810
Method %OnNew(initvalue) As %Status
911
{
1012
Merge ..SourceControlGlobal = ^SYS("SourceControl")
1113
Kill ^SYS("SourceControl")
1214
Set settings = ##class(SourceControl.Git.Settings).%New()
13-
Set settings.namespaceTemp = ##class(%Library.File).TempFilename()_"dir"
15+
set ..TempGitRepoPath = ##class(%Library.File).TempFilename()_"dir"
16+
Set settings.namespaceTemp = ..TempGitRepoPath
1417
Set settings.Mappings("CLS","*")="cls/"
1518
Do settings.%Save()
1619
Do ##class(%Studio.SourceControl.Interface).SourceControlClassSet("SourceControl.Git.Extension")
@@ -19,6 +22,7 @@ Method %OnNew(initvalue) As %Status
1922

2023
Method %OnClose() As %Status [ Private, ServerOnly = 1 ]
2124
{
25+
Do ##class(%File).RemoveDirectoryTree(..TempGitRepoPath)
2226
Do ##class(%Studio.SourceControl.Interface).SourceControlClassSet(..InitialExtension)
2327
Kill ^SYS("SourceControl")
2428
Merge ^SYS("SourceControl") = ..SourceControlGlobal
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
Class UnitTest.SourceControl.Git.WebUIDriver Extends UnitTest.SourceControl.Git.AbstractTest
2+
{
3+
4+
Method TestRevertManyFiles()
5+
{
6+
set oldSession = $get(%session), oldRequest = $get(%request), oldResponse = $get(%response)
7+
set %session = ##class(%CSP.Session).%New(999,0)
8+
set %request = ##class(%CSP.Request).%New()
9+
set %response = ##class(%CSP.Response).%New()
10+
do ##class(SourceControl.Git.Utils).Init()
11+
set requestBody = {"command": ["clean","-f","--"]}
12+
for i=1:1:500 {
13+
set fileRelPath = "txt/test"_i_".txt"
14+
do ..WriteFile(..TempGitRepoPath_"/"_fileRelPath, "automated testing")
15+
do requestBody.command.%Push(fileRelPath)
16+
}
17+
do $$$AssertTrue(##class(%File).Exists(..TempGitRepoPath_"/txt/test1.txt"))
18+
do $$$AssertTrue(##class(%File).Exists(..TempGitRepoPath_"/txt/test500.txt"))
19+
set %request.Content = ##class(%CSP.CharacterStream).%New()
20+
set %request.Method = "POST"
21+
do requestBody.%ToJSON(%request.Content)
22+
do ##class(SourceControl.Git.WebUIDriver).HandleRequest("/git-command",,.handled,.data)
23+
do $$$LogMessage(data.Read())
24+
do $$$AssertTrue(handled)
25+
do $$$AssertNotTrue(##class(%File).Exists(..TempGitRepoPath_"/txt/test1.txt"))
26+
do $$$AssertNotTrue(##class(%File).Exists(..TempGitRepoPath_"/txt/test500.txt"))
27+
set %session = $get(oldSession), %request = $get(oldRequest), %response = $get(oldResponse)
28+
}
29+
30+
}

0 commit comments

Comments
 (0)