From 47ea5a0ff46bcd75574c308a7b87f7c8a2de605c Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 23 Jun 2014 14:57:07 +0000 Subject: [PATCH] enhanced pre-revprop-change to: * check the minimum log message length. * check if svn:author is empty * prevent deletion of svn:log, svn:date, svn:author revision properties --- codepot/etc/post-commit.in | 28 +++--- codepot/etc/post-revprop-change.in | 32 +++---- codepot/etc/pre-commit.in | 69 ++++++++------- codepot/etc/pre-revprop-change.in | 131 +++++++++++++++++++++++++---- 4 files changed, 183 insertions(+), 77 deletions(-) diff --git a/codepot/etc/post-commit.in b/codepot/etc/post-commit.in index 8f65b6c1..c5221d50 100644 --- a/codepot/etc/post-commit.in +++ b/codepot/etc/post-commit.in @@ -14,23 +14,23 @@ my $REV = $ARGV[1]; sub get_config { - my $cfg = new Config::Simple(); + my $cfg = new Config::Simple(); - if (!$cfg->read ($CFG_FILE)) - { - return undef; - } + if (!$cfg->read ($CFG_FILE)) + { + return undef; + } - my $config = { - database_hostname => $cfg->param ("database_hostname"), - database_username => $cfg->param ("database_username"), - database_password => $cfg->param ("database_password"), - database_name => $cfg->param ("database_name"), - database_driver => $cfg->param ("database_driver"), - database_prefix => $cfg->param ("database_prefix") - }; + my $config = { + database_hostname => $cfg->param ("database_hostname"), + database_username => $cfg->param ("database_username"), + database_password => $cfg->param ("database_password"), + database_name => $cfg->param ("database_name"), + database_driver => $cfg->param ("database_driver"), + database_prefix => $cfg->param ("database_prefix") + }; - return $config; + return $config; } sub open_database diff --git a/codepot/etc/post-revprop-change.in b/codepot/etc/post-revprop-change.in index 24f1112e..64853a5c 100644 --- a/codepot/etc/post-revprop-change.in +++ b/codepot/etc/post-revprop-change.in @@ -19,23 +19,23 @@ my $ACTION = $ARGV[4]; sub get_config { - my $cfg = new Config::Simple(); + my $cfg = new Config::Simple(); + + if (!$cfg->read ($CFG_FILE)) + { + return undef; + } + + my $config = { + database_hostname => $cfg->param ("database_hostname"), + database_username => $cfg->param ("database_username"), + database_password => $cfg->param ("database_password"), + database_name => $cfg->param ("database_name"), + database_driver => $cfg->param ("database_driver"), + database_prefix => $cfg->param ("database_prefix") + }; - if (!$cfg->read ($CFG_FILE)) - { - return undef; - } - - my $config = { - database_hostname => $cfg->param ("database_hostname"), - database_username => $cfg->param ("database_username"), - database_password => $cfg->param ("database_password"), - database_name => $cfg->param ("database_name"), - database_driver => $cfg->param ("database_driver"), - database_prefix => $cfg->param ("database_prefix") - }; - - return $config; + return $config; } sub open_database diff --git a/codepot/etc/pre-commit.in b/codepot/etc/pre-commit.in index 11de1590..f2c5d8aa 100644 --- a/codepot/etc/pre-commit.in +++ b/codepot/etc/pre-commit.in @@ -92,6 +92,44 @@ sub is_project_commitable return (((scalar(@row) > 0 && $row[0] eq 'Y')? 1: 0), undef); } +sub check_commit_message +{ + my ($minlen) = @_; + + my $pool = SVN::Pool->new(undef); + #my $config = SVN::Core::config_get_config(undef); + #my $fs = eval { SVN::Fs::open ($REPOFS, $config, $pool) }; + my $svn = eval { SVN::Repos::open ($REPOFS, $pool) }; + if (!defined($svn)) + { + print (STDERR "Cannot open svn - $REPOFS\n"); + return -1; # error + } + + my $fs = $svn->fs (); + if (!defined($fs)) + { + print (STDERR "Cannot open fs - $REPOFS\n"); + return -1; # error + } + + my $txn = eval { $fs->open_txn ($TRANSACTION) }; + if (!defined($txn)) + { + print (STDERR "Cannot open transaction - $TRANSACTION\n"); + return -1; + } + + my $log = $txn->prop ('svn:log'); + $log =~ s/^\s+|\s+$//g; # trim leading spaces and trailing spaces + if (length($log) < $minlen) { + print (STDERR "Commit message too short. must be >= $minlen\n"); + return 0; + } + + return 1; +} + #------------------------------------------------------------ # MAIN #------------------------------------------------------------ @@ -103,38 +141,11 @@ if (!defined($cfg)) exit (1); } -my $pool = SVN::Pool->new(undef); -#my $config = SVN::Core::config_get_config(undef); -#my $fs = eval { SVN::Fs::open ($REPOFS, $config, $pool) }; -my $svn = eval { SVN::Repos::open ($REPOFS, $pool) }; -if (!defined($svn)) +if (check_commit_message ($cfg->{svn_min_commit_message_length}) <= 0) { - print (STDERR "Cannot open svn - $REPOFS\n"); - exit (0); # just let go if the file system can't be opened + exit (1); } -my $fs = $svn->fs (); -if (!defined($fs)) -{ - print (STDERR "Cannot open fs - $REPOFS\n"); - exit (0); # just let go if the file system can't be opened -} - -my $txn = eval { $fs->open_txn ($TRANSACTION) }; -if (!defined($txn)) -{ - print (STDERR "Cannot open transaction - $TRANSACTION\n"); - exit (0); # just let go if the transation can't be opened -} - -my $log = $txn->prop ('svn:log'); -$log =~ s/^\s+|\s+$//g; # trim leading spaces and trailing spaces -if (length($log) < $cfg->{svn_min_commit_message_length}) { - print (STDERR "Commit message too short. must be >= $cfg->{svn_min_commit_message_length}\n"); - exit (1); # block -} - - #my $dbh = open_database ($cfg); #if (!defined($dbh)) diff --git a/codepot/etc/pre-revprop-change.in b/codepot/etc/pre-revprop-change.in index 2cc35909..6644f8c8 100644 --- a/codepot/etc/pre-revprop-change.in +++ b/codepot/etc/pre-revprop-change.in @@ -6,8 +6,13 @@ use Config::Simple; use DBI; use File::Basename; +#use SVN::Core; +#use SVN::Repos; +#use SVN::Fs; + my $CFG_FILE = '@CFGDIR@/codepot.ini'; -my $REPOBASE = basename($ARGV[0]); +my $REPOFS = $ARGV[0]; +my $REPOBASE = basename($REPOFS); my $REVISION= $ARGV[1]; my $USER = $ARGV[2]; my $PROPNAME = $ARGV[3]; @@ -15,23 +20,25 @@ my $ACTION = $ARGV[4]; sub get_config { - my $cfg = new Config::Simple(); + my $cfg = new Config::Simple(); - if (!$cfg->read ($CFG_FILE)) - { - return undef; - } + if (!$cfg->read ($CFG_FILE)) + { + return undef; + } - my $config = { - database_hostname => $cfg->param ("database_hostname"), - database_username => $cfg->param ("database_username"), - database_password => $cfg->param ("database_password"), - database_name => $cfg->param ("database_name"), - database_driver => $cfg->param ("database_driver"), - database_prefix => $cfg->param ("database_prefix") - }; + my $config = { + database_hostname => $cfg->param ("database_hostname"), + database_username => $cfg->param ("database_username"), + database_password => $cfg->param ("database_password"), + database_name => $cfg->param ("database_name"), + database_driver => $cfg->param ("database_driver"), + database_prefix => $cfg->param ("database_prefix"), - return $config; + svn_min_commit_message_length => $cfg->param ('svn_min_commit_message_length') + }; + + return $config; } sub open_database @@ -73,10 +80,42 @@ sub is_project_member return (((scalar(@row) > 0)? 1: 0), undef); } +#sub check_commit_message +#{ +# my ($minlen, $newmsg) = @_; +# +# my $pool = SVN::Pool->new(undef); +# my $svn = eval { SVN::Repos::open ($REPOFS, $pool) }; +# if (!defined($svn)) +# { +# print (STDERR "Cannot open svn - $REPOFS\n"); +# return -1; # error +# } +# +# my $fs = $svn->fs (); +# if (!defined($fs)) +# { +# print (STDERR "Cannot open fs - $REPOFS\n"); +# return -1; # error +# } +# +# my $log = $fs->revision_prop ($REVISION, 'svn:log'); +# $log =~ s/^\s+|\s+$//g; # trim leading spaces and trailing spaces +# if (length($log) < $minlen) +# { +# print (STDERR "[$log] Commit message too short. must be >= $minlen\n"); +# return 0; +# } +# +# return 1; +#} + #------------------------------------------------------------ # MAIN #------------------------------------------------------------ +my $newauthor = undef; + my $cfg = get_config (); if (!defined($cfg)) { @@ -84,6 +123,41 @@ if (!defined($cfg)) exit (1); } + +if ($ACTION eq 'D') +{ + if ($PROPNAME eq 'svn:log' || $PROPNAME eq 'svn:author' || $PROPNAME eq 'svn:date') + { + print (STDERR "Not allowed to delete $PROPNAME\n"); + exit (1); + } +} +elsif ($ACTION eq 'M' || $ACTION eq 'A') +{ + if ($PROPNAME eq 'svn:author') + { + $newauthor = do { local $/; }; # read as a whole + $newauthor =~ s/^\s+|\s+$//g; # trim leading spaces and trailing spaces + if ($newauthor eq '') + { + print (STDERR "Not allowed to empty the author\n"); + exit (1); + } + } + elsif ($PROPNAME eq 'svn:log') + { + my $minlen = $cfg->{svn_min_commit_message_length}; + my $newmsg = do { local $/; }; # read as a whole + $newmsg =~ s/^\s+|\s+$//g; # trim leading spaces and trailing spaces + if (length($newmsg) < $minlen) + { + print (STDERR "Commit message too short. must be >= $minlen\n"); + exit (1); + } + } +} + + my $dbh = open_database ($cfg); if (!defined($dbh)) { @@ -93,17 +167,38 @@ if (!defined($dbh)) my ($member, $errstr) = is_project_member ($dbh, $cfg->{database_prefix}, $REPOBASE, $USER); -close_database ($dbh); if ($member <= -1) { - print (STDERR "Cannot check membership - $errstr\n"); + close_database ($dbh); + print (STDERR "Cannot check membership of [$USER] in the $REPOBASE project - $errstr\n"); exit (1); } elsif ($member == 0) { - print (STDERR "$USER doesn't belong to the $REPOBASE project\n"); + close_database ($dbh); + print (STDERR "[$USER] doesn't belong to the $REPOBASE project\n"); exit (1); } +if (defined($newauthor)) +{ + # the new author to set must be a member of the project. + + my ($member, $errstr) = is_project_member ($dbh, $cfg->{database_prefix}, $REPOBASE, $newauthor); + if ($member <= -1) + { + close_database ($dbh); + print (STDERR "Cannot check membership of [$newauthor] in the $REPOBASE project - $errstr\n"); + exit (1); + } + elsif ($member == 0) + { + close_database ($dbh); + print (STDERR "[$newauthor] doesn't belong to the $REPOBASE project\n"); + exit (1); + } +} + +close_database ($dbh); exit (0);