[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

RE: script to force SVN to elide mergeinfo on child paths

From: Trent Nelson <tnelson_at_onresolve.com>
Date: Fri, 22 May 2009 14:34:37 +0100

I came up with the following for my users, who are all on Windows. They just drop this file in the affected root (i.e. trunk) and run it. Their issues are *always* dodgy svn:mergeinfo props being set on subtrees.

@echo off
rem $Id: fix_dodgy_mergeinfo_props.bat 5 2009-01-23 11:22:03Z trent.p.nelson $
rem Recurse through a source directory and remove the svn:mergeinfo property
rem if set. See http://supportex/wiki/svn/ReintegrateIssues.

setlocal enableextensions enabledelayedexpansion
set FILE=
set PROP=
set _i=0
for /f "usebackq tokens=1,2,3" %%i in (`svn pl -R`) do (
    if "%%i"=="Properties" (
        set FILE=%%k
        set FILE=!FILE:~1,-2!
    set PROP=%%i
    set PROP=!PROP:*:=!
    if "!PROP!"=="mergeinfo" (
        if not "!FILE!"=="." (
            svn pd -q svn:mergeinfo !FILE!
            echo removed svn:mergeinfo property from !FILE!
            set /a _i=!_i! + 1
endlocal & set COUNT=%_i%

if "%COUNT%"=="0" (
    echo no affected files/folders found.
) else (
    echo removed svn:mergeinfo from %COUNT% files/folders

I've since implemented a pre-commit hook that prevents a commit if erroneous svn:mergeinfo is set on any subtree paths. Turns out this was actually easier than upgrading to 1.5.5+ clients:

class SubtreeMergeinfo(RepositoryHook):
    id = 'subtree-mergeinfo'
    def pre_commit(self, txn):
        pathmatcher = self.repo.pathmatcher
        changeset = self.repo.changeset(txn)
        analysis = changeset.analysis
        path = changeset.root_dir
        root_details = pathmatcher.get_root_details(path)
        if not root_details:
        root_dir, root_type, root_name = root_details
        skip = None
        if not analysis.is_subtree_change:
            skip = changeset.root_change
        for change in changeset.changes.values():
            if skip and change == skip:
            if not change.is_remove:
                if 'svn:mergeinfo' in change.proplist():
                    self.terminate('svn:mergeinfo property erroneously set on '
                                   'file %s, please remove before committing' %\

From: Ryan Meador [mailto:rmeador_at_softscape.com]
Sent: 19 May 2009 16:55
To: dev_at_subversion.tigris.org
Subject: script to force SVN to elide mergeinfo on child paths

Hi all,
I’ve cooked up a perl script that will run a giant --record-only merge on the root of a branch in an attempt to get SVN to elide all the mergeinfo on the child paths.  This is very much a work in progress and is semi-specific to my case (some hardcoded paths), but should be possible to generalize.  I’m not 100% sure it works, since the mergeinfo in my repository is very messed up, but some of it gets elided, which gives me hope.  Pburba has been a huge help to me in creating this script, and he suggested I send it to this list.  You can do whatever you want with it, including releasing it as open source, if you wish.  I’m probably going to continue development on it until my mergeinfo problems are solved, so I’ll send out another version if I make any changes of note.

This e-mail communication and any attachments are confidential and intended only for the person or
entity to which it is addressed. Any review, retransmission, dissemination or other use of, or taking
of any action in reliance upon this information by persons or entities other than the intended recipient
is prohibited. If you are not the intended recipient, any review, disclosure, dissemination,
distribution or copying of it or its contents is prohibited. If you have received this communication
in error, please notify the sender immediately and destroy all copies of this communication and any attachments.

Received on 2009-05-22 15:36:44 CEST

This is an archived mail posted to the Subversion Dev mailing list.