Class RenameDetector

java.lang.Object
org.eclipse.jgit.diff.RenameDetector

public class RenameDetector extends Object
Detect and resolve object renames.
  • Field Details

    • EXACT_RENAME_SCORE

      private static final int EXACT_RENAME_SCORE
      See Also:
    • DIFF_COMPARATOR

      private static final Comparator<DiffEntry> DIFF_COMPARATOR
    • entries

      private List<DiffEntry> entries
    • deleted

      private List<DiffEntry> deleted
    • added

      private List<DiffEntry> added
    • done

      private boolean done
    • objectReader

      private final ObjectReader objectReader
    • renameScore

      private int renameScore
      Similarity score required to pair an add/delete as a rename.
    • breakScore

      private int breakScore
      Similarity score required to keep modified file pairs together. Any modified file pairs with a similarity score below this will be broken apart.
    • renameLimit

      private int renameLimit
      Limit in the number of files to consider for renames.
    • bigFileThreshold

      private int bigFileThreshold
      File size threshold (in bytes) for detecting renames. Files larger than this size will not be processed for renames.
    • skipContentRenamesForBinaryFiles

      private boolean skipContentRenamesForBinaryFiles
      Skip detecting content renames for binary files. Content renames are those that are not exact, that is with a slight content modification between the two files.
    • overRenameLimit

      private boolean overRenameLimit
      Set if the number of adds or deletes was over the limit.
  • Constructor Details

    • RenameDetector

      public RenameDetector(Repository repo)
      Create a new rename detector for the given repository
      Parameters:
      repo - the repository to use for rename detection
    • RenameDetector

      public RenameDetector(ObjectReader reader, DiffConfig cfg)
      Create a new rename detector with a specified reader and diff config.
      Parameters:
      reader - reader to obtain objects from the repository with.
      cfg - diff config specifying rename detection options.
      Since:
      3.0
  • Method Details

    • getRenameScore

      public int getRenameScore()
      Get rename score
      Returns:
      minimum score required to pair an add/delete as a rename. The score ranges are within the bounds of (0, 100).
    • setRenameScore

      public void setRenameScore(int score)
      Set the minimum score required to pair an add/delete as a rename.

      When comparing two files together their score must be greater than or equal to the rename score for them to be considered a rename match. The score is computed based on content similarity, so a score of 60 implies that approximately 60% of the bytes in the files are identical.

      Parameters:
      score - new rename score, must be within [0, 100].
      Throws:
      IllegalArgumentException - the score was not within [0, 100].
    • getBreakScore

      public int getBreakScore()
      Get break score
      Returns:
      the similarity score required to keep modified file pairs together. Any modify pairs that score below this will be broken apart into separate add/deletes. Values less than or equal to zero indicate that no modifies will be broken apart. Values over 100 cause all modify pairs to be broken.
    • setBreakScore

      public void setBreakScore(int breakScore)
      Set break score
      Parameters:
      breakScore - the similarity score required to keep modified file pairs together. Any modify pairs that score below this will be broken apart into separate add/deletes. Values less than or equal to zero indicate that no modifies will be broken apart. Values over 100 cause all modify pairs to be broken.
    • getRenameLimit

      public int getRenameLimit()
      Get rename limit
      Returns:
      limit on number of paths to perform inexact rename detection
    • setRenameLimit

      public void setRenameLimit(int limit)
      Set the limit on the number of files to perform inexact rename detection.

      The rename detector has to build a square matrix of the rename limit on each side, then perform that many file compares to determine similarity. If 1000 files are added, and 1000 files are deleted, a 1000*1000 matrix must be allocated, and 1,000,000 file compares may need to be performed.

      Parameters:
      limit - new file limit. 0 means no limit; a negative number means no inexact rename detection will be performed, only exact rename detection.
    • getBigFileThreshold

      public int getBigFileThreshold()
      Get file size threshold for detecting renames. Files larger than this size will not be processed for rename detection.
      Returns:
      threshold in bytes of the file size.
      Since:
      5.12
    • setBigFileThreshold

      public void setBigFileThreshold(int threshold)
      Set the file size threshold for detecting renames. Files larger than this threshold will be skipped during rename detection computation.
      Parameters:
      threshold - file size threshold in bytes.
      Since:
      5.12
    • getSkipContentRenamesForBinaryFiles

      public boolean getSkipContentRenamesForBinaryFiles()
      Get skipping detecting content renames for binary files.
      Returns:
      true if content renames should be skipped for binary files, false otherwise.
      Since:
      5.12
    • setSkipContentRenamesForBinaryFiles

      public void setSkipContentRenamesForBinaryFiles(boolean value)
      Sets skipping detecting content renames for binary files.
      Parameters:
      value - true if content renames should be skipped for binary files, false otherwise.
      Since:
      5.12
    • isOverRenameLimit

      public boolean isOverRenameLimit()
      Check if the detector is over the rename limit.

      This method can be invoked either before or after getEntries has been used to perform rename detection.

      Returns:
      true if the detector has more file additions or removals than the rename limit is currently set to. In such configurations the detector will skip expensive computation.
    • addAll

      public void addAll(Collection<DiffEntry> entriesToAdd)
      Add entries to be considered for rename detection.
      Parameters:
      entriesToAdd - one or more entries to add.
      Throws:
      IllegalStateException - if getEntries was already invoked.
    • add

      public void add(DiffEntry entry)
      Add an entry to be considered for rename detection.
      Parameters:
      entry - to add.
      Throws:
      IllegalStateException - if getEntries was already invoked.
    • compute

      public List<DiffEntry> compute() throws IOException
      Detect renames in the current file set.

      This convenience function runs without a progress monitor.

      Returns:
      an unmodifiable list of DiffEntrys representing all files that have been changed.
      Throws:
      IOException - file contents cannot be read from the repository.
    • compute

      Detect renames in the current file set.
      Parameters:
      pm - report progress during the detection phases.
      Returns:
      an unmodifiable list of DiffEntrys representing all files that have been changed.
      Throws:
      IOException - file contents cannot be read from the repository.
      CanceledException - if rename detection was cancelled
    • compute

      Detect renames in the current file set.
      Parameters:
      reader - reader to obtain objects from the repository with.
      pm - report progress during the detection phases.
      Returns:
      an unmodifiable list of DiffEntrys representing all files that have been changed.
      Throws:
      IOException - file contents cannot be read from the repository.
      CanceledException - if rename detection was cancelled
    • compute

      Detect renames in the current file set.
      Parameters:
      reader - reader to obtain objects from the repository with.
      pm - report progress during the detection phases.
      Returns:
      an unmodifiable list of DiffEntrys representing all files that have been changed.
      Throws:
      IOException - file contents cannot be read from the repository.
      CanceledException - if rename detection was cancelled
    • reset

      public void reset()
      Reset this rename detector for another rename detection pass.
    • advanceOrCancel

      private void advanceOrCancel(ProgressMonitor pm) throws CanceledException
      Throws:
      CanceledException
    • breakModifies

      private void breakModifies(ContentSource.Pair reader, ProgressMonitor pm) throws IOException, CanceledException
      Throws:
      IOException
      CanceledException
    • rejoinModifies

      private void rejoinModifies(ProgressMonitor pm) throws CanceledException
      Throws:
      CanceledException
    • calculateModifyScore

      private int calculateModifyScore(ContentSource.Pair reader, DiffEntry d) throws IOException
      Throws:
      IOException
    • findContentRenames

      private void findContentRenames(ContentSource.Pair reader, ProgressMonitor pm) throws IOException, CanceledException
      Throws:
      IOException
      CanceledException
    • findExactRenames

      private void findExactRenames(ProgressMonitor pm) throws CanceledException
      Throws:
      CanceledException
    • bestPathMatch

      private static DiffEntry bestPathMatch(DiffEntry src, List<DiffEntry> list)
      Find the best match by file path for a given DiffEntry from a list of DiffEntrys. The returned DiffEntry will be of the same type as . If no DiffEntry can be found that has the same type, this method will return null.
      Parameters:
      src - the DiffEntry to try to find a match for
      list - a list of DiffEntrys to search through
      Returns:
      the DiffEntry from who's file path best matches
    • populateMap

      private HashMap<AbbreviatedObjectId,Object> populateMap(List<DiffEntry> diffEntries, ProgressMonitor pm) throws CanceledException
      Throws:
      CanceledException
    • path

      private static String path(DiffEntry de)
    • mode

      private static FileMode mode(DiffEntry de)
    • id

      private static AbbreviatedObjectId id(DiffEntry de)
    • sameType

      static boolean sameType(FileMode a, FileMode b)
    • exactRename

      private static DiffEntry exactRename(DiffEntry src, DiffEntry dst)
    • exactCopy

      private static DiffEntry exactCopy(DiffEntry src, DiffEntry dst)