77 "errors"
88 "fmt"
99 "os"
10+ "slices"
1011
1112 "obot-platform/database/pkg/cmd"
1213
@@ -24,23 +25,29 @@ func main() {
2425 }
2526 command := os .Args [1 ]
2627
27- g , err := gptscript .NewGPTScript ()
28+ g , err := gptscript .NewGPTScript (
29+ gptscript.GlobalOptions {
30+ WorkspaceTool : "github.com/thedadams/workspace-provider@open-file-with-revision-id" ,
31+ },
32+ )
2833 if err != nil {
2934 fmt .Printf ("Error creating GPTScript: %v\n " , err )
3035 os .Exit (1 )
3136 }
3237 defer g .Close ()
3338
3439 var (
35- ctx = context .Background ()
36- dbFileName = "acorn.db"
37- dbWorkspacePath = "/databases/" + dbFileName
40+ ctx = context .Background ()
41+ dbFileName = "acorn.db"
42+ dbWorkspacePath = "/databases/" + dbFileName
43+ revisionID string = "-1"
44+ initialDBData []byte
3845 )
3946
40- // Read the database file from the workspace
41- initialDBData , err := g .ReadFileInWorkspace (ctx , dbWorkspacePath , gptscript.ReadFileInWorkspaceOptions {
47+ workspaceDB , err := g .ReadFileWithRevisionInWorkspace (ctx , dbWorkspacePath , gptscript.ReadFileInWorkspaceOptions {
4248 WorkspaceID : workspaceID ,
4349 })
50+
4451 var notFoundErr * gptscript.NotFoundInWorkspaceError
4552 if err != nil && ! errors .As (err , & notFoundErr ) {
4653 fmt .Printf ("Error reading DB file: %v\n " , err )
@@ -57,11 +64,15 @@ func main() {
5764 defer os .Remove (dbFile .Name ())
5865
5966 // Write the data to the temporary file
60- if initialDBData != nil {
67+ if workspaceDB != nil && workspaceDB .Content != nil {
68+ initialDBData = workspaceDB .Content
6169 if err := os .WriteFile (dbFile .Name (), initialDBData , 0644 ); err != nil {
6270 fmt .Printf ("Error writing to temp file: %v\n " , err )
6371 os .Exit (1 )
6472 }
73+ if workspaceDB .RevisionID != "" {
74+ revisionID = workspaceDB .RevisionID
75+ }
6576 }
6677
6778 // Run the requested command
@@ -74,7 +85,7 @@ func main() {
7485 case "runDatabaseSQL" :
7586 result , err = cmd .RunDatabaseCommand (ctx , dbFile , os .Getenv ("SQL" ), "-header" )
7687 if err == nil {
77- err = saveWorkspaceDB (ctx , g , dbWorkspacePath , dbFile , initialDBData )
88+ err = saveWorkspaceDB (ctx , g , dbWorkspacePath , revisionID , dbFile , initialDBData )
7889 }
7990 case "databaseContext" :
8091 result , err = cmd .DatabaseContext (ctx , dbFile )
@@ -95,6 +106,7 @@ func saveWorkspaceDB(
95106 ctx context.Context ,
96107 g * gptscript.GPTScript ,
97108 dbWorkspacePath string ,
109+ revisionID string ,
98110 dbFile * os.File ,
99111 initialDBData []byte ,
100112) error {
@@ -108,11 +120,38 @@ func saveWorkspaceDB(
108120 }
109121
110122 if err := g .WriteFileInWorkspace (ctx , dbWorkspacePath , updatedDBData , gptscript.WriteFileInWorkspaceOptions {
111- WorkspaceID : workspaceID ,
123+ WorkspaceID : workspaceID ,
124+ CreateRevision : & ([]bool {true }[0 ]),
125+ LatestRevisionID : revisionID ,
112126 }); err != nil {
113127 return fmt .Errorf ("Error writing updated DB file to workspace: %v" , err )
114128 }
115129
130+ // Delete old revisions after successfully writing the new revision
131+ revisions , err := g .ListRevisionsForFileInWorkspace (ctx , dbWorkspacePath , gptscript.ListRevisionsForFileInWorkspaceOptions {
132+ WorkspaceID : workspaceID ,
133+ })
134+ if err != nil {
135+ fmt .Fprintf (os .Stderr , "Error listing revisions: %v\n " , err )
136+ return nil
137+ }
138+
139+ lastRevisionIndex := slices .IndexFunc (revisions , func (rev gptscript.FileInfo ) bool {
140+ return rev .RevisionID == revisionID
141+ })
142+
143+ if lastRevisionIndex < 0 {
144+ return nil
145+ }
146+
147+ for _ , rev := range revisions [:lastRevisionIndex + 1 ] {
148+ if err := g .DeleteRevisionForFileInWorkspace (ctx , dbWorkspacePath , rev .RevisionID , gptscript.DeleteRevisionForFileInWorkspaceOptions {
149+ WorkspaceID : workspaceID ,
150+ }); err != nil {
151+ fmt .Fprintf (os .Stderr , "Error deleting revision %s: %v\n " , rev .RevisionID , err )
152+ }
153+ }
154+
116155 return nil
117156}
118157
0 commit comments