Skip to content

Commit fea3e38

Browse files
committed
Adding --log-diffs-include-activity-ids
1 parent 6a62772 commit fea3e38

3 files changed

Lines changed: 74 additions & 10 deletions

File tree

src/libmain/loggers.cc

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,43 @@
33
#include "nix/util/environment-variables.hh"
44
#include "nix/main/progress-bar.hh"
55

6+
#include <sstream>
7+
68
namespace nix {
79

810
LogFormat defaultLogFormat = LogFormat::raw;
911

12+
std::optional<std::set<ActivityType>> diffActivitiesToInclude = std::nullopt;
13+
14+
static void parseActivityIds(const std::string & activityIdsStr)
15+
{
16+
if (activityIdsStr.empty()) {
17+
diffActivitiesToInclude = std::nullopt;
18+
return;
19+
}
20+
21+
std::set<ActivityType> activityTypes;
22+
std::stringstream ss(activityIdsStr);
23+
std::string item;
24+
25+
while (std::getline(ss, item, ',')) {
26+
// Trim whitespace
27+
item.erase(item.find_last_not_of(" \t\n\r\f\v") + 1);
28+
item.erase(0, item.find_first_not_of(" \t\n\r\f\v"));
29+
30+
if (!item.empty()) {
31+
try {
32+
int activityTypeInt = std::stoi(item);
33+
activityTypes.insert(static_cast<ActivityType>(activityTypeInt));
34+
} catch (const std::exception& e) {
35+
throw Error("invalid activity type '%s' in activity IDs list", item);
36+
}
37+
}
38+
}
39+
40+
diffActivitiesToInclude = activityTypes;
41+
}
42+
1043
LogFormat parseLogFormat(const std::string & logFormatStr)
1144
{
1245
if (logFormatStr == "raw" || getEnv("NIX_GET_COMPLETIONS"))
@@ -15,8 +48,15 @@ LogFormat parseLogFormat(const std::string & logFormatStr)
1548
return LogFormat::rawWithLogs;
1649
else if (logFormatStr == "internal-json")
1750
return LogFormat::internalJSON;
18-
else if (logFormatStr == "diffs")
51+
else if (logFormatStr == "diffs") {
52+
diffActivitiesToInclude = std::nullopt;
1953
return LogFormat::diffs;
54+
}
55+
else if (logFormatStr.starts_with("diffs;")) {
56+
std::string activityIdsPart = logFormatStr.substr(6);
57+
parseActivityIds(activityIdsPart);
58+
return LogFormat::diffs;
59+
}
2060
else if (logFormatStr == "bar")
2161
return LogFormat::bar;
2262
else if (logFormatStr == "bar-with-logs")
@@ -34,7 +74,7 @@ std::unique_ptr<Logger> makeDefaultLogger()
3474
case LogFormat::internalJSON:
3575
return makeJSONLogger(getStandardError());
3676
case LogFormat::diffs:
37-
return makeDiffLogger(getStandardError());
77+
return makeDiffLogger(getStandardError(), diffActivitiesToInclude);
3878
case LogFormat::bar:
3979
return makeProgressBar();
4080
case LogFormat::barWithLogs: {

src/libutil/include/nix/util/logging-diffs.hh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
#include <list>
1111
#include <map>
1212
#include <optional>
13+
#include <set>
1314

1415
namespace nix {
1516

1617
std::unique_ptr<Logger> makeDiffLogger(Descriptor fd);
18+
std::unique_ptr<Logger> makeDiffLogger(Descriptor fd, std::optional<std::set<ActivityType>> activity_types_to_include);
1719

1820
struct ActivityState {
1921
bool isComplete;
@@ -45,6 +47,7 @@ struct NixMessage {
4547

4648
struct NixBuildState {
4749
std::map<ActivityId, ActivityState> activities;
50+
std::set<ActivityId> ignored_activites;
4851
std::list<NixMessage> messages;
4952
};
5053

src/libutil/logging-diffs.cc

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ static void posToJson(json & json, std::shared_ptr<const Pos> pos)
9191

9292
struct DiffLogger : Logger {
9393
Descriptor fd;
94+
std::optional<std::set<ActivityType>> activity_types_to_include;
9495

9596
Sync<NixBuildState> state;
9697
json last_sent;
@@ -99,8 +100,9 @@ struct DiffLogger : Logger {
99100
std::atomic_bool exited;
100101
std::thread printerThread;
101102

102-
DiffLogger(Descriptor fd)
103+
DiffLogger(Descriptor fd, std::optional<std::set<ActivityType>> activity_types_to_include)
103104
: fd(fd)
105+
, activity_types_to_include(activity_types_to_include)
104106
, last_sent(nullptr)
105107
, exitPeriodicAction(false)
106108
, exited(false)
@@ -209,30 +211,49 @@ struct DiffLogger : Logger {
209211
const std::string & s, const Fields & fields, ActivityId parent) override
210212
{
211213
ActivityState as(type, s, fields, parent);
214+
212215
auto state_(state.lock());
213-
state_->activities.insert(std::pair<ActivityId, ActivityState>(act, as));
216+
217+
if (!activity_types_to_include || activity_types_to_include->contains(type)) {
218+
state_->activities.insert(std::pair<ActivityId, ActivityState>(act, as));
219+
} else {
220+
state_->ignored_activites.insert(act);
221+
}
214222
}
215223

216224
void stopActivity(ActivityId act) override
217225
{
218226
auto state_(state.lock());
219-
try { state_->activities.at(act).isComplete = true; }
220-
catch (const std::out_of_range& oor) { }
227+
228+
if (activity_types_to_include && state_->ignored_activites.contains(act)) {
229+
state_->ignored_activites.erase(act);
230+
} else {
231+
try { state_->activities.at(act).isComplete = true; }
232+
catch (const std::out_of_range& oor) { }
233+
}
221234
}
222235

223236
void result(ActivityId act, ResultType type, const Fields & fields) override
224237
{
225238
auto state_(state.lock());
226-
try { state_->activities.at(act).fields = fields; }
227-
catch (const std::out_of_range& oor) {
228-
Logger::writeToStdout("Failed to look up result of type " + std::to_string(static_cast<int>(type)));
239+
240+
if (!activity_types_to_include || !state_->ignored_activites.contains(act)) {
241+
try { state_->activities.at(act).fields = fields; }
242+
catch (const std::out_of_range& oor) {
243+
Logger::writeToStdout("Failed to look up activity " + std::to_string(static_cast<int>(type)) + " to write result of type " + std::to_string(static_cast<int>(type)));
244+
}
229245
}
230246
}
231247
};
232248

249+
std::unique_ptr<Logger> makeDiffLogger(Descriptor fd, std::optional<std::set<ActivityType>> activity_types_to_include)
250+
{
251+
return std::make_unique<DiffLogger>(fd, activity_types_to_include);
252+
}
253+
233254
std::unique_ptr<Logger> makeDiffLogger(Descriptor fd)
234255
{
235-
return std::make_unique<DiffLogger>(fd);
256+
return std::make_unique<DiffLogger>(fd, std::nullopt);
236257
}
237258

238259
}

0 commit comments

Comments
 (0)