diff --git a/workspace.go b/workspace.go index 321602a..d04a2e6 100644 --- a/workspace.go +++ b/workspace.go @@ -121,7 +121,8 @@ func (g *GPTScript) RemoveAll(ctx context.Context, opts ...RemoveAllOptions) err } type WriteFileInWorkspaceOptions struct { - WorkspaceID string + WorkspaceID string + CreateRevision *bool } func (g *GPTScript) WriteFileInWorkspace(ctx context.Context, filePath string, contents []byte, opts ...WriteFileInWorkspaceOptions) error { @@ -130,6 +131,9 @@ func (g *GPTScript) WriteFileInWorkspace(ctx context.Context, filePath string, c if o.WorkspaceID != "" { opt.WorkspaceID = o.WorkspaceID } + if o.CreateRevision != nil { + opt.CreateRevision = o.CreateRevision + } } if opt.WorkspaceID == "" { @@ -137,11 +141,12 @@ func (g *GPTScript) WriteFileInWorkspace(ctx context.Context, filePath string, c } _, err := g.runBasicCommand(ctx, "workspaces/write-file", map[string]any{ - "id": opt.WorkspaceID, - "contents": base64.StdEncoding.EncodeToString(contents), - "filePath": filePath, - "workspaceTool": g.globalOpts.WorkspaceTool, - "env": g.globalOpts.Env, + "id": opt.WorkspaceID, + "contents": base64.StdEncoding.EncodeToString(contents), + "filePath": filePath, + "createRevision": opt.CreateRevision, + "workspaceTool": g.globalOpts.WorkspaceTool, + "env": g.globalOpts.Env, }) return err diff --git a/workspace_test.go b/workspace_test.go index 95829c7..601d614 100644 --- a/workspace_test.go +++ b/workspace_test.go @@ -224,6 +224,89 @@ func TestRevisionsForFileInWorkspace(t *testing.T) { } } +func TestDisableCreateRevisionsForFileInWorkspace(t *testing.T) { + id, err := g.CreateWorkspace(context.Background(), "directory") + if err != nil { + t.Fatalf("Error creating workspace: %v", err) + } + + t.Cleanup(func() { + err := g.DeleteWorkspace(context.Background(), id) + if err != nil { + t.Errorf("Error deleting workspace: %v", err) + } + }) + + err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test0"), WriteFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Fatalf("Error creating file: %v", err) + } + + err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test1"), WriteFileInWorkspaceOptions{WorkspaceID: id, CreateRevision: new(bool)}) + if err != nil { + t.Fatalf("Error creating file: %v", err) + } + + err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test2"), WriteFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Fatalf("Error creating file: %v", err) + } + + revisions, err := g.ListRevisionsForFileInWorkspace(context.Background(), "test.txt", ListRevisionsForFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Errorf("Error reading file: %v", err) + } + + if len(revisions) != 1 { + t.Errorf("Unexpected number of revisions: %d", len(revisions)) + } + + for i, rev := range revisions { + if rev.WorkspaceID != id { + t.Errorf("Unexpected file workspace ID: %v", rev.WorkspaceID) + } + + if rev.Name != "test.txt" { + t.Errorf("Unexpected file name: %s", rev.Name) + } + + if rev.Size != 5 { + t.Errorf("Unexpected file size: %d", rev.Size) + } + + if rev.ModTime.IsZero() { + t.Errorf("Unexpected file mod time: %v", rev.ModTime) + } + + if rev.MimeType != "text/plain" { + t.Errorf("Unexpected file mime type: %s", rev.MimeType) + } + + if rev.RevisionID != fmt.Sprintf("%d", i+1) { + t.Errorf("Unexpected revision ID: %s", rev.RevisionID) + } + } + + err = g.DeleteRevisionForFileInWorkspace(context.Background(), "test.txt", "1", DeleteRevisionForFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Errorf("Error deleting revision for file: %v", err) + } + + revisions, err = g.ListRevisionsForFileInWorkspace(context.Background(), "test.txt", ListRevisionsForFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Errorf("Error reading file: %v", err) + } + + if len(revisions) != 0 { + t.Errorf("Unexpected number of revisions: %d", len(revisions)) + } + + err = g.DeleteFileInWorkspace(context.Background(), "test.txt", DeleteFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Errorf("Error deleting file: %v", err) + } +} + func TestLsComplexWorkspace(t *testing.T) { id, err := g.CreateWorkspace(context.Background(), "directory") if err != nil { @@ -607,6 +690,93 @@ func TestRevisionsForFileInWorkspaceS3(t *testing.T) { } } +func TestDisableCreatingRevisionsForFileInWorkspaceS3(t *testing.T) { + if os.Getenv("AWS_ACCESS_KEY_ID") == "" || os.Getenv("AWS_SECRET_ACCESS_KEY") == "" || os.Getenv("WORKSPACE_PROVIDER_S3_BUCKET") == "" { + t.Skip("Skipping test because AWS credentials are not set") + } + + id, err := g.CreateWorkspace(context.Background(), "s3") + if err != nil { + t.Fatalf("Error creating workspace: %v", err) + } + + t.Cleanup(func() { + err := g.DeleteWorkspace(context.Background(), id) + if err != nil { + t.Errorf("Error deleting workspace: %v", err) + } + }) + + err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test0"), WriteFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Fatalf("Error creating file: %v", err) + } + + err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test1"), WriteFileInWorkspaceOptions{WorkspaceID: id, CreateRevision: new(bool)}) + if err != nil { + t.Fatalf("Error creating file: %v", err) + } + + err = g.WriteFileInWorkspace(context.Background(), "test.txt", []byte("test2"), WriteFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Fatalf("Error creating file: %v", err) + } + + revisions, err := g.ListRevisionsForFileInWorkspace(context.Background(), "test.txt", ListRevisionsForFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Errorf("Error reading file: %v", err) + } + + if len(revisions) != 1 { + t.Errorf("Unexpected number of revisions: %d", len(revisions)) + } + + for i, rev := range revisions { + if rev.WorkspaceID != id { + t.Errorf("Unexpected file workspace ID: %v", rev.WorkspaceID) + } + + if rev.Name != "test.txt" { + t.Errorf("Unexpected file name: %s", rev.Name) + } + + if rev.Size != 5 { + t.Errorf("Unexpected file size: %d", rev.Size) + } + + if rev.ModTime.IsZero() { + t.Errorf("Unexpected file mod time: %v", rev.ModTime) + } + + if rev.MimeType != "text/plain" { + t.Errorf("Unexpected file mime type: %s", rev.MimeType) + } + + if rev.RevisionID != fmt.Sprintf("%d", i+1) { + t.Errorf("Unexpected revision ID: %s", rev.RevisionID) + } + } + + err = g.DeleteRevisionForFileInWorkspace(context.Background(), "test.txt", "1", DeleteRevisionForFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Errorf("Error deleting revision for file: %v", err) + } + + revisions, err = g.ListRevisionsForFileInWorkspace(context.Background(), "test.txt", ListRevisionsForFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Errorf("Error reading file: %v", err) + } + + if len(revisions) != 0 { + t.Errorf("Unexpected number of revisions: %d", len(revisions)) + } + + err = g.DeleteFileInWorkspace(context.Background(), "test.txt", DeleteFileInWorkspaceOptions{WorkspaceID: id}) + if err != nil { + t.Errorf("Error deleting file: %v", err) + } +} + func TestLsComplexWorkspaceS3(t *testing.T) { if os.Getenv("AWS_ACCESS_KEY_ID") == "" || os.Getenv("AWS_SECRET_ACCESS_KEY") == "" || os.Getenv("WORKSPACE_PROVIDER_S3_BUCKET") == "" { t.Skip("Skipping test because AWS credentials are not set")