diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnHistoryProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnHistoryProvider.java index 0e274c011fbc..2cf5c5c7dc7f 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnHistoryProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/history/SvnHistoryProvider.java @@ -44,8 +44,6 @@ import org.jetbrains.idea.svn.SvnVcs; import org.tmatesoft.svn.core.*; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; -import org.tmatesoft.svn.core.io.SVNRepository; -import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.core.wc.*; import org.tmatesoft.svn.util.SVNLogType; @@ -301,7 +299,7 @@ public class SvnHistoryProvider .doLog(new File[]{new File(myFile.getIOFile().getAbsolutePath())}, myFrom == null ? SVNRevision.HEAD : myFrom, myTo == null ? SVNRevision.create(1) : myTo, myPeg, false, true, mySupport15, myLimit, null, - new MyLogEntryHandler(myVcs, myUrl, pegRevision, relativeUrl, myConsumer, repoRootURL, myFile.getCharset())); + new MyLogEntryHandler(myVcs, myUrl, pegRevision, relativeUrl, createConsumerAdapter(myConsumer), repoRootURL, myFile.getCharset())); } catch (SVNCancelException e) { // @@ -315,6 +313,15 @@ public class SvnHistoryProvider } } + private static ThrowableConsumer createConsumerAdapter(final Consumer consumer) { + return new ThrowableConsumer() { + @Override + public void consume(VcsFileRevision revision) throws SVNException { + consumer.consume(revision); + } + }; + } + private static class RepositoryLoader extends LogLoader { private final boolean myForceBackwards; @@ -339,13 +346,17 @@ public class SvnHistoryProvider if (myPI != null) { myPI.setText2(SvnBundle.message("progress.text2.changes.establishing.connection", myUrl)); } - if (myForceBackwards) { - loadBackwards(); - return; - } - SVNWCClient wcClient = myVcs.createWCClient(); try { + if (myForceBackwards) { + SVNURL svnurl = SVNURL.parseURIEncoded(myUrl); + if (! existsNow(svnurl)) { + loadBackwards(svnurl); + return; + } + } + + SVNWCClient wcClient = myVcs.createWCClient(); final SVNURL svnurl = SVNURL.parseURIEncoded(myUrl); SVNInfo info = null; SVNRevision operationalFrom = myFrom == null ? SVNRevision.HEAD : myFrom; @@ -356,9 +367,9 @@ public class SvnHistoryProvider relativeUrl = myUrl.substring(root.length()); } SVNLogClient client = myVcs.createLogClient(); - client.doLog(svnurl, new String[]{}, myPeg, + client.doLog(svnurl, new String[]{}, myPeg == null ? myFrom : myPeg, operationalFrom, myTo == null ? SVNRevision.create(1) : myTo, false, true, mySupport15, myLimit, null, - new RepositoryLogEntryHandler(myVcs, myUrl, SVNRevision.UNDEFINED, relativeUrl, myConsumer, + new RepositoryLogEntryHandler(myVcs, myUrl, SVNRevision.UNDEFINED, relativeUrl, createConsumerAdapter(myConsumer), info.getRepositoryRootURL())); } catch (SVNCancelException e) { @@ -372,11 +383,8 @@ public class SvnHistoryProvider } } - private void loadBackwards() { - try { - final SVNURL svnurl = SVNURL.parseURIEncoded(myUrl); - SVNRevision operationalFrom = myFrom == null ? SVNRevision.HEAD : myFrom; - final SVNURL rootURL = getRepositoryRoot(svnurl, operationalFrom); + private void loadBackwards(SVNURL svnurl) throws SVNException, VcsException { + final SVNURL rootURL = getRepositoryRoot(svnurl, myFrom); final String root = rootURL.toString(); String relativeUrl = myUrl; if (myUrl.startsWith(root)) { @@ -386,35 +394,50 @@ public class SvnHistoryProvider SVNLogClient client = myVcs.createLogClient(); final RepositoryLogEntryHandler repositoryLogEntryHandler = - new RepositoryLogEntryHandler(myVcs, myUrl, SVNRevision.UNDEFINED, relativeUrl, myConsumer, rootURL); + new RepositoryLogEntryHandler(myVcs, myUrl, SVNRevision.UNDEFINED, relativeUrl, + new ThrowableConsumer() { + @Override + public void consume(VcsFileRevision revision) throws SVNException { + myConsumer.consume(revision); + throw new SVNCancelException(); // load only one revision + } + }, rootURL); repositoryLogEntryHandler.setThrowCancelOnMeetPathCreation(true); - SVNRevision current = operationalFrom; - client.doLog(rootURL, new String[]{}, current, myTo, current, false, true, mySupport15, myLimit, null, repositoryLogEntryHandler); - } - catch (SVNCancelException e) { - // - } - catch (SVNException e) { - myException = new VcsException(e); - } - catch (VcsException e) { - myException = e; - } + client.doLog(rootURL, new String[]{}, myFrom, myFrom, myTo == null ? SVNRevision.create(1) : myTo, false, true, mySupport15, 0, null, repositoryLogEntryHandler); } private SVNURL getRepositoryRoot(SVNURL svnurl, SVNRevision operationalFrom) throws SVNException { - final SVNWCClient wcClient = myVcs.createWCClient(); + return myVcs.createRepository(svnurl).getRepositoryRoot(false); + /*final SVNWCClient wcClient = myVcs.createWCClient(); try { final SVNInfo info; info = wcClient.doInfo(svnurl, myPeg, operationalFrom); return info.getRepositoryRootURL(); } catch (SVNException e) { - final SVNInfo info; - info = wcClient.doInfo(svnurl, SVNRevision.UNDEFINED, SVNRevision.UNDEFINED); - return info.getRepositoryRootURL(); + try { + final SVNInfo info; + info = wcClient.doInfo(svnurl, SVNRevision.UNDEFINED, SVNRevision.UNDEFINED); + return info.getRepositoryRootURL(); + } catch (SVNException e1) { + final SVNInfo info; + info = wcClient.doInfo(svnurl, SVNRevision.UNDEFINED, SVNRevision.HEAD); + return info.getRepositoryRootURL(); + } + }*/ + } + + private boolean existsNow(SVNURL svnurl) { + final SVNWCClient wcClient = myVcs.createWCClient(); + final SVNInfo info; + try { + info = wcClient.doInfo(svnurl, SVNRevision.HEAD, SVNRevision.HEAD); } + catch (SVNException e) { + return false; + } + return info != null && info.getURL() != null; } } @@ -433,9 +456,9 @@ public class SvnHistoryProvider private static class MyLogEntryHandler implements ISVNLogEntryHandler { private final ProgressIndicator myIndicator; protected final SvnVcs myVcs; - private String myLastPath; + protected String myLastPath; private final Charset myCharset; - protected final Consumer myResult; + protected final ThrowableConsumer myResult; private VcsFileRevision myPrevious; private final SVNRevision myPegRevision; protected final String myUrl; @@ -450,7 +473,7 @@ public class SvnHistoryProvider public MyLogEntryHandler(SvnVcs vcs, final String url, final SVNRevision pegRevision, String lastPath, - final Consumer result, + final ThrowableConsumer result, SVNURL repoRootURL, Charset charset) throws SVNException, VcsException { myVcs = vcs; @@ -480,15 +503,20 @@ public class SvnHistoryProvider String path = SVNPathUtil.removeTail(myLastPath); while (path.length() > 0) { entryPath = (SVNLogEntryPath)logEntry.getChangedPaths().get(path); - if (entryPath != null) { + if (entryPath != null && (entryPath.getType() == 'A' || entryPath.getType() == 'D')) { String relativePath = myLastPath.substring(entryPath.getPath().length()); - copyPath = entryPath.getCopyPath() + relativePath; + if (entryPath.getCopyPath() != null) { + copyPath = entryPath.getCopyPath() + relativePath; + } break; } path = SVNPathUtil.removeTail(path); } } - if (entryPath == null) return; // skip this revision: no our path in it + if (entryPath == null) { + if (! checkForChildChanges(logEntry)) return; + } + //if (entryPath == null) return; // skip this revision: no our path in it final int mergeLevel = svnLogEntryIntegerPair.getSecond(); final SvnFileRevision revision = createRevision(logEntry, copyPath, entryPath); @@ -504,7 +532,7 @@ public class SvnHistoryProvider myResult.consume(revision); myPrevious = revision; } - if (myThrowCancelOnMeetPathCreation && myUrl.equals(revision.getURL()) && entryPath.getType() == 'A') { + if (myThrowCancelOnMeetPathCreation && myUrl.equals(revision.getURL()) && entryPath != null && entryPath.getType() == 'A') { throw new SVNCancelException(); } } @@ -512,6 +540,15 @@ public class SvnHistoryProvider }); } + private boolean checkForChildChanges(SVNLogEntry logEntry) { + for (String key : logEntry.getChangedPaths().keySet()) { + if (SVNPathUtil.isAncestor(myLastPath, key)) { + return true; + } + } + return false; + } + private String correctLastPathAccordingToFolderRenames(String lastPath, SVNLogEntry logEntry) { final Map paths = logEntry.getChangedPaths(); for (Map.Entry entry : paths.entrySet()) { @@ -562,7 +599,7 @@ public class SvnHistoryProvider public RepositoryLogEntryHandler(final SvnVcs vcs, final String url, final SVNRevision pegRevision, String lastPath, - final Consumer result, + final ThrowableConsumer result, SVNURL repoRootURL) throws VcsException, SVNException { super(vcs, url, pegRevision, lastPath, result, repoRootURL, null); @@ -571,7 +608,8 @@ public class SvnHistoryProvider @Override protected SvnFileRevision createRevision(final SVNLogEntry logEntry, final String copyPath, SVNLogEntryPath entryPath) throws SVNException { - final SVNURL url = myRepositoryRoot.appendPath(entryPath.getPath(), true); + final SVNURL url = entryPath == null ? myRepositoryRoot.appendPath(myLastPath, true) : + myRepositoryRoot.appendPath(entryPath.getPath(), true); return new SvnFileRevision(myVcs, SVNRevision.UNDEFINED, logEntry, url.toString(), copyPath, null); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/treeConflict/TreeConflictRefreshablePanel.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/treeConflict/TreeConflictRefreshablePanel.java index 62e0916d628e..b0890e4bef00 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/treeConflict/TreeConflictRefreshablePanel.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/treeConflict/TreeConflictRefreshablePanel.java @@ -27,19 +27,15 @@ import com.intellij.openapi.vcs.FilePathImpl; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.*; import com.intellij.openapi.vcs.history.*; -import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; import com.intellij.util.BeforeAfter; -import com.intellij.util.ThrowableRunnable; +import com.intellij.util.containers.Convertor; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.VcsBackgroundTask; -import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.ConflictedSvnChange; import org.jetbrains.idea.svn.SvnRevisionNumber; -import org.jetbrains.idea.svn.SvnUtil; import org.jetbrains.idea.svn.SvnVcs; import org.jetbrains.idea.svn.history.SvnHistoryProvider; import org.jetbrains.idea.svn.history.SvnHistorySession; -import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNNodeKind; import org.tmatesoft.svn.core.internal.wc.SVNConflictVersion; @@ -52,7 +48,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.List; /** @@ -123,60 +118,44 @@ public class TreeConflictRefreshablePanel extends AbstractRefreshablePanel { if (myChange.getBeforeRevision() != null) { myCommittedRevision = SvnHistorySession.getCurrentCommittedRevision(myVcs, myPath.getIOFile()); } - final SVNRevision pegFromLeft = description.getSourceLeftVersion() == null ? - null : SVNRevision.create(description.getSourceLeftVersion().getPegRevision()); - ConflictSidePresentation rightSide = createSide(description.getSourceRightVersion(), pegFromLeft, false); - final SidesProcessorMarker marker; - ConflictSidePresentation leftSide; - if (description.getSourceLeftVersion() != null && description.getSourceRightVersion() != null && - ! Comparing.equal(description.getSourceLeftVersion().getPath(), description.getSourceRightVersion().getPath())) { - leftSide = createSide(description.getSourceLeftVersion(), pegFromLeft, true); - marker = new TwoSidesProcessor((AbstractConflictSide) leftSide, (AbstractConflictSide) rightSide, UniversalComparator.getInstance()); - } else { - leftSide = EmptyConflictSide.getInstance(); - if (rightSide instanceof AbstractConflictSide) { - marker = new OneSideProcessor( - description.getSourceLeftVersion() == null ? SVNRevision.create(1) : SVNRevision.create(description.getSourceLeftVersion().getPegRevision()), (AbstractConflictSide) rightSide); + boolean differentURLs = description.getSourceLeftVersion() != null && description.getSourceRightVersion() != null && + ! Comparing.equal(description.getSourceLeftVersion().getPath(), description.getSourceRightVersion().getPath()); + + ConflictSidePresentation leftSide = null; + ConflictSidePresentation rightSide = null; + try { + if (differentURLs) { + leftSide = createSide(description.getSourceLeftVersion(), null, true); + rightSide = createSide(description.getSourceRightVersion(), null, false); + leftSide.load(); + rightSide.load(); } else { - marker = SidesProcessorMarker.EMPTY; + //only one side + leftSide = EmptyConflictSide.getInstance(); + final SVNRevision pegFromLeft = description.getSourceLeftVersion() == null ? + null : SVNRevision.create(description.getSourceLeftVersion().getPegRevision()); + rightSide = createSide(description.getSourceRightVersion(), pegFromLeft, false); + rightSide.load(); + return new BeforeAfter(leftSide, rightSide); + } + } catch (SVNException e) { + throw new VcsException(e); + } finally { + if (leftSide != null) { + myChildDisposables.add(leftSide); + } + if (rightSide != null) { + myChildDisposables.add(rightSide); } } - marker.run(); - myChildDisposables.add(leftSide); - myChildDisposables.add(rightSide); + return new BeforeAfter(leftSide, rightSide); } - private static class UniversalComparator implements Comparator { - private final static UniversalComparator ourComparator = new UniversalComparator(); - - public static UniversalComparator getInstance() { - return ourComparator; - } - - @Override - public int compare(Object o1, Object o2) { - long number1 = get(o1).getNumber(); - long number2 = get(o2).getNumber(); - return number1 < number2 ? -1 : (number1 == number2 ? 0 : 1); - } - - private SVNRevision get(final Object o) { - if (o instanceof VcsFileRevision) { - return ((SvnRevisionNumber) ((VcsFileRevision) o).getRevisionNumber()).getRevision(); - } - if (o instanceof CommittedChangeList) { - return SVNRevision.create(((CommittedChangeList) o).getNumber()); - } - assert true; - return null; - } - } - - private ConflictSidePresentation createSide(SVNConflictVersion version, final SVNRevision pegFromLeft, final boolean isLeft) throws VcsException { + private ConflictSidePresentation createSide(SVNConflictVersion version, final SVNRevision untilThisOther, final boolean isLeft) throws VcsException { if (version == null) return EmptyConflictSide.getInstance(); SvnRevisionNumber number = null; - if (myChange.getBeforeRevision() != null) { + if (myChange.getBeforeRevision() != null && myCommittedRevision != null) { number = (SvnRevisionNumber) myCommittedRevision; if (isLeft && number.getRevision().isValid() && number.getRevision().getNumber() == version.getPegRevision()) { return EmptyConflictSide.getInstance(); @@ -188,7 +167,7 @@ public class TreeConflictRefreshablePanel extends AbstractRefreshablePanel { } else { return new HistoryConflictSide(myVcs, version); }*/ - return new HistoryConflictSide(myVcs, version, number == null ? pegFromLeft : number.getRevision()); + return new HistoryConflictSide(myVcs, version, untilThisOther); } @Override @@ -267,27 +246,6 @@ public class TreeConflictRefreshablePanel extends AbstractRefreshablePanel { }; } - private void acceptOne(final SVNTreeConflictDescription description, final SVNConflictChoice choice, final String title) { - ProgressManager.getInstance().run(new VcsBackgroundTask(myVcs.getProject(), title + myPath, - BackgroundFromStartOption.getInstance(), Collections.singletonList(description), true) { - @Override - protected void process(SVNTreeConflictDescription d) throws VcsException { - try { - myVcs.createWCClient().doResolve(d.getPath(), SVNDepth.INFINITY, choice); - } - catch (SVNException e1) { - throw new VcsException(e1); - } - VcsDirtyScopeManager dirtyScopeManager = VcsDirtyScopeManager.getInstance(myProject); - if (myPath.isDirectory()) { - dirtyScopeManager.dirDirtyRecursively(myPath); - } else { - dirtyScopeManager.fileDirty(myPath); - } - } - }); - } - private ActionListener createLeft(final SVNTreeConflictDescription description) { return new ActionListener() { @Override @@ -358,6 +316,7 @@ public class TreeConflictRefreshablePanel extends AbstractRefreshablePanel { private interface ConflictSidePresentation extends Disposable { JPanel createPanel(); + void load() throws SVNException, VcsException; } private static class EmptyConflictSide implements ConflictSidePresentation { @@ -375,9 +334,13 @@ public class TreeConflictRefreshablePanel extends AbstractRefreshablePanel { @Override public void dispose() { } + + @Override + public void load() throws SVNException { + } } - private static abstract class AbstractConflictSide implements ConflictSidePresentation { + private static abstract class AbstractConflictSide implements ConflictSidePresentation, Convertor { protected final Project myProject; protected final SVNConflictVersion myVersion; @@ -385,191 +348,15 @@ public class TreeConflictRefreshablePanel extends AbstractRefreshablePanel { myProject = project; myVersion = version; } - - public abstract List step(StopMarker marker) throws VcsException; - public abstract void cutTo(final T t); - } - - private interface StopMarker { - boolean isEof(final List list); - } - - private static class ToRevision implements StopMarker { - private final SVNRevision myRevision; - - private ToRevision(SVNRevision revision) { - myRevision = revision; - } - - public SVNRevision getRevision() { - return myRevision; - } - - @Override - public boolean isEof(List list) { - // should be ok, check would have be like an assertion -> we asked until the revision - return true; - } - } - - private static class Portion implements StopMarker { - private final static int ourStep = 10; - - public static int getOurStep() { - return ourStep; - } - - @Override - public boolean isEof(List list) { - return list.size() < ourStep; - } - } - - private static class NoLimit implements StopMarker { - private final static NoLimit ourInstance = new NoLimit(); - - public static NoLimit getInstance() { - return ourInstance; - } - - @Override - public boolean isEof(List list) { - // we loaded all - return true; - } - } - - private interface SidesProcessorMarker extends ThrowableRunnable { - SidesProcessorMarker EMPTY = new SidesProcessorMarker() { - @Override - public void run() { - } - }; - } - - private static class OneSideProcessor implements SidesProcessorMarker { - private final AbstractConflictSide mySide; - private final SVNRevision myLimitingRevision; - - private OneSideProcessor(SVNRevision limitingRevision, AbstractConflictSide side) { - myLimitingRevision = limitingRevision; - mySide = side; - } - - @Override - public void run() throws VcsException { - mySide.step(new ToRevision(myLimitingRevision)); - } - } - - private static class TwoSidesProcessor implements SidesProcessorMarker { - private final AbstractConflictSide myLeft; - private final AbstractConflictSide myRight; - private final Comparator myComparator; - - private TwoSidesProcessor(@NotNull AbstractConflictSide left, @NotNull AbstractConflictSide right, - final Comparator comparator) { - myLeft = left; - myRight = right; - myComparator = comparator; - } - - @Override - public void run() throws VcsException { - final SteppableSide left = new SteppableSide(myLeft); - final SteppableSide right = new SteppableSide(myRight); - - left.init(); - right.init(); - - while (! left.isEof() || ! right.isEof()) { - while (left.hasNext() && right.hasNext()) { - Left leftItem = left.get(); - Right rightItem = right.get(); - int compare = myComparator.compare(leftItem, rightItem); - if (compare == 0) { - myLeft.cutTo(leftItem); - myRight.cutTo(rightItem); - return; - } else if (compare < 0) { - left.step(); - } else { - right.step(); - } - } - boolean loadLeft = ! left.hasNext(); - left.loadStep(loadLeft, right.isEof()); - right.loadStep(! loadLeft, left.isEof()); - } - } - - private static class SteppableSide { - private List myList; - private int myIdx; - private boolean myEof; - private AbstractConflictSide mySide; - - private SteppableSide(AbstractConflictSide side) { - mySide = side; - myList = Collections.emptyList(); - myEof = false; - myIdx = 0; - } - - public void init() throws VcsException { - loadPiece(false); - } - - public boolean isEof() { - return myEof; - } - - public void loadStep(final boolean forceAdvanceMe, final boolean foreignEof) throws VcsException { - if ((forceAdvanceMe || foreignEof) && ! myEof) { - loadPiece(foreignEof); - } - } - - public void step() { - ++ myIdx; - } - - public T get() { - return myList.get(myIdx); - } - - public boolean hasNext() { - return myIdx < myList.size(); - } - - private void loadPiece(boolean foreignEof) throws VcsException { - StopMarker stopMarker = foreignEof ? NoLimit.getInstance() : new Portion(); - myList = mySide.step(stopMarker); - myEof = stopMarker.isEof(myList); - myList.clear(); - myIdx = 0; - } - } - - private boolean loadPiece(boolean thisEof, boolean foreignEof, final List list) throws VcsException { - //if ((loadThis || foreignEof) && ! thisEof) { - StopMarker stopMarker = foreignEof ? NoLimit.getInstance() : new Portion(); - List step = myLeft.step(stopMarker); - thisEof = stopMarker.isEof(step); - list.clear(); - list.addAll(step); - //} - return thisEof; - } } private static class HistoryConflictSide extends AbstractConflictSide { + public static final int LIMIT = 10; private final VcsAppendableHistoryPartnerAdapter mySessionAdapter; private final SvnHistoryProvider myProvider; private final FilePath myPath; private final SvnVcs myVcs; private final SVNRevision myPeg; - private SVNRevision myRevisionTo; private FileHistoryPanelImpl myFileHistoryPanel; private HistoryConflictSide(SvnVcs vcs, SVNConflictVersion version, final SVNRevision peg) throws VcsException { @@ -585,51 +372,24 @@ public class TreeConflictRefreshablePanel extends AbstractRefreshablePanel { } mySessionAdapter = new VcsAppendableHistoryPartnerAdapter(); - mySessionAdapter.reportCreatedEmptySession(new SvnHistorySession(myVcs, Collections.emptyList(), - myPath, SvnUtil.checkRepositoryVersion15(myVcs, version.getPath()), null, true)); + /*mySessionAdapter.reportCreatedEmptySession(new SvnHistorySession(myVcs, Collections.emptyList(), + myPath, SvnUtil.checkRepositoryVersion15(myVcs, version.getPath()), null, true));*/ myProvider = (SvnHistoryProvider) myVcs.getVcsHistoryProvider(); } @Override - public List step(StopMarker marker) throws VcsException { - List list = mySessionAdapter.getSession().getRevisionList(); - int limit = 0; - SVNRevision from; - if (list.isEmpty()) { - myRevisionTo = SVNRevision.create(1); - if (marker instanceof ToRevision) { - myRevisionTo = ((ToRevision)marker).getRevision(); - } - from = SVNRevision.create(myVersion.getPegRevision()); - } else { - from = ((SvnRevisionNumber) list.get(list.size() - 1).getRevisionNumber()).getRevision(); - } - if (marker instanceof Portion) { - limit = Portion.getOurStep(); - } - - VcsAppendableHistoryPartnerAdapter adapter = new VcsAppendableHistoryPartnerAdapter(); - myProvider.reportAppendableHistory(myPath, adapter, myRevisionTo, from, limit, myPeg, true); - final List newRevisions = adapter.getSession().getRevisionList(); - list.addAll(newRevisions); - return newRevisions; + public VcsRevisionNumber convert(VcsFileRevision o) { + return o.getRevisionNumber(); } @Override - public void cutTo(VcsFileRevision endRevision) { - List list = mySessionAdapter.getSession().getRevisionList(); - int i = 0; - for (; i < list.size(); i++) { - final VcsFileRevision revision = list.get(i); - // it is same exactly object so ok if even equals is not overriden - if (endRevision.equals(revision)) { - break; - } - } - if (i < list.size()) { - final ArrayList copy = new ArrayList(list.subList(0, i + 1)); - list.clear(); - list.addAll(copy); + public void load() throws SVNException, VcsException { + SVNRevision from = SVNRevision.create(myVersion.getPegRevision()); + if (myPeg == null) { + // just a portion of history + myProvider.reportAppendableHistory(myPath, mySessionAdapter, from, myPeg, LIMIT, myPeg, true); + } else { + myProvider.reportAppendableHistory(myPath, mySessionAdapter, myPeg, from, 0, myPeg, true); } } @@ -642,13 +402,17 @@ public class TreeConflictRefreshablePanel extends AbstractRefreshablePanel { @Override public JPanel createPanel() { - // todo do not forget to call dispose - // todo remove refresh VcsAbstractHistorySession session = mySessionAdapter.getSession(); + if (session == null) return EmptyConflictSide.getInstance().createPanel(); List list = session.getRevisionList(); + if (list.isEmpty()) { + return EmptyConflictSide.getInstance().createPanel(); + } + Collections.reverse(list); VcsFileRevision last = null; - if (! list.isEmpty() && myRevisionTo.getNumber() > 0 && - myRevisionTo.equals(((SvnRevisionNumber) list.get(list.size() - 1).getRevisionNumber()).getRevision())) { + if (! list.isEmpty() && myPeg == null && list.size() == LIMIT || + (myPeg != null && myPeg.getNumber() > 0 && + myPeg.equals(((SvnRevisionNumber) list.get(list.size() - 1).getRevisionNumber()).getRevision()))) { last = list.remove(list.size() - 1); } myFileHistoryPanel = new FileHistoryPanelImpl(myVcs, myPath, session, myProvider, null, new FileHistoryRefresherI() {