/**
   * Push from repository1 "master" into "test" of repository2.
   *
   * @throws Exception
   */
  @Test
  public void testPush() throws Exception {
    // push from repository1 to repository2
    System.out.println(repository2.getBranch());
    PushOperation pop = createPushOperation();
    pop.execute();
    assertEquals(
        org.eclipse.jgit.transport.RemoteRefUpdate.Status.UP_TO_DATE,
        getStatus(pop.getOperationResult()));
    System.out.println(pop.toString());
    ArrayList<String> files = new ArrayList<String>();

    File file = new File(workdir, "file2.txt");
    FileUtils.createNewFile(file);
    repositoryUtil.appendFileContent(file, "new file");
    files.add(repositoryUtil.getRepoRelativePath(file.getAbsolutePath()));

    AddToIndexOperation trop = new AddToIndexOperation(files, repository1);
    trop.execute();

    CommitOperation cop =
        new CommitOperation(repository1, files, files, AUTHOR, COMMITTER, "added files");
    cop.execute();

    pop = createPushOperation();
    pop.execute();
    assertEquals(
        org.eclipse.jgit.transport.RemoteRefUpdate.Status.OK, getStatus(pop.getOperationResult()));
    System.out.println(pop.toString());
    try {
      // assert that we cannot run this again
      pop.execute();
      fail("Expected Exception not thrown");
    } catch (IllegalStateException e) {
      // expected
    }

    pop = createPushOperation();
    pop.execute();
    assertEquals(
        org.eclipse.jgit.transport.RemoteRefUpdate.Status.UP_TO_DATE,
        getStatus(pop.getOperationResult()));
    System.out.println(pop.toString());
    File testFile = new File(workdir2, repositoryUtil.getRepoRelativePath(file.getAbsolutePath()));
    assertFalse(testFile.exists());
    testFile = new File(workdir, repositoryUtil.getRepoRelativePath(file.getAbsolutePath()));
    assertTrue(testFile.exists());

    // check out test and verify the file is there
    new Git(repository2).checkout().setName("refs/heads/test").call();
    testFile = new File(workdir2, repositoryUtil.getRepoRelativePath(file.getAbsolutePath()));
    assertTrue(testFile.exists());
  }
  @Test
  public void testUpdateTrackingBranchIfSpecifiedInRemoteRefUpdate() throws Exception {
    // Commit on repository 2
    //		RevCommit commit = repository2.addAndCommit(project, new File(workdir2, "test.txt"), "Commit
    // in repository 2");
    System.out.println(repository2.getBranch());
    new Git(repository2).checkout().setName("refs/heads/test").call();
    System.out.println(repository2.getBranch());
    ArrayList<String> files = new ArrayList<String>();
    File file = new File(workdir2, "test.txt");
    FileUtils.createNewFile(file);
    repositoryUtil.appendFileContent(file, "create file of test.txt in repository 2");
    files.add(repositoryUtil.getRepoRelativePath(file.getAbsolutePath()));

    AddToIndexOperation trop = new AddToIndexOperation(files, repository2);
    trop.execute();

    CommitOperation cop =
        new CommitOperation(repository2, files, files, AUTHOR, COMMITTER, "Commit in repository 2");
    cop.execute();
    // We want to push from repository 2 to 1 (because repository 2 already
    // has tracking set up)
    //		URIish remote = repository1.getUri();
    URIish remote = new URIish("file:///" + repository1.getDirectory().toString());

    String trackingRef = "refs/remotes/origin/master";
    RemoteRefUpdate update =
        new RemoteRefUpdate(repository2, "HEAD", "refs/heads/master", false, trackingRef, null);
    PushOperationSpecification spec = new PushOperationSpecification();
    spec.addURIRefUpdates(remote, Arrays.asList(update));

    PushOperation push = new PushOperation(repository2, spec, false, 0);
    push.execute();

    PushOperationResult result = push.getOperationResult();
    PushResult pushResult = result.getPushResult(remote);
    TrackingRefUpdate trf = pushResult.getTrackingRefUpdate(trackingRef);
    System.out.println(trf.getLocalName());
    System.out.println(trf.getRemoteName());
    assertNotNull(
        "Expected result to have tracking ref update",
        pushResult.getTrackingRefUpdate(trackingRef));

    ObjectId trackingId = repository2.resolve(trackingRef);
    assertEquals("Expected tracking branch to be updated", cop.getCommit().getId(), trackingId);
    new Git(repository1).checkout().setName("refs/heads/master").call();
    File testFile = new File(workdir2, repositoryUtil.getRepoRelativePath(file.getAbsolutePath()));
    assertTrue(testFile.exists());
  }
  @Test
  public void testBranchOperation() throws Exception {
    String br1 = repository.getFullBranch();
    System.out.println(br1);
    File file = new File(workdir, "file1.txt");
    FileUtils.createNewFile(file);

    List<String> list = Arrays.asList(repositoryUtil.getRepoRelativePath(file.getAbsolutePath()));

    AddToIndexOperation addfile = new AddToIndexOperation(list, repository);

    addfile.execute();

    CommitOperation commitfile = new CommitOperation(repository, AUTHOR, COMMITTER, "first commit");
    commitfile.execute();

    // create branch of "test1"

    CreateLocalBranchOperation branchCre =
        new CreateLocalBranchOperation(
            repository, "test1", repository.getAllRefs().get(MASTER), null);
    branchCre.execute();

    // checkout branch of test1
    BranchOperation bo = new BranchOperation(repository, "test1");
    bo.execute();
    String br2 = repository.getFullBranch();
    System.out.println(br2);
    assertTrue(repository.getFullBranch().equals(TEST));
    System.out.println(bo.toString());
  }