Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspacePatcher.java')
-rw-r--r--bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspacePatcher.java382
1 files changed, 0 insertions, 382 deletions
diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspacePatcher.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspacePatcher.java
deleted file mode 100644
index 0699d116c..000000000
--- a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/WorkspacePatcher.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.compare.internal.patch;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.compare.internal.core.Messages;
-import org.eclipse.compare.internal.core.patch.DiffProject;
-import org.eclipse.compare.internal.core.patch.FilePatch2;
-import org.eclipse.compare.internal.core.patch.Hunk;
-import org.eclipse.compare.internal.core.patch.PatchReader;
-import org.eclipse.compare.patch.IHunk;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceRuleFactory;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-
-/**
- * A Patcher
- * - knows how to parse various patch file formats into some in-memory structure,
- * - holds onto the parsed data and the options to use when applying the patches,
- * - knows how to apply the patches to files and folders.
- */
-public class WorkspacePatcher extends Patcher {
-
- private DiffProject[] fDiffProjects;
- private boolean fIsWorkspacePatch= false;
- private final Map retargetedDiffs = new HashMap();
-
- public WorkspacePatcher() {
- // nothing to do
- }
-
- public WorkspacePatcher(IResource target) {
- setTarget(target);
- }
-
- protected void patchParsed(PatchReader patchReader) {
- super.patchParsed(patchReader);
- fDiffProjects = patchReader.getDiffProjects();
- fIsWorkspacePatch = patchReader.isWorkspacePatch();
- }
-
- public DiffProject[] getDiffProjects() {
- return fDiffProjects;
- }
-
- public boolean isWorkspacePatch() {
- return fIsWorkspacePatch;
- }
-
- //---- parsing patch files
-
- public void applyAll(IProgressMonitor pm, IFileValidator validator) throws CoreException {
- if (!fIsWorkspacePatch) {
- super.applyAll(pm, validator);
- } else {
- final int WORK_UNIT= 10;
-
- // get all files to be modified in order to call validateEdit
- List list= new ArrayList();
- for (int j= 0; j < fDiffProjects.length; j++) {
- DiffProject diffProject= fDiffProjects[j];
- if (Utilities.getProject(diffProject).isAccessible())
- list.addAll(Arrays.asList(getTargetFiles(diffProject)));
- }
- // validate the files for editing
- if (!validator.validateResources((IFile[])list.toArray(new IFile[list.size()]))) {
- return;
- }
-
- FilePatch2[] diffs = getDiffs();
- if (pm != null) {
- String message= Messages.WorkspacePatcher_0;
- pm.beginTask(message, diffs.length * WORK_UNIT);
- }
-
- for (int i= 0; i < diffs.length; i++) {
-
- int workTicks= WORK_UNIT;
-
- FilePatch2 diff= diffs[i];
- if (isAccessible(diff)) {
- IFile file= getTargetFile(diff);
- IPath path= file.getProjectRelativePath();
- if (pm != null)
- pm.subTask(path.toString());
- createPath(file.getProject(), path);
-
- List failed= new ArrayList();
-
- int type= diff.getDiffType(isReversed());
- switch (type) {
- case FilePatch2.ADDITION :
- // patch it and collect rejected hunks
- List result= apply(diff, file, true, failed);
- if (result != null)
- store(LineReader.createString(isPreserveLineDelimeters(), result), file, new SubProgressMonitor(pm, workTicks));
- workTicks -= WORK_UNIT;
- break;
- case FilePatch2.DELETION :
- file.delete(true, true, new SubProgressMonitor(pm, workTicks));
- workTicks -= WORK_UNIT;
- break;
- case FilePatch2.CHANGE :
- // patch it and collect rejected hunks
- result= apply(diff, file, false, failed);
- if (result != null)
- store(LineReader.createString(isPreserveLineDelimeters(), result), file, new SubProgressMonitor(pm, workTicks));
- workTicks -= WORK_UNIT;
- break;
- }
-
- if (isGenerateRejectFile() && failed.size() > 0) {
- IPath pp= null;
- if (path.segmentCount() > 1) {
- pp= path.removeLastSegments(1);
- pp= pp.append(path.lastSegment() + REJECT_FILE_EXTENSION);
- } else
- pp= new Path(path.lastSegment() + REJECT_FILE_EXTENSION);
- file= createPath(file.getProject(), pp);
- if (file != null) {
- store(getRejected(failed), file, pm);
- try {
- IMarker marker= file.createMarker(MARKER_TYPE);
- marker.setAttribute(IMarker.MESSAGE, Messages.WorkspacePatcher_1);
- marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
- } catch (CoreException ex) {
- // NeedWork
- }
- }
- }
- }
-
- if (pm != null) {
- if (pm.isCanceled())
- break;
- if (workTicks > 0)
- pm.worked(workTicks);
- }
- }
- }
- }
-
- private boolean isAccessible(FilePatch2 diff) {
- return isEnabled(diff) && Utilities.getProject(diff.getProject()).isAccessible();
- }
-
- /**
- * Returns the target files of all the Diffs contained by this
- * DiffProject.
- * @param project
- * @return An array of IFiles that are targeted by the Diffs
- */
- public IFile[] getTargetFiles(DiffProject project) {
- List files= new ArrayList();
- FilePatch2[] diffs = project.getFileDiffs();
- for (int i = 0; i < diffs.length; i++) {
- FilePatch2 diff = diffs[i];
- if (isEnabled(diff)) {
- files.add(getTargetFile(diff));
- }
- }
- return (IFile[]) files.toArray(new IFile[files.size()]);
- }
-
- public IFile getTargetFile(FilePatch2 diff) {
- IPath path = diff.getStrippedPath(getStripPrefixSegments(), isReversed());
- DiffProject project = getProject(diff);
- if (project != null)
- return Utilities.getProject(project).getFile(path);
- return super.getTargetFile(diff);
- }
-
- private IPath getFullPath(FilePatch2 diff) {
- IPath path = diff.getStrippedPath(getStripPrefixSegments(), isReversed());
- DiffProject project = getProject(diff);
- if (project != null)
- return Utilities.getProject(project).getFile(path).getFullPath();
- return getTarget().getFullPath().append(path);
- }
-
- public ISchedulingRule[] getTargetProjects() {
- List projects= new ArrayList();
- IResourceRuleFactory ruleFactory= ResourcesPlugin.getWorkspace().getRuleFactory();
- // Determine the appropriate scheduling rules
- for (int i= 0; i < fDiffProjects.length; i++) {
- IProject tempProject= Utilities.getProject(fDiffProjects[i]);
- // The goal here is to lock as little of the workspace as necessary
- // but still allow the patcher to obtain the locks it needs.
- // As such, we need to get the modify rules from the rule factory for the .project file. A pessimistic
- // rule factory will return the root, while others might return just the project. Combining
- // this rule with the project will result in the smallest possible locking set.
- ISchedulingRule scheduleRule= ruleFactory.modifyRule(tempProject.getFile(IProjectDescription.DESCRIPTION_FILE_NAME));
- MultiRule multiRule= new MultiRule(new ISchedulingRule[] { scheduleRule, tempProject } );
- projects.add(multiRule);
- }
-
- return (ISchedulingRule[]) projects.toArray(new ISchedulingRule[projects.size()]);
- }
-
- public void setDiffProjects(DiffProject[] newProjectArray) {
- fDiffProjects = new DiffProject[newProjectArray.length];
- System.arraycopy(newProjectArray,0, fDiffProjects, 0, newProjectArray.length);
- }
-
- public void removeProject(DiffProject project) {
- DiffProject[] temp = new DiffProject[fDiffProjects.length - 1];
- int counter = 0;
- for (int i = 0; i < fDiffProjects.length; i++) {
- if (fDiffProjects[i] != project){
- temp[counter++] = fDiffProjects[i];
- }
- }
- fDiffProjects = temp;
- }
-
- protected Object getElementParent(Object element) {
- if (element instanceof FilePatch2 && fDiffProjects != null) {
- FilePatch2 diff = (FilePatch2) element;
- for (int i = 0; i < fDiffProjects.length; i++) {
- DiffProject project = fDiffProjects[i];
- if (project.contains(diff))
- return project;
- }
- }
- return null;
- }
-
- public boolean isRetargeted(Object object) {
- return retargetedDiffs.containsKey(object);
- }
-
- public IPath getOriginalPath(Object object) {
- return (IPath)retargetedDiffs.get(object);
- }
-
- public void retargetDiff(FilePatch2 diff, IFile file) {
- retargetedDiffs.put(diff, diff.getPath(false));
- IHunk[] hunks = diff.getHunks();
-
- if (isWorkspacePatch()){
- //since the diff has no more hunks to apply, remove it from the parent and the patcher
- diff.getProject().remove(diff);
- }
- removeDiff(diff);
- FilePatch2 newDiff = getDiffForFile(file);
- for (int i = 0; i < hunks.length; i++) {
- Hunk hunk = (Hunk) hunks[i];
- newDiff.add(hunk);
- }
- }
-
- private FilePatch2 getDiffForFile(IFile file) {
- DiffProject diffProject = null;
- FilePatch2[] diffsToCheck;
- if (isWorkspacePatch()){
- // Check if the diff project already exists for the file
- IProject project = file.getProject();
- DiffProject[] diffProjects = getDiffProjects();
- for (int i = 0; i < diffProjects.length; i++) {
- if (Utilities.getProject(diffProjects[i]).equals(project)){
- diffProject = diffProjects[i];
- break;
- }
- }
- // If the project doesn't exist yet, create it and add it to the project list
- if (diffProject == null){
- diffProject = addDiffProjectForProject(project);
- }
- diffsToCheck = diffProject.getFileDiffs();
- } else {
- diffsToCheck = getDiffs();
- }
- // Check to see if a diff already exists for the file
- for (int i = 0; i < diffsToCheck.length; i++) {
- FilePatch2 fileDiff = diffsToCheck[i];
- if (isDiffForFile(fileDiff, file)) {
- return fileDiff;
- }
- }
-
- // Create a new diff for the file
- IPath path = getDiffPath(file);
- FilePatch2 newDiff = new FilePatch2(path, 0, path, 0);
- if (diffProject != null){
- diffProject.add(newDiff);
- }
- addDiff(newDiff);
- return newDiff;
- }
-
- private IPath getDiffPath(IFile file) {
- DiffProject project = getDiffProject(file.getProject());
- if (project != null) {
- return file.getProjectRelativePath();
- }
- return file.getFullPath().removeFirstSegments(getTarget().getFullPath().segmentCount());
- }
-
- private boolean isDiffForFile(FilePatch2 fileDiff, IFile file) {
- return getFullPath(fileDiff).equals(file.getFullPath());
- }
-
- private DiffProject addDiffProjectForProject(IProject project) {
- DiffProject[] diffProjects = getDiffProjects();
- DiffProject diffProject = new DiffProject(project.getName());
- DiffProject[] newProjectArray = new DiffProject[diffProjects.length + 1];
- System.arraycopy(diffProjects, 0, newProjectArray, 0, diffProjects.length);
- newProjectArray[diffProjects.length] = diffProject;
- setDiffProjects(newProjectArray);
- return diffProject;
- }
-
- public void retargetHunk(Hunk hunk, IFile file) {
- FilePatch2 newDiff = getDiffForFile(file);
- newDiff.add(hunk);
- }
-
- public void retargetProject(DiffProject project, IProject targetProject) {
- retargetedDiffs.put(project, Utilities.getProject(project).getFullPath());
- FilePatch2[] diffs = project.getFileDiffs();
- DiffProject selectedProject = getDiffProject(targetProject);
- if (selectedProject == null)
- selectedProject = addDiffProjectForProject(targetProject);
- // Copy over the diffs to the new project
- for (int i = 0; i < diffs.length; i++) {
- selectedProject.add(diffs[i]);
- }
- // Since the project has been retargeted, remove it from the patcher
- removeProject(project);
- }
-
- /**
- * Return the diff project for the given project
- * or <code>null</code> if the diff project doesn't exist
- * or if the patch is not a workspace patch.
- * @param project the project
- * @return the diff project for the given project
- * or <code>null</code>
- */
- private DiffProject getDiffProject(IProject project) {
- if (!isWorkspacePatch())
- return null;
- DiffProject[] projects = getDiffProjects();
- for (int i = 0; i < projects.length; i++) {
- if (Utilities.getProject(projects[i]).equals(project))
- return projects[i];
- }
- return null;
- }
-
- public int getStripPrefixSegments() {
- // Segments are never stripped from a workspace patch
- if (isWorkspacePatch())
- return 0;
- return super.getStripPrefixSegments();
- }
-
-}

Back to the top