-
Notifications
You must be signed in to change notification settings - Fork 3
/
CheckMimeTypes.pm
97 lines (70 loc) · 2.48 KB
/
CheckMimeTypes.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use strict;
use warnings;
package SVN::Hooks::CheckMimeTypes;
# ABSTRACT: Require the svn:mime-type property.
use Carp;
use SVN::Hooks;
use Exporter qw/import/;
my $HOOK = 'CHECK_MIMETYPES';
our @EXPORT = ($HOOK);
=for Pod::Coverage pre_commit
=head1 SYNOPSIS
This SVN::Hooks plugin checks if the files added to the repository
have the B<svn:mime-type> property set. Moreover, for text files, it
checks if the properties B<svn:eol-style> and B<svn:keywords> are also
set.
The plugin was based on the
L<check-mime-type.pl|http://svn.digium.com/view/repotools/check-mime-type.pl>
script.
It's active in the C<pre-commit> hook.
It's configured by the following directive.
=head2 CHECK_MIMETYPES([MESSAGE])
This directive enables the checking, causing the commit to abort if it
doesn't comply.
The MESSAGE argument is an optional help message shown to the user in
case the commit fails. Note that by default the plugin already inserts
a rather verbose help message in case of errors.
CHECK_MIMETYPES("Use TortoiseSVN -> Properties menu option to set properties.");
=cut
my $Help = <<"EOS";
You may want to consider uncommenting the auto-props section
in your ~/.subversion/config file. Read the Subversion book
(http://svnbook.red-bean.com/), Chapter 7, Properties section,
Automatic Property Setting subsection for more help.
EOS
sub CHECK_MIMETYPES {
my ($help) = @_;
$Help = $help if defined $help;
PRE_COMMIT(\&pre_commit);
return 1;
}
sub pre_commit {
my ($svnlook) = @_;
my @errors;
foreach my $added ($svnlook->added()) {
next if $added =~ m:/$:; # disregard directories
my $props = $svnlook->proplist($added);
unless (my $mimetype = $props->{'svn:mime-type'}) {
push @errors, "property svn:mime-type is not set for: $added";
} elsif ($mimetype =~ m:^text/:) {
for my $prop ('svn:eol-style', 'svn:keywords') {
push @errors, "property $prop is not set for text file: $added"
unless exists $props->{$prop};
}
}
}
if (@errors) {
croak "$HOOK:\n", join("\n", @errors), <<'EOS', $Help;
Every added file must have the svn:mime-type property set. In
addition, text files must have the svn:eol-style and svn:keywords
properties set.
For binary files try running
svn propset svn:mime-type application/octet-stream path/of/file
For text files try
svn propset svn:mime-type text/plain path/of/file
svn propset svn:eol-style native path/of/file
svn propset svn:keywords 'Author Date Id Revision' path/of/file
EOS
}
}
1; # End of SVN::Hooks::CheckMimeTypes