aboutsummaryrefslogtreecommitdiffstats
path: root/drive/path.go
diff options
context:
space:
mode:
Diffstat (limited to 'drive/path.go')
-rw-r--r--drive/path.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/drive/path.go b/drive/path.go
new file mode 100644
index 0000000..f5d1ad5
--- /dev/null
+++ b/drive/path.go
@@ -0,0 +1,65 @@
+package drive
+
+import (
+ "fmt"
+ "path/filepath"
+ "google.golang.org/api/drive/v3"
+)
+
+func (self *Drive) newPathfinder() *remotePathfinder {
+ return &remotePathfinder{
+ service: self.service.Files,
+ files: make(map[string]*drive.File),
+ }
+}
+
+type remotePathfinder struct {
+ service *drive.FilesService
+ files map[string]*drive.File
+}
+
+func (self *remotePathfinder) absPath(f *drive.File) (string, error) {
+ name := f.Name
+
+ if len(f.Parents) == 0 {
+ return name, nil
+ }
+
+ var path []string
+
+ for {
+ parent, err := self.getParent(f.Parents[0])
+ if err != nil {
+ return "", err
+ }
+
+ // Stop when we find the root dir
+ if len(parent.Parents) == 0 {
+ break
+ }
+
+ path = append([]string{parent.Name}, path...)
+ f = parent
+ }
+
+ path = append(path, name)
+ return filepath.Join(path...), nil
+}
+
+func (self *remotePathfinder) getParent(id string) (*drive.File, error) {
+ // Check cache
+ if f, ok := self.files[id]; ok {
+ return f, nil
+ }
+
+ // Fetch file from drive
+ f, err := self.service.Get(id).Fields("id", "name", "parents").Do()
+ if err != nil {
+ return nil, fmt.Errorf("Failed to get file: %s", err)
+ }
+
+ // Save in cache
+ self.files[f.Id] = f
+
+ return f, nil
+}