Package org.tmatesoft.svn.core.wc2

## Class SvnMerge

- java.lang.Object
- - org.tmatesoft.svn.core.wc2.SvnOperation<java.lang.Void>
  - - org.tmatesoft.svn.core.wc2.SvnMerge

- All Implemented Interfaces:
    `ISvnOperationOptionsProvider`

      public class SvnMerge
      extends SvnOperation<java.lang.Void>

  Represents merge operation. There are three possible cases of merge operation. If revision ranges (`ranges`) are provided, merges the changes between `source` in its `pegRevision`, as it changed between the `ranges` in to the working copy path defined in operation's `target`. If revision ranges are not provided, merges changes from `firstSource`/its `pegRevision` to `secondSource`/its `pegRevision` into the working copy path defined in operation's `target`. The third case is if `reintegrate` is `true` performs a reintegration merge of `source` at its `pegRevision` into working copy `target`.
  - Merge between sources/revision ranges, no reintegration.

    If `depth` is `SVNDepth.INFINITY`, merges fully recursively. Else if `SVNDepth.IMMEDIATES`, merges changes at most to files that are immediate children of `target` and to directory properties of `target` and its immediate subdirectory children. Else if `SVNDepth.FILES`, merges at most to immediate file children of `target` and to `target` itself. Else if `SVNDepth.EMPTY`, applies changes only to `target` (i.e., directory property changes only).

    If `depth` is `SVNDepth.UNKNOWN`, uses the depth of `target`.

    Uses `ignoreAncestry` to control whether or not items being diffed will be checked for relatedness first. Unrelated items are typically transmitted to the editor as a deletion of one thing and the addition of another, but if this flag is `false`, unrelated items will be diffed as if they were related.

    If `force` is not set and the merge involves deleting locally modified or unversioned items the operation will fail. If `force` is set such items will be deleted.

    Merge options `mergeOptions` is a collection of `SVNDiffOptions`, they are used to pass arguments to the merge processes (internal or external).

    If the caller's `ISVNEventHandler` is not `null`, then it will be called once for each merged target.

    If `recordOnly` is `true`, the merge isn't actually performed, but the mergeinfo for the revisions which would've been merged is recorded in the working copy (and must be subsequently committed back to the repository).

    If `dryRun` is `true`, the merge is carried out, and full notification feedback is provided, but the working copy is not modified.
    - Merge between revision ranges.

      `Ranges` is a collection of `SvnRevisionRange` ranges. These ranges may describe additive and/or subtractive merge ranges, they may overlap fully or partially, and/or they may partially or fully negate each other. This range list is not required to be sorted.
    - Merge between two sources.

      `FirstSource` and `secondSource` must both represent the same node kind - that is, if `firstSource` is a directory, `secondSource` must also be, and if `firstSource` is a file, `secondSource` must also be.
  - Reintegration merge.

    This kind of merge should be used for back merging (for example, merging branches back to trunk, in which case merge is carried out by comparing the latest trunk tree with the latest branch tree; i.e. the resulting difference is exactly the branch changes which will go back to trunk).

    Destination `target` must be a single-revision, `SVNDepth.INFINITY`, pristine, unswitched working copy - in other words, it must reflect a single revision tree, the "target". The mergeinfo on `source` must reflect that all of the target has been merged into it.

    The depth of the merge is always `SVNDepth.INFINITY`.

    If `source`'s `pegRevision` is `null` or `invalid`, then it defaults to `SVNRevision.HEAD`.

  Note: this operation requires repository access.

  `SvnOperation.run()` method throws org.tmatesoft.svn.core.SVNException in the following cases:
  exception with `SVNErrorCode.CLIENT_BAD_REVISION`- If any revision in the list of provided ranges is `invalid`
  exception with `SVNErrorCode.CLIENT_BAD_REVISION` error code - if either `firstSource`'s `pegRevision` or `firstSource`'s `pegRevision` is `invalid`

Version:
  1.7
Author:
  TMate Software Ltd.

- - ### Constructor Summary

    Constructors
    Modifier | Constructor | Description
    --- | --- | ---
    `protected` | `SvnMerge​(SvnOperationFactory factory)` |

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `addRevisionRange​(SvnRevisionRange range)` | Adds the revision range to collection of revision ranges for merging.
    `SvnTarget` | `getFirstSource()` | Returns first source for merge between two sources.
    `SVNDiffOptions` | `getMergeOptions()` | Returns the operation's merge options controlling white-spaces and eol-styles.
    `java.util.Collection<SvnRevisionRange>` | `getRevisionRanges()` | Returns the collection of `SvnRevisionRange` ranges.
    `SvnTarget` | `getSecondSource()` | Returns second source for merge between two sources.
    `SvnTarget` | `getSource()` | Returns source for merge between revisions and reintegrate merge.
    `boolean` | `isAllowMixedRevisions()` | Returns whether to allow merge target to have mixed revisions.
    `boolean` | `isChangesWorkingCopy()` | Gets whether the operation changes working copy
    `boolean` | `isDryRun()` | Returns whether the merge is carried out, and full notification feedback is provided, but the working copy is not modified.
    `boolean` | `isForce()` | Returns whether to fail if merge involves deleting locally modified or unversioned items.
    `boolean` | `isIgnoreAncestry()` | Returns whether or not items being diffed will be checked for relatedness first.
    `boolean` | `isIgnoreMergeInfo()` |
    `boolean` | `isRecordOnly()` | Returns whether the merge isn't actually performed, but the mergeinfo for the revisions which would've been merged is recorded in the working copy (and must be subsequently committed back to the repository).
    `boolean` | `isReintegrate()` | Returns whether it is reintegrate merge.
    `void` | `setAllowMixedRevisions​(boolean allowMixedRevisions)` | Sets whether to allow merge target to have mixed revisions.
    `void` | `setDryRun​(boolean dryRun)` | Sets whether the merge is carried out, and full notification feedback is provided, but the working copy is not modified.
    `void` | `setForce​(boolean force)` | Sets whether to fail if merge involves deleting locally modified or unversioned items.
    `void` | `setIgnoreAncestry​(boolean ignoreAncestry)` | Sets whether or not items being diffed will be checked for relatedness first.
    `void` | `setIgnoreMergeInfo​(boolean ignoreMergeInfo)` |
    `void` | `setMergeOptions​(SVNDiffOptions mergeOptions)` | Sets the operation's merge options controlling white-spaces and eol-styles.
    `void` | `setRecordOnly​(boolean recordOnly)` | Sets whether the merge isn't actually performed, but the mergeinfo for the revisions which would've been merged is recorded in the working copy (and must be subsequently committed back to the repository).
    `void` | `setSource​(SvnTarget source, boolean reintegrate)` | Sets source of the merge with reintegrate flag.
    `void` | `setSources​(SvnTarget source1, SvnTarget source2)` | Sets first and seconds sources of the merge.

    - ### Methods inherited from class org.tmatesoft.svn.core.wc2.SvnOperation

      `addTarget, cancel, ensureArgumentsAreValid, ensureEnoughTargets, ensureHomohenousTargets, getApplicableChangelists, getAuthenticationManager, getCanceller, getDepth, getEventHandler, getFirstTarget, getMaximumTargetsCount, getMinimumTargetsCount, getOperationalWorkingCopy, getOperationFactory, getOptions, getRepositoryPool, getRevision, getSqliteJournalMode, getTargets, hasFileTargets, hasLocalTargets, hasRemoteTargets, initDefaults, isCancelled, isSleepForTimestamp, isUseParentWcFormat, needsHomohenousTargets, run, setApplicalbeChangelists, setDepth, setRevision, setSingleTarget, setSleepForTimestamp, setSqliteJournalMode`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### SvnMerge

          protected SvnMerge​(SvnOperationFactory factory)

  - ### Method Detail

    - #### addRevisionRange

          public void addRevisionRange​(SvnRevisionRange range)

      Adds the revision range to collection of revision ranges for merging.
      Parameters:
        `range` - revision range for merge
      See Also:
        `getRevisionRanges()`

    - #### getRevisionRanges

          public java.util.Collection<SvnRevisionRange> getRevisionRanges()

      Returns the collection of `SvnRevisionRange` ranges. These ranges may describe additive and/or subtractive merge ranges, they may overlap fully or partially, and/or they may partially or fully negate each other. This range list is not required to be sorted.
      Returns:
        revision ranges of the merge

    - #### setSource

          public void setSource​(SvnTarget source,
                                boolean reintegrate)

      Sets source of the merge with reintegrate flag. This `source` is used in merge between revisions and reintegrate merge.
      Parameters:
        `source` - of merge
        `reintegrate` - `true` if it is reintegrate merge, otherwise `false`
      See Also:
        `isReintegrate()`

    - #### setSources

          public void setSources​(SvnTarget source1,
                                 SvnTarget source2)

      Sets first and seconds sources of the merge. Those sources are used in merge between two sources.
      Parameters:
        `source1` - first source
        `source2` - second source

    - #### getSource

          public SvnTarget getSource()

      Returns source for merge between revisions and reintegrate merge.
      Returns:
        merge source

    - #### getFirstSource

          public SvnTarget getFirstSource()

      Returns first source for merge between two sources.
      Returns:
        first source of merge

    - #### getSecondSource

          public SvnTarget getSecondSource()

      Returns second source for merge between two sources.
      Returns:
        first source of merge

    - #### isReintegrate

          public boolean isReintegrate()

      Returns whether it is reintegrate merge. This kind of merge should be used for back merging (for example, merging branches back to trunk, in which case merge is carried out by comparing the latest trunk tree with the latest branch tree; i.e. the resulting difference is exactly the branch changes which will go back to trunk).
      Returns:
        `true` if it is reintegrate merge, otherwise `false`

    - #### isIgnoreMergeInfo

          public boolean isIgnoreMergeInfo()

    - #### setIgnoreMergeInfo

          public void setIgnoreMergeInfo​(boolean ignoreMergeInfo)

    - #### isIgnoreAncestry

          public boolean isIgnoreAncestry()

      Returns whether or not items being diffed will be checked for relatedness first. Unrelated items are typically transmitted to the editor as a deletion of one thing and the addition of another, but if this flag is `false`, unrelated items will be diffed as if they were related.
      Returns:
        `true` if ancestry should be ignored, otherwise `false`

    - #### setIgnoreAncestry

          public void setIgnoreAncestry​(boolean ignoreAncestry)

      Sets whether or not items being diffed will be checked for relatedness first. Unrelated items are typically transmitted to the editor as a deletion of one thing and the addition of another, but if this flag is `false`, unrelated items will be diffed as if they were related.
      Parameters:
        `ignoreAncestry` - `true` if ancestry should be ignored, otherwise `false`

    - #### isForce

          public boolean isForce()

      Returns whether to fail if merge involves deleting locally modified or unversioned items. If `force` is `true` such items will be deleted, otherwise operation will fail.
      Returns:
        `true` if operation should be forced to run, otherwise `false`

    - #### setForce

          public void setForce​(boolean force)

      Sets whether to fail if merge involves deleting locally modified or unversioned items. If `force` is `true` such items will be deleted, otherwise operation will fail.
      Parameters:
        `force` - `true` if operation should be forced to run, otherwise `false`

    - #### isRecordOnly

          public boolean isRecordOnly()

      Returns whether the merge isn't actually performed, but the mergeinfo for the revisions which would've been merged is recorded in the working copy (and must be subsequently committed back to the repository).
      Returns:
        `true` if operation should record only the result of merge - mergeinfo data, otherwise `false`

    - #### setRecordOnly

          public void setRecordOnly​(boolean recordOnly)

      Sets whether the merge isn't actually performed, but the mergeinfo for the revisions which would've been merged is recorded in the working copy (and must be subsequently committed back to the repository).
      Parameters:
        `recordOnly` - `true` if operation should record only the result of merge - mergeinfo data, otherwise `false`

    - #### isDryRun

          public boolean isDryRun()

      Returns whether the merge is carried out, and full notification feedback is provided, but the working copy is not modified.
      Returns:
        `true` if the operation should only find out if a file can be merged successfully, otherwise `false`

    - #### setDryRun

          public void setDryRun​(boolean dryRun)

      Sets whether the merge is carried out, and full notification feedback is provided, but the working copy is not modified.
      Parameters:
        `dryRun` - `true` if the operation should only find out if a file can be merged successfully, otherwise `false`

    - #### isAllowMixedRevisions

          public boolean isAllowMixedRevisions()

      Returns whether to allow merge target to have mixed revisions. If set to `false` and target has mixed revisions, `SVNException` is thrown with error codes `SVNErrorCode.CLIENT_NOT_READY_TO_MERGE` or `SVNErrorCode.CLIENT_MERGE_UPDATE_REQUIRED`.
      Returns:
        `true` if operation allows merging to mixed-revision working copy, otherwise `false`
      Since:
        1.7, SVN 1.7

    - #### setAllowMixedRevisions

          public void setAllowMixedRevisions​(boolean allowMixedRevisions)

      Sets whether to allow merge target to have mixed revisions. If set to `false` and target has mixed revisions, `SVNException` is thrown with error codes `SVNErrorCode.CLIENT_NOT_READY_TO_MERGE` or `SVNErrorCode.CLIENT_MERGE_UPDATE_REQUIRED`.
      Parameters:
        `allowMixedRevisions` - `true` if operation allows merging to mixed-revision working copy, otherwise `false`
      Since:
        1.7, SVN 1.7

    - #### getMergeOptions

          public SVNDiffOptions getMergeOptions()

      Returns the operation's merge options controlling white-spaces and eol-styles.
      Returns:
        merge options of the operation

    - #### setMergeOptions

          public void setMergeOptions​(SVNDiffOptions mergeOptions)

      Sets the operation's merge options controlling white-spaces and eol-styles.
      Parameters:
        `mergeOptions` - merge options of the operation

    - #### isChangesWorkingCopy

          public boolean isChangesWorkingCopy()

      Gets whether the operation changes working copy
      Overrides:
        `isChangesWorkingCopy` in class `SvnOperation<java.lang.Void>`
      Returns:
        `true` if the operation changes the working copy, otherwise `false`