package SVN::Hooks::AllowLogChange;

use warnings;
use strict;
use SVN::Hooks;

use Exporter qw/import/;
my $HOOK = 'ALLOW_LOG_CHANGE';
our @EXPORT = ($HOOK);

our $VERSION = $SVN::Hooks::VERSION;

=head1 NAME

SVN::Hooks::AllowLogChange - Allow changes in revision log messages.

=head1 SYNOPSIS

This SVN::Hooks plugin is used to allow revision log changes by some
users.

It's active in the C<pre-revprop-change> hook.

It's configured by the following directive.

=head2 ALLOW_LOG_CHANGE(WHO, ...)

This directive enables the change of revision log messages, which are
mantained in the C<svn:log> revision property.

The optional WHO argument specifies the users that are allowed to make
those changes. If absent, any user can change a log
message. Otherwise, it specifies the allowed users depending on its
type.

=over

=item STRING

Specify a single user by name.

=item REGEXP

Specify the class of users whose names are matched by the
Regexp.

=back

	ALLOW_LOG_CHANGE();
	ALLOW_LOG_CHANGE('jsilva');
	ALLOW_LOG_CHANGE(qr/silva$/);

=cut

sub ALLOW_LOG_CHANGE {
    my $conf = $SVN::Hooks::Confs->{$HOOK};

    foreach my $who (@_) {
	if (! ref $who or ref $who eq 'Regexp') {
	    push @{$conf->{users}}, $who;
	}
	else {
	    die "$HOOK: invalid argument '$who'\n";
	}
    }

    $conf->{'pre-revprop-change'} = \&pre_revprop_change;
}

$SVN::Hooks::Inits{$HOOK} = sub {
    return { users => [] };
};

sub pre_revprop_change {
    my ($self, $rev, $author, $propname, $action) = @_;

    $propname eq 'svn:log'
	or die "$HOOK: the revision property $propname cannot be changed.\n";

    $action eq 'M'
	or die "$HOOK: a revision log can only be modified, not added or deleted.\n";

    # If no users are specified, anyone can do it.
    return unless @{$self->{users}};

    for my $user (@{$self->{users}}) {
	return if ! ref $user and $author eq $user or $author =~ $user;
    }

    die "$HOOK: you are not allowed to change a revision log.\n";

}

=head1 AUTHOR

Gustavo Chaves, C<< <gnustavo@cpan.org> >>

=head1 BUGS

Please report any bugs or feature requests to
C<bug-svn-hooks-checkproperty at rt.cpan.org>, or through the web
interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=SVN-Hooks>.  I will
be notified, and then you'll automatically be notified of progress on
your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc SVN::Hooks

You can also look for information at:

=over 4

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=SVN-Hooks>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/SVN-Hooks>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/SVN-Hooks>

=item * Search CPAN

L<http://search.cpan.org/dist/SVN-Hooks>

=back

=head1 COPYRIGHT & LICENSE

Copyright 2008 CPqD, all rights reserved.

This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut

1; # End of SVN::Hooks::AllowLogChange