App-Sqitch
view release on metacpan or search on metacpan
lib/App/Sqitch/Plan.pm view on Meta::CPAN
our $VERSION = 'v1.6.1'; # VERSION
# Like [:punct:], but excluding _. Copied from perlrecharclass.
my $punct = q{-!"#$%&'()*+,./:;<=>?@[\\]^`{|}~};
my $name_re = qr{
(?![$punct]) # first character isn't punctuation
(?: # start non-capturing group, repeated once or more ...
(?! # negative look ahead for...
[~/=%^\[\]] # symbolic reference punctuation
[[:digit:]]+ # digits
(?:$|[[:blank:]]) # eol or blank
) # ...
[^[:blank:]:@#\\] # match a valid character
)+ # ... end non-capturing group
(?<![$punct])\b # last character isn't punctuation
}x;
my $dir_sep_re = qr{/};
my %reserved = map { $_ => undef } qw(ROOT HEAD);
lib/App/Sqitch/Plan.pm view on Meta::CPAN
script. How does it find such files? The first instances files will either be
named F<add_widget@delta.sql> or (soon) findable in the VCS history as of a
VCS "delta" tag.
=head2 Grammar
Here is the EBNF Grammar for the plan file:
plan-file = { <pragma> | <change-line> | <tag-line> | <note-line> | <blank-line> }* ;
blank-line = [ <blanks> ] <eol>;
note-line = <note> ;
change-line = <name> [ "[" { <requires> | <conflicts> } "]" ] ( <eol> | <note> ) ;
tag-line = <tag> ( <eol> | <note> ) ;
pragma = "%" [ <blanks> ] <name> [ <blanks> ] = [ <blanks> ] <value> ( <eol> | <note> ) ;
tag = "@" <name> ;
requires = <name> ;
conflicts = "!" <name> ;
name = <non-punct> [ [ ? non-blank and not "@", ":", or "#" characters ? ] <non-punct> ] ;
non-punct = ? non-punctuation, non-blank character ? ;
value = ? non-EOL or "#" characters ?
note = [ <blanks> ] "#" [ <string> ] <EOL> ;
eol = [ <blanks> ] <EOL> ;
blanks = ? blank characters ? ;
string = ? non-EOL characters ? ;
And written as regular expressions:
my $eol = qr/[[:blank:]]*$/
my $note = qr/(?:[[:blank:]]+)?[#].+$/;
my $punct = q{-!"#$%&'()*+,./:;<=>?@[\\]^`{|}~};
my $name = qr/[^$punct[:blank:]](?:(?:[^[:space:]:#@]+)?[^$punct[:blank:]])?/;
my $tag = qr/[@]$name/;
my $requires = qr/$name/;
my conflicts = qr/[!]$name/;
my $tag_line = qr/^$tag(?:$note|$eol)/;
my $change_line = qr/^$name(?:[[](?:$requires|$conflicts)+[]])?(?:$note|$eol)/;
my $note_line = qr/^$note/;
my $pragma = qr/^][[:blank:]]*[%][[:blank:]]*$name[[:blank:]]*=[[:blank:]].+?(?:$note|$eol)$/;
my $blank_line = qr/^$eol/;
my $plan = qr/(?:$pragma|$change_line|$tag_line|$note_line|$blank_line)+/ms;
=head1 See Also
=over
=item L<sqitch>
The Sqitch command-line client.
( run in 1.733 second using v1.01-cache-2.11-cpan-98e64b0badf )