aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-04-12 22:48:52 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-04-12 22:48:52 -0700
commit7069fbbebc750a7c8a64adc8c30269527cbec9bd (patch)
tree94d08f8fd3f04be1167f274c7aab37d0100a693b
parent7326b6c64dc6b04b6d8512f13dddf67bf7498bf1 (diff)
downloadvcpkg-7069fbbebc750a7c8a64adc8c30269527cbec9bd.tar.gz
vcpkg-7069fbbebc750a7c8a64adc8c30269527cbec9bd.zip
[vcpkg] Remove+indirect nearly all uses of iostreams
-rw-r--r--toolsrc/include/BinaryParagraph.h2
-rw-r--r--toolsrc/include/SourceParagraph.h2
-rw-r--r--toolsrc/include/StatusParagraph.h2
-rw-r--r--toolsrc/include/StatusParagraphs.h4
-rw-r--r--toolsrc/include/vcpkg_Files.h1
-rw-r--r--toolsrc/include/vcpkg_Strings.h8
-rw-r--r--toolsrc/src/BinaryParagraph.cpp34
-rw-r--r--toolsrc/src/SourceParagraph.cpp5
-rw-r--r--toolsrc/src/StatusParagraph.cpp7
-rw-r--r--toolsrc/src/StatusParagraphs.cpp9
-rw-r--r--toolsrc/src/commands_build.cpp2
-rw-r--r--toolsrc/src/commands_import.cpp5
-rw-r--r--toolsrc/src/commands_integrate.cpp10
-rw-r--r--toolsrc/src/metrics.cpp2
-rw-r--r--toolsrc/src/tests_paragraph.cpp36
-rw-r--r--toolsrc/src/vcpkg.cpp10
-rw-r--r--toolsrc/src/vcpkg_Files.cpp10
-rw-r--r--toolsrc/src/vcpkglib.cpp11
18 files changed, 87 insertions, 73 deletions
diff --git a/toolsrc/include/BinaryParagraph.h b/toolsrc/include/BinaryParagraph.h
index e29e0f51b..6cf740920 100644
--- a/toolsrc/include/BinaryParagraph.h
+++ b/toolsrc/include/BinaryParagraph.h
@@ -25,5 +25,5 @@ namespace vcpkg
std::vector<std::string> depends;
};
- std::ostream& operator<<(std::ostream& os, const BinaryParagraph& pgh);
+ void serialize(const BinaryParagraph& pgh, std::string& out_str);
}
diff --git a/toolsrc/include/SourceParagraph.h b/toolsrc/include/SourceParagraph.h
index 65ba478ee..b66fa131b 100644
--- a/toolsrc/include/SourceParagraph.h
+++ b/toolsrc/include/SourceParagraph.h
@@ -13,7 +13,7 @@ namespace vcpkg
std::string qualifier;
};
- std::ostream& operator<<(std::ostream& os, const Dependency& p);
+ const std::string& to_string(const Dependency& dep);
struct SourceParagraph
{
diff --git a/toolsrc/include/StatusParagraph.h b/toolsrc/include/StatusParagraph.h
index bc2766aa2..a71fb7893 100644
--- a/toolsrc/include/StatusParagraph.h
+++ b/toolsrc/include/StatusParagraph.h
@@ -33,7 +33,7 @@ namespace vcpkg
InstallState state;
};
- std::ostream& operator<<(std::ostream& os, const StatusParagraph& pgh);
+ void serialize(const StatusParagraph& pgh, std::string& out_str);
std::string to_string(InstallState f);
diff --git a/toolsrc/include/StatusParagraphs.h b/toolsrc/include/StatusParagraphs.h
index c5ece9616..fcfe99b5a 100644
--- a/toolsrc/include/StatusParagraphs.h
+++ b/toolsrc/include/StatusParagraphs.h
@@ -29,7 +29,7 @@ namespace vcpkg
iterator insert(std::unique_ptr<StatusParagraph>);
- friend std::ostream& operator<<(std::ostream&, const StatusParagraphs&);
+ friend void serialize(const StatusParagraphs& pgh, std::string& out_str);
iterator end()
{
@@ -55,5 +55,5 @@ namespace vcpkg
std::vector<std::unique_ptr<StatusParagraph>> paragraphs;
};
- std::ostream& operator<<(std::ostream&, const StatusParagraphs&);
+ void serialize(const StatusParagraphs& pgh, std::string& out_str);
}
diff --git a/toolsrc/include/vcpkg_Files.h b/toolsrc/include/vcpkg_Files.h
index dde5cf5ee..7bf13e973 100644
--- a/toolsrc/include/vcpkg_Files.h
+++ b/toolsrc/include/vcpkg_Files.h
@@ -14,6 +14,7 @@ namespace vcpkg::Files
virtual std::vector<fs::path> non_recursive_find_all_files_in_dir(const fs::path& dir) const = 0;
virtual void write_all_lines(const fs::path& file_path, const std::vector<std::string>& lines) = 0;
+ virtual void write_contents(const fs::path& file_path, const std::string& data) = 0;
virtual void rename(const fs::path& oldpath, const fs::path& newpath) = 0;
virtual bool remove(const fs::path& path) = 0;
virtual bool remove(const fs::path& path, std::error_code& ec) = 0;
diff --git a/toolsrc/include/vcpkg_Strings.h b/toolsrc/include/vcpkg_Strings.h
index 7b031608c..d152eccf5 100644
--- a/toolsrc/include/vcpkg_Strings.h
+++ b/toolsrc/include/vcpkg_Strings.h
@@ -119,4 +119,12 @@ namespace vcpkg::Strings
void trim_all_and_remove_whitespace_strings(std::vector<std::string>* strings);
std::vector<std::string> split(const std::string& s, const std::string& delimiter);
+
+ template<class T>
+ std::string serialize(const T& t)
+ {
+ std::string ret;
+ serialize(t, ret);
+ return ret;
+ }
}
diff --git a/toolsrc/src/BinaryParagraph.cpp b/toolsrc/src/BinaryParagraph.cpp
index 499ef54f7..99d7d230b 100644
--- a/toolsrc/src/BinaryParagraph.cpp
+++ b/toolsrc/src/BinaryParagraph.cpp
@@ -68,29 +68,23 @@ namespace vcpkg
return Strings::format("%s_%s_%s", this->spec.name(), this->version, this->spec.triplet());
}
- std::ostream& operator<<(std::ostream& os, const BinaryParagraph& p)
+ void serialize(const BinaryParagraph& pgh, std::string& out_str)
{
- os << "Package: " << p.spec.name() << "\n";
- os << "Version: " << p.version << "\n";
- if (!p.depends.empty())
+ out_str.append("Package: ").append(pgh.spec.name()).push_back('\n');
+ out_str.append("Version: ").append(pgh.version).push_back('\n');
+ if (!pgh.depends.empty())
{
- os << "Depends: " << p.depends.front();
+ out_str.append("Depends: ");
+ out_str.append(Strings::join(", ", pgh.depends));
+ out_str.push_back('\n');
+ }
- auto b = p.depends.begin() + 1;
- auto e = p.depends.end();
- for (; b != e; ++b)
- {
- os << ", " << *b;
- }
+ out_str.append("Architecture: ").append(pgh.spec.triplet().to_string()).push_back('\n');
+ out_str.append("Multi-Arch: same\n");
- os << "\n";
- }
- os << "Architecture: " << p.spec.triplet().to_string() << "\n";
- os << "Multi-Arch: same\n";
- if (!p.maintainer.empty())
- os << "Maintainer: " << p.maintainer << "\n";
- if (!p.description.empty())
- os << "Description: " << p.description << "\n";
- return os;
+ if (!pgh.maintainer.empty())
+ out_str.append("Maintainer: ").append(pgh.maintainer).push_back('\n');
+ if (!pgh.description.empty())
+ out_str.append("Description: ").append(pgh.description).push_back('\n');
}
}
diff --git a/toolsrc/src/SourceParagraph.cpp b/toolsrc/src/SourceParagraph.cpp
index c23e220d7..11b83aedf 100644
--- a/toolsrc/src/SourceParagraph.cpp
+++ b/toolsrc/src/SourceParagraph.cpp
@@ -138,9 +138,8 @@ namespace vcpkg
return ret;
}
- std::ostream & operator<<(std::ostream & os, const Dependency & p)
+ const std::string& to_string(const Dependency& dep)
{
- os << p.name;
- return os;
+ return dep.name;
}
}
diff --git a/toolsrc/src/StatusParagraph.cpp b/toolsrc/src/StatusParagraph.cpp
index 88b4fb854..63bfb2f9b 100644
--- a/toolsrc/src/StatusParagraph.cpp
+++ b/toolsrc/src/StatusParagraph.cpp
@@ -16,11 +16,10 @@ namespace vcpkg
{
}
- std::ostream& operator<<(std::ostream& os, const StatusParagraph& p)
+ void serialize(const StatusParagraph& pgh, std::string& out_str)
{
- os << p.package;
- os << "Status: " << to_string(p.want) << " ok " << to_string(p.state) << "\n";
- return os;
+ serialize(pgh.package, out_str);
+ out_str.append("Status: ").append(to_string(pgh.want)).append(" ok ").append(to_string(pgh.state)).push_back('\n');
}
StatusParagraph::StatusParagraph(const std::unordered_map<std::string, std::string>& fields)
diff --git a/toolsrc/src/StatusParagraphs.cpp b/toolsrc/src/StatusParagraphs.cpp
index 59e6ee331..132b7d5d4 100644
--- a/toolsrc/src/StatusParagraphs.cpp
+++ b/toolsrc/src/StatusParagraphs.cpp
@@ -59,13 +59,12 @@ namespace vcpkg
return ptr;
}
- std::ostream& vcpkg::operator<<(std::ostream& os, const StatusParagraphs& l)
+ void serialize(const StatusParagraphs& pghs, std::string& out_str)
{
- for (auto& pgh : l.paragraphs)
+ for (auto& pgh : pghs.paragraphs)
{
- os << *pgh;
- os << "\n";
+ serialize(*pgh, out_str);
+ out_str.push_back('\n');
}
- return os;
}
}
diff --git a/toolsrc/src/commands_build.cpp b/toolsrc/src/commands_build.cpp
index 9af1e8e78..8d91ce813 100644
--- a/toolsrc/src/commands_build.cpp
+++ b/toolsrc/src/commands_build.cpp
@@ -22,7 +22,7 @@ namespace vcpkg::Commands::Build
{
const BinaryParagraph bpgh = BinaryParagraph(source_paragraph, triplet);
const fs::path binary_control_file = paths.packages / bpgh.dir() / "CONTROL";
- std::ofstream(binary_control_file) << bpgh;
+ paths.get_filesystem().write_contents(binary_control_file, Strings::serialize(bpgh));
}
std::wstring make_build_env_cmd(const Triplet& triplet, const Toolset& toolset)
diff --git a/toolsrc/src/commands_import.cpp b/toolsrc/src/commands_import.cpp
index 1fcc3b3a8..b65f636eb 100644
--- a/toolsrc/src/commands_import.cpp
+++ b/toolsrc/src/commands_import.cpp
@@ -72,13 +72,14 @@ namespace vcpkg::Commands::Import
static void do_import(const VcpkgPaths& paths, const fs::path& include_directory, const fs::path& project_directory, const BinaryParagraph& control_file_data)
{
+ auto& fs = paths.get_filesystem();
fs::path library_destination_path = paths.package_dir(control_file_data.spec);
std::error_code ec;
- paths.get_filesystem().create_directory(library_destination_path, ec);
+ fs.create_directory(library_destination_path, ec);
place_library_files_in(paths.get_filesystem(), include_directory, project_directory, library_destination_path);
fs::path control_file_path = library_destination_path / "CONTROL";
- std::ofstream(control_file_path) << control_file_data;
+ fs.write_contents(control_file_path, Strings::serialize(control_file_data));
}
void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths)
diff --git a/toolsrc/src/commands_integrate.cpp b/toolsrc/src/commands_integrate.cpp
index 60c6b0613..8569fdd79 100644
--- a/toolsrc/src/commands_integrate.cpp
+++ b/toolsrc/src/commands_integrate.cpp
@@ -186,7 +186,7 @@ namespace vcpkg::Commands::Integrate
if (should_install_system)
{
const fs::path sys_src_path = tmp_dir / "vcpkg.system.targets";
- std::ofstream(sys_src_path) << create_system_targets_shortcut();
+ fs.write_contents(sys_src_path, create_system_targets_shortcut());
const std::string param = Strings::format(R"(/c mkdir "%s" & copy "%s" "%s" /Y > nul)", system_wide_targets_file.parent_path().string(), sys_src_path.string(), system_wide_targets_file.string());
ElevationPromptChoice user_choice = elevated_cmd_execute(param);
@@ -205,7 +205,7 @@ namespace vcpkg::Commands::Integrate
}
const fs::path appdata_src_path = tmp_dir / "vcpkg.user.targets";
- std::ofstream(appdata_src_path) << create_appdata_targets_shortcut(paths.buildsystems_msbuild_targets.string());
+ fs.write_contents(appdata_src_path, create_appdata_targets_shortcut(paths.buildsystems_msbuild_targets.string()));
auto appdata_dst_path = get_appdata_targets_path();
auto rc = fs.copy_file(appdata_src_path, appdata_dst_path, fs::copy_options::overwrite_existing, ec);
@@ -266,9 +266,9 @@ namespace vcpkg::Commands::Integrate
const std::string nuget_id = get_nuget_id(paths.root);
const std::string nupkg_version = "1.0.0";
- std::ofstream(targets_file_path) << create_nuget_targets_file(paths.buildsystems_msbuild_targets);
- std::ofstream(props_file_path) << create_nuget_props_file();
- std::ofstream(nuspec_file_path) << create_nuspec_file(paths.root, nuget_id, nupkg_version);
+ fs.write_contents(targets_file_path, create_nuget_targets_file(paths.buildsystems_msbuild_targets));
+ fs.write_contents(props_file_path, create_nuget_props_file());
+ fs.write_contents(nuspec_file_path, create_nuspec_file(paths.root, nuget_id, nupkg_version));
// Using all forward slashes for the command line
const std::wstring cmd_line = Strings::wformat(LR"("%s" pack -OutputDirectory "%s" "%s" > nul)", nuget_exe.native(), buildsystems_dir.native(), nuspec_file_path.native());
diff --git a/toolsrc/src/metrics.cpp b/toolsrc/src/metrics.cpp
index cfdd418c3..baefc3c35 100644
--- a/toolsrc/src/metrics.cpp
+++ b/toolsrc/src/metrics.cpp
@@ -411,7 +411,7 @@ true
}
const fs::path vcpkg_metrics_txt_path = temp_folder_path / ("vcpkg" + generate_random_UUID() + ".txt");
- std::ofstream(vcpkg_metrics_txt_path) << payload;
+ fs.write_contents(vcpkg_metrics_txt_path, payload);
const std::wstring cmdLine = Strings::wformat(L"start %s %s", temp_folder_path_exe.native(), vcpkg_metrics_txt_path.native());
System::cmd_execute_clean(cmdLine);
diff --git a/toolsrc/src/tests_paragraph.cpp b/toolsrc/src/tests_paragraph.cpp
index 58e4121a8..20bacf170 100644
--- a/toolsrc/src/tests_paragraph.cpp
+++ b/toolsrc/src/tests_paragraph.cpp
@@ -1,6 +1,7 @@
#include "CppUnitTest.h"
#include "Paragraphs.h"
#include "BinaryParagraph.h"
+#include "vcpkg_Strings.h"
#pragma comment(lib,"version")
#pragma comment(lib,"winhttp")
@@ -16,6 +17,8 @@ namespace Microsoft::VisualStudio::CppUnitTestFramework
}
}
+namespace Strings = vcpkg::Strings;
+
namespace UnitTest1
{
TEST_CLASS(ControlParsing)
@@ -289,27 +292,26 @@ namespace UnitTest1
Assert::AreEqual("v4", pghs[1]["f4"].c_str());
}
- TEST_METHOD(parse_comment_before_single_slashN)
- {
- const char* str =
- "f1: v1\r\n"
- "#comment\n";
- auto pghs = vcpkg::Paragraphs::parse_paragraphs(str).value_or_exit(VCPKG_LINE_INFO);
- Assert::AreEqual(size_t(1), pghs[0].size());
- Assert::AreEqual("v1", pghs[0]["f1"].c_str());
- }
+ TEST_METHOD(parse_comment_before_single_slashN)
+ {
+ const char* str =
+ "f1: v1\r\n"
+ "#comment\n";
+ auto pghs = vcpkg::Paragraphs::parse_paragraphs(str).value_or_exit(VCPKG_LINE_INFO);
+ Assert::AreEqual(size_t(1), pghs[0].size());
+ Assert::AreEqual("v1", pghs[0]["f1"].c_str());
+ }
TEST_METHOD(BinaryParagraph_serialize_min)
{
- std::stringstream ss;
vcpkg::BinaryParagraph pgh({
{ "Package", "zlib" },
{ "Version", "1.2.8" },
{ "Architecture", "x86-windows" },
{ "Multi-Arch", "same" },
});
- ss << pgh;
- auto pghs = vcpkg::Paragraphs::parse_paragraphs(ss.str()).value_or_exit(VCPKG_LINE_INFO);
+ std::string ss = Strings::serialize(pgh);
+ auto pghs = vcpkg::Paragraphs::parse_paragraphs(ss).value_or_exit(VCPKG_LINE_INFO);
Assert::AreEqual(size_t(1), pghs.size());
Assert::AreEqual(size_t(4), pghs[0].size());
Assert::AreEqual("zlib", pghs[0]["Package"].c_str());
@@ -320,7 +322,6 @@ namespace UnitTest1
TEST_METHOD(BinaryParagraph_serialize_max)
{
- std::stringstream ss;
vcpkg::BinaryParagraph pgh({
{ "Package", "zlib" },
{ "Version", "1.2.8" },
@@ -330,8 +331,8 @@ namespace UnitTest1
{ "Depends", "dep" },
{ "Multi-Arch", "same" },
});
- ss << pgh;
- auto pghs = vcpkg::Paragraphs::parse_paragraphs(ss.str()).value_or_exit(VCPKG_LINE_INFO);
+ std::string ss = Strings::serialize(pgh);
+ auto pghs = vcpkg::Paragraphs::parse_paragraphs(ss).value_or_exit(VCPKG_LINE_INFO);
Assert::AreEqual(size_t(1), pghs.size());
Assert::AreEqual(size_t(7), pghs[0].size());
Assert::AreEqual("zlib", pghs[0]["Package"].c_str());
@@ -344,7 +345,6 @@ namespace UnitTest1
TEST_METHOD(BinaryParagraph_serialize_multiple_deps)
{
- std::stringstream ss;
vcpkg::BinaryParagraph pgh({
{ "Package", "zlib" },
{ "Version", "1.2.8" },
@@ -352,8 +352,8 @@ namespace UnitTest1
{ "Multi-Arch", "same" },
{ "Depends", "a, b, c" },
});
- ss << pgh;
- auto pghs = vcpkg::Paragraphs::parse_paragraphs(ss.str()).value_or_exit(VCPKG_LINE_INFO);
+ std::string ss = Strings::serialize(pgh);
+ auto pghs = vcpkg::Paragraphs::parse_paragraphs(ss).value_or_exit(VCPKG_LINE_INFO);
Assert::AreEqual(size_t(1), pghs.size());
Assert::AreEqual("a, b, c", pghs[0]["Depends"].c_str());
}
diff --git a/toolsrc/src/vcpkg.cpp b/toolsrc/src/vcpkg.cpp
index 33b9fbe83..cb7c3f76d 100644
--- a/toolsrc/src/vcpkg.cpp
+++ b/toolsrc/src/vcpkg.cpp
@@ -144,10 +144,12 @@ static void loadConfig()
try
{
std::error_code ec;
- Files::get_real_filesystem().create_directory(localappdata / "vcpkg", ec);
- std::ofstream(localappdata / "vcpkg" / "config", std::ios_base::out | std::ios_base::trunc)
- << "User-Id: " << user_id << "\n"
- << "User-Since: " << user_time << "\n";
+ auto& fs = Files::get_real_filesystem();
+ fs.create_directory(localappdata / "vcpkg", ec);
+ fs.write_contents(localappdata / "vcpkg" / "config",
+ Strings::format(
+ "User-Id: %s\n"
+ "User-Since: %s\n", user_id, user_time));
}
catch (...) { }
}
diff --git a/toolsrc/src/vcpkg_Files.cpp b/toolsrc/src/vcpkg_Files.cpp
index a4a637b78..f4fb1bb61 100644
--- a/toolsrc/src/vcpkg_Files.cpp
+++ b/toolsrc/src/vcpkg_Files.cpp
@@ -149,6 +149,16 @@ namespace vcpkg::Files
{
return fs::stdfs::status(path, ec);
}
+ virtual void write_contents(const fs::path& file_path, const std::string& data) override
+ {
+ FILE* f = nullptr;
+ auto ec = _wfopen_s(&f, file_path.native().c_str(), L"wb");
+ Checks::check_exit(VCPKG_LINE_INFO, ec == 0);
+ auto count = fwrite(data.data(), sizeof(data[0]), data.size(), f);
+ fclose(f);
+
+ Checks::check_exit(VCPKG_LINE_INFO, count == data.size());
+ }
};
Filesystem & get_real_filesystem()
diff --git a/toolsrc/src/vcpkglib.cpp b/toolsrc/src/vcpkglib.cpp
index ad359612e..cc70b86b0 100644
--- a/toolsrc/src/vcpkglib.cpp
+++ b/toolsrc/src/vcpkglib.cpp
@@ -72,7 +72,7 @@ namespace vcpkg
}
}
- std::fstream(status_file_new, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc) << current_status_db;
+ fs.write_contents(status_file_new, Strings::serialize(current_status_db));
fs.rename(status_file_new, status_file);
@@ -90,13 +90,14 @@ namespace vcpkg
void write_update(const VcpkgPaths& paths, const StatusParagraph& p)
{
static int update_id = 0;
+ auto& fs = paths.get_filesystem();
+
auto my_update_id = update_id++;
auto tmp_update_filename = paths.vcpkg_dir_updates / "incomplete";
auto update_filename = paths.vcpkg_dir_updates / std::to_string(my_update_id);
- std::fstream file(tmp_update_filename, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
- file << p;
- file.close();
- paths.get_filesystem().rename(tmp_update_filename, update_filename);
+
+ fs.write_contents(tmp_update_filename, Strings::serialize(p));
+ fs.rename(tmp_update_filename, update_filename);
}
static void upgrade_to_slash_terminated_sorted_format(Files::Filesystem& fs, std::vector<std::string>* lines, const fs::path& listfile_path)