view mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialBuildLogProgress.java @ 1030:1c65ee703a92 release-84894

TW-64274 fix working dir may be locked on "hg pull"
author nikolai.kulakov@DESKTOP-Q4QCGIH
date Fri, 07 Aug 2020 12:13:57 +0300
parents 7bf4d943d5bb
children
line wrap: on
line source
/*
 * Copyright 2000-2018 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.agent.BuildProgressLogger;
import org.jetbrains.annotations.NotNull;

import java.util.concurrent.atomic.AtomicInteger;

public class MercurialBuildLogProgress implements MercurialProgress {

  private final BuildProgressLogger myLogger;
  private final AtomicInteger myBlockMessageCount = new AtomicInteger(0);
  private String myPrevMessage;
  private int myPrevPercents;

  public MercurialBuildLogProgress(@NotNull BuildProgressLogger logger) {
     myLogger = logger;
  }

  public void progressStarted(@NotNull String progressMessage) {
    myBlockMessageCount.set(0);
    myLogger.activityStarted(progressMessage, "CUSTOM_HG_PROGRESS");
  }

  public void reportProgress(@NotNull String progressMessage) {
    myBlockMessageCount.incrementAndGet();
    myLogger.message(progressMessage);
  }

  public void progressFinished(@NotNull String progressMessage) {
    if (myBlockMessageCount.get() == 0)
      myLogger.message("");//add an empty message so that the empty block is shown in UI
    myLogger.activityFinished(progressMessage, "CUSTOM_HG_PROGRESS");
  }

  public void reportProgress(float percentage, @NotNull String stage) {
    if (percentage < 0) {
      resetPrevProgress();
      reportProgress(stage);
    } else {
      int percents = (int) Math.floor(percentage * 100);
      if (!isDuplicate(stage, percents)) {
        myLogger.message(stage + " " + percents + "%");
        updatePrevProgress(stage, percents);
      }
    }
  }

  private void resetPrevProgress() {
    myPrevMessage = null;
    myPrevPercents = -1;
  }

  private boolean isDuplicate(@NotNull String message, int percents) {
    return message.equals(myPrevMessage) && percents == myPrevPercents;
  }

  private void updatePrevProgress(@NotNull String message, int percents) {
    myPrevMessage = message;
    myPrevPercents = percents;
  }
}