@@ -91,6 +91,7 @@ static void posToJson(json & json, std::shared_ptr<const Pos> pos)
9191
9292struct 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+
233254std::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