You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-08-11 12:42:39 +03:00
This was the interface between Perl and C introduced in36a5349b
but sincef0ef73db
has only been used by the Perl integration tests. This is expensive code to maintain just for testing. The main dependency was the interface to storage, no matter where it was located, e.g. S3. Replace this with the new-introduced repo commands (d3c83453
) that allow access to repo storage via the command line. The other dependency was on various cfgOption* functions and CFGOPT_ constants that were convenient but not necessary. Replace these with hard-coded strings in most places and create new constants for commonly used values. Remove all auto-generated Perl code. This means that the error list will no longer be maintained automatically so copy used errors to Common::Exception.pm. This file will need to be maintained manually going forward but there is not likely to be much churn as the Perl integration tests are being retired. Update test.pl and related code to remove LibC builds. Ding, dong, LibC is dead.
224 lines
7.4 KiB
Perl
224 lines
7.4 KiB
Perl
####################################################################################################################################
|
|
# Classify files and generate code totals
|
|
####################################################################################################################################
|
|
package pgBackRestTest::Common::CodeCountTest;
|
|
|
|
####################################################################################################################################
|
|
# Perl includes
|
|
####################################################################################################################################
|
|
use strict;
|
|
use warnings FATAL => qw(all);
|
|
use Carp qw(confess);
|
|
use English '-no_match_vars';
|
|
|
|
use Exporter qw(import);
|
|
our @EXPORT = qw();
|
|
|
|
use pgBackRest::Common::Log;
|
|
|
|
use pgBackRestTest::Common::ExecuteTest;
|
|
|
|
####################################################################################################################################
|
|
# Scan all files and assign types
|
|
####################################################################################################################################
|
|
sub codeCountScan
|
|
{
|
|
my $oStorage = shift;
|
|
my $strBasePath = shift;
|
|
|
|
# Load YAML
|
|
require YAML::XS;
|
|
YAML::XS->import(qw(Load Dump));
|
|
|
|
my $hCodeCount = {};
|
|
|
|
# Build manifest of all files
|
|
my $hManifest = $oStorage->manifest($strBasePath);
|
|
my $strYamlDetail = undef;
|
|
|
|
foreach my $strFile (sort(keys(%{$hManifest})))
|
|
{
|
|
# Only interested in files
|
|
next if $hManifest->{$strFile}{type} ne 'f';
|
|
|
|
# Only exclude these directories/files entirely
|
|
next if ($strFile =~ '^\.' ||
|
|
$strFile =~ '\.DS_Store$' ||
|
|
$strFile =~ '\.gitignore$' ||
|
|
$strFile =~ '\.md$' ||
|
|
$strFile =~ '\.log$' ||
|
|
$strFile eq 'LICENSE' ||
|
|
$strFile =~ '^doc/example/' ||
|
|
$strFile =~ '^doc/output/' ||
|
|
$strFile =~ '^doc/resource/fake\-cert' ||
|
|
$strFile =~ '\.png$' ||
|
|
$strFile =~ '\.eps$' ||
|
|
$strFile =~ '\.cache$' ||
|
|
$strFile =~ '^doc/site/' ||
|
|
$strFile eq 'test/Vagrantfile' ||
|
|
$strFile =~ '^test/\.vagrant/' ||
|
|
$strFile =~ '^test/certificate/' ||
|
|
$strFile =~ '^test/code-count/' ||
|
|
$strFile =~ '^test/coverage/' ||
|
|
$strFile =~ '^test/data/' ||
|
|
$strFile =~ '^test/docker/' ||
|
|
$strFile =~ '^test/expect/' ||
|
|
$strFile =~ '^test/lint/' ||
|
|
$strFile =~ '^test/package/' ||
|
|
$strFile =~ '^test/patch/' ||
|
|
$strFile =~ '^test/profile/' ||
|
|
$strFile eq 'test/scratch.txt' ||
|
|
$strFile eq 'test/src/valgrind.suppress' ||
|
|
$strFile eq 'test/src/lcov.conf');
|
|
|
|
# Classify the source file
|
|
my $strClass = 'test/harness';
|
|
|
|
if ($strFile =~ '^doc/xml/' || $strFile eq 'doc/manifest.xml')
|
|
{
|
|
$strClass = 'doc/source';
|
|
}
|
|
elsif ($strFile =~ '^doc/' || $strFile =~ '^doc/resource/')
|
|
{
|
|
$strClass = 'doc/core';
|
|
}
|
|
elsif ($strFile =~ '^build/' || $strFile eq 'src/Makefile.in' || $strFile eq 'src/configure' ||
|
|
$strFile eq 'src/configure.ac')
|
|
{
|
|
$strClass = 'build';
|
|
}
|
|
elsif ($strFile =~ '^test/lib/pgBackRestTest/Module/' || $strFile =~ '^test/src/module/')
|
|
{
|
|
$strClass = 'test/module';
|
|
}
|
|
elsif ($strFile =~ '^src/')
|
|
{
|
|
$strClass = 'core';
|
|
}
|
|
|
|
# Append auto if an auto-generated file
|
|
if ($strFile =~ '\.auto\..$' | $strFile =~ 'Auto\.pm$')
|
|
{
|
|
$strClass .= '/auto';
|
|
}
|
|
|
|
# Force unrecognized file types
|
|
my $strForceLang = undef;
|
|
my $strType = undef;
|
|
|
|
if ($strFile =~ '\.xs$')
|
|
{
|
|
$strType = 'xs';
|
|
$strForceLang = 'XS';
|
|
}
|
|
elsif ($strFile =~ '\.h$' || $strFile =~ '\.h\.in$' || $strFile =~ '\.xsh$')
|
|
{
|
|
$strType = 'c/h';
|
|
$strForceLang = 'C/C++ Header';
|
|
}
|
|
elsif ($strFile =~ '\.c$')
|
|
{
|
|
$strType = 'c';
|
|
$strForceLang = 'C';
|
|
}
|
|
elsif ($strFile =~ '\.t$' || $strFile =~ '\.pl$' || $strFile =~ '\.pm$' || $strFile =~ '\.PL$')
|
|
{
|
|
$strType = 'perl';
|
|
$strForceLang = 'Perl';
|
|
}
|
|
elsif ($strFile =~ '\.yaml$')
|
|
{
|
|
$strType = 'yaml';
|
|
$strForceLang = 'YAML';
|
|
}
|
|
elsif ($strFile =~ 'Makefile\.in$' || $strFile =~ '^src\/configure')
|
|
{
|
|
$strType = 'make';
|
|
$strForceLang = 'make';
|
|
}
|
|
elsif ($strFile =~ '\.xml$')
|
|
{
|
|
$strType = 'xml';
|
|
$strForceLang = 'XML';
|
|
}
|
|
elsif ($strFile =~ '\.css$')
|
|
{
|
|
$strType = 'css';
|
|
$strForceLang = 'CSS';
|
|
}
|
|
elsif ($strFile =~ '\.dtd$')
|
|
{
|
|
$strType = 'dtd';
|
|
$strForceLang = 'DTD';
|
|
}
|
|
elsif ($strFile =~ '\.tex$')
|
|
{
|
|
$strType = 'latex';
|
|
$strForceLang = 'Latex';
|
|
}
|
|
else
|
|
{
|
|
confess &log(ERROR, "unable to map type for ${strFile}");
|
|
}
|
|
|
|
# Load the file counts
|
|
my $strYaml = executeTest(
|
|
"cloc --yaml ${strBasePath}/${strFile}" .
|
|
" --read-lang-def=${strBasePath}/test/code-count/code.def" .
|
|
" --force-lang='${strForceLang}'", {bSuppressStdErr => true});
|
|
|
|
# Error if the file was ignored
|
|
if ($strYaml =~ '1 file ignored')
|
|
{
|
|
confess &log(ERROR, "file type for ${strBasePath}/${strFile} not recognized:\n${strYaml}");
|
|
}
|
|
|
|
# Clean out extraneous keys
|
|
my $hFileCount = Load($strYaml);
|
|
delete($hFileCount->{header});
|
|
delete($hFileCount->{SUM});
|
|
|
|
# There should only be one key - the file type
|
|
if (keys(%{$hFileCount}) != 1)
|
|
{
|
|
confess &log(ERROR, "more than one file type in ${strBasePath}/${strFile}:\n" . Dump($hFileCount));
|
|
}
|
|
|
|
# Translate type
|
|
my ($strTypeRaw) = keys(%{$hFileCount});
|
|
$hFileCount = $hFileCount->{$strTypeRaw};
|
|
|
|
# Append to yaml file
|
|
$strYamlDetail .=
|
|
(defined($strYamlDetail) ? "\n" : '') .
|
|
"${strFile}:\n" .
|
|
" class: ${strClass}\n" .
|
|
" type: ${strType}\n";
|
|
|
|
# Summarize
|
|
$hCodeCount->{$strClass}{$strType}{code} += $hFileCount->{code};
|
|
$hCodeCount->{$strClass}{$strType}{comment} += $hFileCount->{comment};
|
|
|
|
$hCodeCount->{$strClass}{total}{code} += $hFileCount->{code};
|
|
$hCodeCount->{$strClass}{total}{comment} += $hFileCount->{comment};
|
|
|
|
$hCodeCount->{total}{code} += $hFileCount->{code};
|
|
$hCodeCount->{total}{comment} += $hFileCount->{comment};
|
|
}
|
|
|
|
# Save the file
|
|
$oStorage->put(
|
|
'test/code-count/file-type.yaml',
|
|
"# File types for source files in the project\n" . $strYamlDetail);
|
|
|
|
# Reload the file to make sure there aren't any formatting issues
|
|
Load(${$oStorage->get('test/code-count/file-type.yaml')});
|
|
|
|
# Display code count summary
|
|
&log(INFO, "code count summary:\n" . Dump($hCodeCount));
|
|
}
|
|
|
|
push @EXPORT, qw(codeCountScan);
|
|
|
|
1;
|