[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
Mon Dec 4 00:20:58 PST 2017


grimar updated this revision to Diff 125298.
grimar added a comment.

Addressed review comments:

- Split test into three.
- Use llvm::sys::fs::file_size API for finding output tar file size.


https://reviews.llvm.org/D40606

Files:
  include/llvm/Support/TarWriter.h
  lib/Support/TarWriter.cpp
  unittests/Support/TarWriterTest.cpp


Index: unittests/Support/TarWriterTest.cpp
===================================================================
--- unittests/Support/TarWriterTest.cpp
+++ 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, SingleFileSize) {
+  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, TwoDifferentFilesSize) {
+  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, TwoSamePathFilesSize) {
+  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
Index: lib/Support/TarWriter.cpp
===================================================================
--- lib/Support/TarWriter.cpp
+++ 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: include/llvm/Support/TarWriter.h
===================================================================
--- include/llvm/Support/TarWriter.h
+++ 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;
 };
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40606.125298.patch
Type: text/x-patch
Size: 3049 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171204/e48b1336/attachment.bin>


More information about the llvm-commits mailing list