aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2018-02-19 12:20:16 -0800
committerRobert Schumacher <roschuma@microsoft.com>2018-02-21 23:01:54 -0800
commit0ef0300b8eefcdfe119e0bbaa3ce7b0f8c30ee4c (patch)
tree41d1297d522779e6d6e8115712fc589a4fe9f29a /toolsrc/src
parent222fa360120b9b66fcd305a247e57e1ddf669229 (diff)
downloadvcpkg-0ef0300b8eefcdfe119e0bbaa3ce7b0f8c30ee4c.tar.gz
vcpkg-0ef0300b8eefcdfe119e0bbaa3ce7b0f8c30ee4c.zip
[vcpkg] Enable metrics on linux
Diffstat (limited to 'toolsrc/src')
-rw-r--r--toolsrc/src/vcpkg.cpp6
-rw-r--r--toolsrc/src/vcpkg/base/checks.cpp2
-rw-r--r--toolsrc/src/vcpkg/base/files.cpp2
-rw-r--r--toolsrc/src/vcpkg/base/strings.cpp10
-rw-r--r--toolsrc/src/vcpkg/commands.contact.cpp9
-rw-r--r--toolsrc/src/vcpkg/commands.version.cpp4
-rw-r--r--toolsrc/src/vcpkg/metrics.cpp75
-rw-r--r--toolsrc/src/vcpkg/userconfig.cpp22
8 files changed, 90 insertions, 40 deletions
diff --git a/toolsrc/src/vcpkg.cpp b/toolsrc/src/vcpkg.cpp
index 9f29dcdd2..adb32c723 100644
--- a/toolsrc/src/vcpkg.cpp
+++ b/toolsrc/src/vcpkg.cpp
@@ -171,7 +171,6 @@ static void inner(const VcpkgCmdArguments& args)
static void load_config()
{
-#if defined(_WIN32)
auto& fs = Files::get_real_filesystem();
auto config = UserConfig::try_read_data(fs);
@@ -185,16 +184,20 @@ static void load_config()
write_config = true;
}
+#if defined(_WIN32)
if (config.user_mac.empty())
{
config.user_mac = Metrics::get_MAC_user();
write_config = true;
}
+#endif
{
auto locked_metrics = Metrics::g_metrics.lock();
locked_metrics->set_user_information(config.user_id, config.user_time);
+#if defined(_WIN32)
locked_metrics->track_property("user_mac", config.user_mac);
+#endif
}
if (config.last_completed_survey.empty())
@@ -208,7 +211,6 @@ static void load_config()
{
config.try_write_data(fs);
}
-#endif
}
static std::string trim_path_from_command_line(const std::string& full_command_line)
diff --git a/toolsrc/src/vcpkg/base/checks.cpp b/toolsrc/src/vcpkg/base/checks.cpp
index 2977a1d8b..1b3ed5ec9 100644
--- a/toolsrc/src/vcpkg/base/checks.cpp
+++ b/toolsrc/src/vcpkg/base/checks.cpp
@@ -31,7 +31,7 @@ namespace vcpkg::Checks
#if defined(_WIN32)
::TerminateProcess(::GetCurrentProcess(), exit_code);
#else
- ::exit(exit_code);
+ std::exit(exit_code);
#endif
}
diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp
index 95ae0fd33..b59104a59 100644
--- a/toolsrc/src/vcpkg/base/files.cpp
+++ b/toolsrc/src/vcpkg/base/files.cpp
@@ -166,7 +166,7 @@ namespace vcpkg::Files
}
virtual void write_contents(const fs::path& file_path, const std::string& data, std::error_code& ec) override
{
- ec = std::error_code();
+ ec.clear();
FILE* f = nullptr;
#if defined(_WIN32)
diff --git a/toolsrc/src/vcpkg/base/strings.cpp b/toolsrc/src/vcpkg/base/strings.cpp
index 27cfcbe71..d912734e3 100644
--- a/toolsrc/src/vcpkg/base/strings.cpp
+++ b/toolsrc/src/vcpkg/base/strings.cpp
@@ -74,6 +74,16 @@ namespace vcpkg::Strings
#endif
}
+ std::string escape_string(const CStringView& s, char char_to_escape, char escape_char)
+ {
+ std::string ret = s.c_str();
+ // Replace '\' with '\\' or '`' with '``'
+ ret = Strings::replace_all(std::move(ret), {escape_char}, {escape_char, escape_char});
+ // Replace '"' with '\"' or '`"'
+ ret = Strings::replace_all(std::move(ret), {char_to_escape}, {escape_char, char_to_escape});
+ return ret;
+ }
+
std::string::const_iterator case_insensitive_ascii_find(const std::string& s, const std::string& pattern)
{
const std::string pattern_as_lower_case(ascii_to_lowercase(pattern));
diff --git a/toolsrc/src/vcpkg/commands.contact.cpp b/toolsrc/src/vcpkg/commands.contact.cpp
index 8063fe317..ffed07557 100644
--- a/toolsrc/src/vcpkg/commands.contact.cpp
+++ b/toolsrc/src/vcpkg/commands.contact.cpp
@@ -30,7 +30,6 @@ namespace vcpkg::Commands::Contact
if (Util::Sets::contains(parsed_args.switches, switches[0].name))
{
-#if defined(_WIN32)
auto maybe_now = Chrono::CTime::get_current_date_time();
if (auto p_now = maybe_now.get())
{
@@ -39,10 +38,14 @@ namespace vcpkg::Commands::Contact
config.last_completed_survey = p_now->to_string();
config.try_write_data(fs);
}
-#endif
+#if defined(_WIN32)
System::cmd_execute("start https://aka.ms/NPS_vcpkg");
- System::println("Default browser launched to https://aka.ms/NPS_vcpkg, thank you for your feedback!");
+ System::println("Default browser launched to https://aka.ms/NPS_vcpkg; thank you for your feedback!");
+#else
+ System::println(
+ "Please navigate to https://aka.ms/NPS_vcpkg in your preferred browser. Thank you for your feedback!");
+#endif
}
else
{
diff --git a/toolsrc/src/vcpkg/commands.version.cpp b/toolsrc/src/vcpkg/commands.version.cpp
index c21e8cafd..ffc5d2c8f 100644
--- a/toolsrc/src/vcpkg/commands.version.cpp
+++ b/toolsrc/src/vcpkg/commands.version.cpp
@@ -8,7 +8,11 @@
#define STRINGIFY(...) #__VA_ARGS__
#define MACRO_TO_STRING(X) STRINGIFY(X)
+#if defined(VCPKG_VERSION)
#define VCPKG_VERSION_AS_STRING MACRO_TO_STRING(VCPKG_VERSION)
+#else
+#define VCPKG_VERSION_AS_STRING "-unknownhash"
+#endif
namespace vcpkg::Commands::Version
{
diff --git a/toolsrc/src/vcpkg/metrics.cpp b/toolsrc/src/vcpkg/metrics.cpp
index 1a322e99c..f81c53583 100644
--- a/toolsrc/src/vcpkg/metrics.cpp
+++ b/toolsrc/src/vcpkg/metrics.cpp
@@ -196,8 +196,8 @@ namespace vcpkg::Metrics
"iKey": "b4e88960-4393-4dd9-ab8e-97e8fe6d7603",
"flags": 0.000000,
"tags": {
- "ai.device.os": "Windows",
- "ai.device.osVersion": "%s",
+ "ai.device.os": "Other",
+ "ai.device.osVersion": "%s-%s",
"ai.session.id": "%s",
"ai.user.id": "%s",
"ai.user.accountAcquisitionDate": "%s"
@@ -213,6 +213,17 @@ namespace vcpkg::Metrics
}
}])",
timestamp,
+#if defined(_WIN32)
+ "Windows",
+#elif defined(__APPLE__)
+ "OSX",
+#elif defined(__linux__)
+ "Linux",
+#elif defined(__unix__)
+ "Unix",
+#elif defined(__unix__)
+ "Other",
+#endif
get_os_version_string(),
session_id,
user_id,
@@ -390,50 +401,62 @@ namespace vcpkg::Metrics
void Metrics::flush()
{
-#if defined(_WIN32)
const std::string payload = g_metricmessage.format_event_data_template();
if (g_should_print_metrics) std::cerr << payload << "\n";
if (!g_should_send_metrics) return;
- // upload(payload);
-
+#if defined(_WIN32)
wchar_t temp_folder[MAX_PATH];
GetTempPathW(MAX_PATH, temp_folder);
const fs::path temp_folder_path = fs::path(temp_folder) / "vcpkg";
const fs::path temp_folder_path_exe =
temp_folder_path / Strings::format("vcpkgmetricsuploader-%s.exe", Commands::Version::base_version());
+#endif
auto& fs = Files::get_real_filesystem();
- if (true)
- {
- const fs::path exe_path = [&fs]() -> fs::path {
- auto vcpkgdir = System::get_exe_path_of_current_process().parent_path();
- auto path = vcpkgdir / "vcpkgmetricsuploader.exe";
- if (fs.exists(path)) return path;
-
- path = vcpkgdir / "scripts" / "vcpkgmetricsuploader.exe";
- if (fs.exists(path)) return path;
-
- return "";
- }();
-
- std::error_code ec;
- fs.create_directories(temp_folder_path, ec);
- if (ec) return;
- fs.copy_file(exe_path, temp_folder_path_exe, fs::copy_options::skip_existing, ec);
- if (ec) return;
- }
+#if defined(_WIN32)
- const fs::path vcpkg_metrics_txt_path = temp_folder_path / ("vcpkg" + generate_random_UUID() + ".txt");
+ const fs::path exe_path = [&fs]() -> fs::path {
+ auto vcpkgdir = System::get_exe_path_of_current_process().parent_path();
+ auto path = vcpkgdir / "vcpkgmetricsuploader.exe";
+ if (fs.exists(path)) return path;
+
+ path = vcpkgdir / "scripts" / "vcpkgmetricsuploader.exe";
+ if (fs.exists(path)) return path;
+
+ return "";
+ }();
+
+ std::error_code ec;
+ fs.create_directories(temp_folder_path, ec);
+ if (ec) return;
+ fs.copy_file(exe_path, temp_folder_path_exe, fs::copy_options::skip_existing, ec);
+ if (ec) return;
+#else
+ if (!fs.exists("/tmp")) return;
+ const fs::path temp_folder_path = "/tmp/vcpkg";
std::error_code ec;
+ fs.create_directory(temp_folder_path, ec);
+ // ignore error
+ ec.clear();
+#endif
+ const fs::path vcpkg_metrics_txt_path = temp_folder_path / ("vcpkg" + generate_random_UUID() + ".txt");
fs.write_contents(vcpkg_metrics_txt_path, payload, ec);
if (ec) return;
+
+#if defined(_WIN32)
const std::string cmd_line = Strings::format("start \"vcpkgmetricsuploader.exe\" \"%s\" \"%s\"",
temp_folder_path_exe.u8string(),
vcpkg_metrics_txt_path.u8string());
- System::cmd_execute_clean(cmd_line);
+#else
+ auto escaped_path = Strings::escape_string(vcpkg_metrics_txt_path.u8string(), '\'', '\\');
+ const std::string cmd_line = Strings::format(
+ R"((curl "https://dc.services.visualstudio.com/v2/track" -H "Content-Type: application/json" -X POST --data '@%s' >/dev/null 2>&1; rm '%s') &)",
+ escaped_path,
+ escaped_path);
#endif
+ System::cmd_execute_clean(cmd_line);
}
}
diff --git a/toolsrc/src/vcpkg/userconfig.cpp b/toolsrc/src/vcpkg/userconfig.cpp
index c7c57ce26..9db2e5d47 100644
--- a/toolsrc/src/vcpkg/userconfig.cpp
+++ b/toolsrc/src/vcpkg/userconfig.cpp
@@ -29,13 +29,22 @@ namespace
namespace vcpkg
{
+ static fs::path get_config_path()
+ {
+#if defined(_WIN32)
+ return get_localappdata() / "vcpkg" / "config";
+#else
+ auto maybe_home = System::get_environment_variable("HOME");
+ return fs::path(maybe_home.value_or("/var")) / "vcpkg" / "config";
+#endif
+ }
+
UserConfig UserConfig::try_read_data(const Files::Filesystem& fs)
{
UserConfig ret;
-#if defined(_WIN32)
try
{
- auto maybe_pghs = Paragraphs::get_paragraphs(fs, get_localappdata() / "vcpkg" / "config");
+ auto maybe_pghs = Paragraphs::get_paragraphs(fs, get_config_path());
if (const auto p_pghs = maybe_pghs.get())
{
const auto& pghs = *p_pghs;
@@ -58,19 +67,19 @@ namespace vcpkg
catch (...)
{
}
-#endif
return ret;
}
void UserConfig::try_write_data(Files::Filesystem& fs) const
{
-#if defined(_WIN32)
try
{
+ auto config_path = get_config_path();
+ auto config_dir = config_path.parent_path();
std::error_code ec;
- fs.create_directory(get_localappdata() / "vcpkg", ec);
- fs.write_contents(get_localappdata() / "vcpkg" / "config",
+ fs.create_directory(config_dir, ec);
+ fs.write_contents(config_path,
Strings::format("User-Id: %s\n"
"User-Since: %s\n"
"Mac-Hash: %s\n"
@@ -84,6 +93,5 @@ namespace vcpkg
catch (...)
{
}
-#endif
}
}