5 votes

SVN pre-commit hook pour s'assurer que tous les fichiers référencés dans .csproj sont versionnés ?

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 ?

1voto

jwg Points 53
#!/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?";
        }
    }
}

0voto

RooiWillie Points 351

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X