Skip to content

Commit 95f7f5b

Browse files
committed
First shot at managing labels on merge
1 parent f5c1c2a commit 95f7f5b

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed

.github/workflows/merge.yml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: merge-labeler
2+
3+
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request
4+
5+
permissions:
6+
pull-requests: read|write
7+
8+
on:
9+
pull_request:
10+
types:
11+
- closed
12+
13+
jobs:
14+
accept:
15+
if: github.event.pull_request.merged == true
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@v3
19+
- run: |
20+
echo ${{ github.token }} | cat >> .token
21+
echo REPO ${{ github.repository }}
22+
echo ID ${{ github.event.number }}
23+
perl util/merge-labeler ${{ github.repository }} ${{ github.event.number }}
24+

MANIFEST.SKIP

+1
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,4 @@ packer/
9898

9999
PROGRAMMING_STYLE.md
100100
.perltidyrc
101+
.token

util/merge-labeler

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#!/usr/bin/perl
2+
use v5.10;
3+
4+
our( $repo, $id ) = @ARGV;
5+
our( $url ) = "https://api.github.com/repos/$repo/issues/$id/labels";
6+
7+
say STDERR "REPO: $repo ID $id";
8+
9+
my @labels = get_labels( $repo, $id );
10+
say STDERR "LABELS: @labels";
11+
12+
my @labels_to_remove = grep { /\A(Status|Priority):\s+/ } @labels;
13+
say STDERR "LABELS TO REMOVE: @labels_to_remove";
14+
15+
remove_labels( @labels_to_remove );
16+
17+
add_labels( "Status: accepted" );
18+
19+
sub add_labels {
20+
foreach my $label ( @_ ) {
21+
my @extra = (
22+
$url,
23+
'-d', qq('{"labels": ["$label"]}'),
24+
);
25+
26+
curl( 'POST', @extra );
27+
}
28+
}
29+
30+
sub curl {
31+
state $token = do {
32+
open my $fh, '<', '.token';
33+
chomp( my $line = <$fh> );
34+
$line;
35+
};
36+
37+
my( $method, @extra ) = @_;
38+
39+
my $command = [
40+
'curl',
41+
'--silent',
42+
'-X', $method,
43+
'-H', q('Accept: application/vnd.github.v3+json'),
44+
'-H', qq('Authorization: token $token'),
45+
'-H', q('X-GitHub-Api-Version: 2022-11-28'),
46+
];
47+
48+
my @c = ( @$command, @extra );
49+
50+
my @output = `@c`;
51+
52+
return @output;
53+
}
54+
55+
sub get_labels {
56+
my @extra = (
57+
$url,
58+
);
59+
60+
my @labels =
61+
map { /\A\s*"name":\s+"(.+)"/ ? $1 : () }
62+
curl( 'GET', @extra );
63+
}
64+
65+
sub remove_labels {
66+
foreach my $label ( @_ ) {
67+
$label =~ s/ /%20/g;
68+
my @extra = (
69+
"$url/$label",
70+
);
71+
72+
curl( 'DELETE', @extra )
73+
}
74+
}

0 commit comments

Comments
 (0)