| /* |
| * Copyright 2000-2012 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.jetbrains.idea.svn.history; |
| |
| import com.intellij.openapi.util.text.StringUtil; |
| import org.jetbrains.idea.svn.SvnUtil; |
| import org.tmatesoft.svn.core.SVNException; |
| import org.tmatesoft.svn.core.internal.util.SVNPathUtil; |
| |
| import java.util.Map; |
| |
| /** |
| * Created with IntelliJ IDEA. |
| * User: Irina.Chernushina |
| * Date: 8/30/12 |
| * Time: 5:18 PM |
| * |
| * We consider here, that history is traversed "from now to past" |
| */ |
| public class SvnPathThroughHistoryCorrection implements LogEntryConsumer { |
| private String myBefore; |
| private String myPath; |
| private LogEntryPath myDirectlyMentioned; |
| private boolean myRoot; |
| |
| public SvnPathThroughHistoryCorrection(String path) { |
| myPath = path; |
| myBefore = path; |
| myRoot = StringUtil.isEmpty(path); |
| } |
| |
| @Override |
| public void consume(LogEntry logEntry) throws SVNException { |
| if (myRoot) { |
| return; |
| } |
| myBefore = myPath; |
| myDirectlyMentioned = null; |
| final Map<String,LogEntryPath> paths = logEntry.getChangedPaths(); |
| final LogEntryPath entryPath = paths.get(myPath); |
| if (entryPath != null) { |
| myDirectlyMentioned = entryPath; |
| // exact match |
| if (entryPath.getCopyPath() != null) { |
| myPath = entryPath.getCopyPath(); |
| return; |
| } |
| } |
| for (LogEntryPath path : paths.values()) { |
| // "the origin path *from where* the item, ..." |
| // TODO: this could incorrectly handle case when parent folder was replaced - see IDEA-103042 |
| // TODO: or several parent folder renames occur IDEA-96825 |
| final String copyPath = path.getCopyPath(); |
| if (copyPath != null) { |
| final String thisEntryPath = path.getPath(); |
| if (parentPathChanged(copyPath, thisEntryPath)) { |
| return; |
| } |
| } |
| } |
| } |
| |
| private boolean parentPathChanged(String copyPath, String thisEntryPath) throws SVNException { |
| if (SVNPathUtil.isAncestor(thisEntryPath, myPath)) { |
| final String relativePath = SVNPathUtil.getRelativePath(thisEntryPath, myPath); |
| myPath = SvnUtil.appendMultiParts(copyPath, relativePath); |
| return true; |
| } |
| return false; |
| } |
| |
| public String getBefore() { |
| return myBefore; |
| } |
| |
| public LogEntryPath getDirectlyMentioned() { |
| return myDirectlyMentioned; |
| } |
| |
| public String getCurrentPath() { |
| return myPath; |
| } |
| |
| public boolean isRoot() { |
| return myRoot; |
| } |
| } |