feat(fun/clbot,ops/machines/whitby): filter tvix-dev clbot

In #tvix-dev, we want to display only CLs that relate to tvix and
related projects.

So use a pretty dumb allow-list for which CLs to display in that
channel.

Change-Id: I3ef50b64e3d7fbc27a6690be6a10f1b55c04cd6e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11658
Reviewed-by: flokli <flokli@flokli.de>
Reviewed-by: lukegb <lukegb@tvl.fyi>
Tested-by: BuildkiteCI
This commit is contained in:
Profpatsch 2024-05-13 17:54:34 +02:00
parent 1b39d5868a
commit 9559ef56e3
4 changed files with 55 additions and 9 deletions

View file

@ -42,6 +42,7 @@ var (
notifyBranches = stringSetFlag{} notifyBranches = stringSetFlag{}
neverPing = flag.String("never_ping", "marcus", "Comma-separated terms that should never ping users") neverPing = flag.String("never_ping", "marcus", "Comma-separated terms that should never ping users")
onlyDisplay = flag.String("only_display", "", "Comma-separated substrings of the gerrit CL Change Subject that should be shown (everything else is dropped)")
) )
func init() { func init() {
@ -193,6 +194,21 @@ func nopingAll(username, message string) string {
return strings.ReplaceAll(message, username, noping(username)) return strings.ReplaceAll(message, username, noping(username))
} }
// changeShouldBeSkipped applies the list of channels in `onlyDisplay`
// to whether we should skip displaying a CL.
func changeShouldBeSkipped(onlyDisplay string, changeSubject string) bool {
// case when we dont want to filter
if onlyDisplay == "" {
return false
}
for _, needle := range strings.Split(onlyDisplay, ",") {
if strings.Contains(changeSubject, needle) {
return false
}
}
return true
}
func patchSetURL(c gerritevents.Change, p gerritevents.PatchSet) string { func patchSetURL(c gerritevents.Change, p gerritevents.PatchSet) string {
return fmt.Sprintf("https://cl.tvl.fyi/%d", c.Number) return fmt.Sprintf("https://cl.tvl.fyi/%d", c.Number)
} }
@ -248,13 +264,13 @@ func main() {
var parsedMsg string var parsedMsg string
switch e := e.(type) { switch e := e.(type) {
case *gerritevents.PatchSetCreated: case *gerritevents.PatchSetCreated:
if e.Change.Project != *notifyRepo || !notifyBranches[e.Change.Branch] || e.PatchSet.Number != 1 { if e.Change.Project != *notifyRepo || !notifyBranches[e.Change.Branch] || e.PatchSet.Number != 1 || changeShouldBeSkipped(*onlyDisplay, e.Change.Subject) {
continue continue
} }
user := username(e.PatchSet.Uploader) user := username(e.PatchSet.Uploader)
parsedMsg = nopingAll(user, fmt.Sprintf("CL/%d proposed by %s - %s - %s", e.Change.Number, user, e.Change.Subject, patchSetURL(e.Change, e.PatchSet))) parsedMsg = nopingAll(user, fmt.Sprintf("CL/%d proposed by %s - %s - %s", e.Change.Number, user, e.Change.Subject, patchSetURL(e.Change, e.PatchSet)))
case *gerritevents.ChangeMerged: case *gerritevents.ChangeMerged:
if e.Change.Project != *notifyRepo || !notifyBranches[e.Change.Branch] { if e.Change.Project != *notifyRepo || !notifyBranches[e.Change.Branch] || changeShouldBeSkipped(*onlyDisplay, e.Change.Subject) {
continue continue
} }
owner := username(e.Change.Owner) owner := username(e.Change.Owner)

24
fun/clbot/clbot_test.go Normal file
View file

@ -0,0 +1,24 @@
package main
import (
"testing"
)
func TestChangeShouldBeSkipped(t *testing.T) {
dontSkipAny := ""
if changeShouldBeSkipped(dontSkipAny, "mysubject") {
t.Fatal("dontSkipAny should not not be skip any")
}
showThese := "A,B"
if changeShouldBeSkipped(showThese, "A") {
t.Fatal("A should be shown")
}
if changeShouldBeSkipped(showThese, "B") {
t.Fatal("B should be shown")
}
if !changeShouldBeSkipped(showThese, "C") {
t.Fatal("C should not be shown")
}
}

View file

@ -347,7 +347,12 @@ in
# Start the Gerrit->IRC bot # Start the Gerrit->IRC bot
services.depot.clbot = { services.depot.clbot = {
enable = true; enable = true;
channels = [ "#tvix-dev" "#tvl" ]; channels = {
"#tvl" = { };
"#tvix-dev" = {
only_display = "tvix,nix-compat,third_party,third-party,3p";
};
};
# See //fun/clbot for details. # See //fun/clbot for details.
flags = { flags = {

View file

@ -7,6 +7,7 @@ let
inherit (lib) inherit (lib)
listToAttrs listToAttrs
mapAttrsToList
mkEnableOption mkEnableOption
mkIf mkIf
mkOption mkOption
@ -25,13 +26,13 @@ let
${pkgs.systemd}/bin/systemd-escape '${name}' >> $out ${pkgs.systemd}/bin/systemd-escape '${name}' >> $out
'')); ''));
mkUnit = flags: channel: { mkUnit = channel: channelFlags: {
name = "clbot-${systemdEscape channel}"; name = "clbot-${systemdEscape channel}";
value = { value = {
description = "${description} to ${channel}"; description = "${description} to ${channel}";
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
script = "${depot.fun.clbot}/bin/clbot ${mkFlags (cfg.flags // { script = "${depot.fun.clbot}/bin/clbot ${mkFlags (cfg.flags // channelFlags // {
irc_channel = channel; irc_channel = channel;
})} -alsologtostderr"; })} -alsologtostderr";
@ -53,8 +54,8 @@ in
}; };
channels = mkOption { channels = mkOption {
type = with types; listOf str; type = with types; attrsOf (attrsOf str);
description = "Channels in which to post (generates one unit per channel)"; description = "Channels in which to post (generates one unit per channel); nested attrs are used as extra flags to the service, which override the attrs in `flags`";
}; };
secretsFile = mkOption { secretsFile = mkOption {
@ -77,6 +78,6 @@ in
}; };
}; };
systemd.services = listToAttrs (map (mkUnit cfg.flags) cfg.channels); systemd.services = listToAttrs (mapAttrsToList mkUnit cfg.channels);
}; };
} }