Skip to content

enhance: add support for disabling the creation of file revisions #91

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions workspace.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -130,18 +131,22 @@ 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 == "" {
opt.WorkspaceID = os.Getenv("GPTSCRIPT_WORKSPACE_ID")
}

_, 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
Expand Down
170 changes: 170 additions & 0 deletions workspace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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")
Expand Down
Loading