From 741644b575655560aa542f2a79c9457f6243387e Mon Sep 17 00:00:00 2001 From: Michael Cook Date: Wed, 20 Jun 2018 21:18:51 -0700 Subject: [PATCH 1/4] spelling --- src/duplicacy_backupmanager.go | 8 ++++---- src/duplicacy_chunk.go | 2 +- src/duplicacy_chunk_test.go | 2 +- src/duplicacy_chunkoperator.go | 2 +- src/duplicacy_filereader.go | 2 +- src/duplicacy_snapshotmanager.go | 6 +++--- src/duplicacy_storage.go | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/duplicacy_backupmanager.go b/src/duplicacy_backupmanager.go index f7f836c..f6d4c81 100644 --- a/src/duplicacy_backupmanager.go +++ b/src/duplicacy_backupmanager.go @@ -981,12 +981,12 @@ type fileEncoder struct { buffer *bytes.Buffer } -// Read reads data from the embeded buffer +// Read reads data from the embedded buffer func (encoder fileEncoder) Read(data []byte) (n int, err error) { return encoder.buffer.Read(data) } -// NextFile switchs to the next file and generates its json description in the buffer. It also takes care of +// NextFile switches to the next file and generates its json description in the buffer. It also takes care of // the ending ']' and the commas between files. func (encoder *fileEncoder) NextFile() (io.Reader, bool) { if encoder.currentIndex == len(encoder.files) { @@ -1126,7 +1126,7 @@ func (manager *BackupManager) UploadSnapshot(chunkMaker *ChunkMaker, uploader *C } // Restore downloads a file from the storage. If 'inPlace' is false, the download file is saved first to a temporary -// file under the .duplicacy directory and then replaces the existing one. Otherwise, the exising file will be +// file under the .duplicacy directory and then replaces the existing one. Otherwise, the existing file will be // overwritten directly. func (manager *BackupManager) RestoreFile(chunkDownloader *ChunkDownloader, chunkMaker *ChunkMaker, entry *Entry, top string, inPlace bool, overwrite bool, showStatistics bool, totalFileSize int64, downloadedFileSize int64, startTime int64) bool { @@ -1528,7 +1528,7 @@ func (manager *BackupManager) CopySnapshots(otherManager *BackupManager, snapsho revisionsToBeCopied []int, threads int) bool { if !manager.config.IsCompatiableWith(otherManager.config) { - LOG_ERROR("CONFIG_INCOMPATIABLE", "Two storages are not compatiable for the copy operation") + LOG_ERROR("CONFIG_INCOMPATIBLE", "Two storages are not compatible for the copy operation") return false } diff --git a/src/duplicacy_chunk.go b/src/duplicacy_chunk.go index 2a24493..1865501 100644 --- a/src/duplicacy_chunk.go +++ b/src/duplicacy_chunk.go @@ -267,7 +267,7 @@ func (chunk *Chunk) Encrypt(encryptionKey []byte, derivationKey string) (err err } -// This is to ensure compability with Vertical Backup, which still uses HMAC-SHA256 (instead of HMAC-BLAKE2) to +// This is to ensure compatibility with Vertical Backup, which still uses HMAC-SHA256 (instead of HMAC-BLAKE2) to // derive the key used to encrypt/decrypt files and chunks. var DecryptWithHMACSHA256 = false diff --git a/src/duplicacy_chunk_test.go b/src/duplicacy_chunk_test.go index b4bf83a..a88964c 100644 --- a/src/duplicacy_chunk_test.go +++ b/src/duplicacy_chunk_test.go @@ -71,7 +71,7 @@ func TestChunk(t *testing.T) { } if bytes.Compare(plainData, decryptedData) != 0 { - t.Logf("orginal length: %d, decrypted length: %d", len(plainData), len(decryptedData)) + t.Logf("Original length: %d, decrypted length: %d", len(plainData), len(decryptedData)) t.Errorf("Original data:\n%x\nDecrypted data:\n%x\n", plainData, decryptedData) } diff --git a/src/duplicacy_chunkoperator.go b/src/duplicacy_chunkoperator.go index 1585e8e..f42742a 100644 --- a/src/duplicacy_chunkoperator.go +++ b/src/duplicacy_chunkoperator.go @@ -18,7 +18,7 @@ const ( ChunkOperationResurrect = 3 ) -// ChunkOperatorTask is used to pass paramaters for different kinds of chunk operations. +// ChunkOperatorTask is used to pass parameters for different kinds of chunk operations. type ChunkOperatorTask struct { operation int // The type of operation chunkID string // The chunk id diff --git a/src/duplicacy_filereader.go b/src/duplicacy_filereader.go index 4b8fa45..5d229e6 100644 --- a/src/duplicacy_filereader.go +++ b/src/duplicacy_filereader.go @@ -34,7 +34,7 @@ func CreateFileReader(top string, files []*Entry) *FileReader { return reader } -// NextFile switchs to the next file in the file reader. +// NextFile switches to the next file in the file reader. func (reader *FileReader) NextFile() bool { if reader.CurrentFile != nil { diff --git a/src/duplicacy_snapshotmanager.go b/src/duplicacy_snapshotmanager.go index 46c9358..f05d062 100644 --- a/src/duplicacy_snapshotmanager.go +++ b/src/duplicacy_snapshotmanager.go @@ -386,7 +386,7 @@ func (manager *SnapshotManager) CleanSnapshotCache(latestSnapshot *Snapshot, all if allSnapshots == nil { // If the 'fossils' directory exists then don't clean the cache as all snapshots will be needed later - // during the fossil collection phase. The deletion procedure creates this direcotry. + // during the fossil collection phase. The deletion procedure creates this directory. // We only check this condition when allSnapshots is nil because // in thise case it is the deletion procedure that is trying to clean the snapshot cache. exist, _, _, err := manager.snapshotCache.GetFileInfo(0, "fossils") @@ -1154,7 +1154,7 @@ func (manager *SnapshotManager) VerifySnapshot(snapshot *Snapshot) bool { } } -// RetrieveFile retrieve the file in the specifed snapshot. +// RetrieveFile retrieves the file in the specified snapshot. func (manager *SnapshotManager) RetrieveFile(snapshot *Snapshot, file *Entry, output func([]byte)) bool { if file.Size == 0 { @@ -2247,7 +2247,7 @@ func (manager *SnapshotManager) pruneSnapshotsExhaustive(referencedFossils map[s chunk := strings.Replace(file, "/", "", -1) if !chunkRegex.MatchString(chunk) { - LOG_WARN("CHUNK_UNKONWN_FILE", "File %s is not a chunk", file) + LOG_WARN("CHUNK_UNKNOWN_FILE", "File %s is not a chunk", file) continue } diff --git a/src/duplicacy_storage.go b/src/duplicacy_storage.go index 040acea..ed5b4df 100644 --- a/src/duplicacy_storage.go +++ b/src/duplicacy_storage.go @@ -89,7 +89,7 @@ func (storage *StorageBase) SetRateLimits(downloadRateLimit int, uploadRateLimit } // SetDefaultNestingLevels sets the default read and write levels. This is usually called by -// derived storages to set the levels with old values so that storages initialied by ealier versions +// derived storages to set the levels with old values so that storages initialized by earlier versions // will continue to work. func (storage *StorageBase) SetDefaultNestingLevels(readLevels []int, writeLevel int) { storage.readLevels = readLevels From 0762c448c4e46af468bc60101be3fe7adfebd6c0 Mon Sep 17 00:00:00 2001 From: Michael Cook Date: Sat, 29 Dec 2018 13:19:32 +0100 Subject: [PATCH 2/4] gofmt -s --- duplicacy/duplicacy_main.go | 38 +++++++++++++-------------- src/duplicacy_azurestorage.go | 2 +- src/duplicacy_b2client.go | 2 +- src/duplicacy_b2storage.go | 2 +- src/duplicacy_backupmanager.go | 9 +++---- src/duplicacy_backupmanager_test.go | 16 +++++------ src/duplicacy_chunk.go | 7 +++-- src/duplicacy_chunk_test.go | 2 +- src/duplicacy_chunkdownloader.go | 4 +-- src/duplicacy_entry.go | 8 +++--- src/duplicacy_gcdstorage.go | 14 +++++----- src/duplicacy_hubicstorage.go | 2 +- src/duplicacy_sftpstorage.go | 2 +- src/duplicacy_shadowcopy_darwin.go | 16 +++++------ src/duplicacy_snapshotmanager.go | 24 ++++++++--------- src/duplicacy_snapshotmanager_test.go | 16 +++++------ src/duplicacy_storage.go | 2 +- src/duplicacy_swiftstorage.go | 2 +- src/duplicacy_utils_windows.go | 2 +- src/duplicacy_wasabistorage.go | 2 +- src/duplicacy_webdavstorage.go | 16 +++++------ 21 files changed, 92 insertions(+), 96 deletions(-) diff --git a/duplicacy/duplicacy_main.go b/duplicacy/duplicacy_main.go index ca0c4a4..dd17b33 100644 --- a/duplicacy/duplicacy_main.go +++ b/duplicacy/duplicacy_main.go @@ -7,6 +7,7 @@ package main import ( "encoding/json" "fmt" + "net/http" "os" "os/exec" "os/signal" @@ -16,7 +17,6 @@ import ( "runtime" "strconv" "strings" - "net/http" _ "net/http/pprof" @@ -159,8 +159,6 @@ func setGlobalOptions(context *cli.Context) { }() } - - duplicacy.RunInBackground = context.GlobalBool("background") } @@ -309,11 +307,11 @@ func configRepository(context *cli.Context, init bool) { repositoryPath = context.String("repository") } preference := duplicacy.Preference{ - Name: storageName, - SnapshotID: snapshotID, + Name: storageName, + SnapshotID: snapshotID, RepositoryPath: repositoryPath, - StorageURL: storageURL, - Encrypted: context.Bool("encrypt"), + StorageURL: storageURL, + Encrypted: context.Bool("encrypt"), } storage := duplicacy.CreateStorage(preference, true, 1) @@ -533,7 +531,7 @@ func setPreference(context *cli.Context) { if triBool.IsSet() { newPreference.DoNotSavePassword = triBool.IsTrue() } - + newPreference.NobackupFile = context.String("nobackup-file") key := context.String("key") @@ -650,7 +648,7 @@ func changePassword(context *cli.Context) { duplicacy.LOG_INFO("CONFIG_CLEAN", "The local copy of the old config has been removed") } } - } () + }() err = storage.DeleteFile(0, "config") if err != nil { @@ -1262,7 +1260,7 @@ func infoStorage(context *cli.Context) { for _, dir := range dirs { if len(dir) > 0 && dir[len(dir)-1] == '/' { - duplicacy.LOG_INFO("STORAGE_SNAPSHOT", "%s", dir[0:len(dir) - 1]) + duplicacy.LOG_INFO("STORAGE_SNAPSHOT", "%s", dir[0:len(dir)-1]) } } @@ -1298,7 +1296,7 @@ func benchmark(context *cli.Context) { } threads := downloadThreads - if (threads < uploadThreads) { + if threads < uploadThreads { threads = uploadThreads } @@ -1309,7 +1307,7 @@ func benchmark(context *cli.Context) { if storage == nil { return } - duplicacy.Benchmark(repository, storage, int64(fileSize) * 1000000, chunkSize * 1024 * 1024, chunkCount, uploadThreads, downloadThreads) + duplicacy.Benchmark(repository, storage, int64(fileSize)*1000000, chunkSize*1024*1024, chunkCount, uploadThreads, downloadThreads) } func main() { @@ -1773,8 +1771,8 @@ func main() { Argument: "", }, cli.BoolFlag{ - Name: "bit-identical", - Usage: "(when using -copy) make the new storage bit-identical to also allow rsync etc.", + Name: "bit-identical", + Usage: "(when using -copy) make the new storage bit-identical to also allow rsync etc.", }, cli.StringFlag{ Name: "repository", @@ -1815,10 +1813,10 @@ func main() { Arg: "true", }, cli.StringFlag{ - Name: "nobackup-file", - Usage: "Directories containing a file with this name will not be backed up", + Name: "nobackup-file", + Usage: "Directories containing a file with this name will not be backed up", Argument: "", - Value: "", + Value: "", }, cli.StringFlag{ Name: "key", @@ -1984,8 +1982,8 @@ func main() { Argument: "", }, cli.StringFlag{ - Name: "comment", - Usage: "add a comment to identify the process", + Name: "comment", + Usage: "add a comment to identify the process", }, } @@ -1999,7 +1997,7 @@ func main() { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) go func() { - for _ = range c { + for range c { duplicacy.RunAtError() os.Exit(1) } diff --git a/src/duplicacy_azurestorage.go b/src/duplicacy_azurestorage.go index d21ecbc..fad919b 100644 --- a/src/duplicacy_azurestorage.go +++ b/src/duplicacy_azurestorage.go @@ -104,7 +104,7 @@ func (azureStorage *AzureStorage) ListFiles(threadIndex int, dir string) (files if dir == "snapshots/" { - for subDir, _ := range subDirs { + for subDir := range subDirs { files = append(files, subDir) } diff --git a/src/duplicacy_b2client.go b/src/duplicacy_b2client.go index e0cc8ae..3dfd0b8 100644 --- a/src/duplicacy_b2client.go +++ b/src/duplicacy_b2client.go @@ -385,7 +385,7 @@ func (client *B2Client) ListFileNames(startFileName string, singleFile bool, inc } fileUploadTimestamp, _ := strconv.ParseInt(responseHeader.Get("X-Bz-Upload-Timestamp"), 0, 64) - return []*B2Entry{&B2Entry{fileID, fileName, fileAction, fileSize, fileUploadTimestamp}}, nil + return []*B2Entry{{fileID, fileName, fileAction, fileSize, fileUploadTimestamp}}, nil } if err = json.NewDecoder(readCloser).Decode(&output); err != nil { diff --git a/src/duplicacy_b2storage.go b/src/duplicacy_b2storage.go index 3e001c7..c28a3a5 100644 --- a/src/duplicacy_b2storage.go +++ b/src/duplicacy_b2storage.go @@ -71,7 +71,7 @@ func (storage *B2Storage) ListFiles(threadIndex int, dir string) (files []string subDirs[subDir+"/"] = true } - for subDir, _ := range subDirs { + for subDir := range subDirs { files = append(files, subDir) } } else if dir == "chunks" { diff --git a/src/duplicacy_backupmanager.go b/src/duplicacy_backupmanager.go index f6d4c81..dd08357 100644 --- a/src/duplicacy_backupmanager.go +++ b/src/duplicacy_backupmanager.go @@ -33,7 +33,7 @@ type BackupManager struct { snapshotCache *FileStorage // for copies of chunks needed by snapshots config *Config // contains a number of options - + nobackupFile string // don't backup directory when this file name is found } @@ -65,7 +65,7 @@ func CreateBackupManager(snapshotID string, storage Storage, top string, passwor SnapshotManager: snapshotManager, config: config, - + nobackupFile: nobackupFile, } @@ -1324,7 +1324,6 @@ func (manager *BackupManager) RestoreFile(chunkDownloader *ChunkDownloader, chun } } - for i := entry.StartChunk; i <= entry.EndChunk; i++ { if _, found := offsetMap[chunkDownloader.taskList[i].chunkHash]; !found { chunkDownloader.taskList[i].needed = true @@ -1674,7 +1673,7 @@ func (manager *BackupManager) CopySnapshots(otherManager *BackupManager, snapsho chunksToCopy := 0 chunksToSkip := 0 - for chunkHash, _ := range chunks { + for chunkHash := range chunks { otherChunkID := otherManager.config.GetChunkIDFromHash(chunkHash) if _, found := otherChunks[otherChunkID]; found { chunksToSkip++ @@ -1704,7 +1703,7 @@ func (manager *BackupManager) CopySnapshots(otherManager *BackupManager, snapsho totalSkipped := 0 chunkIndex := 0 - for chunkHash, _ := range chunks { + for chunkHash := range chunks { chunkIndex++ chunkID := manager.config.GetChunkIDFromHash(chunkHash) newChunkID := otherManager.config.GetChunkIDFromHash(chunkHash) diff --git a/src/duplicacy_backupmanager_test.go b/src/duplicacy_backupmanager_test.go index dce5f6c..c4f6fed 100644 --- a/src/duplicacy_backupmanager_test.go +++ b/src/duplicacy_backupmanager_test.go @@ -246,8 +246,8 @@ func TestBackupManager(t *testing.T) { backupManager.Backup(testDir+"/repository1" /*quickMode=*/, true, threads, "first", false, false, 0, false) time.Sleep(time.Duration(delay) * time.Second) SetDuplicacyPreferencePath(testDir + "/repository2/.duplicacy") - backupManager.Restore(testDir+"/repository2", threads, /*inPlace=*/false, /*quickMode=*/false, threads, /*overwrite=*/true, - /*deleteMode=*/false, /*setowner=*/false, /*showStatistics=*/false, /*patterns=*/ nil) + backupManager.Restore(testDir+"/repository2", threads /*inPlace=*/, false /*quickMode=*/, false, threads /*overwrite=*/, true, + /*deleteMode=*/ false /*setowner=*/, false /*showStatistics=*/, false /*patterns=*/, nil) for _, f := range []string{"file1", "file2", "dir1/file3"} { if _, err := os.Stat(testDir + "/repository2/" + f); os.IsNotExist(err) { @@ -270,8 +270,8 @@ func TestBackupManager(t *testing.T) { backupManager.Backup(testDir+"/repository1" /*quickMode=*/, true, threads, "second", false, false, 0, false) time.Sleep(time.Duration(delay) * time.Second) SetDuplicacyPreferencePath(testDir + "/repository2/.duplicacy") - backupManager.Restore(testDir+"/repository2", 2, /*inPlace=*/true, /*quickMode=*/true, threads, /*overwrite=*/true, - /*deleteMode=*/false, /*setowner=*/false, /*showStatistics=*/false, /*patterns=*/nil) + backupManager.Restore(testDir+"/repository2", 2 /*inPlace=*/, true /*quickMode=*/, true, threads /*overwrite=*/, true, + /*deleteMode=*/ false /*setowner=*/, false /*showStatistics=*/, false /*patterns=*/, nil) for _, f := range []string{"file1", "file2", "dir1/file3"} { hash1 := getFileHash(testDir + "/repository1/" + f) @@ -298,8 +298,8 @@ func TestBackupManager(t *testing.T) { createRandomFile(testDir+"/repository2/dir5/file5", 100) SetDuplicacyPreferencePath(testDir + "/repository2/.duplicacy") - backupManager.Restore(testDir+"/repository2", 3, /*inPlace=*/true, /*quickMode=*/false, threads, /*overwrite=*/true, - /*deleteMode=*/true, /*setowner=*/false, /*showStatistics=*/false, /*patterns=*/nil) + backupManager.Restore(testDir+"/repository2", 3 /*inPlace=*/, true /*quickMode=*/, false, threads /*overwrite=*/, true, + /*deleteMode=*/ true /*setowner=*/, false /*showStatistics=*/, false /*patterns=*/, nil) for _, f := range []string{"file1", "file2", "dir1/file3"} { hash1 := getFileHash(testDir + "/repository1/" + f) @@ -325,8 +325,8 @@ func TestBackupManager(t *testing.T) { os.Remove(testDir + "/repository1/file2") os.Remove(testDir + "/repository1/dir1/file3") SetDuplicacyPreferencePath(testDir + "/repository1/.duplicacy") - backupManager.Restore(testDir+"/repository1", 3, /*inPlace=*/true, /*quickMode=*/false, threads, /*overwrite=*/true, - /*deleteMode=*/false, /*setowner=*/false, /*showStatistics=*/false, /*patterns=*/[]string{"+file2", "+dir1/file3", "-*"}) + backupManager.Restore(testDir+"/repository1", 3 /*inPlace=*/, true /*quickMode=*/, false, threads /*overwrite=*/, true, + /*deleteMode=*/ false /*setowner=*/, false /*showStatistics=*/, false /*patterns=*/, []string{"+file2", "+dir1/file3", "-*"}) for _, f := range []string{"file1", "file2", "dir1/file3"} { hash1 := getFileHash(testDir + "/repository1/" + f) diff --git a/src/duplicacy_chunk.go b/src/duplicacy_chunk.go index 1865501..bce5c04 100644 --- a/src/duplicacy_chunk.go +++ b/src/duplicacy_chunk.go @@ -5,18 +5,18 @@ package duplicacy import ( - "os" "bytes" "compress/zlib" "crypto/aes" "crypto/cipher" - "crypto/rand" "crypto/hmac" + "crypto/rand" "crypto/sha256" "encoding/hex" "fmt" "hash" "io" + "os" "runtime" "github.com/bkaradzic/go-lz4" @@ -250,7 +250,7 @@ func (chunk *Chunk) Encrypt(encryptionKey []byte, derivationKey string) (err err // PKCS7 is used. Compressed chunk sizes leaks information about the original chunks so we want the padding sizes // to be the maximum allowed by PKCS7 dataLength := encryptedBuffer.Len() - offset - paddingLength := 256 - dataLength % 256 + paddingLength := 256 - dataLength%256 encryptedBuffer.Write(bytes.Repeat([]byte{byte(paddingLength)}, paddingLength)) encryptedBuffer.Write(bytes.Repeat([]byte{0}, gcm.Overhead())) @@ -342,7 +342,6 @@ func (chunk *Chunk) Decrypt(encryptionKey []byte, derivationKey string) (err err return err } - paddingLength := int(decryptedBytes[len(decryptedBytes)-1]) if paddingLength == 0 { paddingLength = 256 diff --git a/src/duplicacy_chunk_test.go b/src/duplicacy_chunk_test.go index a88964c..7d09445 100644 --- a/src/duplicacy_chunk_test.go +++ b/src/duplicacy_chunk_test.go @@ -48,7 +48,7 @@ func TestChunk(t *testing.T) { if remainderLength == -1 { remainderLength = len(encryptedData) % 256 - } else if len(encryptedData) % 256 != remainderLength { + } else if len(encryptedData)%256 != remainderLength { t.Errorf("Incorrect padding size") } diff --git a/src/duplicacy_chunkdownloader.go b/src/duplicacy_chunkdownloader.go index 9a33961..98867ab 100644 --- a/src/duplicacy_chunkdownloader.go +++ b/src/duplicacy_chunkdownloader.go @@ -178,7 +178,7 @@ func (downloader *ChunkDownloader) Reclaim(chunkIndex int) { return } - for i, _ := range downloader.completedTasks { + for i := range downloader.completedTasks { if i < chunkIndex && downloader.taskList[i].chunk != nil { downloader.config.PutChunk(downloader.taskList[i].chunk) downloader.taskList[i].chunk = nil @@ -253,7 +253,7 @@ func (downloader *ChunkDownloader) Stop() { downloader.numberOfDownloadingChunks-- } - for i, _ := range downloader.completedTasks { + for i := range downloader.completedTasks { downloader.config.PutChunk(downloader.taskList[i].chunk) downloader.taskList[i].chunk = nil downloader.numberOfActiveChunks-- diff --git a/src/duplicacy_entry.go b/src/duplicacy_entry.go index 1f1b795..3d77415 100644 --- a/src/duplicacy_entry.go +++ b/src/duplicacy_entry.go @@ -272,7 +272,7 @@ func (entry *Entry) IsLink() bool { } func (entry *Entry) GetPermissions() os.FileMode { - return os.FileMode(entry.Mode)&fileModeMask + return os.FileMode(entry.Mode) & fileModeMask } func (entry *Entry) IsSameAs(other *Entry) bool { @@ -308,7 +308,7 @@ func (entry *Entry) RestoreMetadata(fullPath string, fileInfo *os.FileInfo, setO } // Only set the permission if the file is not a symlink - if !entry.IsLink() && (*fileInfo).Mode() & fileModeMask != entry.GetPermissions() { + if !entry.IsLink() && (*fileInfo).Mode()&fileModeMask != entry.GetPermissions() { err := os.Chmod(fullPath, entry.GetPermissions()) if err != nil { LOG_ERROR("RESTORE_CHMOD", "Failed to set the file permissions: %v", err) @@ -456,10 +456,10 @@ func ListEntries(top string, path string, fileList *[]*Entry, patterns []string, if err != nil { return directoryList, nil, err } - + // This binary search works because ioutil.ReadDir returns files sorted by Name() by default if nobackupFile != "" { - ii := sort.Search(len(files), func(ii int) bool { return strings.Compare(files[ii].Name(), nobackupFile) >= 0}) + ii := sort.Search(len(files), func(ii int) bool { return strings.Compare(files[ii].Name(), nobackupFile) >= 0 }) if ii < len(files) && files[ii].Name() == nobackupFile { LOG_DEBUG("LIST_NOBACKUP", "%s is excluded due to nobackup file", path) return directoryList, skippedFiles, nil diff --git a/src/duplicacy_gcdstorage.go b/src/duplicacy_gcdstorage.go index 406dd23..ca20d6a 100644 --- a/src/duplicacy_gcdstorage.go +++ b/src/duplicacy_gcdstorage.go @@ -25,7 +25,7 @@ import ( ) var ( - GCDFileMimeType = "application/octet-stream" + GCDFileMimeType = "application/octet-stream" GCDDirectoryMimeType = "application/vnd.google-apps.folder" ) @@ -33,7 +33,7 @@ type GCDStorage struct { StorageBase service *drive.Service - idCache map[string]string // only directories are saved in this cache + idCache map[string]string // only directories are saved in this cache idCacheLock sync.Mutex backoffs []int // desired backoff time in seconds for each thread attempts []int // number of failed attempts since last success for each thread @@ -291,7 +291,7 @@ func (storage *GCDStorage) getIDFromPath(threadIndex int, filePath string, creat } else if isDir { storage.savePathID(current, fileID) } - if i != len(names) - 1 && !isDir { + if i != len(names)-1 && !isDir { return "", fmt.Errorf("Path '%s' is not a directory", current) } } @@ -386,8 +386,8 @@ func (storage *GCDStorage) ListFiles(threadIndex int, dir string) ([]string, []i subDirs := []string{} for _, file := range files { - storage.savePathID("snapshots/" + file.Name, file.Id) - subDirs = append(subDirs, file.Name + "/") + storage.savePathID("snapshots/"+file.Name, file.Id) + subDirs = append(subDirs, file.Name+"/") } return subDirs, nil, nil } else if strings.HasPrefix(dir, "snapshots/") || strings.HasPrefix(dir, "benchmark") { @@ -438,8 +438,8 @@ func (storage *GCDStorage) ListFiles(threadIndex int, dir string) ([]string, []i files = append(files, name) sizes = append(sizes, entry.Size) } else { - parents = append(parents, parent+ "/" + entry.Name) - storage.savePathID(parent + "/" + entry.Name, entry.Id) + parents = append(parents, parent+"/"+entry.Name) + storage.savePathID(parent+"/"+entry.Name, entry.Id) } } } diff --git a/src/duplicacy_hubicstorage.go b/src/duplicacy_hubicstorage.go index 6af4679..d5c6673 100644 --- a/src/duplicacy_hubicstorage.go +++ b/src/duplicacy_hubicstorage.go @@ -113,7 +113,7 @@ func (storage *HubicStorage) ListFiles(threadIndex int, dir string) ([]string, [ for _, entry := range entries { if entry.Type == "application/directory" { - files = append(files, entry.Name + "/") + files = append(files, entry.Name+"/") sizes = append(sizes, 0) } else { files = append(files, entry.Name) diff --git a/src/duplicacy_sftpstorage.go b/src/duplicacy_sftpstorage.go index fae4ced..b44240c 100644 --- a/src/duplicacy_sftpstorage.go +++ b/src/duplicacy_sftpstorage.go @@ -207,7 +207,7 @@ func (storage *SFTPStorage) UploadFile(threadIndex int, filePath string, content if err != nil { // The error may be caused by a non-existent fullDir, or a broken connection. In either case, // we just assume it is the former because there isn't a way to tell which is the case. - for i, _ := range dirs[1 : len(dirs)-1] { + for i := range dirs[1 : len(dirs)-1] { subDir := path.Join(storage.storageDir, path.Join(dirs[0:i+2]...)) // We don't check the error; just keep going blindly but always store the last err err = storage.client.Mkdir(subDir) diff --git a/src/duplicacy_shadowcopy_darwin.go b/src/duplicacy_shadowcopy_darwin.go index b48c294..8dce049 100755 --- a/src/duplicacy_shadowcopy_darwin.go +++ b/src/duplicacy_shadowcopy_darwin.go @@ -25,7 +25,7 @@ var snapshotDate string func CharsToString(ca []int8) string { len := len(ca) - ba := make([]byte, len) + ba := make([]byte, len) for i, v := range ca { ba[i] = byte(v) @@ -54,8 +54,8 @@ func GetPathDeviceId(path string) (deviceId int32, err error) { // Executes shell command with timeout and returns stdout func CommandWithTimeout(timeoutInSeconds int, name string, arg ...string) (output string, err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeoutInSeconds) * time.Second) - defer cancel() + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeoutInSeconds)*time.Second) + defer cancel() cmd := exec.CommandContext(ctx, name, arg...) out, err := cmd.Output() @@ -91,10 +91,10 @@ func DeleteShadowCopy() { LOG_ERROR("VSS_DELETE", "Error while deleting temporary mount directory") return } - + LOG_INFO("VSS_DELETE", "Shadow copy unmounted and deleted at %s", snapshotPath) - snapshotPath = "" + snapshotPath = "" } func CreateShadowCopy(top string, shadowCopy bool, timeoutInSeconds int) (shadowTop string) { @@ -128,7 +128,7 @@ func CreateShadowCopy(top string, shadowCopy bool, timeoutInSeconds int) (shadow } if deviceIdLocal != deviceIdRepository { LOG_WARN("VSS_PATH", "VSS not supported for non-local repository path: ", top) - return top + return top } if timeoutInSeconds <= 60 { @@ -157,8 +157,8 @@ func CreateShadowCopy(top string, shadowCopy bool, timeoutInSeconds int) (shadow snapshotDate = strings.TrimSpace(tmutilOutput[colonPos+1:]) // Mount snapshot as readonly and hide from GUI i.e. Finder - _, err = CommandWithTimeout(timeoutInSeconds, - "/sbin/mount", "-t", "apfs", "-o", "nobrowse,-r,-s=com.apple.TimeMachine." + snapshotDate, "/", snapshotPath) + _, err = CommandWithTimeout(timeoutInSeconds, + "/sbin/mount", "-t", "apfs", "-o", "nobrowse,-r,-s=com.apple.TimeMachine."+snapshotDate, "/", snapshotPath) if err != nil { LOG_ERROR("VSS_CREATE", "Error while mounting snapshot: ", err) return top diff --git a/src/duplicacy_snapshotmanager.go b/src/duplicacy_snapshotmanager.go index f05d062..3ee6a6a 100644 --- a/src/duplicacy_snapshotmanager.go +++ b/src/duplicacy_snapshotmanager.go @@ -57,7 +57,7 @@ func CreateFossilCollection(allSnapshots map[string][]*Snapshot) *FossilCollecti } return &FossilCollection{ - LastRevisions: lastRevisions, + LastRevisions: lastRevisions, DeletedRevisions: make(map[string][]int), } } @@ -807,7 +807,7 @@ func (manager *SnapshotManager) CheckSnapshots(snapshotID string, revisionsToChe snapshotIDIndex := 0 totalMissingChunks := 0 - for snapshotID, _ = range snapshotMap { + for snapshotID = range snapshotMap { revisions := revisionsToCheck if len(revisions) == 0 || showStatistics { @@ -839,7 +839,7 @@ func (manager *SnapshotManager) CheckSnapshots(snapshotID string, revisionsToChe } LOG_INFO("SNAPSHOT_CHECK", "Total chunk size is %s in %d chunks", PrettyNumber(totalChunkSize), len(chunkSizeMap)) - for snapshotID, _ = range snapshotMap { + for snapshotID = range snapshotMap { for _, snapshot := range snapshotMap[snapshotID] { @@ -855,7 +855,7 @@ func (manager *SnapshotManager) CheckSnapshots(snapshotID string, revisionsToChe } missingChunks := 0 - for chunkID, _ := range chunks { + for chunkID := range chunks { _, found := chunkSizeMap[chunkID] @@ -953,7 +953,7 @@ func (manager *SnapshotManager) ShowStatistics(snapshotMap map[string][]*Snapsho var totalChunkSize int64 var uniqueChunkSize int64 - for chunkID, _ := range chunks { + for chunkID := range chunks { chunkSize := chunkSizeMap[chunkID] totalChunkSize += chunkSize if chunkUniqueMap[chunkID] { @@ -971,7 +971,7 @@ func (manager *SnapshotManager) ShowStatistics(snapshotMap map[string][]*Snapsho var totalChunkSize int64 var uniqueChunkSize int64 - for chunkID, _ := range snapshotChunks { + for chunkID := range snapshotChunks { chunkSize := chunkSizeMap[chunkID] totalChunkSize += chunkSize @@ -1021,7 +1021,7 @@ func (manager *SnapshotManager) ShowStatisticsTabular(snapshotMap map[string][]* var newChunkCount int64 var newChunkSize int64 - for chunkID, _ := range chunks { + for chunkID := range chunks { chunkSize := chunkSizeMap[chunkID] totalChunkSize += chunkSize totalChunkCount += 1 @@ -1049,7 +1049,7 @@ func (manager *SnapshotManager) ShowStatisticsTabular(snapshotMap map[string][]* var uniqueChunkSize int64 var totalChunkCount int64 var uniqueChunkCount int64 - for chunkID, _ := range snapshotChunks { + for chunkID := range snapshotChunks { chunkSize := chunkSizeMap[chunkID] totalChunkSize += chunkSize totalChunkCount += 1 @@ -2221,7 +2221,7 @@ func (manager *SnapshotManager) pruneSnapshotsExhaustive(referencedFossils map[s continue } - manager.chunkOperator.Resurrect(chunk, chunkDir + file) + manager.chunkOperator.Resurrect(chunk, chunkDir+file) fmt.Fprintf(logFile, "Found referenced fossil %s\n", file) } else { @@ -2232,7 +2232,7 @@ func (manager *SnapshotManager) pruneSnapshotsExhaustive(referencedFossils map[s } if exclusive { - manager.chunkOperator.Delete(chunk, chunkDir + file) + manager.chunkOperator.Delete(chunk, chunkDir+file) } else { collection.AddFossil(chunkDir + file) LOG_DEBUG("FOSSIL_FIND", "Found unreferenced fossil %s", file) @@ -2409,7 +2409,7 @@ func (manager *SnapshotManager) DownloadFile(path string, derivationKey string) } if len(derivationKey) > 64 { - derivationKey = derivationKey[len(derivationKey) - 64:] + derivationKey = derivationKey[len(derivationKey)-64:] } err = manager.fileChunk.Decrypt(manager.config.FileKey, derivationKey) @@ -2443,7 +2443,7 @@ func (manager *SnapshotManager) UploadFile(path string, derivationKey string, co } if len(derivationKey) > 64 { - derivationKey = derivationKey[len(derivationKey) - 64:] + derivationKey = derivationKey[len(derivationKey)-64:] } err := manager.fileChunk.Encrypt(manager.config.FileKey, derivationKey) diff --git a/src/duplicacy_snapshotmanager_test.go b/src/duplicacy_snapshotmanager_test.go index 333f5b7..ba1898b 100644 --- a/src/duplicacy_snapshotmanager_test.go +++ b/src/duplicacy_snapshotmanager_test.go @@ -9,12 +9,12 @@ import ( "encoding/hex" "encoding/json" "fmt" + "io/ioutil" "os" "path" "strings" "testing" "time" - "io/ioutil" ) func createDummySnapshot(snapshotID string, revision int, endTime int64) *Snapshot { @@ -500,7 +500,7 @@ func TestPruneWithRetentionPolicyAndTag(t *testing.T) { t.Logf("Creating 30 snapshots") for i := 0; i < 30; i++ { tag := "auto" - if i % 3 == 0 { + if i%3 == 0 { tag = "manual" } createTestSnapshot(snapshotManager, "vm1@host1", i+1, now-int64(30-i)*day-3600, now-int64(30-i)*day-60, []string{chunkHashes[i]}, tag) @@ -615,12 +615,12 @@ func TestPruneNewSnapshots(t *testing.T) { // Create another snapshot of vm1 that brings back chunkHash1 createTestSnapshot(snapshotManager, "vm1@host1", 3, now-0*day-3600, now-0*day-60, []string{chunkHash1, chunkHash3}, "tag") // Create another snapshot of vm2 so the fossil collection will be processed by next prune - createTestSnapshot(snapshotManager, "vm2@host1", 2, now + 3600, now + 3600 * 2, []string{chunkHash4, chunkHash5}, "tag") + createTestSnapshot(snapshotManager, "vm2@host1", 2, now+3600, now+3600*2, []string{chunkHash4, chunkHash5}, "tag") // Now chunkHash1 wil be resurrected snapshotManager.PruneSnapshots("vm1@host1", "vm1@host1", []int{}, []string{}, []string{}, false, false, []string{}, false, false, false, 1) checkTestSnapshots(snapshotManager, 4, 0) - snapshotManager.CheckSnapshots("vm1@host1", []int{2, 3}, "", false, false, false, false, false); + snapshotManager.CheckSnapshots("vm1@host1", []int{2, 3}, "", false, false, false, false, false) } // A fossil collection left by an aborted prune should be ignored if any supposedly deleted snapshot exists @@ -664,12 +664,12 @@ func TestPruneGhostSnapshots(t *testing.T) { // Create another snapshot of vm1 so the fossil collection becomes eligible for processing. chunkHash4 := uploadRandomChunk(snapshotManager, chunkSize) - createTestSnapshot(snapshotManager, "vm1@host1", 3, now - day - 3600, now - day - 60, []string{chunkHash3, chunkHash4}, "tag") + createTestSnapshot(snapshotManager, "vm1@host1", 3, now-day-3600, now-day-60, []string{chunkHash3, chunkHash4}, "tag") // Run the prune again but the fossil collection should be igored, since revision 1 still exists snapshotManager.PruneSnapshots("vm1@host1", "vm1@host1", []int{}, []string{}, []string{}, false, false, []string{}, false, false, false, 1) checkTestSnapshots(snapshotManager, 3, 2) - snapshotManager.CheckSnapshots("vm1@host1", []int{1, 2, 3}, "", false, false, false, true /*searchFossils*/, false); + snapshotManager.CheckSnapshots("vm1@host1", []int{1, 2, 3}, "", false, false, false, true /*searchFossils*/, false) // Prune snapshot 1 again snapshotManager.PruneSnapshots("vm1@host1", "vm1@host1", []int{1}, []string{}, []string{}, false, false, []string{}, false, false, false, 1) @@ -677,11 +677,11 @@ func TestPruneGhostSnapshots(t *testing.T) { // Create another snapshot chunkHash5 := uploadRandomChunk(snapshotManager, chunkSize) - createTestSnapshot(snapshotManager, "vm1@host1", 4, now + 3600, now + 3600 * 2, []string{chunkHash5, chunkHash5}, "tag") + createTestSnapshot(snapshotManager, "vm1@host1", 4, now+3600, now+3600*2, []string{chunkHash5, chunkHash5}, "tag") checkTestSnapshots(snapshotManager, 3, 2) // Run the prune again and this time the fossil collection will be processed and the fossils removed snapshotManager.PruneSnapshots("vm1@host1", "vm1@host1", []int{}, []string{}, []string{}, false, false, []string{}, false, false, false, 1) checkTestSnapshots(snapshotManager, 3, 0) - snapshotManager.CheckSnapshots("vm1@host1", []int{2, 3, 4}, "", false, false, false, false, false); + snapshotManager.CheckSnapshots("vm1@host1", []int{2, 3, 4}, "", false, false, false, false, false) } diff --git a/src/duplicacy_storage.go b/src/duplicacy_storage.go index ed5b4df..fd6493f 100644 --- a/src/duplicacy_storage.go +++ b/src/duplicacy_storage.go @@ -626,7 +626,7 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor } else if matched[1] == "webdav" || matched[1] == "webdav-http" { server := matched[3] username := matched[2] - username = username[:len(username) - 1] + username = username[:len(username)-1] storageDir := matched[5] port := 0 useHTTP := matched[1] == "webdav-http" diff --git a/src/duplicacy_swiftstorage.go b/src/duplicacy_swiftstorage.go index 749fe6d..3d36057 100644 --- a/src/duplicacy_swiftstorage.go +++ b/src/duplicacy_swiftstorage.go @@ -21,7 +21,7 @@ type SwiftStorage struct { threads int } -// CreateSwiftStorage creates an OpenStack Swift storage object. storageURL is in the form of +// CreateSwiftStorage creates an OpenStack Swift storage object. storageURL is in the form of // `user@authURL/container/path?arg1=value1&arg2=value2`` func CreateSwiftStorage(storageURL string, key string, threads int) (storage *SwiftStorage, err error) { diff --git a/src/duplicacy_utils_windows.go b/src/duplicacy_utils_windows.go index 720600d..6a9b066 100644 --- a/src/duplicacy_utils_windows.go +++ b/src/duplicacy_utils_windows.go @@ -7,10 +7,10 @@ package duplicacy import ( "fmt" "os" + "path/filepath" "strings" "syscall" "unsafe" - "path/filepath" ) type symbolicLinkReparseBuffer struct { diff --git a/src/duplicacy_wasabistorage.go b/src/duplicacy_wasabistorage.go index 9cf59a2..62e9d65 100644 --- a/src/duplicacy_wasabistorage.go +++ b/src/duplicacy_wasabistorage.go @@ -100,7 +100,7 @@ func (storage *WasabiStorage) MoveFile( var from_path string // The from path includes the bucket. Take care not to include an empty storageDir // string as Wasabi's backend will return 404 on URLs with double slashes. - if (storage.storageDir == "") { + if storage.storageDir == "" { from_path = fmt.Sprintf("/%s/%s", storage.bucket, from) } else { from_path = fmt.Sprintf("/%s/%s/%s", storage.bucket, storage.storageDir, from) diff --git a/src/duplicacy_webdavstorage.go b/src/duplicacy_webdavstorage.go index 63e3ccb..419f71e 100644 --- a/src/duplicacy_webdavstorage.go +++ b/src/duplicacy_webdavstorage.go @@ -19,9 +19,9 @@ import ( "net/http" //"net/http/httputil" "strconv" + "strings" "sync" "time" - "strings" ) type WebDAVStorage struct { @@ -42,10 +42,10 @@ type WebDAVStorage struct { var ( errWebDAVAuthorizationFailure = errors.New("Authentication failed") - errWebDAVMovedPermanently = errors.New("Moved permanently") - errWebDAVNotExist = errors.New("Path does not exist") - errWebDAVMaximumBackoff = errors.New("Maximum backoff reached") - errWebDAVMethodNotAllowed = errors.New("Method not allowed") + errWebDAVMovedPermanently = errors.New("Moved permanently") + errWebDAVNotExist = errors.New("Path does not exist") + errWebDAVMaximumBackoff = errors.New("Maximum backoff reached") + errWebDAVMethodNotAllowed = errors.New("Method not allowed") ) func CreateWebDAVStorage(host string, port int, username string, password string, storageDir string, useHTTP bool, threads int) (storage *WebDAVStorage, err error) { @@ -68,7 +68,7 @@ func CreateWebDAVStorage(host string, port int, username string, password string // Make sure it doesn't follow redirect storage.client.CheckRedirect = func(req *http.Request, via []*http.Request) error { - return http.ErrUseLastResponse + return http.ErrUseLastResponse } exist, isDir, _, err := storage.GetFileInfo(0, storageDir) @@ -325,11 +325,11 @@ func (storage *WebDAVStorage) GetFileInfo(threadIndex int, filePath string) (exi return false, false, 0, err } - if m, exist := properties["/" + storage.storageDir + filePath]; !exist { + if m, exist := properties["/"+storage.storageDir+filePath]; !exist { return false, false, 0, nil } else if resourceType, exist := m["resourcetype"]; exist && strings.Contains(resourceType, "collection") { return true, true, 0, nil - } else if length, exist := m["getcontentlength"]; exist && length != ""{ + } else if length, exist := m["getcontentlength"]; exist && length != "" { value, _ := strconv.Atoi(length) return true, false, int64(value), nil } else { From a782d42ad6bfbfabe208110f8e09585912cf3eae Mon Sep 17 00:00:00 2001 From: Michael Cook Date: Wed, 7 Nov 2018 13:19:46 +0100 Subject: [PATCH 3/4] go vet: result of fmt.Errorf call not used --- src/duplicacy_filestorage.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/duplicacy_filestorage.go b/src/duplicacy_filestorage.go index 1fbd090..937b624 100644 --- a/src/duplicacy_filestorage.go +++ b/src/duplicacy_filestorage.go @@ -165,7 +165,7 @@ func (storage *FileStorage) UploadFile(threadIndex int, filePath string, content } } else { if !stat.IsDir() { - fmt.Errorf("The path %s is not a directory", dir) + return fmt.Errorf("The path %s is not a directory", dir) } } } From 4b9524bd435b860fb3a33277daff4950060fb244 Mon Sep 17 00:00:00 2001 From: Michael Cook Date: Wed, 7 Nov 2018 13:25:16 +0100 Subject: [PATCH 4/4] go vet: unreachable code --- src/duplicacy_s3storage.go | 2 -- src/duplicacy_storage_test.go | 7 ++----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/duplicacy_s3storage.go b/src/duplicacy_s3storage.go index e29af95..5f7d3e8 100644 --- a/src/duplicacy_s3storage.go +++ b/src/duplicacy_s3storage.go @@ -237,8 +237,6 @@ func (storage *S3Storage) UploadFile(threadIndex int, filePath string, content [ LOG_INFO("S3_RETRY", "Retrying on %s: %v", reflect.TypeOf(err), err) attempts += 1 } - - return err } // If a local snapshot cache is needed for the storage to avoid downloading/uploading chunks too often when diff --git a/src/duplicacy_storage_test.go b/src/duplicacy_storage_test.go index 01c333a..88a037f 100644 --- a/src/duplicacy_storage_test.go +++ b/src/duplicacy_storage_test.go @@ -80,12 +80,12 @@ func loadStorage(localStoragePath string, threads int) (Storage, error) { return storage, err } else if testStorageName == "s3" { storage, err := CreateS3Storage(config["region"], config["endpoint"], config["bucket"], config["directory"], config["access_key"], config["secret_key"], threads, true, false) - return storage, err storage.SetDefaultNestingLevels([]int{2, 3}, 2) + return storage, err } else if testStorageName == "wasabi" { storage, err := CreateWasabiStorage(config["region"], config["endpoint"], config["bucket"], config["directory"], config["access_key"], config["secret_key"], threads) - return storage, err storage.SetDefaultNestingLevels([]int{2, 3}, 2) + return storage, err } else if testStorageName == "s3c" { storage, err := CreateS3CStorage(config["region"], config["endpoint"], config["bucket"], config["directory"], config["access_key"], config["secret_key"], threads) storage.SetDefaultNestingLevels([]int{2, 3}, 2) @@ -153,10 +153,7 @@ func loadStorage(localStoragePath string, threads int) (Storage, error) { } storage.SetDefaultNestingLevels([]int{2, 3}, 2) return storage, err - } else { - return nil, fmt.Errorf("Invalid storage named: %s", testStorageName) } - return nil, fmt.Errorf("Invalid storage named: %s", testStorageName) }