From f1a80d8e6be777a0a4fe9c1e53d99604093cc5b9 Mon Sep 17 00:00:00 2001 From: Manuel Coenen Date: Tue, 4 Jun 2019 16:50:31 +0200 Subject: [PATCH] Fix issue with local directories not being created Also handle all files inside a directory first before traversing into sub-directories. This way the order of the log statements makes a lot more sense. --- duetbackup.go | 66 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/duetbackup.go b/duetbackup.go index e1d246a..0fbfd75 100644 --- a/duetbackup.go +++ b/duetbackup.go @@ -16,7 +16,9 @@ import ( ) const ( - sysDir = "0:/sys" + sysDir = "0:/sys" + Directory = "d" + File = "f" ) var httpClient *http.Client @@ -108,15 +110,42 @@ func getFileList(baseURL string, dir string, first uint64) (*filelist, error) { return &fl, nil } +func ensureOutDirExists(outDir string, verbose bool) error { + path, err := filepath.Abs(outDir) + if err != nil { + return err + } + fi, err := os.Stat(path) + if err != nil && !os.IsNotExist(err) { + return err + } + if fi == nil { + if verbose { + log.Println(" Creating directory", path) + } + if err = os.MkdirAll(path, 0755); err != nil { + return err + } + } + return nil +} + func updateLocalFiles(baseURL string, fl *filelist, outDir string, excls excludes, removeLocal, verbose bool) error { + if err := ensureOutDirExists(outDir, verbose); err != nil { + return err + } + fileDownloadURL := "rr_download?name=" for _, file := range fl.Files { + if file.Type == Directory { + continue + } remoteFilename := fl.Dir + "/" + file.Name if excls.Contains(remoteFilename) { if verbose { - log.Println(" Skipping: ", remoteFilename) + log.Println(" Excluded: ", remoteFilename) } continue } @@ -126,26 +155,6 @@ func updateLocalFiles(baseURL string, fl *filelist, outDir string, excls exclude return err } - // It's a directory - if file.Type == "d" { - - // Does not exist yet so try to create it - if fi == nil { - if verbose { - log.Println(" Creating directory", fileName) - } - if err = os.MkdirAll(fileName, 0755); err != nil { - return err - } - } - - // Go recursively into this directory - if err = syncFolder(baseURL, remoteFilename, fileName, excls, removeLocal, verbose); err != nil { - return err - } - continue - } - // File does not exist or is outdated so get it if fi == nil || fi.ModTime().Before(file.Date.Time) { if verbose { @@ -212,7 +221,7 @@ func removeDeletedFiles(fl *filelist, outDir string, verbose bool) error { return err } if verbose { - log.Println("Removed", f.Name()) + log.Println(" Removed: ", f.Name()) } } } @@ -239,6 +248,17 @@ func syncFolder(address, folder, outDir string, excls excludes, removeLocal, ver } } + for _, file := range fl.Files { + if file.Type != Directory { + continue + } + remoteFilename := fl.Dir + "/" + file.Name + fileName := filepath.Join(outDir, file.Name) + if err = syncFolder(address, remoteFilename, fileName, excls, removeLocal, verbose); err != nil { + return err + } + } + return nil }