diff options
author | Brad King <brad.king@kitware.com> | 2009-04-15 13:58:13 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-04-15 13:58:13 (GMT) |
commit | 0d92350bb67de4632220e63d8f02c062596896d1 (patch) | |
tree | 131bd18d053f4c770a85dd417f9ecdec43a97f74 /Source | |
parent | d3363beb2f5b4bedee95aae6f6697f059ed3f48b (diff) | |
download | CMake-0d92350bb67de4632220e63d8f02c062596896d1.zip CMake-0d92350bb67de4632220e63d8f02c062596896d1.tar.gz CMake-0d92350bb67de4632220e63d8f02c062596896d1.tar.bz2 |
ENH: Create file(RENAME) command mode
This creates command "file(RENAME <oldname> <newname>)" to rename a file
or directory within a single disk volume.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmFileCommand.cxx | 43 | ||||
-rw-r--r-- | Source/cmFileCommand.h | 5 |
2 files changed, 48 insertions, 0 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index ab8edda..1808027 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -100,6 +100,10 @@ bool cmFileCommand { return this->HandleMakeDirectoryCommand(args); } + else if ( subCommand == "RENAME" ) + { + return this->HandleRename(args); + } else if ( subCommand == "REMOVE" ) { return this->HandleRemove(args, false); @@ -2175,6 +2179,45 @@ bool cmFileCommand::HandleRelativePathCommand( //---------------------------------------------------------------------------- +bool cmFileCommand::HandleRename(std::vector<std::string> const& args) +{ + if(args.size() != 3) + { + this->SetError("given incorrect number of arguments."); + return false; + } + + // Compute full path for old and new names. + std::string oldname = args[1]; + if(!cmsys::SystemTools::FileIsFullPath(oldname.c_str())) + { + oldname = this->Makefile->GetCurrentDirectory(); + oldname += "/" + args[1]; + } + std::string newname = args[2]; + if(!cmsys::SystemTools::FileIsFullPath(newname.c_str())) + { + newname = this->Makefile->GetCurrentDirectory(); + newname += "/" + args[2]; + } + + if(!cmSystemTools::RenameFile(oldname.c_str(), newname.c_str())) + { + std::string err = cmSystemTools::GetLastSystemError(); + cmOStringStream e; + e << "RENAME failed to rename\n" + << " " << oldname << "\n" + << "to\n" + << " " << newname << "\n" + << "because: " << err << "\n"; + this->SetError(e.str().c_str()); + return false; + } + return true; +} + + +//---------------------------------------------------------------------------- bool cmFileCommand::HandleRemove(std::vector<std::string> const& args, bool recurse) { diff --git a/Source/cmFileCommand.h b/Source/cmFileCommand.h index 656ad96..9257855 100644 --- a/Source/cmFileCommand.h +++ b/Source/cmFileCommand.h @@ -78,6 +78,7 @@ public: " file(GLOB variable [RELATIVE path] [globbing expressions]...)\n" " file(GLOB_RECURSE variable [RELATIVE path] \n" " [FOLLOW_SYMLINKS] [globbing expressions]...)\n" + " file(RENAME <oldname> <newname>)\n" " file(REMOVE [file1 ...])\n" " file(REMOVE_RECURSE [file1 ...])\n" " file(MAKE_DIRECTORY [directory1 directory2 ...])\n" @@ -133,6 +134,9 @@ public: " /dir/*.py - match all python files in /dir and subdirectories\n" "MAKE_DIRECTORY will create the given directories, also if their parent " "directories don't exist yet\n" + "RENAME moves a file or directory within a filesystem, " + "replacing the destination atomically." + "\n" "REMOVE will remove the given files, also in subdirectories\n" "REMOVE_RECURSE will remove the given files and directories, also " "non-empty directories\n" @@ -159,6 +163,7 @@ public: cmTypeMacro(cmFileCommand, cmCommand); protected: + bool HandleRename(std::vector<std::string> const& args); bool HandleRemove(std::vector<std::string> const& args, bool recurse); bool HandleWriteCommand(std::vector<std::string> const& args, bool append); bool HandleReadCommand(std::vector<std::string> const& args); |