ENH: Add untaring support

This commit is contained in:
Andy Cedilnik 2005-12-29 10:43:12 -05:00
parent 21c7454250
commit d1180fc4e1
3 changed files with 64 additions and 6 deletions

View File

@ -1382,7 +1382,7 @@ bool cmSystemTools::CreateTar(const char* outFileName, const std::vector<cmStdSt
TAR_VERBOSE
| 0) == -1)
{
fprintf(stderr, "tar_open(): %s\n", strerror(errno));
cmSystemTools::Error("Problem with tar_open(): ", strerror(errno));
return false;
}
@ -1395,9 +1395,10 @@ bool cmSystemTools::CreateTar(const char* outFileName, const std::vector<cmStdSt
buf[sizeof(buf)-1] = 0;
if (tar_append_tree(t, buf, pathname) != 0)
{
fprintf(stderr,
"tar_append_tree(\"%s\", \"%s\"): %s\n", buf,
pathname, strerror(errno));
cmOStringStream ostr;
ostr << "Problem with tar_append_tree(\"" << buf << "\", \"" << pathname << "\"): "
<< strerror(errno);
cmSystemTools::Error(ostr.str().c_str());
tar_close(t);
return false;
}
@ -1405,14 +1406,53 @@ bool cmSystemTools::CreateTar(const char* outFileName, const std::vector<cmStdSt
if (tar_append_eof(t) != 0)
{
fprintf(stderr, "tar_append_eof(): %s\n", strerror(errno));
cmSystemTools::Error("Problem with tar_append_eof(): ", strerror(errno));
tar_close(t);
return false;
}
if (tar_close(t) != 0)
{
fprintf(stderr, "tar_close(): %s\n", strerror(errno));
cmSystemTools::Error("Problem with tar_close(): ", strerror(errno));
return false;
}
return true;
#else
return false;
#endif
}
bool cmSystemTools::ExtractTar(const char* outFileName, const std::vector<cmStdString>& files)
{
#if defined(CMAKE_BUILD_WITH_CMAKE)
TAR *t;
// Ok, this libtar is not const safe. for now use auto_ptr hack
char* realName = new char[ strlen(outFileName) + 1 ];
std::auto_ptr<char> realNamePtr(realName);
strcpy(realName, outFileName);
if (tar_open(&t, realName,
NULL,
O_RDONLY
#ifdef _WIN32
| O_BINARY
#endif
, 0,
TAR_VERBOSE
| 0) == -1)
{
cmSystemTools::Error("Problem with tar_open(): ", strerror(errno));
return false;
}
if (tar_extract_all(t, 0) != 0)
{
cmSystemTools::Error("Problem with tar_extract_all(): ", strerror(errno));
return false;
}
if (tar_close(t) != 0)
{
cmSystemTools::Error("Problem with tar_close(): ", strerror(errno));
return false;
}
return true;

View File

@ -299,6 +299,7 @@ public:
/** Create tar */
static bool CreateTar(const char* outFileName, const std::vector<cmStdString>& files);
static bool ExtractTar(const char* inFileName, const std::vector<cmStdString>& files);
private:
static bool s_ForceUnixPaths;
static bool s_RunCommandHideConsole;

View File

@ -963,6 +963,23 @@ int cmake::CMakeCommand(std::vector<std::string>& args)
return 0;
}
// Untar files
else if (args[1] == "untar" && args.size() > 3)
{
std::string outFile = args[2];
std::vector<cmStdString> files;
for (std::string::size_type cc = 3; cc < args.size(); cc ++)
{
files.push_back(args[cc]);
}
if ( !cmSystemTools::ExtractTar(outFile.c_str(), files) )
{
cmSystemTools::Error("Problem extracting tar: ", outFile.c_str());
return 1;
}
return 0;
}
#if defined(CMAKE_BUILD_WITH_CMAKE)
// Internal CMake Fortran module support.
else if (args[1] == "cmake_copy_f90_mod" && args.size() >= 4)