view mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ModificationDataFactory.java @ 691:d4ef6a366768

extract code to utility
author eugene.petrenko@gmail.com
date Thu, 19 Dec 2013 19:10:00 +0100
parents
children 31a1aca3305c
line wrap: on
line source
package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.ChangeSet;
import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.ChangeSetRevision;
import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.FileStatus;
import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.Status;
import jetbrains.buildServer.log.Loggers;
import jetbrains.buildServer.vcs.*;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

import static java.util.Collections.emptyList;

/**
 * Created 19.12.13 19:05
 *
 * @author Eugene Petrenko (eugene.petrenko@jetbrains.com)
 */
public class ModificationDataFactory {
  @NotNull
  public static ModificationData createModificationData(@NotNull final OperationContext ctx,
                                                        @NotNull final ChangeSet cset,
                                                        @NotNull final VcsRoot root,
                                                        @NotNull final CheckoutRules checkoutRules) throws VcsException {
    final List<ChangeSetRevision> parents = cset.getParents();
    if (parents.isEmpty()) throw new IllegalStateException("Commit " + cset.getId() + " has no parents");

    final String version = ctx.getStringFromPool(cset.getId());
    final List<VcsChange> files = toVcsChanges(ctx, cset.getModifiedFiles(), ctx.getStringFromPool(parents.get(0).getId()), version, checkoutRules);
    final ModificationData result = new ModificationData(cset.getTimestamp(), files, cset.getDescription(), ctx.getStringFromPool(cset.getUser()), root, version, version);

    for (ChangeSetRevision parent : parents) {
      result.addParentRevision(ctx.getStringFromPool(parent.getId()));
    }
    setCanBeIgnored(result, cset);
    return result;
  }

  private static void setCanBeIgnored(@NotNull final ModificationData md,
                                      @NotNull final ChangeSet cset) {
    if (md.getParentRevisions().size() > 1) {
      //don't ignore merge commits
      md.setCanBeIgnored(false);
    } else if (cset.getModifiedFiles().isEmpty()) {
      //don't ignore empty commits
      md.setCanBeIgnored(false);
    }
  }


  @NotNull
  public static List<VcsChange> toVcsChanges(@NotNull OperationContext ctx,
                                             @NotNull List<FileStatus> modifiedFiles,
                                             @NotNull String prevVer,
                                             @NotNull String curVer,
                                             @NotNull CheckoutRules rules) {
    final List<VcsChange> files = new ArrayList<VcsChange>(0);
    for (FileStatus mf : modifiedFiles) {
      if (rules.map(mf.getPath()) == null) continue;

      final String normalizedPath = PathUtil.normalizeSeparator(mf.getPath());
      final String path = ctx.getStringFromPool(normalizedPath);
      files.add(new VcsChange(getChangeType(mf.getStatus()), mf.getStatus().getName(), path, path, prevVer, curVer));
    }

    if (files.isEmpty()) return emptyList();
    return files;
  }

  @NotNull
  private static VcsChangeInfo.Type getChangeType(final Status status) {
    switch (status) {
      case ADDED:
        return VcsChangeInfo.Type.ADDED;
      case MODIFIED:
        return VcsChangeInfo.Type.CHANGED;
      case REMOVED:
        return VcsChangeInfo.Type.REMOVED;
      default:
        Loggers.VCS.warn("Unable to convert status: " + status + " to VCS change type");
        return VcsChangeInfo.Type.NOT_CHANGED;
    }
  }
}