On 4/27/07, lsuvkne@onemodel.org <lsuvkne@onemodel.org> wrote:
> >>> On Fri, Apr 27, 2007 at 9:30 am, justinjohnson@gmail.com wrote:
> > Wrapping up client commands isn't really an option for me. There are
> > too many clients to make this feasible (command line, TortoiseSVN, IDE
> > plugins).
>
> If we do that we'll have to train our people
> to use the command line only for merges; in our case this seems
> possible.
>
> > I wrote a script that parses revisions from the log and determines if
> > a rename happened. It seems like svnmerge.py should be able to detect
> > when something was renamed and make sure changes aren't lost. It may
> > require asking the user which file/directory should be kept (i.e. what
> > history to preserve) and then it can merge the lost changes into that
> > file/directory.
>
> What is the reliable logic to determine if a rename happened? Like
> if a directory (java package) is renamed, or if there are other adds
> & deletes at the same time? I didn't see a way but if it works, then
> modifying svnmerge.py sounds attractive.
Here is sample log output for clarification.
C:\work\testwc2>svn log -v -r 14
------------------------------------------------------------------------
r14 | jjohn53 | 2007-04-26 13:46:33 -0500 (Thu, 26 Apr 2007) | 1 line
Changed paths:
A /trunk/foo.txt (from /trunk/new_file.txt:12)
D /trunk/new_file.txt
------------------------------------------------------------------------
From the log output I parse for:
1) " A NEW_PATH (from OLD_PATH:REV)" saving OLD_PATH
2) " D OLD_PATH"
Here is the quick and dirty perl script.
# Run while in a working copy.
# Get single revision or revision range
my $revs = $ARGV[0];
# Get the repository root from the working copy
my $repos_url = "";
my @info_output = `svn info`;
foreach (@info_output)
{
if (/Repository Root: (.+)$/)
{
$repos_url = $1;
last;
}
}
# Get log for all revisions. If none specified, get all revisions.
my @log_output = ();
if ($revs)
{
@log_output = `svn log $repos_url -v -r $revs`;
}
else
{
@log_output = `svn log $repos_url -v`;
}
# Parse log output into each revision
# Shift off the first one since we know we're starting a new revision.
my $line = shift @log_output;
while (@log_output)
{
# New revision starts here
if ($line =~ /^\-\-\-/)
{
my $rev = "";
my %copied_from = ();
my %deleted = ();
$line = shift @log_output;
while ($line !~ /^\-\-\-/)
{
if ($line =~ /^r(\d+)/)
{
$rev = $1;
}
if ($line =~ / A (.+) \(from (.+)\:\d+\)$/)
{
$copied_from{$1} = "$2";
}
if ($line =~ / D (.+)$/)
{
$deleted{$1} = 1;
}
$line = shift @log_output;
}
# Display results
foreach my $c (keys %copied_from)
{
my $old_file = $copied_from{$c};
if (defined $deleted{"$old_file"})
{
print "r$rev\t Renamed '$old_file' to '$c'\n";
}
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@subversion.tigris.org
For additional commands, e-mail: users-help@subversion.tigris.org
Received on Fri Apr 27 18:36:07 2007