The 'pre-svn-dcommit' hook is called before 'git svn dcommit', which aborts if return value is not zero. The only parameter given to the hook is the reference given to 'git svn dcommit'. If no paramter was used, hook gets HEAD as its only parameter. Signed-off-by: Frédéric Heitzmann <frederic.heitzmann@xxxxxxxxx> --- I resend the same patch previously sent July 9th. Apparently it did not graduated upstream, and I do not know why. Please someone tell me if something needs to be improved. Documentation/git-svn.txt | 14 +++++++++++++- git-svn.perl | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletions(-) diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index 713e523..ec87ed3 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -700,6 +700,18 @@ section because they affect the 'git-svn-id:' metadata line, except for rewriteRoot and rewriteUUID which can be used together. +HOOKS +----- + +The 'pre-svn-dcommit' hook is called by 'git svn dcommit' and can be used to +prevent some diff to be committed to a SVN repository. It may typically be +used to filter some intermediate patches, which were committed into git but +must not find their way to the SVN repository. + +It takes a single parameter, the reference given to 'git svn dcommit'. If the +hook exists with a non zero-status, 'git svn dcommit' will abort. + + BASIC EXAMPLES -------------- @@ -901,7 +913,7 @@ reset) branches-maxRev and/or tags-maxRev as appropriate. SEE ALSO -------- -linkgit:git-rebase[1] +linkgit:git-rebase[1], linkgit:githooks[5] GIT --- diff --git a/git-svn.perl b/git-svn.perl index 89f83fd..a537858 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -396,6 +396,25 @@ sub init_subdir { $_repository = Git->repository(Repository => $ENV{GIT_DIR}); } +sub pre_svn_dcommit_hook { + my $head = shift; + + my $hook = "$ENV{GIT_DIR}/hooks/pre-svn-dcommit"; + return 0 if ! -e $hook || ! -x $hook; + + system($hook, $head); + if ($? == -1) { + print "[pre_svn_dcommit_hook] failed to execute $hook: $!\n"; + return 1; + } elsif ($? & 127) { + printf "[pre_svn_dcommit_hook] child died with signal %d, %s coredump\n", + ($? & 127), ($? & 128) ? 'with' : 'without'; + return 1; + } else { + return $? >> 8; + } +} + sub cmd_clone { my ($url, $path) = @_; if (!defined $path && @@ -505,6 +524,8 @@ sub cmd_dcommit { . "or stash them with `git stash'.\n"; $head ||= 'HEAD'; + return if pre_svn_dcommit_hook($head); + my $old_head; if ($head ne 'HEAD') { $old_head = eval { -- 1.7.6.133.gd3b55a -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html