De temps en temps, nous livrons un fichier de projet C# à SVN qui fait référence à des fichiers que nous avons oublié d'ajouter à SVN. Existe-t-il des scripts scripts qui analysent le fichier .csproj et rejettent le commit s'il fait référence à des fichiers non versionnés ?
Réponses
Trop de publicités?#!/usr/bin/perl
# Checks for source files which have been added to a csproj in a commit
# but haven't themselves been committed.
use Modern::Perl;
use warnings FATAL => 'syntax';
use File::Basename qw(basename);
use XML::Simple;
die "usage: $0 repo transaction\n" if @ARGV != 2;
my $opt = "-t"; # -r for testing
my ($repos, $txn) = @ARGV;
# If you really, really want to add a file to the proj and
# not commit it, start your commit message with a !
my @info = `svnlook info $opt $txn "$repos"`;
exit 0 if ($info[3] =~ /\A!/);
my @lines = `svnlook changed $opt $txn "$repos"`;
my @projects = grep { /\AU/ }
grep { /[.]csproj\z/ }
map { chomp; $_ } @lines;
my @filelist = `svnlook tree $opt $txn "$repos" --full-paths`;
my %present;
foreach (@filelist) {
chomp;
$present{$_} = 1;
}
foreach (@projects) {
m"\AU.\s\s([\w/.]+/)([\w]+\.csproj)\z" or die "bad line $_";
my ($path, $proj) = ($1, $2);
my $projfile = `svnlook cat $opt $txn "$repos" $path/$proj`;
my $xml = XMLin($projfile);
# Tested with VS 2012 project files
my @includes = @{$xml->{ItemGroup}->[1]->{Compile}};
# All the source files in the csproj
my @filenames = map {$_->{Include}} @includes;
foreach (@filenames) {
# ignore "../etc", not below the project file in the tree
next if /\A[.][.]/;
# if you have files that are in the proj but shouldn't be committed
# eg some generated files, add checks for them here
# next if /MyGeneratedFile.cs\z/;
my $file = $path . $_;
# The csproj file speaks windows paths, but svn will output unix ones
$file =~ tr|\\|/|;
if (!defined $present{$file}) {
die "The file $file is included in the project $path\\$proj, but is not present in the tree, did you forget to commit it?";
}
}
}
Si vous utilisez un serveur Windows, vous pouvez consulter Subversion Notify pour Windows - http://sourceforge.net/projects/svn-notify/
Je l'utilise pour effectuer une simple vérification du message de validation, afin de m'assurer que les utilisateurs respectent nos règles internes. Je ne me suis pas penché sur les autres utilisations de la pré-commission, mais cela peut valoir la peine d'essayer !
Je cite le manuel :
CONTRÔLES AVANT VALIDATION
Assurez l'intégrité de votre référentiel en appliquant les normes des messages de validation.
Restreindre les types de fichiers qui peuvent être livrés (éliminer les livraisons accidentelles de fichiers de configuration temporaires ou spécifiques au développeur).
Contrôler le type de fichier - les fichiers qui peuvent être validés, mais qui nécessitent une étiquette de validation spéciale pour s'assurer qu'ils sont validés conformément à vos règles.
Vérifiez votre système de suivi des tâches et des bogues pour vous assurer qu'il s'agit d'un élément de suivi valide et que vos normes sont appliquées (pas de livraisons contre des bogues fermés, par exemple).