Package org.eclipse.egit.ui.wizards.clone

Source Code of org.eclipse.egit.ui.wizards.clone.SampleTestRepository

/*******************************************************************************
* Copyright (C) 2010, Matthias Sohn <matthias.sohn@sap.com>
*
* 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
*******************************************************************************/
package org.eclipse.egit.ui.wizards.clone;

import static org.junit.Assert.assertFalse;

import java.io.File;
import java.io.IOException;
import java.util.Random;

import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.junit.http.SimpleHttpServer;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryBuilder;
import org.eclipse.jgit.revwalk.RevBlob;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevTag;
import org.eclipse.jgit.transport.Daemon;
import org.eclipse.jgit.transport.DaemonClient;
import org.eclipse.jgit.transport.resolver.FileResolver;
import org.eclipse.jgit.util.FileUtils;

/**
* Creates an on disk sample repository with some generated content and starts a
* git daemon on a free port.
*
* If the system property <code>test-repo-no-cleanup</code> is defined the
* source repository data will not be deleted from disk to enable testing the
* test.
*/
public class SampleTestRepository {
  /**
   * Name of the test repository
   */
  public static final String REPO_NAME = "test";

  /**
   * Name of a branch in the sample repository
   */
  public static final String FIX = "fix";

  /**
   * Name of a tag in the sample repository
   */
  public static final String v1_0_name = "v1_0";

  /**
   * Name of a tag in the sample repository
   */
  public static final String v2_0_name = "v2_0";

  /**
   * Name of a file in the sample repository
   */
  public static final String A_txt_name = "A_txt";

  private static final File trash = new File("target/trash");

  private final TestRepository<Repository> src;

  private Daemon d;

  private SimpleHttpServer httpServer;

  private String uri;

  private RevBlob A_txt;

  private RevCommit A, B, C;

  private RevTag v1_0, v2_0;

  private final boolean serveHttp;

  public String getUri() {
    return uri;
  }

  /**
   * Create a bare repository, generate some sample data and start git daemon
   * on a free port
   *
   * @param n
   *            hint how many random commits should be generated
   * @param serveHttp
   *
   * @throws Exception
   */
  public SampleTestRepository(int n, boolean serveHttp) throws Exception {
    this.serveHttp = serveHttp;
    src = createRepository();
    generateSampleData(n);
    if (serveHttp)
      serveHttp();
    else
      serve();
  }

  private TestRepository<Repository> createRepository() throws Exception {
    String gitdirName = "test" + System.currentTimeMillis()
        + Constants.DOT_GIT;
    File gitdir = new File(trash, gitdirName).getCanonicalFile();
    Repository db = new RepositoryBuilder().setGitDir(gitdir).build();
    assertFalse(gitdir.exists());
    db.create();
    return new TestRepository<Repository>(db);
  }

  private void generateSampleData(int n) throws Exception {
    A_txt = src.blob("A");
    A = src.commit().add(A_txt_name, A_txt).create();
    src.update(Constants.R_HEADS + Constants.MASTER, A);

    // create some random commits
    RevCommit X = A;
    for (int i = 0; i < n; i++) {
      X = src.commit().parent(X)
          .add(randomAsciiString(), randomAsciiString()).create();
    }

    B = src.commit().parent(X).add(A_txt_name, "C").add("B", "B").create();
    src.update(Constants.R_HEADS + Constants.MASTER, B);

    v1_0 = src.tag(v1_0_name, B);
    src.update(Constants.R_TAGS + v1_0_name, v1_0);

    C = src.commit().parent(A).add(A_txt_name, "D").add("C", "C").create();
    src.update(Constants.R_HEADS + FIX, C);

    v2_0 = src.tag(v2_0_name, C);
    src.update(Constants.R_TAGS + v2_0_name, v2_0);
  }

  private String randomAsciiString() {
    StringBuilder randstring = new StringBuilder("");
    Random rand = new Random();
    int strlen = rand.nextInt(20) + 10;
    for (int i = 0, j = 0; i < strlen; i++) {
      if (rand.nextInt(2) == 1)
        j = 97;
      else
        j = 65;
      randstring.append((char) (rand.nextInt(26) + j));
    }
    return randstring.toString();
  }

  private void serve() throws IOException {
    d = new Daemon();
    FileResolver<DaemonClient> resolver = new FileResolver<DaemonClient>();
    resolver.exportRepository(REPO_NAME, src.getRepository());
    d.setRepositoryResolver(resolver);
    d.start();
    uri = "git://localhost:" + d.getAddress().getPort() + "/" + REPO_NAME
        + Constants.DOT_GIT_EXT;
  }

  private void serveHttp() throws Exception{
    httpServer = new SimpleHttpServer(src.getRepository());
    httpServer.start();
    uri = httpServer.getUri().toString();
  }

  /**
   * Stop the git daemon and delete test data from disk. If the system
   * property <code>test-repo-no-cleanup</code> is defined the test data will
   * be left on disk for analysis.
   *
   * @throws Exception
   *             deletion of test repository failed
   * @throws IOException
   *             deletion of test repository failed
   */
  public void shutDown() throws Exception {
    src.getRepository().close();
    if (serveHttp)
      httpServer.stop();
    else
      d.stop();

    if (!System.getProperties().contains("test-repo-no-cleanup"))
      FileUtils.delete(trash, FileUtils.RECURSIVE | FileUtils.RETRY);
  }

}
TOP

Related Classes of org.eclipse.egit.ui.wizards.clone.SampleTestRepository

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.