diff --git a/ACKNOWLEDGEMENTS.md b/ACKNOWLEDGEMENTS.md new file mode 100644 index 0000000..0e49886 --- /dev/null +++ b/ACKNOWLEDGEMENTS.md @@ -0,0 +1,14 @@ +Duplicacy is based on the following open source project: + +| Projects | License | +|--------|:-------:| +|https://github.com/urfave/cli | MIT | +|https://github.com/aryann/difflib | MIT | +|https://github.com/bkaradzic/go-lz4 | BSD-2-Clause | +|https://github.com/Azure/azure-sdk-for-go | Apache-2.0 | +|https://github.com/tj/go-dropbox | MIT | +|https://github.com/goamz/goamz | LGPL-3.0 with static compilation excpetions | +|https://github.com/howeyc/gopass | ISC | +|https://github.com/tmc/keyring | ISC | +|https://github.com/pcwizz/xattr | BSD-2-Clause | +|https://github.com/minio/blake2b-simd | Apache-2.0 | diff --git a/main/duplicacy_main.go b/main/duplicacy_main.go index fb7f430..936aa93 100644 --- a/main/duplicacy_main.go +++ b/main/duplicacy_main.go @@ -28,7 +28,6 @@ const ( var ScriptEnabled bool - func getRepositoryPreference(context *cli.Context, storageName string) (repository string, preference *duplicacy.Preference) { @@ -37,6 +36,7 @@ func getRepositoryPreference(context *cli.Context, storageName string) (reposito duplicacy.LOG_ERROR("REPOSITORY_PATH", "Failed to retrieve the current working directory: %v", err) return "", nil } + for { stat, err := os.Stat(path.Join(repository, duplicacy.DUPLICACY_DIRECTORY)) //TOKEEP if err != nil && !os.IsNotExist(err) { @@ -1682,7 +1682,7 @@ func main() { app.Name = "duplicacy" app.HelpName = "duplicacy" app.Usage = "A new generation cloud backup tool based on lock-free deduplication" - app.Version = "2.0.0" + app.Version = "2.0.2" err := app.Run(os.Args) if err != nil { os.Exit(2) diff --git a/duplicacy_acdclient.go b/src/duplicacy_acdclient.go similarity index 100% rename from duplicacy_acdclient.go rename to src/duplicacy_acdclient.go diff --git a/duplicacy_acdclient_test.go b/src/duplicacy_acdclient_test.go similarity index 100% rename from duplicacy_acdclient_test.go rename to src/duplicacy_acdclient_test.go diff --git a/duplicacy_acdstorage.go b/src/duplicacy_acdstorage.go similarity index 100% rename from duplicacy_acdstorage.go rename to src/duplicacy_acdstorage.go diff --git a/duplicacy_azurestorage.go b/src/duplicacy_azurestorage.go similarity index 100% rename from duplicacy_azurestorage.go rename to src/duplicacy_azurestorage.go diff --git a/duplicacy_b2client.go b/src/duplicacy_b2client.go similarity index 100% rename from duplicacy_b2client.go rename to src/duplicacy_b2client.go diff --git a/duplicacy_b2client_test.go b/src/duplicacy_b2client_test.go similarity index 100% rename from duplicacy_b2client_test.go rename to src/duplicacy_b2client_test.go diff --git a/duplicacy_b2storage.go b/src/duplicacy_b2storage.go similarity index 100% rename from duplicacy_b2storage.go rename to src/duplicacy_b2storage.go diff --git a/duplicacy_backupmanager.go b/src/duplicacy_backupmanager.go similarity index 100% rename from duplicacy_backupmanager.go rename to src/duplicacy_backupmanager.go diff --git a/duplicacy_backupmanager_test.go b/src/duplicacy_backupmanager_test.go similarity index 91% rename from duplicacy_backupmanager_test.go rename to src/duplicacy_backupmanager_test.go index 056d3ec..0a48dbb 100644 --- a/duplicacy_backupmanager_test.go +++ b/src/duplicacy_backupmanager_test.go @@ -267,6 +267,20 @@ func TestBackupManager(t *testing.T) { } } + // Remove file2 and dir1/file3 and restore them from revision 3 + os.Remove(testDir + "/repository1/file2") + os.Remove(testDir + "/repository1/dir1/file3") + backupManager.Restore(testDir + "/repository1", 3, /*inPlace=*/true, /*quickMode=*/false, threads, /*overwrite=*/true, + /*deleteMode=*/false, /*showStatistics=*/false, /*patterns=*/[]string{"+file2", "+dir1/file3", "-*"}) + + for _, f := range []string{ "file1", "file2", "dir1/file3" } { + hash1 := getFileHash(testDir + "/repository1/" + f) + hash2 := getFileHash(testDir + "/repository2/" + f) + if hash1 != hash2 { + t.Errorf("File %s has different hashes: %s vs %s", f, hash1, hash2) + } + } + /*buf := make([]byte, 1<<16) runtime.Stack(buf, true) fmt.Printf("%s", buf)*/ diff --git a/duplicacy_chunk.go b/src/duplicacy_chunk.go similarity index 100% rename from duplicacy_chunk.go rename to src/duplicacy_chunk.go diff --git a/duplicacy_chunk_test.go b/src/duplicacy_chunk_test.go similarity index 100% rename from duplicacy_chunk_test.go rename to src/duplicacy_chunk_test.go diff --git a/duplicacy_chunkdownloader.go b/src/duplicacy_chunkdownloader.go similarity index 98% rename from duplicacy_chunkdownloader.go rename to src/duplicacy_chunkdownloader.go index 689206c..74d8ec7 100644 --- a/duplicacy_chunkdownloader.go +++ b/src/duplicacy_chunkdownloader.go @@ -110,7 +110,7 @@ func (downloader *ChunkDownloader) AddFiles(snapshot *Snapshot, files [] *Entry) } downloader.taskList = append(downloader.taskList, task) } else { - downloader.taskList[lastChunkIndex].needed = true + downloader.taskList[len(downloader.taskList) - 1].needed = true } lastChunkIndex = i } @@ -353,7 +353,7 @@ func (downloader *ChunkDownloader) Download(threadIndex int, task ChunkDownloadT } } - if downloader.showStatistics || IsTracing() { + if (downloader.showStatistics || IsTracing()) && downloader.totalFileSize > 0 { atomic.AddInt64(&downloader.downloadedFileSize, int64(chunk.GetLength())) downloadFileSize := atomic.LoadInt64(&downloader.downloadedFileSize) diff --git a/duplicacy_chunkmaker.go b/src/duplicacy_chunkmaker.go similarity index 100% rename from duplicacy_chunkmaker.go rename to src/duplicacy_chunkmaker.go diff --git a/duplicacy_chunkmaker_test.go b/src/duplicacy_chunkmaker_test.go similarity index 100% rename from duplicacy_chunkmaker_test.go rename to src/duplicacy_chunkmaker_test.go diff --git a/duplicacy_chunkuploader.go b/src/duplicacy_chunkuploader.go similarity index 100% rename from duplicacy_chunkuploader.go rename to src/duplicacy_chunkuploader.go diff --git a/duplicacy_chunkuploader_test.go b/src/duplicacy_chunkuploader_test.go similarity index 100% rename from duplicacy_chunkuploader_test.go rename to src/duplicacy_chunkuploader_test.go diff --git a/duplicacy_config.go b/src/duplicacy_config.go similarity index 100% rename from duplicacy_config.go rename to src/duplicacy_config.go diff --git a/duplicacy_dropboxstorage.go b/src/duplicacy_dropboxstorage.go similarity index 100% rename from duplicacy_dropboxstorage.go rename to src/duplicacy_dropboxstorage.go diff --git a/duplicacy_entry.go b/src/duplicacy_entry.go similarity index 100% rename from duplicacy_entry.go rename to src/duplicacy_entry.go diff --git a/duplicacy_entry_test.go b/src/duplicacy_entry_test.go similarity index 100% rename from duplicacy_entry_test.go rename to src/duplicacy_entry_test.go diff --git a/duplicacy_filereader.go b/src/duplicacy_filereader.go similarity index 100% rename from duplicacy_filereader.go rename to src/duplicacy_filereader.go diff --git a/duplicacy_filestorage.go b/src/duplicacy_filestorage.go similarity index 100% rename from duplicacy_filestorage.go rename to src/duplicacy_filestorage.go diff --git a/duplicacy_gcdstorage.go b/src/duplicacy_gcdstorage.go similarity index 100% rename from duplicacy_gcdstorage.go rename to src/duplicacy_gcdstorage.go diff --git a/duplicacy_gcsstorage.go b/src/duplicacy_gcsstorage.go similarity index 100% rename from duplicacy_gcsstorage.go rename to src/duplicacy_gcsstorage.go diff --git a/duplicacy_hubicclient.go b/src/duplicacy_hubicclient.go similarity index 100% rename from duplicacy_hubicclient.go rename to src/duplicacy_hubicclient.go diff --git a/duplicacy_hubicclient_test.go b/src/duplicacy_hubicclient_test.go similarity index 100% rename from duplicacy_hubicclient_test.go rename to src/duplicacy_hubicclient_test.go diff --git a/duplicacy_hubicstorage.go b/src/duplicacy_hubicstorage.go similarity index 100% rename from duplicacy_hubicstorage.go rename to src/duplicacy_hubicstorage.go diff --git a/duplicacy_keyring.go b/src/duplicacy_keyring.go similarity index 100% rename from duplicacy_keyring.go rename to src/duplicacy_keyring.go diff --git a/duplicacy_keyring_windows.go b/src/duplicacy_keyring_windows.go similarity index 100% rename from duplicacy_keyring_windows.go rename to src/duplicacy_keyring_windows.go diff --git a/duplicacy_log.go b/src/duplicacy_log.go similarity index 100% rename from duplicacy_log.go rename to src/duplicacy_log.go diff --git a/duplicacy_oneclient.go b/src/duplicacy_oneclient.go similarity index 100% rename from duplicacy_oneclient.go rename to src/duplicacy_oneclient.go diff --git a/duplicacy_oneclient_test.go b/src/duplicacy_oneclient_test.go similarity index 100% rename from duplicacy_oneclient_test.go rename to src/duplicacy_oneclient_test.go diff --git a/duplicacy_onestorage.go b/src/duplicacy_onestorage.go similarity index 100% rename from duplicacy_onestorage.go rename to src/duplicacy_onestorage.go diff --git a/duplicacy_preference.go b/src/duplicacy_preference.go similarity index 100% rename from duplicacy_preference.go rename to src/duplicacy_preference.go diff --git a/duplicacy_s3storage.go b/src/duplicacy_s3storage.go similarity index 100% rename from duplicacy_s3storage.go rename to src/duplicacy_s3storage.go diff --git a/duplicacy_sftpstorage.go b/src/duplicacy_sftpstorage.go similarity index 100% rename from duplicacy_sftpstorage.go rename to src/duplicacy_sftpstorage.go diff --git a/duplicacy_shadowcopy.go b/src/duplicacy_shadowcopy.go similarity index 100% rename from duplicacy_shadowcopy.go rename to src/duplicacy_shadowcopy.go diff --git a/duplicacy_shadowcopy_windows.go b/src/duplicacy_shadowcopy_windows.go similarity index 100% rename from duplicacy_shadowcopy_windows.go rename to src/duplicacy_shadowcopy_windows.go diff --git a/duplicacy_snapshot.go b/src/duplicacy_snapshot.go similarity index 100% rename from duplicacy_snapshot.go rename to src/duplicacy_snapshot.go diff --git a/duplicacy_snapshotmanager.go b/src/duplicacy_snapshotmanager.go similarity index 100% rename from duplicacy_snapshotmanager.go rename to src/duplicacy_snapshotmanager.go diff --git a/duplicacy_snapshotmanager_test.go b/src/duplicacy_snapshotmanager_test.go similarity index 100% rename from duplicacy_snapshotmanager_test.go rename to src/duplicacy_snapshotmanager_test.go diff --git a/duplicacy_storage.go b/src/duplicacy_storage.go similarity index 99% rename from duplicacy_storage.go rename to src/duplicacy_storage.go index 1c415e2..8d434de 100644 --- a/duplicacy_storage.go +++ b/src/duplicacy_storage.go @@ -135,7 +135,7 @@ func CreateStorage(repository string, preference Preference, resetPassword bool, if strings.HasPrefix(storageURL, "/") { isFileStorage = true } else if runtime.GOOS == "windows" { - if len(storageURL) > 3 && storageURL[1] == ':' && (storageURL[2] == '/' || storageURL[2] == '\\') { + if len(storageURL) >= 3 && storageURL[1] == ':' && (storageURL[2] == '/' || storageURL[2] == '\\') { volume := strings.ToLower(storageURL[:1]) if volume[0] >= 'a' && volume[0] <= 'z' { isFileStorage = true diff --git a/duplicacy_storage_test.go b/src/duplicacy_storage_test.go similarity index 100% rename from duplicacy_storage_test.go rename to src/duplicacy_storage_test.go diff --git a/duplicacy_utils.go b/src/duplicacy_utils.go similarity index 100% rename from duplicacy_utils.go rename to src/duplicacy_utils.go diff --git a/duplicacy_utils_others.go b/src/duplicacy_utils_others.go similarity index 100% rename from duplicacy_utils_others.go rename to src/duplicacy_utils_others.go diff --git a/duplicacy_utils_test.go b/src/duplicacy_utils_test.go similarity index 100% rename from duplicacy_utils_test.go rename to src/duplicacy_utils_test.go diff --git a/duplicacy_utils_windows.go b/src/duplicacy_utils_windows.go similarity index 100% rename from duplicacy_utils_windows.go rename to src/duplicacy_utils_windows.go