Date: Sat, 7 Dec 2013 18:27:22 +0000 (UTC) From: Peter Wemm <peter@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-svnadmin@freebsd.org Subject: svn commit: r259074 - svnadmin/hooks/scripts Message-ID: <201312071827.rB7IRMqq071138@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: peter Date: Sat Dec 7 18:27:21 2013 New Revision: 259074 URL: http://svnweb.freebsd.org/changeset/base/259074 Log: Add initial version of mergeinfo bloat detection script Added: svnadmin/hooks/scripts/detect-mergeinfo-bloat.pl (contents, props changed) Added: svnadmin/hooks/scripts/detect-mergeinfo-bloat.pl ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ svnadmin/hooks/scripts/detect-mergeinfo-bloat.pl Sat Dec 7 18:27:21 2013 (r259074) @@ -0,0 +1,198 @@ +#!/usr/bin/env perl + + +# $FreeBSD$ +# source: http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/check-mime-type.pl +# + +# ==================================================================== +# commit-mime-type-check.pl: check that every added file has the +# svn:mime-type property set and every added file with a mime-type +# matching text/* also has svn:eol-style set. If any file fails this +# test the user is sent a verbose error message suggesting solutions and +# the commit is aborted. +# +# Usage: commit-mime-type-check.pl REPOS TXN-NAME +# ==================================================================== +# Most of commit-mime-type-check.pl was taken from +# commit-access-control.pl, Revision 9986, 2004-06-14 16:29:22 -0400. +# ==================================================================== +# Copyright (c) 2000-2004 CollabNet. All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://subversion.tigris.org/license.html. +# If newer versions of this license are posted there, you may use a +# newer version instead, at your option. +# +# This software consists of voluntary contributions made by many +# individuals. For exact contribution history, see the revision +# history and logs, available at http://subversion.tigris.org/. +# ==================================================================== + +require warnings; +import warnings; + +use strict; +use Carp; +use feature qw(switch); # be 5.10 or later, or else! + +###################################################################### +# Configuration section. + +# Svnlook path. +my $svnlook = "/usr/bin/svnlook"; + +# Since the path to svnlook depends upon the local installation +# preferences, check that the required program exists to insure that +# the administrator has set up the script properly. +{ + my $ok = 1; + foreach my $program ($svnlook) { + if (-e $program) { + unless (-x $program) { + warn "$0: required program `$program' is not executable, edit $0.\n"; + $ok = 0; + } + } else { + warn "$0: required program `$program' does not exist, edit $0.\n"; + $ok = 0; + } + } + exit 1 unless $ok; +} + +###################################################################### +# Initial setup/command-line handling. + +&usage unless @ARGV == 2; + +my $repos = shift; +my $txn = shift; + +unless (-e $repos) { + &usage("$0: repository directory `$repos' does not exist."); +} +unless (-d $repos) { + &usage("$0: repository directory `$repos' is not a directory."); +} + + +###################################################################### +# Harvest data using svnlook. + +# Change into /tmp so that svnlook diff can create its .svnlook +# directory. +my $tmp_dir = '/tmp'; +chdir($tmp_dir) + or die "$0: cannot chdir `$tmp_dir': $!\n"; + + +#see rev 257353. We're trying to allow modifications but prevent new stuff. +#Property changes on: stable/10/etc +#___________________________________________________________________ +#Modified: svn:mergeinfo +# +#Property changes on: stable/10/share/man/man7 +#___________________________________________________________________ +#Added: svn:mergeinfo + +my $state = 0; +my $path; +my @errors; +foreach my $line (&read_from_process($svnlook, 'diff', $repos, '-r', $txn)) { + #printf "line: %s, current state %d\n", $line, $state; + if ($state == 0 && $line =~ /^Property changes on: (.*)$/) { + $path = $1; + given ($path) { + when (/stable\/([0-9]+)/) { if ($1 >= 10) { $state = 1; } else { $state = 0; } } + default { $state = 0; } + } + #printf "path: %s, state %d\n", $path, $state; + next; + } + if ($state == 1) { + if ($line =~ /^___________/) { $state = 2; } else { $state = 0; } + #print "state 1 -> 2\n"; + next; + } + if ($state == 2) { + given ($line) { + when (/^Added: svn:mergeinfo/) { + push @errors, "$path : svn:merginfo added at somewhere other than root"; + } + when (/^================/) { $state = 0; } + } + } +} + +# If there are any errors list the problem files and give information +# on how to avoid the problem. Hopefully people will set up auto-props +# and will not see this verbose message more than once. +if (@errors) { + warn "$0:\n\n", join("\n", @errors), "\n\n", <<EOS; + svn merge should be done at the root directory to prevent + spread of stray mergeinfo records. This commit adds new + mergeinfo. +EOS + exit 1; +} else { + exit 0; +} + +sub usage +{ + warn "@_\n" if @_; + die "usage: $0 REPOS TXN-NAME\n"; +} + +sub safe_read_from_pipe +{ + unless (@_) { + croak "$0: safe_read_from_pipe passed no arguments.\n"; + } + #print "Running @_\n"; + my $pid = open(SAFE_READ, '-|'); + unless (defined $pid) { + die "$0: cannot fork: $!\n"; + } + unless ($pid) { + open(STDERR, ">&STDOUT") || die "$0: cannot dup STDOUT: $!\n"; + exec(@_) || die "$0: cannot exec `@_': $!\n"; + } + my @output; + while (<SAFE_READ>) { + chomp; + push(@output, $_); + } + close(SAFE_READ); + my $result = $?; + my $exit = $result >> 8; + my $signal = $result & 127; + my $cd = $result & 128 ? "with core dump" : ""; + if ($signal or $cd) { + warn "$0: pipe from `@_' failed $cd: exit=$exit signal=$signal\n"; + } + if (wantarray) { + return ($result, @output); + } else { + return $result; + } +} + +sub read_from_process +{ + unless (@_) { + croak "$0: read_from_process passed no arguments.\n"; + } + my ($status, @output) = &safe_read_from_pipe(@_); + if ($status) { + if (@output) { + die "$0: `@_' failed with this output:\n", join("\n", @output), "\n"; + } else { + die "$0: `@_' failed with no output.\n"; + } + } else { + return @output; + } +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312071827.rB7IRMqq071138>