lsjson: add --metadata/-M flag

Note that this removes the `-M` flag from `--encrypted` as it
conflicted with the global flag and adds it to `--metadata`.
This commit is contained in:
Nick Craig-Wood 2022-05-24 11:16:29 +01:00
parent 78d52882ca
commit d823a38ce5
4 changed files with 29 additions and 1 deletions

View file

@ -26,10 +26,11 @@ func init() {
flags.BoolVarP(cmdFlags, &opt.ShowHash, "hash", "", false, "Include hashes in the output (may take longer)")
flags.BoolVarP(cmdFlags, &opt.NoModTime, "no-modtime", "", false, "Don't read the modification time (can speed things up)")
flags.BoolVarP(cmdFlags, &opt.NoMimeType, "no-mimetype", "", false, "Don't read the mime type (can speed things up)")
flags.BoolVarP(cmdFlags, &opt.ShowEncrypted, "encrypted", "M", false, "Show the encrypted names")
flags.BoolVarP(cmdFlags, &opt.ShowEncrypted, "encrypted", "", false, "Show the encrypted names")
flags.BoolVarP(cmdFlags, &opt.ShowOrigIDs, "original", "", false, "Show the ID of the underlying Object")
flags.BoolVarP(cmdFlags, &opt.FilesOnly, "files-only", "", false, "Show only files in the listing")
flags.BoolVarP(cmdFlags, &opt.DirsOnly, "dirs-only", "", false, "Show only directories in the listing")
flags.BoolVarP(cmdFlags, &opt.Metadata, "metadata", "M", false, "Add metadata to the listing")
flags.StringArrayVarP(cmdFlags, &opt.HashTypes, "hash-type", "", nil, "Show only this hash type (may be repeated)")
flags.BoolVarP(cmdFlags, &statOnly, "stat", "", false, "Just return the info for the pointed to file")
}
@ -81,6 +82,9 @@ returned
If ` + "`--files-only`" + ` is not specified directories in addition to the files
will be returned.
If ` + "`--metadata`" + ` is set then an additional Metadata key will be returned.
This will have metdata in rclone standard format as a JSON object.
if ` + "`--stat`" + ` is set then a single JSON blob will be returned about the
item pointed to. This will return an error if the item isn't found.
However on bucket based backends (like s3, gcs, b2, azureblob etc) if

View file

@ -29,6 +29,7 @@ type ListJSONItem struct {
OrigID string `json:",omitempty"`
Tier string `json:",omitempty"`
IsBucket bool `json:",omitempty"`
Metadata fs.Metadata `json:",omitempty"`
}
// Timestamp a time in the provided format
@ -80,6 +81,7 @@ type ListJSONOpt struct {
ShowHash bool `json:"showHash"`
DirsOnly bool `json:"dirsOnly"`
FilesOnly bool `json:"filesOnly"`
Metadata bool `json:"metadata"`
HashTypes []string `json:"hashTypes"` // hash types to show if ShowHash is set, e.g. "MD5", "SHA-1"
}
@ -222,6 +224,14 @@ func (lj *listJSON) entry(ctx context.Context, entry fs.DirEntry) (*ListJSONItem
item.Tier = do.GetTier()
}
}
if lj.opt.Metadata {
metadata, err := fs.GetMetadata(ctx, x)
if err != nil {
fs.Errorf(x, "Failed to read metadata: %v", err)
} else if metadata != nil {
item.Metadata = metadata
}
}
default:
fs.Errorf(nil, "Unknown type %T in listing in ListJSON", entry)
}

View file

@ -172,6 +172,19 @@ func TestListJSON(t *testing.T) {
ModTime: operations.Timestamp{When: t1},
IsDir: false,
}},
}, {
name: "Metadata",
opt: operations.ListJSONOpt{
FilesOnly: true,
Metadata: true,
},
want: []*operations.ListJSONItem{{
Path: "file1",
Name: "file1",
Size: 5,
ModTime: operations.Timestamp{When: t1},
IsDir: false,
}},
},
} {
t.Run(test.name, func(t *testing.T) {

View file

@ -34,6 +34,7 @@ func init() {
- noMimeType - If set don't show mime types
- dirsOnly - If set only show directories
- filesOnly - If set only show files
- metadata - If set return metadata of objects also
- hashTypes - array of strings of hash types to show if showHash set
Returns: