Fixes #318.
NTEDD7T4M7XXYCWNZN57EJOEH3KI3UYMHOANV4MY2LSUPWX3JRDQC A2Z3ZJ667A3ZXLLVQ3SFBM6NMP6FQWPYVT3S6CKATEOHITBSWAWAC 7LWB2J2ZFB4XJDN5MBL2WDKVBRYQD7Y6RQU7LUYKH7PZTXK2H7KQC NSRWW6LCJUUNQO4RI3MMYD4NVURBYBAG7SK3LJUY7KKC4OH7J65QC FCTX433OH7QIVWHXL23DKVSUKBQSLQTRK3PFCKKSMLX6A634456QC MHVIT4JYWUYD4UCGB2AHLXWLX6B5SYE22BREERNGANT7RGGDUFOAC 24BMQDZAWDQ7VNIA7TIROXSOYLOJBNZ2E4264WHWNJAEN6ZB3UOAC VQISTKOPNAEUS2K2F73CMNNLGZATWUYIURD5CSVNBNF7Q5ZF4PXQC UNVMKJV5VX74A2MLS42AP3SY25HKQSH4S27Y44QFKRQRKPU2MV6QC FITVNQ2SVM6KSOF5P3HHWJYQ3WMQYDJGAONCBIZ7OF7CPXGMA36QC NJJ7H64SZOX5EGACDCQAUQ7R6UEWD5IIC35A2MWFOOJV55DJYPHAC GS4BE6TB6GH2JUZJHDPHL6YG7J7YYESF3YOZJZ2CFABXUTO4VYPQC IE2PRAQUCQVFPJ4CAIJRPXXEFC5VBAE3EO5I5FG4XWEDRNONNHKQC X6FOUYFJ5ODEOMHLL6AHM6KI2JRZ2XOI76NYJYJNDUQBTV5UJLBAC HJOEIMLRDVQ2KZI5HGL2HKGBM3AHP7YIKGKDAGFUNKRUXVRB24NAC B2L4T3X63XVYJQXEDU4WT5Y4R6PMDXGC6WN2KGOMHRQILSABNQOAC D5QIOJGPKQJIYBUCSC3MFJ3TXLPNZ2XMI37GXMFRVRFWWR2VMTFAC PHNLYPKB5SJJAHAICS6QEMRNCREPG7SC2MQRLTQMQLWGXM427S3QC 5HFMGRVJD3EVXPADZ4WTAIKT6EKY4C3TWHRNTJBL2PBWZUP25C7QC PMNWRTGJ4GVSMSSAWSUD57B26PCRAHMZIQ5SIWJIK7A74ENKEQLAC OOQ2D3KCLFPYNAN253PHWLBQMB6OMO2KYQWQXLTP65SQAYZWQ5LAC BLVQGJ4LITFCIR3KAUX3GWAHMYH3XXFC4BDXUSXUVEJFEJ7IMM4AC JAH3UPWAVSHXIPNGL6PROQPZBYZHPJNFONWBDZX4HCX646USZXUQC 5EQYVRWECBDJORGI5DRIOUEJXSXMRCQNT2562BM4Z4U52LT7JUHAC {auto notificationSenderQueue_(notificationSenderQueue.lock());notificationSenderQueue_->push(NotificationItem{NotificationItem::Type::Started, build->id});}notificationSenderWakeup.notify_one();
enqueueNotificationItem({NotificationItem::Type::BuildStarted, build->id});
for (auto id : buildIDs) {{auto notificationSenderQueue_(notificationSenderQueue.lock());notificationSenderQueue_->push(NotificationItem{NotificationItem::Type::Finished, id});}notificationSenderWakeup.notify_one();}
for (auto id : buildIDs)enqueueNotificationItem({NotificationItem::Type::BuildFinished, id});
if (unlink(logPath.c_str()) != 0)throw SysError(format("unlinking ‘%1%’") % logPath);
if (unlink(item.logPath.c_str()) != 0)throw SysError(format("unlinking ‘%1%’") % item.logPath);/* Run plugins. We do this after log compression to ensurethat the log file doesn't change while the plugins maybe accessing it. */enqueueNotificationItem({NotificationItem::Type::StepFinished, item.id, {}, item.stepNr, dstPath});
Strings argv({"hydra-notify", item.type == NotificationItem::Type::Started ? "build-started" : "build-finished", std::to_string(item.id)});for (auto id : item.dependentIds)argv.push_back(std::to_string(id));
Strings argv;switch (item.type) {case NotificationItem::Type::BuildStarted:argv = {"hydra-notify", "build-started", std::to_string(item.id)};for (auto id : item.dependentIds)argv.push_back(std::to_string(id));break;case NotificationItem::Type::BuildFinished:argv = {"hydra-notify", "build-finished", std::to_string(item.id)};for (auto id : item.dependentIds)argv.push_back(std::to_string(id));break;case NotificationItem::Type::StepFinished:argv = {"hydra-notify", "step-finished", std::to_string(item.id), std::to_string(item.stepNr), item.logPath};break;};
package Hydra::Helper::PluginHooks;use strict;use Exporter;our @ISA = qw(Exporter);our @EXPORT = qw(notifyBuildStartednotifyBuildFinished);sub notifyBuildStarted {my ($plugins, $build) = @_;foreach my $plugin (@{$plugins}) {eval {$plugin->buildStarted($build);};if ($@) {print STDERR "$plugin->buildStarted: $@\n";}}}sub notifyBuildFinished {my ($plugins, $build, $dependents) = @_;foreach my $plugin (@{$plugins}) {eval {$plugin->buildFinished($build, $dependents);};if ($@) {print STDERR "$plugin->buildFinished: $@\n";}}}1;
notifyBuildFinished(\@plugins, $build, [@dependents]);} elsif ($cmd eq "build-started") {notifyBuildStarted(\@plugins, $build);
foreach my $plugin (@plugins) {eval { $plugin->buildFinished($build, [@dependents]); };if ($@) {print STDERR "$plugin->buildFinished: $@\n";}}}elsif ($cmd eq "build-started") {foreach my $plugin (@plugins) {eval { $plugin->buildStarted($build); };if ($@) {print STDERR "$plugin->buildStarted: $@\n";}}}elsif ($cmd eq "step-finished") {my $stepNr = shift @ARGV or die;my $step = $build->buildsteps->find({stepnr => $stepNr})or die "step $stepNr does not exist\n";my $logPath = shift @ARGV or die;foreach my $plugin (@plugins) {eval { $plugin->stepFinished($step, $logPath); };if ($@) {print STDERR "$plugin->stepFinished: $@\n";}}