From 88710f7093e446cf453f5b4e99903ac5a862751e Mon Sep 17 00:00:00 2001 From: laihenyi Date: Mon, 23 Feb 2026 12:39:10 +0800 Subject: [PATCH 1/2] feat(drive): include shortcutDetails in drive get fields Add shortcutDetails to the Drive Get API fields to enable resolving shortcut target file IDs and MIME types. Co-Authored-By: Claude Opus 4.6 --- internal/cmd/drive.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cmd/drive.go b/internal/cmd/drive.go index 1d1dacbc..1d65184c 100644 --- a/internal/cmd/drive.go +++ b/internal/cmd/drive.go @@ -242,7 +242,7 @@ func (c *DriveGetCmd) Run(ctx context.Context, flags *RootFlags) error { f, err := svc.Files.Get(fileID). SupportsAllDrives(true). - Fields("id, name, mimeType, size, modifiedTime, createdTime, parents, webViewLink, description, starred"). + Fields("id, name, mimeType, size, modifiedTime, createdTime, parents, webViewLink, description, starred, shortcutDetails"). Context(ctx). Do() if err != nil { From 6a93cf4a435ba86b32c13e2284640d7587d9a208 Mon Sep 17 00:00:00 2001 From: laihenyi Date: Wed, 18 Mar 2026 09:37:01 +0800 Subject: [PATCH 2/2] feat(drive): add OWNER column to ls/search table output Request the `owners` field from the Drive API in list/search calls and display the primary owner's email in a new OWNER column in the plain/table output. JSON output already included the full owners array via the driveGet path; this change brings parity to the listing commands so users can identify file ownership at a glance, which is especially useful in shared drives. Co-Authored-By: Claude Opus 4.6 (1M context) --- internal/cmd/drive.go | 2 +- internal/cmd/drive_listing.go | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/internal/cmd/drive.go b/internal/cmd/drive.go index e294116c..97a8c52d 100644 --- a/internal/cmd/drive.go +++ b/internal/cmd/drive.go @@ -120,7 +120,7 @@ func (c *DriveGetCmd) Run(ctx context.Context, flags *RootFlags) error { f, err := svc.Files.Get(fileID). SupportsAllDrives(true). - Fields("id, name, mimeType, size, modifiedTime, createdTime, parents, webViewLink, description, starred, shortcutDetails"). + Fields("id, name, mimeType, size, modifiedTime, createdTime, parents, webViewLink, description, starred"). Context(ctx). Do() if err != nil { diff --git a/internal/cmd/drive_listing.go b/internal/cmd/drive_listing.go index b4600dbf..9174c643 100644 --- a/internal/cmd/drive_listing.go +++ b/internal/cmd/drive_listing.go @@ -12,7 +12,7 @@ import ( "github.com/steipete/gogcli/internal/ui" ) -const driveFileListFields = "nextPageToken, files(id, name, mimeType, size, modifiedTime, parents, webViewLink)" +const driveFileListFields = "nextPageToken, files(id, name, mimeType, size, modifiedTime, parents, webViewLink, owners)" type driveFileListOptions struct { query string @@ -104,18 +104,26 @@ func writeDriveFileList(ctx context.Context, resp *drive.FileList, emptyMessage w, flush := tableWriter(ctx) defer flush() - fmt.Fprintln(w, "ID\tNAME\tTYPE\tSIZE\tMODIFIED") + fmt.Fprintln(w, "ID\tNAME\tTYPE\tSIZE\tMODIFIED\tOWNER") for _, f := range resp.Files { fmt.Fprintf( w, - "%s\t%s\t%s\t%s\t%s\n", + "%s\t%s\t%s\t%s\t%s\t%s\n", f.Id, f.Name, driveType(f.MimeType), formatDriveSize(f.Size), formatDateTime(f.ModifiedTime), + driveOwnerEmail(f.Owners), ) } printNextPageHint(u, resp.NextPageToken) return nil } + +func driveOwnerEmail(owners []*drive.User) string { + if len(owners) == 0 { + return "" + } + return owners[0].EmailAddress +}