All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.itemis.maven.plugins.unleash.scm.requests.UpdateRequest Maven / Gradle / Ivy

There is a newer version: 3.1.0
Show newest version
package com.itemis.maven.plugins.unleash.scm.requests;

import java.util.Set;

import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.Sets;
import com.itemis.maven.plugins.unleash.scm.merge.MergeClient;
import com.itemis.maven.plugins.unleash.scm.merge.MergeStrategy;

/**
 * A Request for updating the local working copy from the remote repository.
* USE {@link #builder()} TO CREATE A REQUEST!
*
* The following configuration options are possible: *
    *
  1. Update the whole working directory.
  2. *
  3. Update only specific files of the working directory.
  4. *
  5. Specify a merge strategy and optionally a {@link MergeClient} for update conflicts.
  6. *
* * @author Stanley Hillner * @since 0.1.0 */ public class UpdateRequest { private Set pathsToUpdate; private String targetRevision; private MergeStrategy mergeStrategy = MergeStrategy.DO_NOT_MERGE; private MergeClient mergeClient; private UpdateRequest() { this.pathsToUpdate = Sets.newHashSet(); // use builder! } public static Builder builder() { return new Builder(); } public Set getPathsToUpdate() { return this.pathsToUpdate; } public boolean updateAllChanges() { return this.pathsToUpdate.isEmpty(); } public Optional getTargetRevision() { return Optional.fromNullable(this.targetRevision); } public MergeStrategy getMergeStrategy() { return this.mergeStrategy; } public Optional getMergeClient() { return Optional.fromNullable(this.mergeClient); } /** * The builder for a {@link UpdateRequest}. * * @author Stanley Hillner * @since 0.1.0 */ public static class Builder { private UpdateRequest request = new UpdateRequest(); /** * Adds some working directory-relative paths of files or folders to the list of paths to update.
* Once some paths are added only these files are updated, nothing else!
* * @param paths some filepaths to update. * @return the builder itself. */ public Builder addPaths(String... paths) { for (String path : paths) { this.request.pathsToUpdate.add(path); } return this; } /** * Sets the working directory-relative paths of files or folders to update. This method totally overrides all paths * added previously!
* Once some paths are added only these files are updated, nothing else!
* Use {@code paths(null)} to unset the list of files and update all changes of the working copy. * * @param paths the filepaths to update. * @return the builder itself. */ public Builder paths(Set paths) { if (paths != null) { this.request.pathsToUpdate = paths; } else { this.request.pathsToUpdate = Sets.newHashSet(); } return this; } /** * @param revision the revision to which the working copy shall be updated.
* If this revision is omitted, HEAD is assumed. * @return the builder itself. */ public Builder toRevision(String revision) { this.request.targetRevision = revision; return this; } /** * Sets the merge strategy to {@link MergeStrategy#USE_LOCAL} for merge conflicts during the update.
* This will request overriding of all conflicting changes with the local versions. * * @return the builder itself. */ public Builder mergeUseLocal() { this.request.mergeStrategy = MergeStrategy.USE_LOCAL; return this; } /** * Sets the merge strategy to {@link MergeStrategy#USE_REMOTE} for merge conflicts during the update.
* This will request overriding of all conflicting changes with the remote versions. * * @return the builder itself. */ public Builder mergeUseRemote() { this.request.mergeStrategy = MergeStrategy.USE_REMOTE; return this; } /** * Sets the merge strategy to {@link MergeStrategy#FULL_MERGE} for merge conflicts during the update.
* This will request real merging of conflicts between local and remote changes. In case of such a conflict the * {@link MergeClient} is used to resolve the conflict.
*
* Set the merge client using {@link #mergeClient(MergeClient)} when setting this merge strategy! * * @return the builder itself. */ public Builder merge() { this.request.mergeStrategy = MergeStrategy.FULL_MERGE; return this; } /** * Sets the merge strategy to {@link MergeStrategy#DO_NOT_MERGE} for merge conflicts during the update.
* This will request to not merge local and remote changes which will likely result in failure messages or conflict * info being written. * * @return the builder itself. */ public Builder noMerge() { this.request.mergeStrategy = MergeStrategy.DO_NOT_MERGE; return this; } /** * Sets a specific merge strategy for merge conflicts during the update. * * @param mergeStrategy the requested merge strategy. {@code null} results in {@link MergeStrategy#DO_NOT_MERGE}. * @return the builder itself. */ public Builder mergeStrategy(MergeStrategy mergeStrategy) { if (mergeStrategy != null) { this.request.mergeStrategy = mergeStrategy; } else { noMerge(); } return this; } /** * @param mergeClient the merge client to be used in case of merge conflicts and merge strategy * {@link MergeStrategy#FULL_MERGE}. * @return the builder itself. */ public Builder mergeClient(MergeClient mergeClient) { this.request.mergeClient = mergeClient; return this; } /** * Checks the settings of the request to build and builds the actual update request. * * @return the request for updating the local working copy. */ public UpdateRequest build() { if (MergeStrategy.FULL_MERGE == this.request.mergeStrategy) { Preconditions.checkState(this.request.mergeClient != null, "Merge strategy " + this.request.mergeStrategy + " has been requested but no merge client is set!"); } return this.request; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy