aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetter Rasmussen2016-02-21 15:57:28 +0100
committerPetter Rasmussen2016-02-21 16:01:21 +0100
commita02adf6f342fb851ba9436d8c47c429d0f4b24c8 (patch)
tree6564f8807e35f2e835ab1f15b7e738d5f3d0a6c4
parent0b0c7a47e8ed2fdb06858753508f5c4e0c2aa05b (diff)
downloadgdrive-a02adf6f342fb851ba9436d8c47c429d0f4b24c8.tar.bz2
Add remotePathFinder
-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
+}