Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unify perl linting rules #5348

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .perltidyrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
# # See <https://github.com/houseabsolute/perl-code-tidyall/issues/84>.
--character-encoding=none
--no-valign
-l=120 # 120 characters per line
-l=160
-fbl # don't change blank lines
-fnl # don't remove new lines
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree to include this line but I do not want to loosen the line-length rule. We must find a way to support project specific rule additions and exceptions.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I remember the conversation from the other PR there's no easy way to add exceptions per project. Could 120 be used instead?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already covered that we can not easily reduce os-autoinst-distri-opensuse from 160 down to 120

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay. I guess I'm fine with 160 then if it's the only deviation.

Copy link
Contributor

@perlpunk perlpunk Nov 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can live with a .perltidyrc per project. If the common project has a config, existing and new projects can use this by symlinking, but they don't have to, so openQA would keep its own config, if the common project uses 160, or if the common project uses 120, distri-opensuse would use its own.
That's at least what @josegomezr agreed on when we chatted today

-nsfs # no spaces before semicolons
-baao # space after operators
-bbao # space before operators
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/Constants.pm
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ use constant WORKER_STOP_REASONS => (
# Define error categories used alongside the reasons defined above for finer error handling where needed
use constant {
WORKER_EC_CACHE_FAILURE => 'cache failure', # the cache service made problems
WORKER_EC_ASSET_FAILURE => 'asset failure', # a problem occurred when handling assets, e.g. an asset was not found
WORKER_EC_ASSET_FAILURE => 'asset failure', # a problem occurred when handling assets, e.g. an asset was not found
};

# Time verification to use with the "worker_timeout" configuration.
Expand Down
4 changes: 2 additions & 2 deletions lib/OpenQA/LiveHandler/Controller/LiveViewHandler.pm
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ sub connect_to_cmd_srv {
error => 'unable to upgrade ws to command server')
unless $tx->is_websocket;

# assign transaction: don't do this before to prevent regular HTTP connections to be used in send_message_to_os_autoinst
# assign transaction: don't do this before to prevent regular HTTP connections to be used in send_message_to_os_autoinst
$self->cmd_srv_transactions_by_job->{$job_id} = $tx;

# instantly query the os-autoinst status
Expand Down Expand Up @@ -500,7 +500,7 @@ sub ws_proxy {
error => 'unable to create (further) development session');
}
# mark session as active
$developer_session->update({ws_connection_count => \'ws_connection_count + 1'}); #'restore syntax highlighting
$developer_session->update({ws_connection_count => \'ws_connection_count + 1'}); #'restore syntax highlighting
}

# add JavaScript transaction to the list of JavaScript transactions for this job
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/Parser/Format/JUnit.pm
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ sub parse {
my $num = 1;
for my $tc ($ts, $ts->children('testcase')->each) {

# create extra entry for whole testsuite if there is any system-out or system-err outside of particular testcase
# create extra entry for whole testsuite if there is any system-out or system-err outside of particular testcase
next if ($tc->tag eq 'testsuite' && $tc->children('system-out, system-err')->size == 0);

my $tc_result = $ts_result; # use overall testsuite result as fallback
Expand Down
4 changes: 2 additions & 2 deletions lib/OpenQA/Schema/Result/Jobs.pm
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ sub prepare_for_work ($self, $worker = undef, $worker_properties = {}) {
@{$job_hashref->{settings}}{keys %$updated_settings} = values %$updated_settings
if $updated_settings;

if ( $job_hashref->{settings}->{NICTYPE}
if ($job_hashref->{settings}->{NICTYPE}
&& !defined $job_hashref->{settings}->{NICVLAN}
&& $job_hashref->{settings}->{NICTYPE} ne 'user')
{
Expand Down Expand Up @@ -1149,7 +1149,7 @@ sub delete_videos ($self) {

my @files = (find_video_files($result_dir), Mojo::Collection->new(path($result_dir, 'video_time.vtt')));
my $deleted_size = _delete_returning_size_from_array(\@files);
$self->update({result_size => \"greatest(0, result_size - $deleted_size)"}); # considering logs still present here
$self->update({result_size => \"greatest(0, result_size - $deleted_size)"}); # considering logs still present here
return $deleted_size;
}

Expand Down
8 changes: 4 additions & 4 deletions lib/OpenQA/Schema/Result/ScheduledProducts.pm
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ sub _generate_jobs {
}
for my $job_template (@templates) {
# compose settings from product, machine, testsuite and job template itself
# note: That order also defines the precedence from lowest to highest. The only exception is the WORKER_CLASS
# note: That order also defines the precedence from lowest to highest. The only exception is the WORKER_CLASS
# variable where all occurrences are merged.
my %settings;
my %params = (
Expand Down Expand Up @@ -712,7 +712,7 @@ sub _create_dependencies_for_parents {
if ($worker_class ne $parent_worker_class) {
my $test_name = $job->settings_hash->{TEST};
die
"Worker class of $test_name ($worker_class) does not match the worker class of its directly chained parent ($parent_worker_class)";
"Worker class of $test_name ($worker_class) does not match the worker class of its directly chained parent ($parent_worker_class)";
}
}
$job_dependencies->create(
Expand Down Expand Up @@ -779,7 +779,7 @@ sub _schedule_from_yaml ($self, $args, $skip_chained_deps, $include_children, @l
next unless defined $products;
next unless my $product = $products->{$product_name};
next
if ( $product->{distri} ne _distri_key($args)
if ($product->{distri} ne _distri_key($args)
|| $product->{flavor} ne $args->{FLAVOR}
|| ($product->{version} ne '*' && $product->{version} ne $args->{VERSION})
|| $product->{arch} ne $args->{ARCH});
Expand Down Expand Up @@ -951,7 +951,7 @@ sub cancel ($self, $reason = undef) {

# update status to CANCELLING
if (!$self->_update_status_if(CANCELLING, -not => {status => SCHEDULING})) {
# the scheduled product is SCHEDULING; set it nevertheless to CANCELLING but back off from cancelling immediately
# the scheduled product is SCHEDULING; set it nevertheless to CANCELLING but back off from cancelling immediately
# unless it is not SCHEDULING anymore after all
return 0 if $self->_update_status_if(CANCELLING, status => SCHEDULING);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/Schema/Result/Workers.pm
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ sub reschedule_assigned_jobs {
}
catch {
my $worker_id = $self->id; # uncoverable statement
log_warning("Unable to re-schedule job $job_id abandoned by worker $worker_id: $_"); # uncoverable statement
log_warning("Unable to re-schedule job $job_id abandoned by worker $worker_id: $_"); # uncoverable statement
};
}
}
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/Script/CloneJob.pm
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ sub openqa_baseurl ($local_url) {
my $port = '';
if (
$local_url->port
&& ( ($local_url->scheme eq 'http' && $local_url->port != 80)
&& (($local_url->scheme eq 'http' && $local_url->port != 80)
|| ($local_url->scheme eq 'https' && $local_url->port != 443)))
{
$port = ':' . $local_url->port;
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/Task/Asset/Limit.pm
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ sub _limit {
my $age_in_days = $age->delta_days($now)->in_units('days');
if ($age_in_days >= $limit_in_days) {
_remove_if($schema, $asset,
"Removing asset $asset_name (not in any group, age "
"Removing asset $asset_name (not in any group, age "
. "($age_in_days days) exceeds limit ($limit_in_days days)");
}
else {
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/WebAPI/Controller/API/V1/Job.pm
Original file line number Diff line number Diff line change
Expand Up @@ -953,7 +953,7 @@ sub _generate_job_setting ($self, $args) {
my %params = (input_args => $args, settings => \%settings);

# Populated with Product settings if there are DISTRI, VERSION, FLAVOR, ARCH in arguments.
if ( defined $args->{DISTRI}
if (defined $args->{DISTRI}
&& defined $args->{VERSION}
&& defined $args->{FLAVOR}
&& defined $args->{ARCH})
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/WebAPI/Controller/API/V1/Table.pm
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ sub update {
(($table eq 'TestSuites' || $table eq 'Machines') && $rc->name ne $self->param('name'))
|| (
$table eq 'Products'
&& ( $rc->arch ne $self->param('arch')
&& ($rc->arch ne $self->param('arch')
|| $rc->distri ne $self->param('distri')
|| $rc->flavor ne $self->param('flavor')
|| $rc->version ne $self->param('version'))))
Expand Down
6 changes: 3 additions & 3 deletions lib/OpenQA/WebAPI/Controller/Test.pm
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ sub _prepare_job_results ($self, $all_jobs, $limit) {
my $machines = $self->param_hash('machine');

my @jobs = grep {
(not $states or $states->{$_->state})
(not $states or $states->{$_->state})
and (not $results or $results->{$_->result})
and (not $archs or $archs->{$_->ARCH})
and (not $machines or $machines->{$_->MACHINE})
Expand Down Expand Up @@ -687,7 +687,7 @@ sub _prepare_job_results ($self, $all_jobs, $limit) {

# Append machine name to TEST if it does not match the most frequently used MACHINE
# for the jobs architecture
if ( $job->MACHINE
if ($job->MACHINE
&& $preferred_machines->{$job->ARCH}
&& $preferred_machines->{$job->ARCH} ne $job->MACHINE)
{
Expand Down Expand Up @@ -890,7 +890,7 @@ sub module_fails {
sub _add_dependency_to_graph ($dependency_data, $parent_job_id, $child_job_id, $dependency_type) {

# add edge for chained dependencies
if ( $dependency_type eq OpenQA::JobDependencies::Constants::CHAINED
if ($dependency_type eq OpenQA::JobDependencies::Constants::CHAINED
|| $dependency_type eq OpenQA::JobDependencies::Constants::DIRECTLY_CHAINED)
{
push(@{$dependency_data->{edges}}, {from => $parent_job_id, to => $child_job_id});
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/WebAPI/Plugin/Helpers.pm
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ sub register ($self, $app, $config) {
my $data = {toggle => 'popover', trigger => 'focus', title => $title, content => $content};
$data->{placement} = $placement if $placement;
return $c->t(a => (tabindex => 0, class => $class, role => 'button', data => $data, @args));
});
});

$app->helper(
help_popover_todo => sub ($c) {
Expand Down
6 changes: 3 additions & 3 deletions lib/OpenQA/WebAPI/Plugin/ObsRsync.pm
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,13 @@ sub register {

# terminology:
# * project - Obs Project name alone, e.g. 'openSUSE:Factory:ToTest'
# * batch - abstraction used by openqa-trigger-from-obs to split actions, needed to be taken when Obs Project is ready for testing,
# * batch - abstraction used by openqa-trigger-from-obs to split actions, needed to be taken when Obs Project is ready for testing,
# e.g. 'base, 'jeos', 'migration'.
# * alias - Obs Project name alone or with corresponding batch concatenated with '|': 'projectname|batchname'
# e.g. 'openSUSE:Factory:ToTest|base', 'openSUSE:Factory:ToTest|microos', 'openSUSE:Factory:ToTest|jeos'
# * subfolder - folder, containing artifacts from paricular synch actions. Most often if form `.run_YYYYMMDDhhmmss`.
# * subfolder - folder, containing artifacts from paricular synch actions. Most often if form `.run_YYYYMMDDhhmmss`.
#
# routes which have parameter #alias, can be called for simple project, for batched project or for particular batch
# routes which have parameter #alias, can be called for simple project, for batched project or for particular batch
# routes which have parameter #project, can not be called for single batch
$plugin_r->get('/obs_rsync/queue')->name('plugin_obs_rsync_queue')
->to('Plugin::ObsRsync::Controller::Gru#index');
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/WebSockets/Controller/Worker.pm
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ sub _message {

# skip any further actions if worker just does the one job we expected it to do
return undef
if ( defined $job_id
if (defined $job_id
&& defined $current_job_id
&& defined $job_token
&& defined $registered_job_token
Expand Down
2 changes: 1 addition & 1 deletion lib/OpenQA/Worker/WebUIConnection.pm
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ sub _setup_websocket_connection ($self, $websocket_url = undef) {
# prevent messing around when there's still an active websocket connection
return undef if $self->websocket_connection;

# make URL for websocket connection unless specified as argument (which would be the case when following redirection)
# make URL for websocket connection unless specified as argument (which would be the case when following redirection)
if (!$websocket_url) {
my $worker_id = $self->worker_id;
my $webui_host = $self->webui_host;
Expand Down
2 changes: 1 addition & 1 deletion t/01-style.t
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ ok system(qq{git grep -I -l 'Copyright \((C)\|(c)\|©\)' ':!COPYING' ':!external
'No redundant copyright character';
ok
system(
qq{git grep -I -l 'This program is free software.*if not, see <http://www.gnu.org/licenses/' ':!COPYING' ':!external/' ':!t/01-style.t'}
qq{git grep -I -l 'This program is free software.*if not, see <http://www.gnu.org/licenses/' ':!COPYING' ':!external/' ':!t/01-style.t'}
) != 0, 'No verbatim licenses in source files';
ok system(qq{git grep -I -l '[#/ ]*SPDX-License-Identifier ' ':!COPYING' ':!external/' ':!t/01-style.t'}) != 0,
'SPDX-License-Identifier correctly terminated';
Expand Down
2 changes: 1 addition & 1 deletion t/01-test-utilities.t
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ subtest 'warnings in sub processes are fatal test failures' => sub {
# Give Utils.pm a chance to install $SIG{CHLD}
sleep 1; # uncoverable statement
OpenQA::Test::Utils::_setup_sub_process 'test-process-1'; # uncoverable statement
'' . undef; # uncoverable statement: provoke Perl warning "Use of uninitialized value in concatenation …"
'' . undef; # uncoverable statement: provoke Perl warning "Use of uninitialized value in concatenation …"
};
note "waiting at most $signal_timeout seconds for SIGCHLD (sleep is supposed to be interrupted by SIGCHLD)";
sleep $signal_timeout;
Expand Down
2 changes: 1 addition & 1 deletion t/05-scheduler-capabilities.t
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ is($job->{id}, $jobH->id, "next job by prio, parent - server");

$job = $sent->{$w8_id}->{job}->to_hash;
is($job->{id}, $jobJ->id,
"I is a scheduled child of running H so it should have the highest prio, but this worker can't do it because of class -> take next job by prio instead"
"I is a scheduled child of running H so it should have the highest prio, but this worker can't do it because of class -> take next job by prio instead"
);

$job = $sent->{$w9_id}->{job}->to_hash;
Expand Down
6 changes: 3 additions & 3 deletions t/05-scheduler-dependencies.t
Original file line number Diff line number Diff line change
Expand Up @@ -748,17 +748,17 @@ subtest 'duplicate parallel parent in tree with all dependency types' => sub {
is_deeply(
$jobW2->{parents},
{Chained => [$jobQ2->{id}], Parallel => [], 'Directly chained' => []},
'jobW2 has clone of jobQ as chained parent (although jobQ has only been cloned because it is a direct parent of jobTA)'
'jobW2 has clone of jobQ as chained parent (although jobQ has only been cloned because it is a direct parent of jobTA)'
) or diag explain $jobW2->{parents};
is_deeply(
$jobU2->to_hash(deps => 1)->{parents},
{Chained => [$jobQ2->{id}], Parallel => [], 'Directly chained' => []},
'jobU2 has clone of jobQ as chained parent (although jobQ has only been cloned because it is a direct parent of jobTA)'
'jobU2 has clone of jobQ as chained parent (although jobQ has only been cloned because it is a direct parent of jobTA)'
) or diag explain $jobU2->to_hash(deps => 1)->{parents};
is_deeply(
$jobR2->{parents},
{Chained => [$jobQ2->{id}], Parallel => [], 'Directly chained' => []},
'jobR2 has clone of jobQ as chained parent (although jobQ has only been cloned because it is a direct parent of jobTA)'
'jobR2 has clone of jobQ as chained parent (although jobQ has only been cloned because it is a direct parent of jobTA)'
) or diag explain $jobR2->{parents};
};

Expand Down
2 changes: 1 addition & 1 deletion t/05-scheduler-restart-and-duplicate.t
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ subtest 'restart with (directly) chained child' => sub {
99938 => {is_parent_or_initial_job => 0, @empty_deps, directly_chained_parents => [99937]},
);
is_deeply(job_get_rs(99937)->cluster_jobs, \%expected_cluster,
'99937 has one directly chained child and one directly chained parent; '
'99937 has one directly chained child and one directly chained parent; '
. 'parent considered for restarting but not siblings');
$job_before_restart = job_get(99937);

Expand Down
4 changes: 2 additions & 2 deletions t/10-jobs.t
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ subtest 'job with all modules passed and at least one ignore_failure failed => o
};

subtest
'job with important modules passed and at least one softfailed and at least one ignore_failure failed => overall softfailed'
'job with important modules passed and at least one softfailed and at least one ignore_failure failed => overall softfailed'
=> sub {
my %_settings = %settings;
$_settings{TEST} = 'F';
Expand All @@ -282,7 +282,7 @@ subtest
};

subtest
'job with one "important" (old flag we now ignore) module failed and at least one ignore_failure passed => overall failed'
'job with one "important" (old flag we now ignore) module failed and at least one ignore_failure passed => overall failed'
=> sub {
my %_settings = %settings;
$_settings{TEST} = 'G';
Expand Down
4 changes: 2 additions & 2 deletions t/14-grutasks.t
Original file line number Diff line number Diff line change
Expand Up @@ -370,8 +370,8 @@ subtest 'assets associated with pending jobs are preserved' => sub {
[$pending_asset_name, $other_asset_name],
"asset $pending_asset_name has been deleted with 99947 no longer pending"
) or diag explain $deleted_assets;
# note: The main purpose of this subtest is to cross-check whether this test is actually working. If the asset would
# still not be cleaned up here that would mean the pending state makes no difference for this test and it is
# note: The main purpose of this subtest is to cross-check whether this test is actually working. If the asset would
# still not be cleaned up here that would mean the pending state makes no difference for this test and it is
# therefore meaningless.
};
};
Expand Down
2 changes: 1 addition & 1 deletion t/16-markdown.t
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ subtest 'openQA additions' => sub {
qq{<p><a href="https://example.com/#fragment_-">https://example.com/#fragment_-</a></p>\n},
'URL with fragment turned into a link';
is markdown_to_html('https://example.com/#fragment/<script>test</script>'),
qq{<p><a href="https://example.com/#fragment/">https://example.com/#fragment/</a><!-- raw HTML omitted -->test<!-- raw HTML omitted --></p>\n},
qq{<p><a href="https://example.com/#fragment/">https://example.com/#fragment/</a><!-- raw HTML omitted -->test<!-- raw HTML omitted --></p>\n},
'URL with fragment + script turned into a link';
is markdown_to_html('https://example.com/#?(.-/\' some text'),
qq{<p><a href="https://example.com/#?(.-/&#x27;">https://example.com/#?(.-/'</a> some text</p>\n},
Expand Down
2 changes: 1 addition & 1 deletion t/17-labels_carry_over.t
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ subtest '"happy path": failed->failed carries over last issue reference' => sub
local $ENV{OPENQA_JOB_DONE_HOOK_FAILED} = 'foo';

my $bugs = $t->app->schema->resultset('Bugs');
$bugs->search({bugid => 'bsc#1234'})->delete; # ensure the bugref supposed to be inserted does not exist anyways
$bugs->search({bugid => 'bsc#1234'})->delete; # ensure the bugref supposed to be inserted does not exist anyways
$t->app->log->level('debug');
$group->update({carry_over_bugrefs => 1});
my $output = combined_from {
Expand Down
2 changes: 1 addition & 1 deletion t/24-worker-engine.t
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ subtest 'asset caching' => sub {
cache_assets =>
sub ($cache_client, $job, $vars, $assets_to_cache, $assetkeys, $webui_host, $pooldir, $callback) {
$callback->(undef);
});
});
my $job = Test::MockObject->new;
my $testpool_server;
$job->mock(client => sub { Test::MockObject->new->set_bound(testpool_server => \$testpool_server) });
Expand Down
4 changes: 2 additions & 2 deletions t/24-worker-jobs.t
Original file line number Diff line number Diff line change
Expand Up @@ -1337,7 +1337,7 @@ subtest 'override job reason when qemu terminated with known issues by parsing a
{
reason => 'QEMU terminated: Failed to allocate KVM .* Cannot allocate memory',
log_file_content =>
'[warn] !!! : qemu-system-ppc64: Failed to allocate KVM HPT of order 25 (try smaller maxmem?): Cannot allocate memory.',
'[warn] !!! : qemu-system-ppc64: Failed to allocate KVM HPT of order 25 (try smaller maxmem?): Cannot allocate memory.',
base_state_content => '{"component": "backend", "msg": "QEMU exited unexpectedly, see log for details"}'
},
{
Expand All @@ -1348,7 +1348,7 @@ subtest 'override job reason when qemu terminated with known issues by parsing a
},
{
reason =>
'terminated prematurely: Encountered corrupted state file: No space left on device, see log output for details',
'terminated prematurely: Encountered corrupted state file: No space left on device, see log output for details',
log_file_content =>
'[debug] Unable to serialize fatal error: Can\'t write to file "base_state.json": No space left on device at /usr/lib/os-autoinst/bmwqemu.pm line 86.',
base_state_content => 'foo boo',
Expand Down
Loading
Loading