Giovanni Bajo <rasky@develer.com> (giovannibajo)


Found Patch Review Suggested
r19581 r25815, r20787, r18595, r18575, r18569, r16860 r30180, r29815, r27830, r27348, r26883, r26032, r25923, r25873, r25872, r25871, r25819, r25815, r25814, r25813, r25812, r25684, r25683, r23052, r19800, r19653, r19338, r19112, r19068, r19051, r18685, r18614 r21508, r18696

r30180 | rocketraman | 2008-04-02 08:39:25 -0500 (Wed, 02 Apr 2008)

svnmerge.py: Fix a problem occasionally causing conflicts in the integrated
property due to some revisions being treated by svnmerge.py as unicode
strings, and others as int's.

* contrib/client-side/svnmerge/svnmerge.py
  (SvnLogParser): Always return revisions as ints.
  (action_init): Cast revision to str before concatenation.

Found by: Horst Hermanns <h.hermanns@telekom.de>
Patch by: Horst Hermanns <h.hermanns@telekom.de>
          me
Review by: Giovanni Bajo <rasky@develer.com>


r29815 | rocketraman | 2008-03-09 16:06:52 -0500 (Sun, 09 Mar 2008)

Fix regression error in r29666 for non-english locales that was causing a 
KeyError when svnmerge.py commands were executed, since the output of svn 
info was non-english and therefore non-parseable.

* contrib/client-side/svnmerge.py: Set the environment in which the script
    operates to set LC_MESSAGES = C (to force svn messages, such as those
    for svn info to be in english, and thus parseable by svnmerge.py), while
    also removing any pre-existing setting for LC_ALL (since setting LC_ALL 
    to C causes log output to not be internationalized).

Patch by:  me
           Laurent Petit <laurent.petit@gmail.com>
Review by: Giovanni Bajo <rasky@develer.com>
Found by:  Hernán Martínez Foffani <hernan.martinez@ecc.es>


r27830 | rocketraman | 2007-11-15 10:31:00 -0600 (Thu, 15 Nov 2007)

* contrib/client-side/svnmerge/svnmerge.py
  (VersionedProperty.load): While looping through the revisions in which
    there are property changes, properly cache the old value for the
    next loop. Not a correctness issue, buy may improve performance
    slightly.

Patch by: Anonymous
Review by: Giovanni Bajo <rasky@develer.com>
           Raman Gupta <rocketraman@fastmail.fm>


r27348 | dustin | 2007-10-24 09:36:27 -0500 (Wed, 24 Oct 2007)

* contrib/client-side/svnmerge/svnmerge.py
  (display_revisions, command_table): add '--summarize' option,
   pass it to 'svn diff'.

Patch by: Archie Cobbs <archie@dellroad.org>
Review by: Giovanni Bajo <rasky@develer.com>
           Jon Schewe <jpschewe@mtu.net>


r26883 | glasser | 2007-10-01 17:53:32 -0500 (Mon, 01 Oct 2007)

svnmerge.py: Because 'svn merge' in 1.5 can trigger interactive
conflict resolution, pass --non-interactive to it.  For good measure,
pass --non-interactive to *all* svn invocations (all commands that
svnmerge.py currently invokes do accept --non-interactive).

(Ideally, svnmerge.py should invoke svn in such a way that the user
could actually interact with the interaction prompt; this patch at
least prevents the script from hanging.)

* contrib/client-side/svnmerge/svnmerge.py
  (launchsvn): Pass --non-interactive to all svn commands.

Review by: giovannibajo
           dlr


r26032 | giovannibajo | 2007-08-10 13:34:45 -0500 (Fri, 10 Aug 2007)

analyze_source_revs() gets the latest revision of the *branch*
repository, then proceeds to use that value against the *source*
repository; it should get the latest revision of the *source*.

This of course is not a bug in the common scenario of merges
within the same repository, but it is blocking our way to
inter-repository merges.

* svnmerge.py
  (analyze_source_revs): Get latest rev of source_url.
  
Patch by: Dustin J. Mitchell <dustin@zmanda.com>  
Review by: Giovanni Bajo <rasky@develer.com>


r25923 | dustin | 2007-08-01 15:41:12 -0500 (Wed, 01 Aug 2007)

* contrib/client-side/svnmerge/svnmerge.py
  (initialized_revs): New function
  (analyze_revs, action_avail, action_merge, action_block): Exclude
    initialized revisions when considering candidates, if
    --bidirectional is specified
* contrib/client-side/svnmerge/svnmerge_test.py
  (testBidirectionalMergesMultiBranch): test initialized revision detection
Patch by:  Rich Williams <perldog@gmail.com>
Patch by:  Michael Willmott <mwillmott@leadgenpro.co.uk>
Review by: Giovanni Bajo <rasky@develer.com>


r25873 | dustin | 2007-07-28 10:52:49 -0500 (Sat, 28 Jul 2007)

Finish work begun by r22788, to improve default revision range set by "svnmerge
init" if none provided by user, for scenario where merge source is a copy of
the merge target (i.e., merging from branch back to trunk) or vice-versa.

* contrib/client-side/svnmerge/svnmerge.py
  (get_copyfrom): Add copy_committed_in_rev to returned values; add comments.
  (action_init): Use copy_committed_in_rev from get_copyfrom call for 
    correct conditional default revision range; added logic to auto-calculate 
    revision range depending on merge source and target copy relationship; add
    comments.

* contrib/client-side/svnmerge/svnmerge_test.py:
  (testUninitForce): Change test so does not depend on specific initialized
    revision number, as that is not the point of the test and this is
    now handled in testInitScenarios.  This was broken by the other
    changes, thus fixed here.
  (testInitScenarios): Added function to test how action_init behaves in 
    different circumstances.
  (testCheckInitializeEverything): Removed (now redundant, and not testing for 
    the right behavior).
  (testBidirectionalMerges):  Changed to pass with newly correct init behavior.

Patch by:  Luke Call <lsuvkne@onemodel.org>
Review by: Dustin J. Mitchell <dustin@zmanda.com>
           Giovanni Bajo <rasky@develer.com>


r25872 | dustin | 2007-07-28 10:48:25 -0500 (Sat, 28 Jul 2007)

Clarify action_init by changing nomenclature from "branch" to "target".

* contrib/client?side/svnmerge/svnmerge.py
  (action_init): changing nomenclature from "branch" to "target",
    since the merge target could be either a trunk or a branch.  This
    helps prepare for a subsequent patch that corrects & adds logic to
    this function and uses the term "target" consistently.

Patch by:  Luke Call <lacall186@onemodel.org>
Review by: Giovanni Bajo <rasky@develer.com>


r25871 | dustin | 2007-07-28 10:45:03 -0500 (Sat, 28 Jul 2007)

Clarify uses of xml.dom.

* contrib/client-side/svnmerge/svnmerge.py
  (getAttributeOrNone): New function.
  (SvnLogParser): provide more informative error message if expected name is
    not found.
  (SvnLogRevision): call getAttributeOrNone instead of
    xml.dom.Element.getAttribute directly, to integrate more cleanly with
    get_copyfrom() by returning None instead of an empty string.

Patch by: Luke Call <lacall186@onemodel.org>
Review by: Giovanni Bajo <rasky@develer.com>


r25819 | dustin | 2007-07-22 10:41:49 -0500 (Sun, 22 Jul 2007)

clearly differentiate urls, directories, and repo-relative paths

* svn/trunk/contrib/client-side/svnmerge/svnmerge.py
 fix comments, variable names for urls, directories, and
 "repostitory-relative paths" to be more explicit and call the
 repo-relative paths "path identifiers"

Reviewed by: Giovanni Bajo <rasky@develer.com>


r25815 | dustin | 2007-07-21 22:10:58 -0500 (Sat, 21 Jul 2007)

* contrib/client-side/svnmerge/svnmerge.py
  (block_metadata): New function
  (analyze_revs): Consider changes to blocked-prop as reflected revisions.

Patch by:  Giovanni Bajo <rasky@develer.com>
Review by: Raman Gupta <rocketraman@fastmail.fm>
           Giovanni Bajo <rasky@develer.com>


r25814 | dustin | 2007-07-21 22:04:38 -0500 (Sat, 21 Jul 2007)

No logic change; a cleanup to use xml instead of regular expression
parsing.

* contrib/client-side/svnmerge/svnmerge.py
  (SvnLogParser):  New class.
  (get_copyfrom):  Use xml instead of regular expression to
  parse information from logs.

Patch by: Giovanni Bajo <rasky@develer.com> and Luke Call <lsuvkne@onemodel.org>
Review by: Giovanni Bajo <rasky@develer.com>


r25813 | dustin | 2007-07-21 22:00:25 -0500 (Sat, 21 Jul 2007)

Uses new subprocess module for in launch(), when python version allows, for a 
big performance benefit on some operating systems.  Faster because doesn't 
try to close all (unused) file descriptors. 

* svnmerge/svnmerge.py
  (launch):  Use subprocess module when possible for better performance.
* svnmerge/svnmerge_test.py
  (multilaunch):  No longer passing empty cmd strings.
  (testBlockMergeAndRollback, testMergeAndRollbackEmptyRevisionRange,
  testMergeAndRollback, testMergeWithPotentialPropertyConflict): Change
  quoting of log comment arguments for windows command parser, so they
  are kept together.

Patch by: Luke Call <lsuvkne@onemodel.org>
Review by: Dustin J. Mitchell <dustin@zmanda.com>
           Giovanni Bajo <rasky@develer.com>
(Dustin clarified comments; Dustin and Giovanni made helpful suggestions.)


r25812 | dustin | 2007-07-21 21:28:29 -0500 (Sat, 21 Jul 2007)

* contrib/client-side/svnmerge/svnmerge_test.py: fix testUninit,
  testBidirectionalMerges, and testBidirectionalMergesMultiBranches,
  which began failing in r22788, by forcing revisions at 'init' time
  and ignoring '--force' in the 'svn merge' commands generated by
  'svnmerge merge'.

Review by: Giovanni Bajo <rasky@develer.com>


r25684 | dustin | 2007-07-07 20:30:13 -0500 (Sat, 07 Jul 2007)

Move the post-merge merge_props and blocked_props update to *before*
the generation of the commit message. This allows a CTRL+C interrupt
to break the generation of the commit message, without leaving the
working copy in an inconsistent state. Requested by Giovanni Bajo.

* contrib/client-side/svnmerge.py:
  (action_merge): Move the commit log generation to the end of the
    method.

Patch by:  Raman Gupta <rocketraman@fastmail.fm>
Review by: Giovanni Bajo <rasky@develer.com>


r25683 | dustin | 2007-07-07 20:19:36 -0500 (Sat, 07 Jul 2007)

Prevent spurious conflicts on the merge and blocked property
when the source branch contains merge property information for
other branches i.e. a transitive merge A -> B -> C is executed.
Previously, this caused a property conflict because the initial
value on the source branch did not match the initial value on
the target branch.

This patch also prevents extra merge property information from
uninitialized branches being merged into the target. If merging
to those other branches was never initialized on the target by
the user, then the user probably does not expect to see that
information. Note that if that information *was* initialized by
the user, then the user is attempting to do graph-based merging
i.e. A -> B -> C -> A which is currently unsupported.

* contrib/client-side/svnmerge_test.py 
  (testTransitiveMerge): test a transitive merge
* contrib/client-side/svnmerge.py:
  (action_merge): Before each merge, clear the integrated/blocked
    properties. Reset these properties to known values after the
    merge is complete.

Patch by:  Raman Gupta <rocketraman@fastmail.fm>
           Dustin J. Mitchell <dustin@zmanda.com>
Review by: Giovanni Bajo <rasky@develer.com>


r23052 | dlr | 2007-01-16 17:37:56 -0600 (Tue, 16 Jan 2007)

Make multiple invocations of 'svn merge' from an invocation of
'svnmerge.py merge' behave like the combined merge in cases where an
'svn merge' produces a local modifications which interfere with a
subsequent 'svn merge'.

As svnmerge.py runs only in clean working copies, the only possible
local modifications are those produed by svnmerge.py itself: here we
*REALLY* want --force.  See the following message and surrounding
email thread:

Date: Thu, 11 Jan 2007 00:03:17 +0100
From: Giovanni Bajo <rasky@develer.com>
Subject: Re: [Svnmerge] Bugs when merging revisions that modify and deletefiles
Message-ID: <45A570B5.1040100@develer.com>


* contrib/client-side/svnmerge.py
  (action_merge, action_rollback): Add the --force to invocation of
   the Subversion command-line binary's 'merge' command.

Patch by: Tilmann Singer <tils@tils.net>
(Tweaked by me.)
Reviewed by: giovannibajo
             archiecobbs


r21508 | rooneg | 2006-09-15 08:59:22 -0500 (Fri, 15 Sep 2006)

Remove note about lack of Python 2.4 bindings for Windows, as we have
some now.

Suggested by: Giovanni Bajo <rasky@develer.com>

* www/project_packages.html: Remove python 2.4 on windows note.


r20787 | blair | 2006-07-19 22:41:28 -0500 (Wed, 19 Jul 2006)

Strip leading and trailing whitespace from property names and values
after splitting on ; and =.  Use String.split() instead of regular
expressions to remove the leading and trailing whitespace since it is
faster and easier to read.

Patch by: Giovanni Bajo <rasky@develer.com>
          me

* contrib/client-side/svn_apply_autoprops.py
  Update copyright year.
  (re_remove_leading_whitespace),
  (re_remove_trailing_whitespace):
    Remove these constants as String.split() does the job.
  (process_autoprop_lines):
    Use String.strip() on all strings after splitting on ; and =.


r19800 | djames | 2006-05-23 19:44:06 -0500 (Tue, 23 May 2006)

Implement `svnmerge rollback'.
The `rollback' sub-command can be used to rollback previously integrated
revisions.

Patch by: Madan U Sreenivasan <madan@collab.net>

Review by: David James <djames@collab.net>
           Daniel Rall <dlr@collab.net>
           Giovanni Bajo <rasky@develer.com>

* contrib/client-side/svnmerge_test.py
  (TestCase_TestRepo.testRollbackWithoutInit):
  (TestCase_TestRepo.testRollbackOutsidePossibleRange):
  (TestCase_TestRepo.testRollbackWithoutRevisionOpt):
  (TestCase_TestRepo.testInitAndRollbackRecordOnly):
  (TestCase_TestRepo.testInitAndRollback):
  (TestCase_TestRepo.testMergeAndRollbackEmptyRevisionRange):
  (TestCase_TestRepo.testBlockMergeAndRollback):
  (TestCase_TestRepo.testMergeAndRollback):
  (TestCase_TestRepo.testBlockMergeAndRollback): New tests for rollback
   functionality.

* contrib/client-side/svnmerge.py
  (warn): New function to print warning message to stdout.
  (action_rollback): New function. Used to rollback the merges between
   the given revision numbers.
  (command_table): New entry for `rollback'.



r19653 | giovannibajo | 2006-05-16 07:19:43 -0500 (Tue, 16 May 2006)

Add the uninit command, which removes merge tracking information for a given
head URL, including blocked revision information. This is especially useful
if multiple heads are being tracked -- without uninit, this situation requires
the new property value to be manually set by the user via svn propset.

* svnmerge.py: Added uninit to command table.
  (action_uninit): New method for uninitialization of merge tracking info.

* svnmerge_test.py
  (TestCase_TestRepo.testUninit): New test case, checking that uninit works.
  (TestCase_TestRepo.testUninitForce): New test case.
  (TestCase_TestRepo.getproperty): Prevent array index errors when
    retrieving a property with no value.
  (TestCase_TestRepo.getBlockedProperty): New method to get the value
    of the svnmerge blocked property.

Patch by: Raman Gupta <rocketraman@fastmail.fm>
Review by: Daniel Rall <dlr@collab.net>
           Madan U Sreenivasan <madan@collab.net>
           Giovanni Bajo <rasky@develer.com>


r19581 | dlr | 2006-05-09 13:07:48 -0500 (Tue, 09 May 2006)

* subversion/svn/main.c
  (svn_cl__cmd_table): Document that 'info' and 'log' accept a peg rev.

Found by: giovannibajo


r19338 | dlr | 2006-04-12 19:09:03 -0500 (Wed, 12 Apr 2006)

Make svnmerge.py's "multiple heads found" error message more
informative.

* contrib/client-side/svnmerge.py
  (get_default_head): Change the error message printed when multiple
   source URLs are found by listing all available URLs.

Patch by: Madan U S <madan@collab.net>
Review by: giovannibajo
           dlr
           djames


r19112 | dlr | 2006-03-31 12:33:54 -0600 (Fri, 31 Mar 2006)

Use svnmerge.py's error() function for all its error handling.


* contrib/client-side/svnmerge.py
  (global, main, check_old_prop_version): Replace code to print error
   message and exit with call to error().


Patch by: Madan U S <madan@collab.net>
(Tweaked by me.)

Review by: giovannibajo


r19068 | dlr | 2006-03-28 15:05:05 -0600 (Tue, 28 Mar 2006)

Remove svnmerge.py's undocumented long flag name processing behavior,
which was replacing embedded "-" characters with "_".  Giovanni Bajo
indicates that this was an artifact of some uncommitted code which
followed the idiom of the Python optparse module, which actually
creates an instance field on the options object
(e.g. "opts.flag_name"), as opposed to using a dictionary-like object
for the options (the current behavior).

(Subsequent commits r19072 and r19073 made the same naming convention
change for other elements in the "opts" dictionary.)


* contrib/client-side/svnmerge.py
  Throughout, replace "_" with "-" in the flag names "avail_showwhat",
  "avail_display", "dry_run", "show_changes", "commit_file",
  "record_only".

  (OptBase.__init__): Remove replace of "-" with "_" in long flag names.


Review by: giovannibajo


r19051 | dlr | 2006-03-27 16:33:52 -0600 (Mon, 27 Mar 2006)

Add the ability to mark revisions as merged via 'merge --record-only',
effectively a way to manipulate the merge memory stored in the
"svnmerge-integrated" property.  This is the converse of the 'block'
concept (which marks revisions which shouldn't be merged).


* contrib/client-side/svnmerge.py
  (action_merge): When the "--record-only" argument is specified,
   avoid executing the 'svn merge' command, and adjust output
   accordingly.

  (common_opts): Add a new "-M"/"--record-only" Option.

  (command_table): Add support for "--record-only" to "merge", and
   expand "merge" help to cover it, and "block" help to mention it.


* contrib/client-side/svnmerge_test.py
  (testMergeRecordOnly): New test method for 'svnmerge.py merge --record-only'.


Review by: djames
           giovannibajo


r18696 | djames | 2006-03-02 20:11:38 -0600 (Thu, 02 Mar 2006)

Simplify find_changes and analyze_revs.

* contrib/client-side/svnmerge.py
  (find_changes): Rename show_merges parameter to find_merges. Move initialization of loop parameters
  closer to loop.
  (analyze_revs): Simplify calculation of reflected revisions.

Suggested by: giovannibajo



r18685 | giovannibajo | 2006-03-02 08:45:28 -0600 (Thu, 02 Mar 2006)

Patch by: Alan Barrett <apb@cequrux.com>
          Raman Gupta <rocketraman@fastmail.fm>
Reviewed by: Giovanni Bajo <rasky@develer.com>

* contrib/client-side/svnmerge.py
  (prefix_lines):
    New method to take a string and prepend each line of the string
    with a specified string. Lines are delimited by newline
    characters, and the entire string is asserted to be newline
    terminated.
  (construct_merged_log_message):
    Added indentation for each commit message. Added check for empty
    log messages, which should never happen but doesn't hurt.

* contrib/client-side/svnmerge_test.py
  (TestCase_PrefixLines.test_basic):
     New test for the prefix_lines functionality.



r18614 | blair | 2006-02-24 16:49:13 -0600 (Fri, 24 Feb 2006)

When svnmerge.py is used to bidirectionally merge changes between a
branch and its head, it is necessary to not merge the same changes
forth and back: e.g., if you committed a merge of a certain revision
of the branch into the head, you do not want that commit to appear as
available to merged into the branch (as the code originated in the
branch itself!).  svnmerge can skip these so-called "reflected"
revisions with the new --bidirectional or -b command line option.

Patch by: Raman Gupta <rocketraman@fastmail.fm>
Reviewed by: Giovanni Bajo <rasky@develer.com>
(Tweaked by me.)

* contrib/client-side/svnmerge.py
  (analyze_revs):
    Take a new argument, the target directory receiving the merges.
    If the opts["bidirectional"] is True, then pass --verbose to 'svn
      log --quiet' to get a lit of all the changed paths in the head
      URL.  Look for any changed paths that exactly match the target
      directory and look for property changes on the directory in the
      svnmerge-integrated property for the target directory.
    Return an additional RevisionSet containing the reflected
      revisions.
  (analyze_head_revs):
    Pass the target directory receiving the merges down to
      analyze_revs().
  (action_avail):
    Use the new returned RevisionSet from analyze_head_revs() to
      remove from the set of available revisions the reflected ones.
  (action_merge):
    Use the new returned RevisionSet from analyze_head_revs() to
      remove from the set of available revisions the reflected ones.
  (common_opts):
    Add a new -b and --bidirectional flag to this, which defaults to
      False.
  (command_table):
    Add documentation about the bidirectional merge support to the
      'avail' and 'merge' commands.
    Enable the -b and --bidirectional command line options for the
      'avail' and 'merge' subcommands.

* contrib/client-side/svnmerge_test.py
  (TestCase_TestRepo.testBidirectionalMerges):
    New test method to check that reflected revisions are recognized
      properly for bidirectional merges.
  (TestCase_TestRepo.testBidirectionalMergesMultiBranch):
    New test method to check that merges from a second branch are not
      considered reflected for other branches.


r18595 | blair | 2006-02-23 18:53:14 -0600 (Thu, 23 Feb 2006)

Add utility functions to svnmerge.py's test suite to enable the
running of a single command and checking its output against regular
expressions.  The ability to check for the presence of or the lack of
presence text is available.

Code pulled from Giovanni Bajo's repository, revision 272.

Patch by: Giovanni Bajo <rasky@develer.com>

* contrib/client-side/svnmerge_test.py:
  (TestCase_SvnMerge._parseoutput):
    New method to check the output of a command against regular
      expressions.
  (TestCase_SvnMerge.launch):
    New method to run a single command.  Uses _parseoutput().
  (TestCase_TestRepo.lanch):
    New method that applies a dictionary to the command string and
      then calls TestCase_SvnMerge.launch.


r18575 | blair | 2006-02-23 12:28:17 -0600 (Thu, 23 Feb 2006)

Fixes and improvements in svnmerge.py's test suite to prepare for
bidirectional merge support.

Patch by: Giovanni Bajo <rasky@develer.com>
          Raman Gupta <rocketraman@fastmail.fm>
(Tweaked by me.)

* contrib/client-side/svnmerge_test.py
  (main):
    At script start time, always delete an existing template directory
      to force TestCase_TestRepo.setUp() to create a fresh template.
  (TestCase_SvnMerge.svnmerge2):
    Always clear svnmerge's internal cache before running svnmerge.
      This is needed for the bidirectional merge testing in a future
      patch.
  (TestCase_SvnMerge.setUp):
    Add to the template repository another branch of trunk which is
      then immediately renamed.  The new branch is not used in any
      tests currently.  I'm adding it now so that the tests for the
      bidirectional merge support that checks the expected revision
      numbers will not have to be renumbered in the future.  This
      change is from r238 from Giovanni Bajo's repository.
  (TestCase_TestRepo.testCheckInitializeEverything):
    Update the expected result to take into account the two additional
      commits in the template repository.  This change is from r238
      from Giovanni Bajo's repository.


r18569 | blair | 2006-02-22 19:05:05 -0600 (Wed, 22 Feb 2006)

Forgot that I already added the test_svnmerge.py file from Giovanni
Bajo's repository, I just renamed it to svnmerge_test.py.  However,
the new test_svnmerge.py did have some changes, so copy its contents
into svnmerge_test.py and then delete it.

Patch by: Giovanni Bajo <rasky@develer.com>

* contrib/client-side/svnmerge_test.py:
  Contents copied from contrib/client-side/test_svnmerge.py.

* contrib/client-side/test_svnmerge.py:
  Delete.


r16860 | blair | 2005-10-20 13:58:08 -0500 (Thu, 20 Oct 2005)

Initial commit of the Python version of svnmerge.py, primarily written
by Giovanni Bajo <rasky@develer.com> with contributions by John
Belmonte and myself, which is a much enhanced version of the Bourne
shell svnmerge.sh, primarily written by Archie Cobbs
<archie@awarix.com>.  There, got all my attributions right :)

Imported from svn://pyinstaller.hpcf.upr.edu/svnmerge/svnmerge.py
revision 180.

Patch by: Giovanni Bajo <rasky@develer.com>
Review by: me

* contrib/client-side/svnmerge.README:
  Remove note that development is occurring at
    pyinstaller.hpcf.upr.edu.
  Set svn:keywords.

* contrib/client-side/svnmerge.py:
  New file imported from
    svn://pyinstaller.hpcf.upr.edu/svnmerge/svnmerge.py revision 180.

* contrib/client-side/svnmerge_test.py:
  New file imported from
    svn://pyinstaller.hpcf.upr.edu/svnmerge/test_svnmerge.py revision
    180.  Note that I changed the name of the file.
  This tests the revision range and merge interval code.