SVN::Hooks::CheckStructure - Check the structure of a repository.
version 1.36
This SVN::Hooks plugin checks if the files and directories added to the repository are allowed by its structure definition. If they don't, the commit is aborted.
It's active in the pre-commit hook.
pre-commit
It's configured by the following directive.
This directive enables the checking, causing the commit to abort if it doesn't comply.
The STRUCT_DEF argument specify the repository strucure with a recursive data structure consisting of one of:
An array ref specifies the contents of a directory. The referenced array must contain a pair number of elements. Each pair consists of a NAME_DEF and a STRUCT_DEF. The NAME_DEF specifies the name of the component contained in the directory and the STRUCT_DEF specifies recursively what it must be.
The NAME_DEF specifies a name in one of these ways:
A string specifies a name directly.
A regexp specifies the class of names that match it.
A number may be used as an else-clause. A non-zero number means that any name not yet matched by the previous pair must conform to the associated STRUCT_DEF.
A zero means that no name will do and signals an error. In this case, if the STRUCT_DEF is a string it is used as a help message shown to the user.
If no NAME_DEF matches the component being looked for, then it is a structure violation and the commit fails.
A string must be one of 'FILE' and 'DIR', specifying what the current component must be.
A non-zero number simply tells that whatever the current component is is ok and finishes the check successfully.
A zero tells that whatever the current component is is a structure violation and aborts the commit.
Now that we have this semi-formal definition off the way, let's try to understand it with some examples.
my $tag_rx = qr/^[a-z]+-\d+\.\d+$/; # e.g. project-1.0 my $branch_rx = qr/^[a-z]+-/; # must start with letters and hifen my $project_struct = [ 'META.yml' => 'FILE', 'Makefile.PL' => 'FILE', ChangeLog => 'FILE', LICENSE => 'FILE', MANIFEST => 'FILE', README => 'FILE', t => [ qr/\.t$/ => 'FILE', ], lib => 'DIR', ]; CHECK_STRUCTURE( [ trunk => $project_struct, branches => [ $branch_rx => $project_rx, ], tags => [ $tag_rx => $project_rx, ], ], );
The structure's first level consists of the three usual directories: trunk, tags, and branches. Anything else in this level is denied.
trunk
tags
branches
Below the trunk we allow some usual files and two directories only: lib and t. Below trunk/t we may allow only test files with the .t extension and below lib we allow anything.
lib
t
trunk/t
.t
We require that each branch and tag have the same structure as the trunk, which is made easier by the use of the $project_struct variable. Moreover, we impose some restrictions on the names of the tags and the branches.
$project_struct
SVN::Hooks::CheckStructure exports a function to allow for the verification of path structures outside the context of a Subversion hook. (It would probably be better to take this function to its own module and use that module here. We'll take care of that eventually.)
The function check_structure takes two arguments. The first is a STRUCT_DEF exactly the same as specified for the CHECK_STRUCTURE directive above. The second is a PATH to a file which will be checked against the STRUCT_DEF.
The function returns true if the check succeeds and dies with a proper message otherwise.
The function is intended to check paths as they're shown by the 'svn ls' command, i.e., with no leading slashes and with a trailing slash to indicate directories. The leading slash is assumed if it's missing, but the trailing slash is needed to indicate directories.
Gustavo L. de M. Chaves <gnustavo@cpan.org>
This software is copyright (c) 2022 by CPqD <www.cpqd.com.br>.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
To install SVN::Hooks, copy and paste the appropriate command in to your terminal.
cpanm
cpanm SVN::Hooks
CPAN shell
perl -MCPAN -e shell install SVN::Hooks
For more information on module installation, please visit the detailed CPAN module installation guide.