[PATCH] D40606: [Support/TarWriter] - Don't allow TarWriter to add the same file more than once.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 5 02:10:44 PST 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL319750: [Support/TarWriter] - Don't allow TarWriter to add the same file more than once. (authored by grimar).
Changed prior to commit:
https://reviews.llvm.org/D40606?vs=125298&id=125483#toc
Repository:
rL LLVM
https://reviews.llvm.org/D40606
Files:
llvm/trunk/include/llvm/Support/TarWriter.h
llvm/trunk/lib/Support/TarWriter.cpp
llvm/trunk/unittests/Support/TarWriterTest.cpp
Index: llvm/trunk/include/llvm/Support/TarWriter.h
===================================================================
--- llvm/trunk/include/llvm/Support/TarWriter.h
+++ llvm/trunk/include/llvm/Support/TarWriter.h
@@ -11,6 +11,7 @@
#define LLVM_SUPPORT_TAR_WRITER_H
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/StringSet.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/raw_ostream.h"
@@ -26,6 +27,7 @@
TarWriter(int FD, StringRef BaseDir);
raw_fd_ostream OS;
std::string BaseDir;
+ StringSet<> Files;
};
}
Index: llvm/trunk/lib/Support/TarWriter.cpp
===================================================================
--- llvm/trunk/lib/Support/TarWriter.cpp
+++ llvm/trunk/lib/Support/TarWriter.cpp
@@ -173,6 +173,10 @@
// Write Path and Data.
std::string Fullpath = BaseDir + "/" + sys::path::convert_to_slash(Path);
+ // We do not want to include the same file more than once.
+ if (!Files.insert(Fullpath).second)
+ return;
+
StringRef Prefix;
StringRef Name;
if (splitUstar(Fullpath, Prefix, Name)) {
Index: llvm/trunk/unittests/Support/TarWriterTest.cpp
===================================================================
--- llvm/trunk/unittests/Support/TarWriterTest.cpp
+++ llvm/trunk/unittests/Support/TarWriterTest.cpp
@@ -120,4 +120,60 @@
StringRef Pax = StringRef((char *)(Buf.data() + 512), 512);
EXPECT_TRUE(Pax.startswith("211 path=/" + std::string(200, 'x')));
}
+
+TEST_F(TarWriterTest, SingleFile) {
+ SmallString<128> Path;
+ std::error_code EC =
+ sys::fs::createTemporaryFile("TarWriterTest", "tar", Path);
+ EXPECT_FALSE((bool)EC);
+
+ Expected<std::unique_ptr<TarWriter>> TarOrErr = TarWriter::create(Path, "");
+ EXPECT_TRUE((bool)TarOrErr);
+ std::unique_ptr<TarWriter> Tar = std::move(*TarOrErr);
+ Tar->append("FooPath", "foo");
+ Tar.reset();
+
+ uint64_t TarSize;
+ EC = sys::fs::file_size(Path, TarSize);
+ EXPECT_FALSE((bool)EC);
+ EXPECT_EQ(TarSize, 2048);
+}
+
+TEST_F(TarWriterTest, NoDuplicate) {
+ SmallString<128> Path;
+ std::error_code EC =
+ sys::fs::createTemporaryFile("TarWriterTest", "tar", Path);
+ EXPECT_FALSE((bool)EC);
+
+ Expected<std::unique_ptr<TarWriter>> TarOrErr = TarWriter::create(Path, "");
+ EXPECT_TRUE((bool)TarOrErr);
+ std::unique_ptr<TarWriter> Tar = std::move(*TarOrErr);
+ Tar->append("FooPath", "foo");
+ Tar->append("BarPath", "bar");
+ Tar.reset();
+
+ uint64_t TarSize;
+ EC = sys::fs::file_size(Path, TarSize);
+ EXPECT_FALSE((bool)EC);
+ EXPECT_EQ(TarSize, 3072);
+}
+
+TEST_F(TarWriterTest, Duplicate) {
+ SmallString<128> Path;
+ std::error_code EC =
+ sys::fs::createTemporaryFile("TarWriterTest", "tar", Path);
+ EXPECT_FALSE((bool)EC);
+
+ Expected<std::unique_ptr<TarWriter>> TarOrErr = TarWriter::create(Path, "");
+ EXPECT_TRUE((bool)TarOrErr);
+ std::unique_ptr<TarWriter> Tar = std::move(*TarOrErr);
+ Tar->append("FooPath", "foo");
+ Tar->append("FooPath", "bar");
+ Tar.reset();
+
+ uint64_t TarSize;
+ EC = sys::fs::file_size(Path, TarSize);
+ EXPECT_FALSE((bool)EC);
+ EXPECT_EQ(TarSize, 2048);
}
+} // namespace
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40606.125483.patch
Type: text/x-patch
Size: 3123 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171205/b09627ce/attachment.bin>
More information about the llvm-commits
mailing list