mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-18 22:38:56 +00:00
Don't include directory names in archives.
This matches the behavior of both gnu and os x versions of ar. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184420 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6f2c88a08b
commit
be984d6376
@ -1,2 +1,8 @@
|
|||||||
;RUN: not llvm-ar r %T/test.a . 2>&1 | FileCheck %s
|
;RUN: not llvm-ar r %T/test.a . 2>&1 | FileCheck %s
|
||||||
;CHECK: . Is a directory
|
;CHECK: . Is a directory
|
||||||
|
|
||||||
|
;RUN: rm -f %T/test.a
|
||||||
|
;RUN: llvm-ar r %T/test.a %s
|
||||||
|
;RUN: llvm-ar t %T/test.a | FileCheck -check-prefix=MEMBERS %s
|
||||||
|
;MEMBERS-NOT: /
|
||||||
|
;MEMBERS: directory.ll
|
||||||
|
@ -97,15 +97,8 @@ bool ArchiveMember::replaceWith(StringRef newFile, std::string* ErrMsg) {
|
|||||||
else
|
else
|
||||||
flags &= ~StringTableFlag;
|
flags &= ~StringTableFlag;
|
||||||
|
|
||||||
// If it has a slash then it has a path
|
|
||||||
bool hasSlash = path.find('/') != std::string::npos;
|
|
||||||
if (hasSlash)
|
|
||||||
flags |= HasPathFlag;
|
|
||||||
else
|
|
||||||
flags &= ~HasPathFlag;
|
|
||||||
|
|
||||||
// If it has a slash or its over 15 chars then its a long filename format
|
// If it has a slash or its over 15 chars then its a long filename format
|
||||||
if (hasSlash || path.length() > 15)
|
if (path.length() > 15)
|
||||||
flags |= HasLongFilenameFlag;
|
flags |= HasLongFilenameFlag;
|
||||||
else
|
else
|
||||||
flags &= ~HasLongFilenameFlag;
|
flags &= ~HasLongFilenameFlag;
|
||||||
|
@ -52,9 +52,8 @@ class ArchiveMember : public ilist_node<ArchiveMember> {
|
|||||||
SVR4SymbolTableFlag = 1, ///< Member is a SVR4 symbol table
|
SVR4SymbolTableFlag = 1, ///< Member is a SVR4 symbol table
|
||||||
BSD4SymbolTableFlag = 2, ///< Member is a BSD4 symbol table
|
BSD4SymbolTableFlag = 2, ///< Member is a BSD4 symbol table
|
||||||
BitcodeFlag = 4, ///< Member is bitcode
|
BitcodeFlag = 4, ///< Member is bitcode
|
||||||
HasPathFlag = 8, ///< Member has a full or partial path
|
HasLongFilenameFlag = 8, ///< Member uses the long filename syntax
|
||||||
HasLongFilenameFlag = 16, ///< Member uses the long filename syntax
|
StringTableFlag = 16 ///< Member is an ar(1) format string table
|
||||||
StringTableFlag = 32 ///< Member is an ar(1) format string table
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
@ -125,10 +124,6 @@ class ArchiveMember : public ilist_node<ArchiveMember> {
|
|||||||
/// @brief Determine if this member is a bitcode file.
|
/// @brief Determine if this member is a bitcode file.
|
||||||
bool isBitcode() const { return flags&BitcodeFlag; }
|
bool isBitcode() const { return flags&BitcodeFlag; }
|
||||||
|
|
||||||
/// @returns true iff the file name contains a path (directory) component.
|
|
||||||
/// @brief Determine if the member has a path
|
|
||||||
bool hasPath() const { return flags&HasPathFlag; }
|
|
||||||
|
|
||||||
/// Long filenames are an artifact of the ar(1) file format which allows
|
/// Long filenames are an artifact of the ar(1) file format which allows
|
||||||
/// up to sixteen characters in its header and doesn't allow a path
|
/// up to sixteen characters in its header and doesn't allow a path
|
||||||
/// separator character (/). To avoid this, a "long format" member name is
|
/// separator character (/). To avoid this, a "long format" member name is
|
||||||
|
@ -98,13 +98,7 @@ Archive::fillHeader(const ArchiveMember &mbr, ArchiveMemberHeader& hdr,
|
|||||||
sprintf(buffer,"%-12u", unsigned(secondsSinceEpoch));
|
sprintf(buffer,"%-12u", unsigned(secondsSinceEpoch));
|
||||||
memcpy(hdr.date,buffer,12);
|
memcpy(hdr.date,buffer,12);
|
||||||
|
|
||||||
// Get rid of trailing blanks in the name
|
std::string mbrPath = sys::path::filename(mbr.getPath());
|
||||||
std::string mbrPath = mbr.getPath().str();
|
|
||||||
size_t mbrLen = mbrPath.length();
|
|
||||||
while (mbrLen > 0 && mbrPath[mbrLen-1] == ' ') {
|
|
||||||
mbrPath.erase(mbrLen-1,1);
|
|
||||||
mbrLen--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the name field in one of its various flavors.
|
// Set the name field in one of its various flavors.
|
||||||
bool writeLongName = false;
|
bool writeLongName = false;
|
||||||
@ -165,8 +159,8 @@ bool Archive::addFileBefore(StringRef filePath, iterator where,
|
|||||||
ArchiveMember* mbr = new ArchiveMember(this);
|
ArchiveMember* mbr = new ArchiveMember(this);
|
||||||
|
|
||||||
mbr->data = 0;
|
mbr->data = 0;
|
||||||
mbr->path = filePath.str();
|
mbr->path = filePath;
|
||||||
sys::PathWithStatus PWS(mbr->path);
|
sys::PathWithStatus PWS(filePath);
|
||||||
const sys::FileStatus *FSInfo = PWS.getFileStatus(false, ErrMsg);
|
const sys::FileStatus *FSInfo = PWS.getFileStatus(false, ErrMsg);
|
||||||
if (!FSInfo) {
|
if (!FSInfo) {
|
||||||
delete mbr;
|
delete mbr;
|
||||||
@ -179,10 +173,7 @@ bool Archive::addFileBefore(StringRef filePath, iterator where,
|
|||||||
mbr->Size = FSInfo->getSize();
|
mbr->Size = FSInfo->getSize();
|
||||||
|
|
||||||
unsigned flags = 0;
|
unsigned flags = 0;
|
||||||
bool hasSlash = filePath.str().find('/') != std::string::npos;
|
if (sys::path::filename(filePath).size() > 15)
|
||||||
if (hasSlash)
|
|
||||||
flags |= ArchiveMember::HasPathFlag;
|
|
||||||
if (hasSlash || filePath.str().length() > 15)
|
|
||||||
flags |= ArchiveMember::HasLongFilenameFlag;
|
flags |= ArchiveMember::HasLongFilenameFlag;
|
||||||
|
|
||||||
sys::fs::file_magic type;
|
sys::fs::file_magic type;
|
||||||
|
@ -399,14 +399,6 @@ doExtract(std::string* ErrMsg) {
|
|||||||
if (Paths.empty() ||
|
if (Paths.empty() ||
|
||||||
(std::find(Paths.begin(), Paths.end(), I->getPath()) != Paths.end())) {
|
(std::find(Paths.begin(), Paths.end(), I->getPath()) != Paths.end())) {
|
||||||
|
|
||||||
// Make sure the intervening directories are created
|
|
||||||
if (I->hasPath()) {
|
|
||||||
sys::Path dirs(I->getPath());
|
|
||||||
dirs.eraseComponent();
|
|
||||||
if (dirs.createDirectoryOnDisk(/*create_parents=*/true, ErrMsg))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open up a file stream for writing
|
// Open up a file stream for writing
|
||||||
std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
|
std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
|
||||||
std::ios::binary;
|
std::ios::binary;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user