Skip to content

Commit 18a0ade

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

File tree

5 files changed

+80
-9
lines changed

5 files changed

+80
-9
lines changed

src/libmain/common-args.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ MixCommonArgs::MixCommonArgs(const std::string & programName)
7171
.handler = {[](std::string format) { setLogFormat(format); }},
7272
});
7373

74+
addFlag({
75+
.longName = "log-diffs-include-activity-ids",
76+
.description = "Comma-separated list of activity IDs to include when using 'diffs' logging.",
77+
.category = loggingCategory,
78+
.labels = {"diffs-include-activity-ids"},
79+
.handler = {[](std::string format) { setLogDiffsIncludeActivityIds(format); }},
80+
});
81+
7482
addFlag({
7583
.longName = "max-jobs",
7684
.shortName = 'j',

src/libmain/include/nix/main/loggers.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ enum class LogFormat {
1717
void setLogFormat(const std::string & logFormatStr);
1818
void setLogFormat(const LogFormat & logFormat);
1919

20+
void setLogDiffsIncludeActivityIds(const std::string & activityIdsStr);
21+
2022
} // namespace nix

src/libmain/loggers.cc

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
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+
1014
LogFormat parseLogFormat(const std::string & logFormatStr)
1115
{
1216
if (logFormatStr == "raw" || getEnv("NIX_GET_COMPLETIONS"))
@@ -34,7 +38,7 @@ std::unique_ptr<Logger> makeDefaultLogger()
3438
case LogFormat::internalJSON:
3539
return makeJSONLogger(getStandardError());
3640
case LogFormat::diffs:
37-
return makeDiffLogger(getStandardError());
41+
return makeDiffLogger(getStandardError(), diffActivitiesToInclude);
3842
case LogFormat::bar:
3943
return makeProgressBar();
4044
case LogFormat::barWithLogs: {
@@ -58,4 +62,37 @@ void setLogFormat(const LogFormat & logFormat)
5862
logger = makeDefaultLogger();
5963
}
6064

65+
void setLogDiffsIncludeActivityIds(const std::string & activityIdsStr)
66+
{
67+
if (activityIdsStr.empty()) {
68+
diffActivitiesToInclude = std::nullopt;
69+
} else {
70+
std::set<ActivityType> activityTypes;
71+
std::stringstream ss(activityIdsStr);
72+
std::string item;
73+
74+
while (std::getline(ss, item, ',')) {
75+
// Trim whitespace
76+
item.erase(item.find_last_not_of(" \t\n\r\f\v") + 1);
77+
item.erase(0, item.find_first_not_of(" \t\n\r\f\v"));
78+
79+
if (!item.empty()) {
80+
try {
81+
int activityTypeInt = std::stoi(item);
82+
activityTypes.insert(static_cast<ActivityType>(activityTypeInt));
83+
} catch (const std::exception& e) {
84+
throw Error("invalid activity type '%s' in activity IDs list", item);
85+
}
86+
}
87+
}
88+
89+
diffActivitiesToInclude = activityTypes;
90+
}
91+
92+
// If we're currently using diffs format, recreate the logger with the new filter
93+
if (defaultLogFormat == LogFormat::diffs) {
94+
logger = makeDefaultLogger();
95+
}
96+
}
97+
6198
} // namespace nix

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)