From 03e013e4510bee824eaa44aa087bb6ce86a53330 Mon Sep 17 00:00:00 2001 From: Donnie Adams Date: Thu, 13 Feb 2025 09:48:30 -0500 Subject: [PATCH 1/2] enhance: add option to return revision ID when reading file in workspace Signed-off-by: Donnie Adams --- pkg/sdkserver/workspaces.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/pkg/sdkserver/workspaces.go b/pkg/sdkserver/workspaces.go index 3b38c759..e878fd77 100644 --- a/pkg/sdkserver/workspaces.go +++ b/pkg/sdkserver/workspaces.go @@ -187,7 +187,7 @@ type writeFileInWorkspaceRequest struct { FilePath string `json:"filePath"` Contents string `json:"contents"` CreateRevision *bool `json:"createRevision"` - LatestRevision string `json:"latestRevision"` + LatestRevisionID string `json:"latestRevisionID"` } func (s *server) writeFileInWorkspace(w http.ResponseWriter, r *http.Request) { @@ -209,8 +209,8 @@ func (s *server) writeFileInWorkspace(w http.ResponseWriter, r *http.Request) { prg, s.getServerToolsEnv(reqObject.Env), fmt.Sprintf( - `{"workspace_id": "%s", "file_path": "%s", "body": "%s", "create_revision": %t, "latest_revision": "%s"}`, - reqObject.ID, reqObject.FilePath, reqObject.Contents, reqObject.CreateRevision == nil || *reqObject.CreateRevision, reqObject.LatestRevision, + `{"workspace_id": "%s", "file_path": "%s", "body": "%s", "create_revision": %t, "latest_revision_id": "%s"}`, + reqObject.ID, reqObject.FilePath, reqObject.Contents, reqObject.CreateRevision == nil || *reqObject.CreateRevision, reqObject.LatestRevisionID, ), ) if err != nil { @@ -260,6 +260,7 @@ func (s *server) removeFileInWorkspace(w http.ResponseWriter, r *http.Request) { type readFileInWorkspaceRequest struct { workspaceCommonRequest `json:",inline"` FilePath string `json:"filePath"` + WithLatestRevisionID bool `json:"withLatestRevisionID"` } func (s *server) readFileInWorkspace(w http.ResponseWriter, r *http.Request) { @@ -281,8 +282,8 @@ func (s *server) readFileInWorkspace(w http.ResponseWriter, r *http.Request) { prg, s.getServerToolsEnv(reqObject.Env), fmt.Sprintf( - `{"workspace_id": "%s", "file_path": "%s"}`, - reqObject.ID, reqObject.FilePath, + `{"workspace_id": "%s", "file_path": "%s", "with_latest_revision_id": "%v"}`, + reqObject.ID, reqObject.FilePath, reqObject.WithLatestRevisionID, ), ) if err != nil { @@ -296,6 +297,7 @@ func (s *server) readFileInWorkspace(w http.ResponseWriter, r *http.Request) { type statFileInWorkspaceRequest struct { workspaceCommonRequest `json:",inline"` FilePath string `json:"filePath"` + WithLatestRevisionID bool `json:"withLatestRevisionID"` } func (s *server) statFileInWorkspace(w http.ResponseWriter, r *http.Request) { @@ -317,8 +319,8 @@ func (s *server) statFileInWorkspace(w http.ResponseWriter, r *http.Request) { prg, s.getServerToolsEnv(reqObject.Env), fmt.Sprintf( - `{"workspace_id": "%s", "file_path": "%s"}`, - reqObject.ID, reqObject.FilePath, + `{"workspace_id": "%s", "file_path": "%s", "with_latest_revision_id": "%v"}`, + reqObject.ID, reqObject.FilePath, reqObject.WithLatestRevisionID, ), ) if err != nil { From 30300a3aefcb4303dc0b2ea593e1abb164b057e9 Mon Sep 17 00:00:00 2001 From: Donnie Adams Date: Wed, 19 Feb 2025 06:36:34 -0500 Subject: [PATCH 2/2] Read with revision updates Signed-off-by: Donnie Adams --- pkg/sdkserver/routes.go | 1 + pkg/sdkserver/workspaces.go | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/pkg/sdkserver/routes.go b/pkg/sdkserver/routes.go index c4b45e92..1431b73b 100644 --- a/pkg/sdkserver/routes.go +++ b/pkg/sdkserver/routes.go @@ -79,6 +79,7 @@ func (s *server) addRoutes(mux *http.ServeMux) { mux.HandleFunc("POST /workspaces/write-file", s.writeFileInWorkspace) mux.HandleFunc("POST /workspaces/delete-file", s.removeFileInWorkspace) mux.HandleFunc("POST /workspaces/read-file", s.readFileInWorkspace) + mux.HandleFunc("POST /workspaces/read-file-with-revision", s.readFileWithRevisionInWorkspace) mux.HandleFunc("POST /workspaces/stat-file", s.statFileInWorkspace) mux.HandleFunc("POST /workspaces/list-revisions", s.listRevisions) mux.HandleFunc("POST /workspaces/get-revision", s.getRevisionForFileInWorkspace) diff --git a/pkg/sdkserver/workspaces.go b/pkg/sdkserver/workspaces.go index e878fd77..162853f7 100644 --- a/pkg/sdkserver/workspaces.go +++ b/pkg/sdkserver/workspaces.go @@ -260,7 +260,6 @@ func (s *server) removeFileInWorkspace(w http.ResponseWriter, r *http.Request) { type readFileInWorkspaceRequest struct { workspaceCommonRequest `json:",inline"` FilePath string `json:"filePath"` - WithLatestRevisionID bool `json:"withLatestRevisionID"` } func (s *server) readFileInWorkspace(w http.ResponseWriter, r *http.Request) { @@ -282,8 +281,39 @@ func (s *server) readFileInWorkspace(w http.ResponseWriter, r *http.Request) { prg, s.getServerToolsEnv(reqObject.Env), fmt.Sprintf( - `{"workspace_id": "%s", "file_path": "%s", "with_latest_revision_id": "%v"}`, - reqObject.ID, reqObject.FilePath, reqObject.WithLatestRevisionID, + `{"workspace_id": "%s", "file_path": "%s"}`, + reqObject.ID, reqObject.FilePath, + ), + ) + if err != nil { + writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to run program: %w", err)) + return + } + + writeResponse(logger, w, map[string]any{"stdout": out}) +} + +func (s *server) readFileWithRevisionInWorkspace(w http.ResponseWriter, r *http.Request) { + logger := gcontext.GetLogger(r.Context()) + var reqObject readFileInWorkspaceRequest + if err := json.NewDecoder(r.Body).Decode(&reqObject); err != nil { + writeError(logger, w, http.StatusBadRequest, fmt.Errorf("invalid request body: %w", err)) + return + } + + prg, err := loader.Program(r.Context(), s.getWorkspaceTool(reqObject.workspaceCommonRequest), "Read File With Revision In Workspace", loader.Options{Cache: s.client.Cache}) + if err != nil { + writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err)) + return + } + + out, err := s.client.Run( + r.Context(), + prg, + s.getServerToolsEnv(reqObject.Env), + fmt.Sprintf( + `{"workspace_id": "%s", "file_path": "%s", "with_latest_revision_id": "true"}`, + reqObject.ID, reqObject.FilePath, ), ) if err != nil {