From f296f28683eab6c29e49da6587deaa6a15f8aa93 Mon Sep 17 00:00:00 2001 From: Pravin Barton <9560941+isc-pbarton@users.noreply.github.com> Date: Thu, 28 Aug 2025 11:54:22 -0400 Subject: [PATCH] fix: no longer use variadic args because argument stack runs out of room --- CHANGELOG.md | 1 + cls/SourceControl/Git/Utils.cls | 8 ++++- cls/SourceControl/Git/WebUIDriver.cls | 4 +-- .../SourceControl/Git/AbstractTest.cls | 6 +++- .../SourceControl/Git/WebUIDriver.cls | 30 +++++++++++++++++++ 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 test/UnitTest/SourceControl/Git/WebUIDriver.cls diff --git a/CHANGELOG.md b/CHANGELOG.md index 920240cd..fbdc75af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed Import All deploying changes to files in a CSP application (#828) +- Fixed an error when discarding a large number of changes through the Web UI (#845) ## [2.13.0] - 2025-08-20 diff --git a/cls/SourceControl/Git/Utils.cls b/cls/SourceControl/Git/Utils.cls index 1ff0b905..c961944c 100644 --- a/cls/SourceControl/Git/Utils.cls +++ b/cls/SourceControl/Git/Utils.cls @@ -1866,8 +1866,14 @@ ClassMethod RunGitCommand(command As %String, Output errStream, Output outStream quit ..RunGitCommandWithInput(command,,.errStream,.outStream,args...) } -ClassMethod RunGitCommandWithInput(command As %String, inFile As %String = "", Output errStream, Output outStream, args...) As %Integer +ClassMethod RunGitCommandWithInput(command As %String, inFile As %String = "", Output errStream, Output outStream, pArgs...) As %Integer { + // pArgs may be a variable number of arguments or a single multidimensional array + if ($get(pArgs) = 1) && ($data(pArgs(1)) >= 10) { + merge args = pArgs(1) + } else { + merge args = pArgs + } // Special case: git --version is used internally even when the settings incorporated here may be invalid/unspecified. set tempFolder = ..TempFolder() if (command '= "--version") { diff --git a/cls/SourceControl/Git/WebUIDriver.cls b/cls/SourceControl/Git/WebUIDriver.cls index a7d808cc..6a2b89c8 100644 --- a/cls/SourceControl/Git/WebUIDriver.cls +++ b/cls/SourceControl/Git/WebUIDriver.cls @@ -264,7 +264,7 @@ ClassMethod HandleRequest(pagePath As %String, InternalName As %String = "", Out set inFile = "" if (gitCmd = "stash") { - set st = ##class(SourceControl.Git.Utils).RunGitAndHandleMerge("-c",inFile, .resolver, .succeeded, .returnCode, .errStream, .outStream, argsArr...) + set st = ##class(SourceControl.Git.Utils).RunGitAndHandleMerge("-c",inFile, .resolver, .succeeded, .returnCode, .errStream, .outStream, .argsArr) set %data = ##class(%Stream.TmpCharacter).%New() set changeTerminators = (%data.LineTerminator '= $char(13,10)) @@ -287,7 +287,7 @@ ClassMethod HandleRequest(pagePath As %String, InternalName As %String = "", Out do %data.Write("Git-Return-Code: " _ returnCode) // No ending newline expected do %data.Rewind() } else { - set returnCode = ##class(SourceControl.Git.Utils).RunGitCommandWithInput("-c", inFile, .errStream, .outStream, argsArr...) + set returnCode = ##class(SourceControl.Git.Utils).RunGitCommandWithInput("-c", inFile, .errStream, .outStream, .argsArr) do ..ConvertGitOutput(.outStream,.errStream,returnCode,.%data) } set handled = 1 diff --git a/test/UnitTest/SourceControl/Git/AbstractTest.cls b/test/UnitTest/SourceControl/Git/AbstractTest.cls index 5fa1e1f2..7b02d6f7 100644 --- a/test/UnitTest/SourceControl/Git/AbstractTest.cls +++ b/test/UnitTest/SourceControl/Git/AbstractTest.cls @@ -5,12 +5,15 @@ Property InitialExtension As %String [ InitialExpression = {##class(%Studio.Sour Property SourceControlGlobal [ MultiDimensional ]; +Property TempGitRepoPath As %String; + Method %OnNew(initvalue) As %Status { Merge ..SourceControlGlobal = ^SYS("SourceControl") Kill ^SYS("SourceControl") Set settings = ##class(SourceControl.Git.Settings).%New() - Set settings.namespaceTemp = ##class(%Library.File).TempFilename()_"dir" + set ..TempGitRepoPath = ##class(%Library.File).TempFilename()_"dir" + Set settings.namespaceTemp = ..TempGitRepoPath Set settings.Mappings("CLS","*")="cls/" Do settings.%Save() Do ##class(%Studio.SourceControl.Interface).SourceControlClassSet("SourceControl.Git.Extension") @@ -19,6 +22,7 @@ Method %OnNew(initvalue) As %Status Method %OnClose() As %Status [ Private, ServerOnly = 1 ] { + Do ##class(%File).RemoveDirectoryTree(..TempGitRepoPath) Do ##class(%Studio.SourceControl.Interface).SourceControlClassSet(..InitialExtension) Kill ^SYS("SourceControl") Merge ^SYS("SourceControl") = ..SourceControlGlobal diff --git a/test/UnitTest/SourceControl/Git/WebUIDriver.cls b/test/UnitTest/SourceControl/Git/WebUIDriver.cls new file mode 100644 index 00000000..dad16ced --- /dev/null +++ b/test/UnitTest/SourceControl/Git/WebUIDriver.cls @@ -0,0 +1,30 @@ +Class UnitTest.SourceControl.Git.WebUIDriver Extends UnitTest.SourceControl.Git.AbstractTest +{ + +Method TestRevertManyFiles() +{ + set oldSession = $get(%session), oldRequest = $get(%request), oldResponse = $get(%response) + set %session = ##class(%CSP.Session).%New(999,0) + set %request = ##class(%CSP.Request).%New() + set %response = ##class(%CSP.Response).%New() + do ##class(SourceControl.Git.Utils).Init() + set requestBody = {"command": ["clean","-f","--"]} + for i=1:1:500 { + set fileRelPath = "txt/test"_i_".txt" + do ..WriteFile(..TempGitRepoPath_"/"_fileRelPath, "automated testing") + do requestBody.command.%Push(fileRelPath) + } + do $$$AssertTrue(##class(%File).Exists(..TempGitRepoPath_"/txt/test1.txt")) + do $$$AssertTrue(##class(%File).Exists(..TempGitRepoPath_"/txt/test500.txt")) + set %request.Content = ##class(%CSP.CharacterStream).%New() + set %request.Method = "POST" + do requestBody.%ToJSON(%request.Content) + do ##class(SourceControl.Git.WebUIDriver).HandleRequest("/git-command",,.handled,.data) + do $$$LogMessage(data.Read()) + do $$$AssertTrue(handled) + do $$$AssertNotTrue(##class(%File).Exists(..TempGitRepoPath_"/txt/test1.txt")) + do $$$AssertNotTrue(##class(%File).Exists(..TempGitRepoPath_"/txt/test500.txt")) + set %session = $get(oldSession), %request = $get(oldRequest), %response = $get(oldResponse) +} + +}