# # # add_dir "tests/checkout_in_windows_root" # # add_file "tests/checkout_in_windows_root/__driver__.lua" # content [5342eac40f626f4fda003515c76af219892aaa91] # # patch "win32/fs.cc" # from [ea9b04b9ff4e1dccca546b1e63fd00beb8843c29] # to [952077b15aa3f8774b6261e37237472815a7c0ae] # ============================================================ --- tests/checkout_in_windows_root/__driver__.lua 5342eac40f626f4fda003515c76af219892aaa91 +++ tests/checkout_in_windows_root/__driver__.lua 5342eac40f626f4fda003515c76af219892aaa91 @@ -0,0 +1,15 @@ +-- mtn 0.4 had problems when checking out into the Windows root directory + +skip_if(ostype ~= "Windows") + +mtn_setup() + +addfile("testfile", "foo") +commit() + +root = os.tmpname() +check(indir(os.getenv("HOMEDRIVE").."/", mtn_outside_ws("--branch=testbranch", "checkout", root)), 0, false, nil) +remove(root) + +-- end of file + ============================================================ --- win32/fs.cc ea9b04b9ff4e1dccca546b1e63fd00beb8843c29 +++ win32/fs.cc 952077b15aa3f8774b6261e37237472815a7c0ae @@ -22,6 +22,11 @@ get_current_working_dir() E(getcwd(buffer, 4096), F("cannot get working directory: %s") % strerror(errno)); std::string str(buffer); + + // strip trailing backslash, but not if at root dir + if (str.size() == 3 && str[1] == ':' && str[2] == '\\') + return str; + if (str[str.size() - 1] == '\\') str = str.substr(0, str.size() - 1); return str; @@ -290,7 +295,7 @@ rename_clobberingly_impl(const char * fr L(FL("MoveFileEx failed with CALL_NOT_IMPLEMENTED, using fallback")); } } - + // This is not even remotely atomic, but what can you do? DeleteFile(to); return MoveFile(from, to); @@ -361,13 +366,13 @@ make_temp_file(std::string const & dir, v /= base; tmp.at(tmp.size() - 5) = letters[v % base]; v /= base; - + HANDLE h = CreateFile(tmp.c_str(), GENERIC_READ|GENERIC_WRITE, 0, // exclusive access (LPSECURITY_ATTRIBUTES)0, // default security CREATE_NEW, FILE_ATTRIBUTE_NORMAL, (HANDLE)0); // no template file - + if (h != INVALID_HANDLE_VALUE) { name = tmp;