Skip to content
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

fix: ls differentiate exit codes for empty and non-existent buckets #732

Merged
merged 22 commits into from
Jul 10, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
2dbc567
fix: ls differentiate exit codes for empty and non-existent buckets (#1)
tarikozyurtt Jul 4, 2024
f235f22
Merge branch 'master' into master
tarikozyurtt Jul 4, 2024
ffc65a4
Merge branch 'peak:master' into master
tarikozyurtt Jul 4, 2024
0214e65
Merge branch 'peak:master' into master
tarikozyurtt Jul 4, 2024
3f837f4
fix: ls differentiate exit codes for empty and non-existent buckets (#2)
tarikozyurtt Jul 4, 2024
7f1da17
Update e2e/du_test.go
tarikozyurtt Jul 5, 2024
19411ea
Update e2e/ls_test.go
tarikozyurtt Jul 5, 2024
ec32627
Update e2e/ls_test.go
tarikozyurtt Jul 5, 2024
6374ff2
Empty bucket listing error fix (#3)
tarikozyurtt Jul 5, 2024
b9412df
Update du_test.go
tarikozyurtt Jul 5, 2024
e755a04
Update ls_test.go
tarikozyurtt Jul 5, 2024
9998236
fix: ls differentiate exit codes for empty and non-existent buckets
tarikozyurtt Jul 8, 2024
aa50c95
Merge branch 'master' into master
tarikozyurtt Jul 8, 2024
460dcf7
Merge branch 'master' into master
igungor Jul 9, 2024
5b70424
fix: seperate test function for empty bucket case
tarikozyurtt Jul 9, 2024
d783e0f
fix: remove common struct and unneeded fields
tarikozyurtt Jul 9, 2024
30f8872
fix: generalize expected value for empty bucket cases
tarikozyurtt Jul 9, 2024
9a36464
Update e2e/select_test.go
tarikozyurtt Jul 9, 2024
e20b2d3
fix format issue caused by github actions
tarikozyurtt Jul 9, 2024
c1ee826
Merge branch 'master' into master
tarikozyurtt Jul 9, 2024
6c6f030
remove expectError completely
tarikozyurtt Jul 9, 2024
16244b2
revert unneeded naming changes
tarikozyurtt Jul 10, 2024
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
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
# Changelog
## v2.3.0

#### Breaking changes
- Changed the exit code from 1 to 0 for `ls` when used with an empty bucket. Exits with 1 if the bucket is non-existent. ([#722](https://github.com/peak/s5cmd/issues/722))

## v2.2.2 - 13 Sep 2023

#### Bugfixes
Expand Down
18 changes: 18 additions & 0 deletions e2e/du_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -300,3 +300,21 @@ func TestDiskUsageByVersionIDAndAllVersions(t *testing.T) {
})
}
}

func TestDiskUsageEmptyBucket(t *testing.T) {
t.Parallel()

s3client, s5cmd := setup(t)

bucket := s3BucketFromTestName(t)
createBucket(t, s3client, bucket)

cmd := s5cmd("du", "s3://"+bucket)
result := icmd.RunCmd(cmd)

result.Assert(t, icmd.Success)

assertLines(t, result.Stdout(), map[int]compareFunc{
0: suffix(`0 bytes in 0 objects: s3://%v`, bucket),
})
}
16 changes: 16 additions & 0 deletions e2e/ls_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -786,3 +786,19 @@ func TestListNestedLocalFolders(t *testing.T) {
2: match(filepath.ToSlash("file.txt")),
}, trimMatch(dateRe), alignment(true))
}

func TestEmptyBucket(t *testing.T) {
t.Parallel()

s3client, s5cmd := setup(t)

bucket := s3BucketFromTestName(t)
createBucket(t, s3client, bucket)

cmd := s5cmd("ls", "s3://"+bucket)
result := icmd.RunCmd(cmd)

result.Assert(t, icmd.Success)

assertLines(t, result.Stdout(), nil)
}
91 changes: 78 additions & 13 deletions e2e/select_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func TestSelectCommand(t *testing.T) {
expectedValue: "id0\n",
},
{
name: "input:json-lines,output:csv,compression:gzip,select:with-where",
name: "input:json-lines,output:csv,select:with-where",
cmd: []string{
"select", "json",
"--output-format", "csv",
Expand All @@ -165,7 +165,7 @@ func TestSelectCommand(t *testing.T) {
expectedValue: "id0\n",
},
{
name: "input:json-document,output:json,select:with-document-access",
name: "input:json-document,output:json-lines,select:with-document-access",
denizsurmeli marked this conversation as resolved.
Show resolved Hide resolved
cmd: []string{
"select", "json",
"--structure", "document",
Expand All @@ -177,7 +177,7 @@ func TestSelectCommand(t *testing.T) {
expectedValue: "{\"id\":\"id0\"}\n",
},
{
name: "input:json-document,output:json,compression:gzip,select:with-document-access",
name: "input:json-document,output:json-lines,compression:gzip,select:with-document-access",
denizsurmeli marked this conversation as resolved.
Show resolved Hide resolved
cmd: []string{
"select", "json",
"--structure", "document",
Expand All @@ -200,11 +200,11 @@ func TestSelectCommand(t *testing.T) {
},
informat: "json",
structure: "document",
outformat: "json",
outformat: "csv",
expectedValue: "id0\n",
},
{
name: "input:json-document,output:json,compression:gzip,select:with-document-access",
name: "input:json-document,output:csv,compression:gzip,select:with-document-access",
cmd: []string{
"select", "json",
"--structure", "document",
Expand All @@ -215,13 +215,36 @@ func TestSelectCommand(t *testing.T) {
informat: "json",
compression: true,
structure: "document",
outformat: "json",
outformat: "csv",
expectedValue: "id0\n",
},
{
name: "input:json-lines,output:json-lines,all-versions:true,empty-bucket:true",
cmd: []string{
"select", "json",
"--all-versions",
"--query", query,
},
informat: "json",
structure: "lines",
outformat: "json",
expectedValue: "-",
},
},
"csv": {
{
tarikozyurtt marked this conversation as resolved.
Show resolved Hide resolved
name: "input:csv,output:csv,delimiter:comma",
name: "input:csv,output:json,delimiter:comma",
cmd: []string{
"select", "csv",
"--output-format", "json",
"--query", query,
},
informat: "csv",
structure: ",",
outformat: "json",
},
{
name: "input:csv,output:csv,delimiter:comma,extra-flag:false",
cmd: []string{
"select", "csv",
"--query", query,
Expand All @@ -231,7 +254,7 @@ func TestSelectCommand(t *testing.T) {
outformat: "csv",
},
{
name: "input:csv,output:csv,delimiter:comma,compression:gzip",
name: "input:csv,output:csv,delimiter:comma,compression:gzip,extra-flag:false",
cmd: []string{
"select", "csv",
"--compression", "gzip",
Expand All @@ -242,6 +265,19 @@ func TestSelectCommand(t *testing.T) {
structure: ",",
outformat: "csv",
},
{
name: "input:csv,output:json,delimiter:comma,compression:gzip",
cmd: []string{
"select", "csv",
"--compression", "gzip",
"--output-format", "json",
"--query", query,
},
informat: "csv",
compression: true,
structure: ",",
outformat: "json",
},
{
name: "input:csv,output:csv,delimiter:comma,compression:gzip",
cmd: []string{
Expand All @@ -267,7 +303,7 @@ func TestSelectCommand(t *testing.T) {
outformat: "csv",
},
{
name: "input:csv,output:csv,delimiter:tab",
name: "input:csv,output:csv,delimiter:tab,extra-flag:false",
cmd: []string{
"select", "csv",
"--delimiter", "\t",
Expand All @@ -277,6 +313,18 @@ func TestSelectCommand(t *testing.T) {
structure: "\t",
outformat: "csv",
},
{
name: "input:csv,output:json,delimiter:tab",
cmd: []string{
"select", "csv",
"--delimiter", "\t",
"--output-format", "json",
"--query", query,
},
informat: "csv",
structure: "\t",
outformat: "json",
},
{
name: "input:csv,output:csv,delimiter:tab",
cmd: []string{
Expand Down Expand Up @@ -372,7 +420,7 @@ func TestSelectCommand(t *testing.T) {
informat: "csv",
compression: true,
structure: ",",
outformat: "csv",
outformat: "json",
expectedValue: "{\"id\":\"id0\"}\n",
},
{
Expand All @@ -386,7 +434,7 @@ func TestSelectCommand(t *testing.T) {
},
informat: "csv",
structure: "\t",
outformat: "csv",
outformat: "json",
expectedValue: "{\"id\":\"id0\"}\n",
},
{
Expand All @@ -402,9 +450,21 @@ func TestSelectCommand(t *testing.T) {
informat: "csv",
compression: true,
structure: "\t",
outformat: "csv",
outformat: "json",
expectedValue: "{\"id\":\"id0\"}\n",
},
{
name: "input:csv,output:csv,delimiter:comma,all-versions:true,empty-bucket:true",
cmd: []string{
"select", "csv",
"--all-versions",
"--query", query,
},
informat: "csv",
structure: ",",
outformat: "csv",
expectedValue: "-",
denizsurmeli marked this conversation as resolved.
Show resolved Hide resolved
tarikozyurtt marked this conversation as resolved.
Show resolved Hide resolved
},
},
"backwards-compatibility": {
{
Expand Down Expand Up @@ -471,8 +531,13 @@ func TestSelectCommand(t *testing.T) {

s3client, s5cmd := setup(t, withEndpointURL(endpoint), withRegion(region), withAccessKeyID(accessKeyID), withSecretKey(secretKey))
createBucket(t, s3client, bucket)
putFile(t, s3client, bucket, filename, contents)

if tc.expectedValue == "-" { // test empty bucket case
src = fmt.Sprintf("s3://%s/", bucket)
expected = ""
} else {
putFile(t, s3client, bucket, filename, contents)
}
tc.cmd = append(tc.cmd, src)
cmd := s5cmd(tc.cmd...)

Expand Down
6 changes: 3 additions & 3 deletions storage/s3.go
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ func (s *S3) listObjectVersions(ctx context.Context, url *url.URL) <-chan *Objec
return
}

if !objectFound {
if !objectFound && !url.IsBucket() {
objCh <- &Object{Err: ErrNoObjectFound}
}
}()
Expand Down Expand Up @@ -378,7 +378,7 @@ func (s *S3) listObjectsV2(ctx context.Context, url *url.URL) <-chan *Object {
return
}

if !objectFound {
if !objectFound && !url.IsBucket() {
objCh <- &Object{Err: ErrNoObjectFound}
}
}()
Expand Down Expand Up @@ -470,7 +470,7 @@ func (s *S3) listObjects(ctx context.Context, url *url.URL) <-chan *Object {
return
}

if !objectFound {
if !objectFound && !url.IsBucket() {
objCh <- &Object{Err: ErrNoObjectFound}
}
}()
Expand Down
Loading