2011-01-17 11 views

risposta

3

Ho impostato un ambiente simile utilizzando Tortoise Docs e posso dire: Sì, lo è! operazione comporta una start-commit hook che riempie nelle linee che l'utente deve leggere e un pre-commit hook che rimuove Thee linee ancora:

Inizio-commit hook
Questo gancio viene passato tre parametri: PATH MESSAGEFILE CWD . MESSAGEFILE è il percorso di un file temporaneo che verrà utilizzato per la memorizzazione del messaggio di commit. Puoi riempire questo file temporaneo con il tuo messaggio Non dimenticarti di fare X! Oppure, si precede il messaggio con qualcosa che si tratterà come commento nel messaggio di commit e verrà filtrato. Poiché Git utilizza # come commento nel messaggio di commit, ho fatto lo stesso: ogni riga che inizia con # viene filtrata dal messaggio di commit. E quindi scriverei il messaggio # Don't forget to do X!. esempio di implementazione in Perl (non testata):

use strict;       # what we always have 
use warnings;      # what we always have 
use Fcntl ':flock';     # lock files when writing 
use Carp;       # use croak instead of die 
use English qw(-no_match_vars); # words instad of cryptic variables 

sub startcommit_hook{ 
    # open the logfile 
    my $logfilename  = $ARGV[1]; 
    # write hint line about supported tags 
    open my $handle, '>:utf8', $logfilename 
    or croak "Opening $logfilename for writing failed\n"; 
    flock $handle, LOCK_EX; 
    print {$handle} "# Don't forget to do X!\n"; 
    flock $handle, LOCK_UN; 
    return close $handle or croak "unable to close $OS_ERROR"; 
} 

startcommit_hook(); 

pre-commit hook
Questo hook viene passato quattro parametri: PATH DEPTH MESSAGEFILE CWD. Il compito del gancio di pre-commit è filtrare il messaggio che hai inserito in MESSAGEFILE nel hook di avvio-commit (altrimenti andrà come parte del messaggio di commit al server e questo probabilmente non è quello che vuoi) . O semplicemente elimina il tuo messaggio Non dimenticarti di fare X! o –   se si utilizza l'approccio comment come ho scritto sopra   – eliminare ogni riga che inizia con un segno # (o che corrisponde al modello ^\s*#) poiché si tratta di un commento nel nostro mondo.

Potremmo estendere il nostro file per il hook di avvio-commit per gestire anche le cose di pre-commit poiché il numero di parametri è diverso. La decisione su quale gancio di chiamare è costituito il parametro Count passato allo script (anche non testata):

use strict;       # what we always have 
use warnings;      # what we always have 
use feature 'switch';    # for given-when construct 
use Fcntl ':flock';     # lock files when writing 
use Carp;       # use croak instead of die 
use English qw(-no_match_vars); # words instad of cryptic variables 

sub startcommit_hook{ 
    # open the logfile 
    my $logfilename  = $ARGV[1]; 
    # write hint line about supported tags 
    open my $handle, '>:utf8', $logfilename 
    or croak "Opening $logfilename for writing failed\n"; 
    flock $handle, LOCK_EX; 
    print {$handle} "# Don't forget to do X!\n"; 
    flock $handle, LOCK_UN; 
    return close $handle or croak "unable to close $OS_ERROR"; 
} 

sub precommit_hook{ 
    my $logfilename  = $ARGV[2]; 
    # first, read the logfile 
    open my $handle,'<:utf8',$logfilename or croak "Error reading file contents of $logfilename: $OS_ERROR\n"; 
    my @content = <$handle>; 
    close $handle or croak "unable to close: $OS_ERROR"; 
    chomp @content; 

    # now, write it, ignoring the comment lines 
    open my $handle, '>:utf8', $logfilename 
    or croak "Opening $logfilename for writing failed\n"; 
    flock $handle, LOCK_EX; 

    foreach my $line(@content){ 
    if($line !~ /^\s*#/){ # line has no comment, print it. 
     print {$handle} $line . "\n"; 
    } 
    } 

    flock $handle, LOCK_UN; 
    close $handle or croak "unable to close $OS_ERROR"; 
    return; 
} 

given($#ARGV){ 
    when (3){startcommit_hook();} 
    when (4) {precommit_hook();} # no user supplied -> auto lookup 
    default {croak "Invalid number of parameters";} 
} 

Per attivare i ganci, aprire le impostazioni di TortoiseSVN, vanno a hook scripts e aggiungere lo script una volta come avvio-commit hook e una volta come hook pre-commit. La riga di comando da chiamare sarebbe perl /path/to/script. E anche controllare Wait for the script to finish e Hide script while running.

Nota
Se avete bisogno di ulteriori informazioni passate ai ganci, si potrebbe anche passare parametri personalizzati quando si assegnano i ganci nelle impostazioni di TortoiseSVN. Se si assegnano parametri personalizzati, questi vengono passati al gancio prima dello per passare i parametri predefiniti (come indicato nello docs).

Problemi correlati