Skip to content

Commit 73d4753

Browse files
committed
Upgrade: Only check reactors/channels specified by config
That way if new modules are added (but not used on the running instance of synergy) an upgrade will still (rightly) succeed.
1 parent c5808d7 commit 73d4753

File tree

11 files changed

+88
-41
lines changed

11 files changed

+88
-41
lines changed

lib/Synergy/Hub.pm

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ use URI;
2424
use Scalar::Util qw(blessed);
2525
use Defined::KV;
2626

27+
has config_file => (
28+
is => 'ro',
29+
isa => 'Maybe[Str]',
30+
);
31+
2732
has name => (
2833
is => 'ro',
2934
isa => 'Str',
@@ -295,11 +300,10 @@ sub set_loop ($self, $loop) {
295300
return $loop;
296301
}
297302

298-
sub synergize {
299-
my $class = shift;
300-
my ($loop, $config) = @_ == 2 ? @_
301-
: @_ == 1 ? (undef, @_)
302-
: confess("weird arguments passed to synergize");
303+
sub synergize ($class, $arg) {
304+
my $loop = delete $arg->{loop};
305+
my $config = delete $arg->{config};
306+
my $config_file = delete $arg->{config_file};
303307

304308
$loop //= do {
305309
require IO::Async::Loop;
@@ -321,6 +325,7 @@ sub synergize {
321325
defined_kv(tls_cert_file => $config->{tls_cert_file}),
322326
defined_kv(tls_key_file => $config->{tls_key_file}),
323327
defined_kv(state_dbfile => $config->{state_dbfile}),
328+
config_file => $config_file,
324329
});
325330

326331
$directory->register_with_hub($hub);
@@ -384,10 +389,11 @@ sub synergize_file {
384389
: $filename =~ /\.toml\z/ ? \&_slurp_toml_file
385390
: confess "don't know how to synergize_file $filename";
386391

387-
return $class->synergize(
388-
($loop ? $loop : ()),
389-
$reader->($filename),
390-
);
392+
return $class->synergize({
393+
loop => $loop,
394+
config => $reader->($filename),
395+
config_file => $filename,
396+
});
391397
}
392398

393399
has http_client => (

lib/Synergy/Reactor/Upgrade.pm

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use namespace::clean;
1010
use File::pushd;
1111
use File::Find;
1212
use Path::Tiny;
13+
use YAML::XS;
14+
use Try::Tiny;
1315

1416
has git_dir => (
1517
is => 'ro',
@@ -180,10 +182,48 @@ sub get_version_desc ($self) {
180182
$output;
181183
}
182184

183-
sub check_next {
185+
sub check_next ($self, @) {
186+
my $cf = $self->hub->config_file;
187+
188+
# No config file? Huh. Do normal check
189+
return $self->check_next_file_find unless $cf;
190+
191+
my $reader = $cf =~ /\.ya?ml\z/ ? sub { YAML::XS::LoadFile($_[0]) }
192+
: $cf =~ /\.json\z/ ? \&Synergy::Hub::_slurp_json_file
193+
: $cf =~ /\.toml\z/ ? \&Synergy::Hub::_slurp_toml_file
194+
: undef;
195+
196+
return $self->check_next_file_find unless $reader;
197+
198+
my ($config, $err);
199+
200+
try {
201+
$config = $reader->($cf);
202+
} catch {
203+
$err = "Failed to parse config ($cf): $_";
204+
};
205+
206+
return $err if $err;
207+
208+
my %allowed;
209+
210+
for my $thing (qw( channels reactors )) {
211+
for my $thing_config (values %{ $config->{$thing} }) {
212+
my $thing_class = delete $thing_config->{class};
213+
214+
next unless $thing_class;
215+
216+
$allowed{$thing_class} = 1;
217+
}
218+
}
219+
220+
return $self->check_next_file_find(\%allowed);
221+
}
222+
223+
sub check_next_file_find ($self, $allowed = {}) {
184224
my $data = "use lib qw(lib);\n";
185225

186-
find(sub { wanted(\$data) }, 'lib/');
226+
find(sub { wanted($allowed, \$data) }, 'lib/');
187227

188228
my $f = Path::Tiny->tempfile;
189229
$f->spew($data);
@@ -194,9 +234,7 @@ sub check_next {
194234
return;
195235
}
196236

197-
sub wanted {
198-
my $data = shift;
199-
237+
sub wanted ($allowed, $data) {
200238
return unless -f $_;
201239
return unless /\.pm$/;
202240

@@ -206,6 +244,9 @@ sub wanted {
206244
$name =~ s/\//::/g;
207245
$name =~ s/\.pm//;
208246

247+
# Only load channels/reactors referenced in config
248+
return if %$allowed && $name =~ /Synergy::(Reactor|Channel)/ && ! $allowed->{$name};
249+
209250
$$data .= "use $name;\n";
210251
}
211252

t/basic.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use Net::Async::HTTP;
1515
use Synergy::Hub;
1616

1717
# Initialize Synergy.
18-
my $synergy = Synergy::Hub->synergize(
19-
{
18+
my $synergy = Synergy::Hub->synergize({
19+
config => {
2020
user_directory => "t/data/users.yaml",
2121
channels => {
2222
'test-channel' => {
@@ -35,7 +35,7 @@ my $synergy = Synergy::Hub->synergize(
3535
pref => { class => 'Synergy::Reactor::Preferences' },
3636
}
3737
}
38-
);
38+
});
3939

4040
# Tests begin here.
4141
testing_loop($synergy->loop);

t/dates.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use Net::Async::HTTP;
1818
use Synergy::Hub;
1919

2020
# Initialize Synergy.
21-
my $synergy = Synergy::Hub->synergize(
22-
{
21+
my $synergy = Synergy::Hub->synergize({
22+
config => {
2323
user_directory => "t/data/users.yaml",
2424
time_zone_names => {
2525
"America/New_York" => "🇺🇸",
@@ -38,7 +38,7 @@ my $synergy = Synergy::Hub->synergize(
3838
echo => { class => 'Synergy::Reactor::Echo' },
3939
}
4040
}
41-
);
41+
});
4242

4343
sub from_epoch { DateTime->from_epoch(epoch => $_[0]) }
4444

t/exclusive.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use Net::Async::HTTP;
1515
use Synergy::Hub;
1616

1717
# Initialize Synergy.
18-
my $synergy = Synergy::Hub->synergize(
19-
{
18+
my $synergy = Synergy::Hub->synergize({
19+
config => {
2020
user_directory => "t/data/users.yaml",
2121
channels => {
2222
'test-channel' => {
@@ -33,7 +33,7 @@ my $synergy = Synergy::Hub->synergize(
3333
echo => { class => 'Synergy::Reactor::Echo' },
3434
}
3535
}
36-
);
36+
});
3737

3838
# Tests begin here.
3939
testing_loop($synergy->loop);

t/httpendpoint.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ package Synergy::Channel::Test::HTTPEndpointAuth {
4141
}
4242

4343
# Initialize Synergy.
44-
my $synergy = Synergy::Hub->synergize(
45-
{
44+
my $synergy = Synergy::Hub->synergize({
45+
config => {
4646
user_directory => "t/data/users.yaml",
4747
channels => {
4848
'test-channel-endpoint' => {
@@ -55,7 +55,7 @@ my $synergy = Synergy::Hub->synergize(
5555
},
5656
},
5757
}
58-
);
58+
});
5959

6060
# Tests begin here.
6161
testing_loop($synergy->loop);

t/https.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ use Plack::Response;
1717
use Synergy::Hub;
1818

1919
# Initialize Synergy.
20-
my $synergy = Synergy::Hub->synergize(
21-
{
20+
my $synergy = Synergy::Hub->synergize({
21+
config => {
2222
user_directory => "t/data/users.yaml",
2323
channels => {
2424
'test-channel' => {
@@ -28,7 +28,7 @@ my $synergy = Synergy::Hub->synergize(
2828
tls_cert_file => "t/data/synergy.crt",
2929
tls_key_file => "t/data/synergy.key",
3030
}
31-
);
31+
});
3232

3333
$synergy->server->register_path('/ok', sub {
3434
return Plack::Response->new(200)->finalize;

t/httpserver.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ use Plack::Response;
1717
use Synergy::Hub;
1818

1919
# Initialize Synergy.
20-
my $synergy = Synergy::Hub->synergize(
21-
{
20+
my $synergy = Synergy::Hub->synergize({
21+
config => {
2222
user_directory => "t/data/users.yaml",
2323
channels => {
2424
'test-channel' => {
2525
class => 'Synergy::Channel::Test',
2626
}
2727
},
2828
}
29-
);
29+
});
3030

3131
$synergy->server->register_path('/ok', sub {
3232
return Plack::Response->new(200)->finalize;

t/lp-task-spec.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use Synergy::Logger::Test '$Logger';
1313
use Synergy::Hub;
1414

1515
my $tmpfile = Path::Tiny->tempfile;
16-
my $synergy = Synergy::Hub->synergize(
17-
{
16+
my $synergy = Synergy::Hub->synergize({
17+
config => {
1818
user_directory => "t/data/users-lp.yaml",
1919
channels => {
2020
'test-channel' => {
@@ -38,7 +38,7 @@ my $synergy = Synergy::Hub->synergize(
3838
},
3939
state_dbfile => "$tmpfile",
4040
}
41-
);
41+
});
4242

4343
for my $to_set (
4444
[ jetta => { lp => { 'default-project-shortcut' => 'pies' } } ],

t/page.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ my $PAGE = "Hello\n\nfriend.";
2020
my $tmpfile = Path::Tiny->tempfile;
2121

2222
# Initialize Synergy.
23-
my $synergy = Synergy::Hub->synergize(
24-
{
23+
my $synergy = Synergy::Hub->synergize({
24+
config => {
2525
user_directory => "t/data/users-page.yaml",
2626
channels => {
2727
'test-1' => {
@@ -49,7 +49,7 @@ my $synergy = Synergy::Hub->synergize(
4949
},
5050
state_dbfile => "$tmpfile",
5151
}
52-
);
52+
});
5353

5454
# Tests begin here.
5555
testing_loop($synergy->loop);

0 commit comments

Comments
 (0)