diff options
author | Jean Michel-Lemieux | 2002-04-30 14:27:45 +0000 |
---|---|---|
committer | Jean Michel-Lemieux | 2002-04-30 14:27:45 +0000 |
commit | a53b502308682e06476375cc8c7edd97703a00fc (patch) | |
tree | 5c84e20952ee58031c1ff40971e12d275ecfc1ff | |
parent | 240305b1bfd6a0f1336f36a444ce307a5a20d4f4 (diff) | |
download | eclipse.platform.team-a53b502308682e06476375cc8c7edd97703a00fc.tar.gz eclipse.platform.team-a53b502308682e06476375cc8c7edd97703a00fc.tar.xz eclipse.platform.team-a53b502308682e06476375cc8c7edd97703a00fc.zip |
*** empty log message ***
30 files changed, 355 insertions, 344 deletions
diff --git a/bundles/org.eclipse.team.core/doc/org_eclipse_team_core.html b/bundles/org.eclipse.team.core/doc/org_eclipse_team_core.html index cf37ed5f7..a001ac9a1 100644 --- a/bundles/org.eclipse.team.core/doc/org_eclipse_team_core.html +++ b/bundles/org.eclipse.team.core/doc/org_eclipse_team_core.html @@ -12,6 +12,15 @@ This document lists all of the extension points that the Team Core plug-in makes <p> <hr WIDTH="100%"> <h1>General Extension Points</h1> +The following extension points can be used to extend various aspects of the team functionality: +<ul> +<li> +<a href="org_eclipse_team_core_fileTypes.html">org.eclipse.team.core.fileTypes</a></li> +<li> +<a href="org_eclipse_team_core_ignore.html">org.eclipse.team.core.ignore</a></li> +<li> +<a href="org_eclipse_team_core_projectSets.html">org.eclipse.team.core.projectSets</a></li> +</ul> <a href="hglegal.htm"><img SRC="ngibmcpy.gif" ALT="Copyright IBM Corp. 2000, 2001. All Rights Reserved." BORDER=0 height=12 width=195></a> </body> </html> diff --git a/bundles/org.eclipse.team.core/plugin.xml b/bundles/org.eclipse.team.core/plugin.xml index a6842badc..cf1475485 100644 --- a/bundles/org.eclipse.team.core/plugin.xml +++ b/bundles/org.eclipse.team.core/plugin.xml @@ -3,7 +3,7 @@ <plugin id="org.eclipse.team.core" name="%pluginName" - version="2.0.0" + version="1.9.0" provider-name="Object Technology International, Inc." class="org.eclipse.team.core.TeamPlugin"> <requires> diff --git a/bundles/org.eclipse.team.cvs.core/plugin.xml b/bundles/org.eclipse.team.cvs.core/plugin.xml index a89ad30b0..20ea792b2 100644 --- a/bundles/org.eclipse.team.cvs.core/plugin.xml +++ b/bundles/org.eclipse.team.cvs.core/plugin.xml @@ -2,7 +2,7 @@ <plugin name="%pluginName" id="org.eclipse.team.cvs.core" - version="2.0.0" + version="1.9.0" class="org.eclipse.team.internal.ccvs.core.CVSProviderPlugin" provider-name="Object Technology International, Inc."> diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java index 161aee9c1..eb71760b5 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java @@ -1,10 +1,15 @@ +/******************************************************************************* + * Copyright (c) 2000, 2002 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v0.5 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v05.html + * + * Contributors: + * IBM - Initial API and implementation + ******************************************************************************/ package org.eclipse.team.internal.ccvs.core.client; -/* - * (c) Copyright IBM Corp. 2000, 2002. - * All Rights Reserved. - */ - import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -19,7 +24,7 @@ import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.client.Command.GlobalOption; import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption; -public class RTag extends Command { +public class RTag extends RemoteCommand { /*** Local options: specific to tag ***/ public static final LocalOption CREATE_BRANCH = Tag.CREATE_BRANCH; @@ -42,7 +47,6 @@ public class RTag extends Command { } } - protected RTag() { } protected String getRequestId() { return "rtag"; //$NON-NLS-1$ } @@ -50,17 +54,7 @@ public class RTag extends Command { protected ICVSResource[] computeWorkResources(Session session, LocalOption[] localOptions, String[] arguments) throws CVSException { if (arguments.length < 2) throw new IllegalArgumentException(); - return new ICVSResource[0]; - } - - protected void sendLocalResourceState(Session session, GlobalOption[] globalOptions, - LocalOption[] localOptions, ICVSResource[] resources, IProgressMonitor monitor) - throws CVSException { - // do nothing - } - - protected void sendLocalWorkingDirectory(Session session) throws CVSException { - // do nothing + return super.computeWorkResources(session, localOptions, arguments); } public IStatus execute(Session session, GlobalOption[] globalOptions, diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java index 127f3ca5b..ded3e384d 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java @@ -1,9 +1,14 @@ +/******************************************************************************* + * Copyright (c) 2000, 2002 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v0.5 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v05.html + * + * Contributors: + * IBM - Initial API and implementation + ******************************************************************************/ package org.eclipse.team.internal.ccvs.core.client; - -/* - * (c) Copyright IBM Corp. 2000, 2002. - * All Rights Reserved. - */ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -897,6 +902,7 @@ public class Session { in = new ProgressMonitorInputStream(in, size, TRANSFER_PROGRESS_INCREMENT, monitor) { protected void updateMonitor(long bytesRead, long bytesTotal, IProgressMonitor monitor) { if (bytesRead == 0) return; + Assert.isTrue(bytesRead <= bytesTotal); monitor.subTask(Policy.bind("Session.transfer", //$NON-NLS-1$ new Object[] { title, Long.toString(bytesRead >> 10), Long.toString(bytesTotal >> 10) })); } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Version.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Version.java index 4064aefc4..af1ca8917 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Version.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Version.java @@ -29,7 +29,7 @@ import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; * Concurrent Versions System (CVS) NT 1.11.1.1 (Build 27) * Concurrent Versions System (CVSNT) 1.11.1.3 (Build 57a) (client/server) */ -public class Version extends AbstractMessageCommand { +public class Version extends RemoteCommand { private static final String CVS_NT_PREFIX_1 = "Concurrent Versions System (CVS) NT "; //$NON-NLS-1$ private static final String CVS_NT_PREFIX_2 = "Concurrent Versions System (CVSNT) "; //$NON-NLS-1$ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/Connection.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/Connection.java index 630da6e7c..3e68d7ce0 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/Connection.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/Connection.java @@ -63,19 +63,12 @@ public class Connection { if (!isEstablished()) return; try { - // Perhaps it should be left to the connection to deal with reading pending input! - readPendingInput(); - } catch (CVSException e) { - // Ignore this exception since we don't care about it (i.e. we're closing) + serverConnection.close(); + } catch (IOException ex) { + throw new CVSCommunicationException(Policy.bind("Connection.cannotClose"), ex);//$NON-NLS-1$ } finally { - try { - serverConnection.close(); - } catch (IOException ex) { - throw new CVSCommunicationException(Policy.bind("Connection.cannotClose"), ex);//$NON-NLS-1$ - } finally { - fResponseStream = null; - fIsEstablished = false; - } + fResponseStream = null; + fIsEstablished = false; } } /** @@ -155,47 +148,21 @@ public class Connection { } } -static String readLine(InputStream in) throws IOException { - byte[] buffer = new byte[256]; - int index = 0; - int r; - while ((r = in.read()) != -1) { - if (r == NEWLINE) - break; - buffer = append(buffer, index++, (byte) r); + static String readLine(InputStream in) throws IOException { + byte[] buffer = new byte[256]; + int index = 0; + int r; + while ((r = in.read()) != -1) { + if (r == NEWLINE) + break; + buffer = append(buffer, index++, (byte) r); + } + String result = new String(buffer, 0, index); + if (Policy.DEBUG_CVS_PROTOCOL) + System.out.println(result); + return result; } - String result = new String(buffer, 0, index); - if (Policy.DEBUG_CVS_PROTOCOL) - System.out.println(result); - return result; -} - /** - * Reads any pending input from the response stream so that - * the stream can savely be closed. - */ - protected void readPendingInput() throws CVSException { - byte[] buffer= new byte[2048]; - InputStream in= getInputStream(); - OutputStream out= getOutputStream(); - try { - while (true) { - int available = in.available(); - if (available < 1) break; - if (available > buffer.length) available = buffer.length; - if (in.read(buffer, 0, available) < 1) break; - } - out.flush(); - while (true) { - int available = in.available(); - if (available < 1) break; - if (available > buffer.length) available = buffer.length; - if (in.read(buffer, 0, available) < 1) break; - } - } catch (IOException e) { - throw new CVSCommunicationException(e); - } - } //---- Helper to send strings to the server ---------------------------- /** diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java index f108168c1..5730407a5 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java @@ -109,8 +109,8 @@ public class CVSWorkspaceRoot { remote = getRemoteTreeFromParent(resource, managed, tag, progress); } else if(resource.getType() == IResource.FILE) { baseTree = remote; - ICVSRemoteResource remoteParent = CVSWorkspaceRoot.getRemoteResourceFor(resource.getParent()); - remote = RemoteFile.getLatest((RemoteFolder)remoteParent, (ICVSFile)managed, tag, progress); + ICVSRepositoryLocation location = remote.getRepository(); + remote = RemoteFolderTreeBuilder.buildRemoteTree((CVSRepositoryLocation)location, (ICVSFile)managed, tag, progress); } else { ICVSRepositoryLocation location = remote.getRepository(); baseTree = RemoteFolderTreeBuilder.buildBaseTree((CVSRepositoryLocation)location, (ICVSFolder)managed, tag, progress); @@ -125,8 +125,8 @@ public class CVSWorkspaceRoot { if (remote == null) { remote = getRemoteTreeFromParent(resource, managed, tag, progress); } else if(resource.getType() == IResource.FILE) { - ICVSRemoteResource remoteParent = CVSWorkspaceRoot.getRemoteResourceFor(resource.getParent()); - remote = RemoteFile.getLatest((RemoteFolder)remoteParent, (ICVSFile)managed, tag, progress); + ICVSRepositoryLocation location = remote.getRepository(); + remote = RemoteFolderTreeBuilder.buildRemoteTree((CVSRepositoryLocation)location, (ICVSFile)managed, tag, progress); } else { ICVSRepositoryLocation location = remote.getRepository(); remote = RemoteFolderTreeBuilder.buildRemoteTree((CVSRepositoryLocation)location, (ICVSFolder)managed, tag, progress); diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java index 520b4b63a..2da15c4c8 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java @@ -53,6 +53,7 @@ import org.eclipse.team.internal.ccvs.core.client.listeners.LogListener; import org.eclipse.team.internal.ccvs.core.connection.CVSServerException; import org.eclipse.team.internal.ccvs.core.syncinfo.MutableResourceSyncInfo; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; +import org.eclipse.team.internal.ccvs.core.util.Util; /** * This class provides the implementation of ICVSRemoteFile and IManagedFile for @@ -60,10 +61,10 @@ import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; */ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { - // Contents will be cahced to disk when this thrshold is exceeded + // Contents will be cached to disk when this thrshold is exceeded private static final int CACHING_THRESHOLD = 32768; - // cache for file contents received from the server + // buffer for file contents received from the server private byte[] contents; // cach the log entry for the remote file private ILogEntry entry; @@ -86,71 +87,6 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { parent.setChildren(new ICVSRemoteResource[] {file}); return file; } - - /** - * Static method which creates a file as a single child of its parent. - * This should only be used when one is only interested in the file alone. - * - * The returned RemoteFile represents the latest remote revision corresponding to the local resource. - * If the local resource does not have a base, then null is returned - * even if the resource does exists remotely (e.g. created by another party). - */ - public static RemoteFile getLatest(RemoteFolder parent, ICVSFile managed, CVSTag tag, IProgressMonitor monitor) throws CVSException { - ResourceSyncInfo info = managed.getSyncInfo(); - if ((info == null) || info.isAdded()) { - // Either the file is unmanaged or has just been added (i.e. doesn't necessarily have a remote) - return null; - } - - // ensure that the entry line has the tag in it. Or else status will return - // the latest from the branch of the local resource. - if(tag!=null) { - MutableResourceSyncInfo newInfo = info.cloneMutable(); - newInfo.setTag(tag); - info = newInfo; - } - - // initialize with new sync info from the local resource, this info will - // be updated when updateRevision is called. - RemoteFile file = new RemoteFile(parent, info); - - // use the contents of the file on disk so that the server can calculate the relative - // sync state. This is a trick to allow the server to calculate sync state for us. - InputStream is = managed.getContents(); - file.setContents(is, ICVSFile.UPDATED, false, Policy.monitorFor(null)); - - parent.setChildren(new ICVSRemoteResource[] {file}); - if( ! file.updateRevision(tag, monitor)) { - // If updateRevision returns false then the resource no longer exists remotely - return null; - } - - // forget local contents. Remote contents will be fetched the next time - // the returned handle is used. - file.clearContents(); - - // If the revision changed, clear the contents of the original revision in case contents where cached - if ( ! info.getRevision().equals(file.getRevision())) { - RemoteFile originalRevision = new RemoteFile(parent, info); - originalRevision.clearContents(); - } - return file; - } - - /** - * Forget the contents associated with this remote handle. - */ - public void clearContents() { - contents = null; - try { - File ioFile = CVSProviderPlugin.getPlugin().getCacheFileFor(getCacheRelativePath()); - if (ioFile.exists()) { - ioFile.delete(); - } - } catch (IOException e) { - CVSProviderPlugin.log(CVSException.wrapException(e).getStatus()); - } - } /** * Constructor for RemoteFile that should be used when nothing is know about the @@ -194,28 +130,15 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { public InputStream getContents(IProgressMonitor monitor) throws CVSException { if (contents == null) { // First, check to see if there's a cached contents for the file - try { - try { - File ioFile = CVSProviderPlugin.getPlugin().getCacheFileFor(getCacheRelativePath()); - if (ioFile.exists()) { - return new BufferedInputStream(new FileInputStream(ioFile)); - } - } catch (IOException e) { - // Try to purge the cache and continue - File ioFile = CVSProviderPlugin.getPlugin().getCacheFileFor(getCacheRelativePath()); - if (ioFile.exists()) { - ioFile.delete(); - } - } - } catch (IOException e) { - // We will end up here if we couldn't read or delete the cache file - throw new CVSException(new CVSStatus(IStatus.ERROR, 0, Policy.bind("RemoteFile.errorRetrievingFromCache", e.getMessage()), e));//$NON-NLS-1$ + InputStream cached = getCachedContents(); + if (cached != null) { + return cached; } + // We need to fetch the contents from the server monitor.beginTask(Policy.bind("RemoteFile.getContents"), 100);//$NON-NLS-1$ Session.run(getRepository(), parent, false, new ICVSRunnable() { public void run(IProgressMonitor monitor) throws CVSException { - monitor.beginTask(null, 100); IStatus status = Command.UPDATE.execute( Command.NO_GLOBAL_OPTIONS, new LocalOption[] { @@ -223,16 +146,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { Update.IGNORE_LOCAL_CHANGES }, new ICVSResource[] { RemoteFile.this }, null, - Policy.subMonitorFor(monitor, 90)); - if (status.getCode() != CVSStatus.SERVER_ERROR) { - try { - getLogEntry(Policy.subMonitorFor(monitor, 10)); - } catch (CVSException e) { - // Ignore the status of the log entry fetch. - // If it fails, the entry will still be null - } - } - monitor.done(); + monitor); if (status.getCode() == CVSStatus.SERVER_ERROR) { throw new CVSServerException(status); } @@ -243,16 +157,11 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { // than we can assume that the remote file has no contents. if (contents == null) { // The above is true unless there is a cache file - try { - File ioFile = CVSProviderPlugin.getPlugin().getCacheFileFor(getCacheRelativePath()); - if (ioFile.exists()) { - return new BufferedInputStream(new FileInputStream(ioFile)); - } else { - contents = new byte[0]; - } - } catch (IOException e) { - // Something is wrong with the cached file so signal an error. - throw new CVSException(new CVSStatus(IStatus.ERROR, 0, Policy.bind("RemoteFile.errorRetrievingFromCache", e.getMessage()), e));//$NON-NLS-1$ + cached = getCachedContents(); + if (cached != null) { + return cached; + } else { + contents = new byte[0]; } } } @@ -339,30 +248,34 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { return file; } - /** - * @see IManagedFile#getSize() + /** + * @see ICVSFile#getSize() */ public long getSize() { + if (contents == null) { + try { + File ioFile = getCacheFile(); + if (ioFile.exists()) { + return ioFile.length(); + } + } catch (IOException e) { + // Try to purge the cache and continue + try { + clearCachedContents(); + } catch (IOException e2) { + } + CVSProviderPlugin.log(CVSException.wrapException(e).getStatus()); + } + } return contents == null ? 0 : contents.length; } /** - * @see IManagedFile#getFileInfo() + * @see ICVSFile#getSyncInfo() */ public ResourceSyncInfo getSyncInfo() { return info; } - - /** - * @see ICVSResource#getRelativePath(ICVSFolder) - */ - public String getRelativePath(ICVSFolder ancestor) throws CVSException { - String result = parent.getRelativePath(ancestor); - if (result.length() == 0) - return getName(); - else - return result + Session.SERVER_SEPARATOR + getName(); - } /** * @see ICVSResource#getRemoteLocation(ICVSFolder) @@ -407,13 +320,9 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { public InputStream getContents() throws CVSException { if (contents == null) { // Check for cached contents for the file - try { - File ioFile = CVSProviderPlugin.getPlugin().getCacheFileFor(getCacheRelativePath()); - if (ioFile.exists()) { - return new BufferedInputStream(new FileInputStream(ioFile)); - } - } catch (IOException e) { - throw new CVSException(new CVSStatus(IStatus.ERROR, 0, Policy.bind("RemoteFile.errorRetrievingFromCache", e.getMessage()), e));//$NON-NLS-1$ + InputStream cached = getCachedContents(); + if (cached != null) { + return cached; } } return new ByteArrayInputStream(contents == null ? new byte[0] : contents); @@ -434,16 +343,9 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { // Detect when the file is getting too big to keep in memory // and switch to a caching strategy for the contents of the file if (out == byteStream && byteStream.size() > CACHING_THRESHOLD) { - // Get the cache file to write to - File ioFile = CVSProviderPlugin.getPlugin().getCacheFileFor(getCacheRelativePath()); - if ( ! ioFile.getParentFile().exists()) { - ioFile.getParentFile().mkdirs(); - } // Switch streams byteStream.close(); - out = new BufferedOutputStream(new FileOutputStream(ioFile)); - // Write what we've read so far - out.write(byteStream.toByteArray()); + out = switchToCacheOutputStream(byteStream); // Continue looping until the whole file is read } } @@ -453,17 +355,16 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { } catch (IOException e) { // Make sure we don't leave the cache file around as it may not have the right contents if (byteStream != out) { - File ioFile = CVSProviderPlugin.getPlugin().getCacheFileFor(getCacheRelativePath()); - if (ioFile.exists()) { - ioFile.delete(); - } + clearCachedContents(); } throw e; } - // Set the contents if we didn't cahce them + // Set the contents if we didn't cache them to disk if (out == byteStream) { contents = byteStream.toByteArray(); + } else { + contents = null; } } finally { stream.close(); @@ -565,4 +466,51 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { path = path.append(getName() + ' ' + getRevision()); return path.toString(); } + + private File getCacheFile() throws IOException { + return CVSProviderPlugin.getPlugin().getCacheFileFor(getCacheRelativePath()); + } + + private void clearCachedContents() throws IOException { + try { + File ioFile = getCacheFile(); + if (ioFile.exists()) { + ioFile.delete(); + } + } catch (IOException e) { + CVSProviderPlugin.log(CVSException.wrapException(e).getStatus()); + } + } + + private InputStream getCachedContents() throws CVSException { + try { + try { + File ioFile = getCacheFile(); + if (ioFile.exists()) { + return new BufferedInputStream(new FileInputStream(ioFile)); + } + } catch (IOException e) { + // Try to purge the cache and continue + clearCachedContents(); + throw e; + } + } catch (IOException e) { + // We will end up here if we couldn't read or delete the cache file + throw new CVSException(new CVSStatus(IStatus.ERROR, 0, Policy.bind("RemoteFile.errorRetrievingFromCache", e.getMessage()), e));//$NON-NLS-1$ + } + return null; + } + + private OutputStream switchToCacheOutputStream(ByteArrayOutputStream byteStream) throws IOException { + // Get the cache file and make sure it's parent exists + File ioFile = getCacheFile(); + if ( ! ioFile.getParentFile().exists()) { + ioFile.getParentFile().mkdirs(); + } + // Switch streams + OutputStream out = new BufferedOutputStream(new FileOutputStream(ioFile)); + // Write what we've read so far + out.write(byteStream.toByteArray()); + return out; + } }
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java index ebae8e5ec..865b45b11 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java @@ -459,13 +459,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC if (parent == null) { throw new CVSException(Policy.bind("RemoteFolder.invalidChild", getName(), ancestor.getName())); //$NON-NLS-1$ } - // Append the receivers name to the parents path relative to the ancestor - String parentPath = parent.getRelativePath(ancestor); - if (parentPath.equals(Session.CURRENT_LOCAL_FOLDER) || parentPath.length() == 0) { - return getName(); - } else { - return Util.appendPath(parentPath, getName()); - } + return super.getRelativePath(ancestor); } public ICVSRepositoryLocation getRepository() { diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTreeBuilder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTreeBuilder.java index cf380bb36..2ff1dc2f0 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTreeBuilder.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTreeBuilder.java @@ -154,6 +154,11 @@ public class RemoteFolderTreeBuilder { return builder.buildTree(monitor); } + public static RemoteFile buildRemoteTree(CVSRepositoryLocation repository, ICVSFile file, CVSTag tag, IProgressMonitor monitor) throws CVSException { + RemoteFolderTreeBuilder builder = new RemoteFolderTreeBuilder(repository, file.getParent(), tag); + return builder.buildTree(file, monitor); + } + private RemoteFolderTree buildTree(IProgressMonitor monitor) throws CVSException { // Make sure that the cvs commands are not quiet during this operations @@ -168,7 +173,7 @@ public class RemoteFolderTreeBuilder { session.open(Policy.subMonitorFor(monitor, 10)); try { Policy.checkCanceled(monitor); - fetchDelta(session, Policy.subMonitorFor(monitor, 50)); + fetchDelta(session, Session.CURRENT_LOCAL_FOLDER, Policy.subMonitorFor(monitor, 50)); if (projectDoesNotExist) { return null; } @@ -227,6 +232,62 @@ public class RemoteFolderTreeBuilder { } } + private RemoteFile buildTree(ICVSFile file, IProgressMonitor monitor) throws CVSException { + QuietOption quietness = CVSProviderPlugin.getPlugin().getQuietness(); + try { + CVSProviderPlugin.getPlugin().setQuietness(Command.VERBOSE); + + monitor.beginTask(null, 100); + + // Query the server to see if there is a delta available + Policy.checkCanceled(monitor); + Session session = new Session(repository, root, false); + session.open(Policy.subMonitorFor(monitor, 10)); + try { + Policy.checkCanceled(monitor); + fetchDelta(session, file.getName(), Policy.subMonitorFor(monitor, 50)); + if (projectDoesNotExist) { + return null; + } + } finally { + session.close(); + } + // Create a parent for the remote resource + remoteRoot = + new RemoteFolderTree(null, root.getName(), repository, + new Path(root.getFolderSyncInfo().getRepository()), + tagForRemoteFolder(root, tag)); + // Create the remote resource (using the delta if there is one) + RemoteFile remoteFile; + Map deltas = (Map)fileDeltas.get(Path.EMPTY); + if (deltas == null || deltas.isEmpty()) { + remoteFile = new RemoteFile(remoteRoot, file.getSyncInfo()); + } else { + DeltaNode d = (DeltaNode)deltas.get(file.getName()); + remoteFile = new RemoteFile(remoteRoot, d.getSyncState(), file.getName(), tagForRemoteFolder(remoteRoot, tag)); + } + // Add the resource to its parent + remoteRoot.setChildren(new ICVSRemoteResource[] {remoteFile}); + // If there was a delta, ftech the new revision + if (!changedFiles.isEmpty()) { + // Add the remote folder to the remote folder lookup table (used to update file revisions) + remoteFolderTable.put(new Path(remoteRoot.getFolderSyncInfo().getRemoteLocation()), remoteRoot); + session = new Session(repository, remoteRoot, false); + session.open(Policy.subMonitorFor(monitor, 10)); + try { + fetchFileRevisions(session, (String[])changedFiles.toArray(new String[changedFiles.size()]), Policy.subMonitorFor(monitor, 20)); + } finally { + session.close(); + } + } + return remoteFile; + + } finally { + CVSProviderPlugin.getPlugin().setQuietness(quietness); + monitor.done(); + } + } + /* * Build the base remote tree from the local tree. * @@ -426,7 +487,7 @@ public class RemoteFolderTreeBuilder { * * Returns the list of changed files */ - private List fetchDelta(Session session, final IProgressMonitor monitor) throws CVSException { + private List fetchDelta(Session session, String argument, final IProgressMonitor monitor) throws CVSException { // Create an listener that will accumulate new and removed files and folders final List newChildDirectories = new ArrayList(); @@ -486,7 +547,7 @@ public class RemoteFolderTreeBuilder { IStatus status = Command.UPDATE.execute(session, new GlobalOption[] { Command.DO_NOT_CHANGE }, updateLocalOptions, - new String[] { Session.CURRENT_LOCAL_FOLDER }, + new String[] { argument }, new UpdateListener(listener), monitor); return changedFiles; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java index 430e3b10b..fee58046f 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java @@ -42,6 +42,13 @@ public abstract class RemoteResource extends PlatformObject implements ICVSRemot } /* + * @see ICVSResource#getRelativePath(ICVSFolder) + */ + public String getRelativePath(ICVSFolder ancestor) throws CVSException { + return Util.appendPath(parent.getRelativePath(ancestor), getName()); + } + + /* * @see ICVSRemoteResource#getParent() */ public ICVSRemoteResource getRemoteParent() { diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/PollingInputStream.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/PollingInputStream.java index fdbf3d92d..3ba903905 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/PollingInputStream.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/PollingInputStream.java @@ -17,6 +17,8 @@ import java.io.InterruptedIOException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; import org.eclipse.team.internal.ccvs.core.Policy; /** @@ -58,15 +60,23 @@ public class PollingInputStream extends FilterInputStream { */ public void close() throws IOException { int attempts = 0; - for (;;) { - try { - in.close(); - return; - } catch (InterruptedIOException e) { - if (monitor.isCanceled()) throw new OperationCanceledException(); - if (++attempts == numAttempts) - throw new InterruptedIOException(Policy.bind("PollingInputStream.closeTimeout")); //$NON-NLS-1$ - if (DEBUG) System.out.println("close retry=" + attempts); //$NON-NLS-1$ + try { + readPendingInput(); + } catch (IOException e) { + // We shouldn't get an exception when we're getting the available input. + // If we do, just log it so we can close. + CVSProviderPlugin.log(CVSException.wrapException(e).getStatus()); + } finally { + for (;;) { + try { + in.close(); + return; + } catch (InterruptedIOException e) { + if (monitor.isCanceled()) throw new OperationCanceledException(); + if (++attempts == numAttempts) + throw new InterruptedIOException(Policy.bind("PollingInputStream.closeTimeout")); //$NON-NLS-1$ + if (DEBUG) System.out.println("close retry=" + attempts); //$NON-NLS-1$ + } } } } @@ -135,4 +145,18 @@ public class PollingInputStream extends FilterInputStream { } } } + + /** + * Reads any pending input from the input stream so that + * the stream can savely be closed. + */ + protected void readPendingInput() throws IOException { + byte[] buffer= new byte[2048]; + while (true) { + int available = in.available(); + if (available < 1) break; + if (available > buffer.length) available = buffer.length; + if (in.read(buffer, 0, available) < 1) break; + } + } } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/PollingOutputStream.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/PollingOutputStream.java index 0e6385b8b..a486d4bd2 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/PollingOutputStream.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/PollingOutputStream.java @@ -143,7 +143,7 @@ public class PollingOutputStream extends FilterOutputStream { public void close() throws IOException { int attempts = numAttempts - 1; // fail fast if flush() does times out try { - flush(); + out.flush(); attempts = 0; } finally { for (;;) { diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/SizeConstrainedInputStream.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/SizeConstrainedInputStream.java index 54489979f..5cafd3047 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/SizeConstrainedInputStream.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/streams/SizeConstrainedInputStream.java @@ -15,6 +15,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; +import org.eclipse.core.runtime.OperationCanceledException; + /** * Simulates a stream that represents only a portion of the underlying stream. * Will report EOF when this portion has been fully read and prevent further reads. @@ -52,6 +54,10 @@ public class SizeConstrainedInputStream extends FilterInputStream { if (discardOnClose) { while (bytesRemaining != 0 && skip(bytesRemaining) != 0); } + } catch (OperationCanceledException e) { + // The receiver is likely wrapping a PollingInputStream which could throw + // an OperationCanceledException on a skip. + // Since we're closing, just ignore the cancel and let the caller check the monitor } finally { bytesRemaining = 0; } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/PrepareForReplaceVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/PrepareForReplaceVisitor.java index af1a875e1..adc9605d8 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/PrepareForReplaceVisitor.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/PrepareForReplaceVisitor.java @@ -70,6 +70,14 @@ public class PrepareForReplaceVisitor implements ICVSResourceVisitor { files[i].accept(this); } } + // Also delete ignored child files that start with .# + ICVSResource[] ignoredFiles = folder.members(ICVSFolder.FILE_MEMBERS | ICVSFolder.IGNORED_MEMBERS); + for (int i = 0; i < ignoredFiles.length; i++) { + ICVSResource cvsResource = ignoredFiles[i]; + if (cvsResource.getName().startsWith(".#")) { + cvsResource.delete(); + } + } monitor.worked(1); } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java index cd99f83d6..46deb13ea 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java @@ -51,7 +51,9 @@ public class Util { * Append the prefix and suffix to form a valid CVS path. */ public static String appendPath(String prefix, String suffix) { - if (prefix.endsWith(Session.SERVER_SEPARATOR)) { + if (prefix.length() == 0 || prefix.equals(Session.CURRENT_LOCAL_FOLDER)) { + return suffix; + } else if (prefix.endsWith(Session.SERVER_SEPARATOR)) { if (suffix.startsWith(Session.SERVER_SEPARATOR)) return prefix + suffix.substring(1); else diff --git a/bundles/org.eclipse.team.cvs.ui/plugin.xml b/bundles/org.eclipse.team.cvs.ui/plugin.xml index d42daa004..1dfc8f924 100644 --- a/bundles/org.eclipse.team.cvs.ui/plugin.xml +++ b/bundles/org.eclipse.team.cvs.ui/plugin.xml @@ -2,7 +2,7 @@ <plugin id="org.eclipse.team.cvs.ui" name="%pluginName" - version="2.0.0" + version="1.9.0" provider-name="Object Technology International, Inc." class="org.eclipse.team.internal.ccvs.ui.CVSUIPlugin"> diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSCompareEditorInput.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSCompareEditorInput.java index 3bd5a6c85..6ff815c24 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSCompareEditorInput.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSCompareEditorInput.java @@ -46,8 +46,8 @@ import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; /** - * A compare input for performing naive comparisons between - * resources and resource editions. + * A compare input for comparing remote resources. Use <code>CVSLocalCompareInput</code> + * when comparing resources in the workspace to remote resources. */ public class CVSCompareEditorInput extends CompareEditorInput { private ITypedElement left; @@ -59,53 +59,17 @@ public class CVSCompareEditorInput extends CompareEditorInput { private static final int NODE_NOT_EQUAL = 1; private static final int NODE_UNKNOWN = 2; - class ResourceDiffNode extends DiffNode { - public ResourceDiffNode(IDiffContainer parent, int kind, ITypedElement ancestor, ITypedElement left, ITypedElement right) { - super(parent, kind, ancestor, left, right); - } - /* - * @see ICompareInput#copy(boolean) - */ - public void copy(boolean leftToRight) { - if (leftToRight) return; - ITypedElement right = getRight(); - ITypedElement left = getLeft(); - if (left == null) { - // Addition - ResourceDiffNode parent = (ResourceDiffNode)getParent(); - IContainer parentResource = (IContainer)((CVSResourceNode)parent.getLeft()).getResource(); - IFile resource = parentResource.getFile(new Path(right.getName())); - try { - resource.create(new ByteArrayInputStream(new byte[0]), false, null); - } catch (CoreException e) { - CVSUIPlugin.log(e.getStatus()); - } - left = new CVSResourceNode(resource); - setLeft(left); - } else { - // Deletion - try { - ((IFile)((CVSResourceNode)left).getResource()).delete(false, true, null); - } catch (CoreException e) { - CVSUIPlugin.log(e.getStatus()); - } - setLeft(null); - } - super.copy(leftToRight); - } - }; - /** * Creates a new CVSCompareEditorInput. */ - public CVSCompareEditorInput(ITypedElement left, ITypedElement right) { + public CVSCompareEditorInput(ResourceEditionNode left, ResourceEditionNode right) { this(left, right, null); } /** * Creates a new CVSCompareEditorInput. */ - public CVSCompareEditorInput(ITypedElement left, ITypedElement right, ITypedElement ancestor) { + public CVSCompareEditorInput(ResourceEditionNode left, ResourceEditionNode right, ResourceEditionNode ancestor) { super(new CompareConfiguration()); this.left = left; this.right = right; @@ -113,19 +77,9 @@ public class CVSCompareEditorInput extends CompareEditorInput { } /** - * Overridden to create the CVSDiffTreeViewer to have the proper popup actions - */ - //public Viewer createDiffViewer(Composite parent) { - // return new CVSDiffTreeViewer(parent, this); - //} - - /** * Returns the label for the given input element. */ private String getLabel(ITypedElement element) { - if (element instanceof ResourceNode) { - return Policy.bind("CVSCompareEditorInput.workspace", element.getName()); //$NON-NLS-1$ - } if (element instanceof ResourceEditionNode) { ICVSRemoteResource edition = ((ResourceEditionNode)element).getRemoteResource(); ICVSResource resource = (ICVSResource)edition; @@ -161,9 +115,6 @@ public class CVSCompareEditorInput extends CompareEditorInput { * Returns the label for the given input element. */ private String getVersionLabel(ITypedElement element) { - if (element instanceof ResourceNode) { - return Policy.bind("CVSCompareEditorInput.workspaceLabel"); //$NON-NLS-1$ - } if (element instanceof ResourceEditionNode) { ICVSRemoteResource edition = ((ResourceEditionNode)element).getRemoteResource(); ICVSResource resource = (ICVSResource)edition; @@ -260,25 +211,6 @@ public class CVSCompareEditorInput extends CompareEditorInput { ITypedElement right = this.right; ITypedElement ancestor = this.ancestor; - if (selection.size() == 1) { - Object s = selection.getFirstElement(); - if (s instanceof ResourceDiffNode) { - ResourceDiffNode node = (ResourceDiffNode)s; - left = node.getLeft(); - right = node.getRight(); - ancestor = node.getAncestor(); - if (left == null) { - cc.setLeftLabel(Policy.bind("CVSCompareEditorInput.noWorkspaceFile")); //$NON-NLS-1$ - cc.setLeftImage(right.getImage()); - } - if (right == null) { - cc.setRightLabel(Policy.bind("CVSCompareEditorInput.noRepositoryFile")); //$NON-NLS-1$ - cc.setRightImage(left.getImage()); - } - if (ancestor == null) ancestor = this.ancestor; - } - } - if (left != null) { cc.setLeftLabel(getLabel(left)); cc.setLeftImage(left.getImage()); @@ -342,11 +274,7 @@ public class CVSCompareEditorInput extends CompareEditorInput { return null; } protected Object visit(Object data, int result, Object ancestor, Object left, Object right) { - if (CVSCompareEditorInput.this.left instanceof CVSResourceNode) { - return new ResourceDiffNode((IDiffContainer) data, result, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right); - } else { - return new DiffNode((IDiffContainer) data, result, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right); - } + return new DiffNode((IDiffContainer) data, result, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right); } }; @@ -385,22 +313,10 @@ public class CVSCompareEditorInput extends CompareEditorInput { * NODE_UNKNOWN if comparison was not possible. */ protected int teamEqual(Object left, Object right) { - // calculate the type for the left contribution ICVSRemoteResource leftEdition = null; if (left instanceof ResourceEditionNode) { leftEdition = ((ResourceEditionNode)left).getRemoteResource(); - } else if (left instanceof ResourceNode) { - IResource resource = ((ResourceNode)left).getResource(); - try { - ICVSResource element = CVSWorkspaceRoot.getCVSResourceFor(resource); - if (resource.getType() == IResource.FILE) { - if (((ICVSFile) element).isDirty()) return NODE_NOT_EQUAL; - } - leftEdition = CVSWorkspaceRoot.getRemoteResourceFor(resource); - } catch(CVSException e) { - return NODE_UNKNOWN; - } } // calculate the type for the right contribution @@ -451,6 +367,7 @@ public class CVSCompareEditorInput extends CompareEditorInput { private boolean considerContentIfRevisionOrPathDiffers() { return CVSUIPlugin.getPlugin().getPreferenceStore().getBoolean(ICVSUIConstants.PREF_CONSIDER_CONTENTS); } + public Viewer createDiffViewer(Composite parent) { Viewer viewer = super.createDiffViewer(parent); viewer.addSelectionChangedListener(new ISelectionChangedListener() { diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSRepositoryPropertiesPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSRepositoryPropertiesPage.java index 5493a75a8..a31e9ec78 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSRepositoryPropertiesPage.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSRepositoryPropertiesPage.java @@ -210,6 +210,7 @@ public class CVSRepositoryPropertiesPage extends PropertyPage { info.setPassword(passwordText.getText()); } final String type = methodType.getText(); + final String password = passwordText.getText(); final boolean[] result = new boolean[] { false }; try { new ProgressMonitorDialog(getShell()).run(true, false, new IRunnableWithProgress() { @@ -218,7 +219,7 @@ public class CVSRepositoryPropertiesPage extends PropertyPage { // Check if the password was the only thing to change. if (passwordChanged && !connectionInfoChanged) { CVSRepositoryLocation oldLocation = (CVSRepositoryLocation)location; - oldLocation.setPassword(passwordText.getText()); + oldLocation.setPassword(password); oldLocation.updateCache(); result[0] = true; return; diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/RepositoriesView.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/RepositoriesView.java index 4de75483a..e0ccbd9b1 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/RepositoriesView.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/RepositoriesView.java @@ -14,7 +14,9 @@ import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.wizard.WizardDialog; @@ -123,9 +125,23 @@ public class RepositoriesView extends ViewPart { } }; - // Properties (popup) + // Properties propertiesAction = new PropertyDialogAction(shell, viewer); - + getViewSite().getActionBars().setGlobalActionHandler(IWorkbenchActionConstants.PROPERTIES, propertiesAction); + IStructuredSelection selection = (IStructuredSelection)viewer.getSelection(); + if (selection.size() == 1 && selection.getFirstElement() instanceof ICVSRepositoryLocation) { + propertiesAction.setEnabled(true); + } else { + propertiesAction.setEnabled(false); + } + viewer.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + IStructuredSelection ss = (IStructuredSelection)event.getSelection(); + boolean enabled = ss.size() == 1 && ss.getFirstElement() instanceof ICVSRepositoryLocation; + propertiesAction.setEnabled(enabled); + } + }); + // Create the popup menu MenuManager menuMgr = new MenuManager(); Tree tree = viewer.getTree(); diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithRemoteAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithRemoteAction.java index a894c1bd3..6ad3d6c6e 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithRemoteAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithRemoteAction.java @@ -74,7 +74,6 @@ public class CompareWithRemoteAction extends CompareWithTagAction { protected boolean isEnabled() { IResource[] resources = getSelectedResources(); - // allow operation for homegeneous multiple selections if(resources.length>0) { for (int i = 0; i < resources.length; i++) { IResource resource = resources[i]; diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java index b1a169731..e6012a137 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java @@ -43,7 +43,6 @@ public class CompareWithTagAction extends TeamAction { protected boolean isEnabled() { IResource[] resources = getSelectedResources(); - // allow operation for homegeneous multiple selections if(resources.length>0) { for (int i = 0; i < resources.length; i++) { IResource resource = resources[i]; diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/MergeEditorInput.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/MergeEditorInput.java index 5481d6870..a532cc05f 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/MergeEditorInput.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/MergeEditorInput.java @@ -19,15 +19,16 @@ import org.eclipse.team.core.sync.IRemoteResource; import org.eclipse.team.core.sync.IRemoteSyncElement; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.CVSTag; -import org.eclipse.team.internal.ccvs.core.ICVSFolder; -import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource; import org.eclipse.team.internal.ccvs.core.ICVSRunnable; import org.eclipse.team.internal.ccvs.core.client.Session; import org.eclipse.team.internal.ccvs.core.resources.CVSRemoteSyncElement; import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; +import org.eclipse.team.internal.ccvs.core.resources.RemoteFile; import org.eclipse.team.internal.ccvs.ui.Policy; import org.eclipse.team.internal.ccvs.ui.sync.CVSSyncCompareInput; +import org.eclipse.team.ui.sync.MergeResource; import org.eclipse.team.ui.sync.SyncView; +import org.eclipse.team.ui.sync.TeamFile; public class MergeEditorInput extends CVSSyncCompareInput { CVSTag start; @@ -116,5 +117,23 @@ public class MergeEditorInput extends CVSSyncCompareInput { return result[0]; } + + /* + * Override collectResourceChanges to only determine the true sync state for incomming changes + */ + protected IDiffElement collectResourceChanges(IDiffContainer parent, IRemoteSyncElement tree, IProgressMonitor pm) { + if ( ! tree.isContainer()) { + CVSRemoteSyncElement cvsTree = (CVSRemoteSyncElement)tree; + RemoteFile base = (RemoteFile)cvsTree.getBase(); + RemoteFile remote = (RemoteFile)cvsTree.getRemote(); + if (base != null && remote != null && base.getRevision().equals(remote.getRevision())) { + // If the base and remote are the same, we don't have an incomming change + MergeResource mergeResource = new MergeResource(tree); + TeamFile file = new TeamFile(parent, mergeResource, IRemoteSyncElement.IN_SYNC, getShell()); + return file; + } + } + return super.collectResourceChanges(parent, tree, pm); + } }
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/UpdateMergeAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/UpdateMergeAction.java index 517811da3..d2ec1aeef 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/UpdateMergeAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/merge/UpdateMergeAction.java @@ -24,6 +24,7 @@ import org.eclipse.team.core.sync.RemoteSyncElement; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.CVSTag; import org.eclipse.team.internal.ccvs.core.ICVSFolder; +import org.eclipse.team.internal.ccvs.core.ICVSRunnable; import org.eclipse.team.internal.ccvs.core.client.Command; import org.eclipse.team.internal.ccvs.core.client.Update; import org.eclipse.team.internal.ccvs.core.resources.CVSRemoteSyncElement; @@ -101,10 +102,23 @@ public class UpdateMergeAction extends UpdateSyncAction { private void makeRemoteLocal(CVSRemoteSyncElement element, IProgressMonitor monitor) throws CVSException { IRemoteResource remote = element.getRemote(); - IResource local = element.getLocal(); + final IResource local = element.getLocal(); try { if(remote==null) { - local.delete(false, monitor); + // Need a runnable so that move/delete hook is disabled + final CoreException[] exception = new CoreException[] { null }; + CVSWorkspaceRoot.getCVSFolderFor(local.getParent()).run(new ICVSRunnable() { + public void run(IProgressMonitor monitor) throws CVSException { + try { + local.delete(false, monitor); + } catch(CoreException e) { + exception[0] = e; + } + } + }, monitor); + if (exception[0] != null) { + throw exception[0]; + } } else { if(remote.isContainer()) { if(!local.exists()) { diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/CommitSyncAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/CommitSyncAction.java index 8e6c0afb1..fc48fd54f 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/CommitSyncAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/CommitSyncAction.java @@ -13,6 +13,7 @@ import java.util.Vector; import org.eclipse.compare.structuremergeviewer.Differencer; import org.eclipse.compare.structuremergeviewer.IDiffContainer; import org.eclipse.compare.structuremergeviewer.IDiffElement; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -25,7 +26,10 @@ import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Shell; import org.eclipse.team.core.TeamException; import org.eclipse.team.core.sync.IRemoteSyncElement; +import org.eclipse.team.internal.ccvs.core.ICVSFile; +import org.eclipse.team.internal.ccvs.core.client.Command; import org.eclipse.team.internal.ccvs.core.resources.CVSRemoteSyncElement; +import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; import org.eclipse.team.internal.ccvs.ui.Policy; import org.eclipse.team.internal.ccvs.ui.RepositoryManager; @@ -175,6 +179,19 @@ public class CommitSyncAction extends MergeAction { } } + // Reset the timestamps for any files that were not committed + // because their contents match that of the server + for (int i = 0; i < changedResources.length; i++) { + IResource resource = changedResources[i]; + if (resource.getType() == IResource.FILE) { + ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor((IFile)resource); + // If the file is still modified after the commit, it probably is a pseudo change + if (cvsFile.isModified()) { + cvsFile.setTimeStamp(cvsFile.getSyncInfo().getTimeStamp()); + } + } + } + } catch (final TeamException e) { getShell().getDisplay().syncExec(new Runnable() { public void run() { diff --git a/bundles/org.eclipse.team.ui/doc/org_eclipse_team_ui.html b/bundles/org.eclipse.team.ui/doc/org_eclipse_team_ui.html index 311279079..807b2ff6c 100644 --- a/bundles/org.eclipse.team.ui/doc/org_eclipse_team_ui.html +++ b/bundles/org.eclipse.team.ui/doc/org_eclipse_team_ui.html @@ -2,7 +2,7 @@ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> - <title>Team Core Extension Points</title> + <title>Team UI Extension Points</title> </head> <body link="#0000FF" vlink="#800080"> diff --git a/bundles/org.eclipse.team.ui/plugin.xml b/bundles/org.eclipse.team.ui/plugin.xml index efc8bfa3d..57634d3a1 100644 --- a/bundles/org.eclipse.team.ui/plugin.xml +++ b/bundles/org.eclipse.team.ui/plugin.xml @@ -3,7 +3,7 @@ <plugin id="org.eclipse.team.ui" name="%pluginName" - version="2.0.0" + version="1.9.0" provider-name="Object Technology International, Inc." class="org.eclipse.team.ui.TeamUIPlugin"> <requires> diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/ExportProjectSetMainPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/ExportProjectSetMainPage.java index 22efa303c..d873642ac 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/ExportProjectSetMainPage.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/ExportProjectSetMainPage.java @@ -82,6 +82,7 @@ public class ExportProjectSetMainPage extends TeamWizardPage { } else { selectedProjects.remove(project); } + updateEnablement(); } }); createLabel(composite, Policy.bind("ExportProjectSetMainPage.Project_Set_File_Name__3")); //$NON-NLS-1$ @@ -145,8 +146,10 @@ public class ExportProjectSetMainPage extends TeamWizardPage { } private void updateEnablement() { boolean complete; - - if (file.length() == 0) { + if (selectedProjects.size() == 0) { + setMessage(null); + complete = false; + } else if (file.length() == 0) { setMessage(null); complete = false; } else { diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/sync/SyncCompareInput.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/sync/SyncCompareInput.java index f9b606963..7f4323125 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/sync/SyncCompareInput.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/sync/SyncCompareInput.java @@ -254,7 +254,7 @@ public abstract class SyncCompareInput extends CompareEditorInput { * and has enough ticks to allow 1 unit of work per resource in the tree and an additional * unit for each folder. */ - IDiffElement collectResourceChanges(IDiffContainer parent, IRemoteSyncElement tree, IProgressMonitor pm) { + protected IDiffElement collectResourceChanges(IDiffContainer parent, IRemoteSyncElement tree, IProgressMonitor pm) { int type = tree.getSyncKind(getSyncGranularity(), Policy.subMonitorFor(pm, 1)); MergeResource mergeResource = new MergeResource(tree); |