diff options
-rw-r--r-- | bin/bbackupquery/BackupQueries.cpp | 29 | ||||
-rw-r--r-- | bin/bbackupquery/documentation.txt | 7 | ||||
-rw-r--r-- | test/bbackupd/testbbackupd.cpp | 26 |
3 files changed, 51 insertions, 11 deletions
diff --git a/bin/bbackupquery/BackupQueries.cpp b/bin/bbackupquery/BackupQueries.cpp index c7dd82c2..002a9ec4 100644 --- a/bin/bbackupquery/BackupQueries.cpp +++ b/bin/bbackupquery/BackupQueries.cpp @@ -1951,9 +1951,10 @@ void BackupQueries::Compare(int64_t DirID, const std::string &rStoreDir, void BackupQueries::CommandRestore(const std::vector<std::string> &args, const bool *opts) { // Check arguments - if(args.size() != 2) + if(args.size() < 1 || args.size() > 2) { - BOX_ERROR("Incorrect usage. restore [-drif] <remote-name> <local-name>"); + BOX_ERROR("Incorrect usage. restore [-drif] <remote-name> " + "[<local-name>]"); return; } @@ -1994,18 +1995,30 @@ void BackupQueries::CommandRestore(const std::vector<std::string> &args, const b BOX_ERROR("Directory '" << args[0] << "' not found on server"); return; } + if(dirID == BackupProtocolClientListDirectory::RootDirectory) { BOX_ERROR("Cannot restore the root directory -- restore locations individually."); return; } - -#ifdef WIN32 + std::string localName; - if(!ConvertConsoleToUtf8(args[1].c_str(), localName)) return; -#else - std::string localName(args[1]); -#endif + + if(args.size() == 2) + { + #ifdef WIN32 + if(!ConvertConsoleToUtf8(args[1].c_str(), localName)) + { + return; + } + #else + localName = args[1]; + #endif + } + else + { + localName = args[0]; + } // Go and restore... int result; diff --git a/bin/bbackupquery/documentation.txt b/bin/bbackupquery/documentation.txt index 96eda158..214fe218 100644 --- a/bin/bbackupquery/documentation.txt +++ b/bin/bbackupquery/documentation.txt @@ -119,10 +119,13 @@ compare <store-dir-name> <local-dir-name> This can be used for automated tests. < -> restore [-drif] <directory-name> <local-directory-name> +> restore [-drif] <directory-name> [<local-directory-name>] Restores a directory to the local disc. The local directory specified - must not exist (unless a previous restore is being restarted). + must not exist (unless a previous restore is being restarted). If the + local directory is omitted, the default is to restore to the same + directory name and path, relative to the current local directory, + as set with the "lcd" command. The root cannot be restored -- restore locations individually. diff --git a/test/bbackupd/testbbackupd.cpp b/test/bbackupd/testbbackupd.cpp index 32f3c176..c129a584 100644 --- a/test/bbackupd/testbbackupd.cpp +++ b/test/bbackupd/testbbackupd.cpp @@ -2070,6 +2070,31 @@ int test_bbackupd() BackupQueries::ReturnCode::Compare_Same); TestRemoteProcessMemLeaks("bbackupquery.memleaks"); + // Try a restore with just the remote directory name, + // check that it uses the same name in the local + // directory. + TEST_THAT(::mkdir("testfiles/restore-test", 0700) == 0); + + compareReturnValue = ::system(BBACKUPQUERY " " + "-Wwarning " + "-c testfiles/bbackupd.conf " + "\"lcd testfiles/restore-test\" " + "\"restore Test1\" " + "quit"); + TEST_RETURN(compareReturnValue, + BackupQueries::ReturnCode::Command_OK); + TestRemoteProcessMemLeaks("bbackupquery.memleaks"); + + // check that it restored properly + compareReturnValue = ::system(BBACKUPQUERY " " + "-Wwarning " + "-c testfiles/bbackupd.conf " + "\"compare -cEQ Test1 testfiles/restore-test/Test1\" " + "quit"); + TEST_RETURN(compareReturnValue, + BackupQueries::ReturnCode::Compare_Same); + TestRemoteProcessMemLeaks("bbackupquery.memleaks"); + // put the permissions back to sensible values #ifdef WIN32 TEST_THAT(::system("chmod 0755 testfiles/" @@ -2082,7 +2107,6 @@ int test_bbackupd() TEST_THAT(chmod("testfiles/restore1/x1", 0755) == 0); #endif - } #ifdef WIN32 |