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 3b38c759..162853f7 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 { @@ -293,9 +293,41 @@ func (s *server) readFileInWorkspace(w http.ResponseWriter, r *http.Request) { 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 { + writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to run program: %w", err)) + return + } + + writeResponse(logger, w, map[string]any{"stdout": out}) +} + 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 +349,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 {