view mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderSupport.java @ 964:e4332192fc0d Indore-2017.1.x

TW-50033 handle tag and branch name clash during labeling
author Dmitry Neverov <dmitry.neverov@gmail.com>
date Mon, 15 May 2017 18:16:13 +0200
parents b130c7d27c02
children 7bf4d943d5bb
line wrap: on
line source
/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jetbrains.buildServer.buildTriggers.vcs.mercurial;

import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.CommitsAndMountPointsCommand;
import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.HgVcsRoot;
import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.LogCommand;
import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.WrongSubrepoUrlException;
import jetbrains.buildServer.dataStructures.MultiMapToList;
import jetbrains.buildServer.vcs.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Date;
import java.util.Map;

/**
 * Created 30.09.13 13:05
 *
 * @author Eugene Petrenko (eugene.petrenko@jetbrains.com)
 */
public class MercurialCommitsInfoBuilderSupport implements CommitsInfoBuilder, MercurialServerExtension {
  private final MercurialVcsSupport mySupport;
  private final HgVcsRootFactory myHgVcsRootFactory;

  public MercurialCommitsInfoBuilderSupport(@NotNull MercurialVcsSupport vcs,
                                            @NotNull HgVcsRootFactory vcsRootFactory) {
    vcs.addExtension(this);
    mySupport = vcs;
    myHgVcsRootFactory = vcsRootFactory;
  }

  @NotNull
  private static MultiMapToList<String, String> commitToBranchs(@NotNull final Map<String, String> branchToCommit) {
    final MultiMapToList<String, String> map = new MultiMapToList<String, String>();
    for (Map.Entry<String, String> e : branchToCommit.entrySet()) {
      map.add(e.getValue(), e.getKey());
    }
    return map;
  }

  public void collectCommits(@NotNull final VcsRoot root,
                             @NotNull final CheckoutRules rules,
                             @NotNull final CommitsConsumer consumer) throws VcsException {

    final HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
    final ServerHgRepo repo = mySupport.createRepo(hgRoot);
    VcsCallable<MultiMapToList<String, String>> cmd = new VcsCallable<MultiMapToList<String, String>>() {
      public MultiMapToList<String, String> call() throws VcsException {
        return commitToBranchs(mySupport.getCollectChangesPolicy().getHeads(hgRoot));
      }
    };
    final MultiMapToList<String, String> heads = mySupport.syncRepository(hgRoot, new SyncSettings<MultiMapToList<String, String>>(cmd));
    repo.logSubstates().call(new CommitsAndMountPointsCommand.Callback() {
      private final MercurialCommitsInfoBuilderStates subs = new MercurialCommitsInfoBuilderStates();

      public void processHGSubFile(@NotNull String fileId, @NotNull String text) {
        subs.addSubNode(fileId, text);
      }

      public void processHGSubStateFile(@NotNull String fileId, @NotNull String text) {
        subs.addStateNode(fileId, text);
      }

      public void onCommit(@NotNull String commitNum,
                           @NotNull String commitId,
                           @NotNull String[] parents,
                           @NotNull String branch,
                           @NotNull String[] tags,
                           @NotNull String author,
                           @NotNull String message,
                           @NotNull Date timestamp,
                           @Nullable String hgsubNodeId,
                           @Nullable String hgsubstateNodeId) {

        final CommitDataBean bean = new CommitDataBean(
                HgRepo.shortId(commitId),
                HgRepo.shortId(commitId),
                timestamp
                );

        for (String parent : parents) {
          if (LogCommand.ZERO_PARENT_ID.equals(parent)) continue;
          if (LogCommand.ZERO_PARENT_SHORT_ID.equals(parent)) continue;
          bean.addParentRevision(HgRepo.shortId(parent));
        }

        for (String tag : tags) {
          if ("tip".equals(tag)) continue;

          bean.addTag(tag);
        }

        bean.addBranch(branch);
        bean.setCommitAuthor(author);
        bean.setCommitMessage(message);

        for (SubRepo subRepo : subs.mounts(hgsubNodeId, hgsubstateNodeId).values()) {
          try {
            bean.addMountPoint(new CommitMountPointDataBean(
                    subRepo.vcsType().getVcsPluginName(),
                    subRepo.resolveUrl(hgRoot.getRepository()),
                    subRepo.path(),
                    subRepo.revision()
                    ));
          } catch (WrongSubrepoUrlException e) {
            //NOP
          }
        }

        bean.setHeads(heads.getValues(bean.getVersion()));

        consumer.consumeCommit(bean);
      }
    });
  }

}