// modified + checkout = clean
  @Test
  @Ignore("not supported yet")
  public void testCheckoutDotPath() throws Exception {
    // clone a repo
    URI workspaceLocation = createWorkspace(getMethodName());
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName(), null);
    IPath clonePath =
        new Path("file").append(project.getString(ProtocolConstants.KEY_ID)).makeAbsolute();
    clone(clonePath);

    // get project metadata
    WebRequest request =
        getGetFilesRequest(project.getString(ProtocolConstants.KEY_CONTENT_LOCATION));
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    project = new JSONObject(response.getText());

    JSONObject testTxt = getChild(project, "test.txt");
    modifyFile(testTxt, "change");

    JSONObject folder1 = getChild(project, "folder");
    JSONObject folderTxt = getChild(folder1, "folder.txt");
    modifyFile(folderTxt, "change");

    JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
    String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);
    String gitCloneUri = GitStatusTest.getCloneUri(gitStatusUri);

    request = getCheckoutRequest(gitCloneUri, new String[] {"."});
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    assertStatus(StatusResult.CLEAN, gitStatusUri);
  }
  // modified + checkout = clean
  @Test
  public void testCheckoutInFolder() throws Exception {
    // clone a repo
    URI workspaceLocation = createWorkspace(getMethodName());
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName(), null);
    IPath clonePath =
        new Path("file").append(project.getString(ProtocolConstants.KEY_ID)).makeAbsolute();
    clone(clonePath);

    // get project metadata
    WebRequest request =
        getGetFilesRequest(project.getString(ProtocolConstants.KEY_CONTENT_LOCATION));
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    project = new JSONObject(response.getText());

    JSONObject testTxt = getChild(project, "test.txt");
    modifyFile(testTxt, "change");

    JSONObject folder1 = getChild(project, "folder");
    JSONObject folderTxt = getChild(folder1, "folder.txt");
    modifyFile(folderTxt, "change");

    JSONObject gitSection = folder1.getJSONObject(GitConstants.KEY_GIT);
    String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);
    // we should get a proper clone URI here: /git/clone/file/{projectId}/
    String gitCloneUri = GitStatusTest.getCloneUri(gitStatusUri);

    request = getCheckoutRequest(gitCloneUri, new String[] {"folder/folder.txt"});
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    // 'test.txt' is still modified
    assertStatus(new StatusResult().setModifiedNames("test.txt"), gitStatusUri);
  }
  @Test
  public void testCheckoutAfterResetByPath() throws Exception {
    URI workspaceLocation = createWorkspace(getMethodName());
    JSONObject projectTop = createProjectOrLink(workspaceLocation, getMethodName() + "-top", null);
    IPath clonePathTop =
        new Path("file").append(projectTop.getString(ProtocolConstants.KEY_ID)).makeAbsolute();
    JSONObject projectFolder =
        createProjectOrLink(workspaceLocation, getMethodName() + "-folder", null);
    IPath clonePathFolder =
        new Path("file")
            .append(projectFolder.getString(ProtocolConstants.KEY_ID))
            .append("folder")
            .makeAbsolute();

    IPath[] clonePaths = new IPath[] {clonePathTop, clonePathFolder};

    for (IPath clonePath : clonePaths) {
      // clone a repo
      JSONObject clone = clone(clonePath);
      String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

      // get project/folder metadata
      WebRequest request = getGetFilesRequest(cloneContentLocation);
      WebResponse response = webConversation.getResponse(request);
      assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
      JSONObject folder = new JSONObject(response.getText());

      JSONObject gitSection = folder.getJSONObject(GitConstants.KEY_GIT);
      String gitIndexUri = gitSection.getString(GitConstants.KEY_INDEX);
      String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);
      String gitCloneUri = GitStatusTest.getCloneUri(gitStatusUri);

      JSONObject testTxt = getChild(folder, "test.txt");
      modifyFile(testTxt, "change");

      assertStatus(new StatusResult().setModified(1), gitStatusUri);

      addFile(testTxt);

      assertStatus(new StatusResult().setChanged(1), gitStatusUri);

      // unstage
      request =
          GitResetTest.getPostGitIndexRequest(
              gitIndexUri, new String[] {"test.txt"}, null, (String) null);
      response = webConversation.getResponse(request);
      assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

      // check status again
      assertStatus(new StatusResult().setModified(1), gitStatusUri);

      // checkout
      request = getCheckoutRequest(gitCloneUri, new String[] {"test.txt"});
      response = webConversation.getResponse(request);
      assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

      // check status one more time
      assertStatus(StatusResult.CLEAN, gitStatusUri);
    }
  }
  @Test
  public void testCheckoutPathInUri() throws Exception {
    // clone a repo
    URI workspaceLocation = createWorkspace(getMethodName());
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName(), null);
    IPath clonePath =
        new Path("file").append(project.getString(ProtocolConstants.KEY_ID)).makeAbsolute();
    clone(clonePath);

    // get project metadata
    WebRequest request =
        getGetFilesRequest(project.getString(ProtocolConstants.KEY_CONTENT_LOCATION));
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    project = new JSONObject(response.getText());

    JSONObject testTxt = getChild(project, "test.txt");
    modifyFile(testTxt, "change");

    JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
    String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);
    String gitCloneUri = GitStatusTest.getCloneUri(gitStatusUri);

    // TODO: don't create URIs out of thin air
    request = getCheckoutRequest(gitCloneUri + "test.txt", new String[] {});
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_BAD_REQUEST, response.getResponseCode());
  }
  @Test
  public void testCheckoutUntrackedFile() throws Exception {
    // clone a repo
    URI workspaceLocation = createWorkspace(getMethodName());
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName(), null);
    IPath clonePath =
        new Path("file").append(project.getString(ProtocolConstants.KEY_ID)).makeAbsolute();
    clone(clonePath);

    // get project metadata
    WebRequest request =
        getGetFilesRequest(project.getString(ProtocolConstants.KEY_CONTENT_LOCATION));
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    project = new JSONObject(response.getText());

    String fileName = "new.txt";
    request =
        getPostFilesRequest(
            project.getString(ProtocolConstants.KEY_LOCATION),
            getNewFileJSON(fileName).toString(),
            fileName);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_CREATED, response.getResponseCode());

    JSONObject gitSection = project.getJSONObject(GitConstants.KEY_GIT);
    String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);
    String gitCloneUri = GitStatusTest.getCloneUri(gitStatusUri);

    // checkout the new file
    request = getCheckoutRequest(gitCloneUri, new String[] {fileName});
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    // nothing has changed, checkout doesn't touch untracked files
    assertStatus(new StatusResult().setUntrackedNames(fileName), gitStatusUri);

    // discard the new file
    request = getCheckoutRequest(gitCloneUri, new String[] {fileName}, true);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    assertStatus(StatusResult.CLEAN, gitStatusUri);
  }
Example #6
0
  @Test
  public void testDiffWithCommonAncestor() throws Exception {
    // clone: create
    URI workspaceLocation = createWorkspace(getMethodName());
    JSONObject project = createProjectOrLink(workspaceLocation, getMethodName(), null);
    String projectId = project.getString(ProtocolConstants.KEY_ID);
    IPath clonePath =
        new Path("file").append(project.getString(ProtocolConstants.KEY_ID)).makeAbsolute();
    JSONObject clone = clone(clonePath);
    String cloneLocation = clone.getString(ProtocolConstants.KEY_LOCATION);
    String branchesLocation = clone.getString(GitConstants.KEY_BRANCH);

    // get project metadata
    WebRequest request =
        getGetFilesRequest(project.getString(ProtocolConstants.KEY_CONTENT_LOCATION));
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    project = new JSONObject(response.getText());
    JSONObject gitSection = project.optJSONObject(GitConstants.KEY_GIT);
    assertNotNull(gitSection);

    String a = "a";
    branch(branchesLocation, a);

    // checkout 'a'
    checkoutBranch(cloneLocation, a);

    // modify while on 'a'
    request = getPutFileRequest(projectId + "/test.txt", "change in a");
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    gitSection = project.optJSONObject(GitConstants.KEY_GIT);
    assertNotNull(gitSection);
    String gitIndexUri = gitSection.getString(GitConstants.KEY_INDEX);
    String gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);
    String gitHeadUri = gitSection.getString(GitConstants.KEY_HEAD);
    String gitDiffUri = gitSection.getString(GitConstants.KEY_DIFF);

    // "git add ."
    request = GitAddTest.getPutGitIndexRequest(gitIndexUri);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    // commit all
    request = GitCommitTest.getPostGitCommitRequest(gitHeadUri, "commit on a", false);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    // assert clean
    request = GitStatusTest.getGetGitStatusRequest(gitStatusUri);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    JSONObject statusResponse = new JSONObject(response.getText());
    GitStatusTest.assertStatusClean(statusResponse);

    // checkout 'master'
    checkoutBranch(cloneLocation, Constants.MASTER);

    // modify the same file on master
    request = getPutFileRequest(projectId + "/test.txt", "change in master");
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    gitSection = project.optJSONObject(GitConstants.KEY_GIT);
    assertNotNull(gitSection);
    gitIndexUri = gitSection.getString(GitConstants.KEY_INDEX);
    gitStatusUri = gitSection.getString(GitConstants.KEY_STATUS);
    gitHeadUri = gitSection.getString(GitConstants.KEY_HEAD);

    // "git add ."
    request = GitAddTest.getPutGitIndexRequest(gitIndexUri);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    // commit all
    request = GitCommitTest.getPostGitCommitRequest(gitHeadUri, "commit on master", false);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

    // assert clean
    request = GitStatusTest.getGetGitStatusRequest(gitStatusUri);
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    statusResponse = new JSONObject(response.getText());
    GitStatusTest.assertStatusClean(statusResponse);

    // TODO: replace with REST API for git log when ready, see bug 339104
    // TODO: don't create URIs out of thin air
    String enc = URLEncoder.encode(Constants.MASTER + ".." + a, "UTF-8");
    String location = gitDiffUri.replaceAll(GitConstants.KEY_DIFF_DEFAULT, enc);
    location += "test.txt";

    request = getGetFilesRequest(location + "?parts=uris,diff");
    response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
    String[] parts = parseMultiPartResponse(response);

    assertDiffUris(
        location,
        new String[] {"change in master", "change in a", "test"},
        new JSONObject(parts[0]));
  }
  @Test
  public void testCheckoutFileOutsideCurrentFolder() throws Exception {
    // see bug 347847
    URI workspaceLocation = createWorkspace(getMethodName());
    JSONObject projectTop = createProjectOrLink(workspaceLocation, getMethodName() + "-top", null);
    IPath clonePathTop =
        new Path("file").append(projectTop.getString(ProtocolConstants.KEY_ID)).makeAbsolute();

    JSONObject projectFolder =
        createProjectOrLink(workspaceLocation, getMethodName() + "-folder", null);
    IPath clonePathFolder =
        new Path("file")
            .append(projectFolder.getString(ProtocolConstants.KEY_ID))
            .append("folder")
            .makeAbsolute();

    IPath[] clonePaths = new IPath[] {clonePathTop, clonePathFolder};

    for (IPath clonePath : clonePaths) {
      // clone a  repo
      JSONObject clone = clone(clonePath);
      String cloneContentLocation = clone.getString(ProtocolConstants.KEY_CONTENT_LOCATION);

      // get project/folder metadata
      WebRequest request = getGetFilesRequest(cloneContentLocation);
      WebResponse response = webConversation.getResponse(request);
      assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());
      JSONObject folder = new JSONObject(response.getText());

      JSONObject testTxt = getChild(folder, "test.txt");
      modifyFile(testTxt, "change in file.txt");

      JSONObject folder1 = getChild(folder, "folder");
      JSONObject folderTxt = getChild(folder1, "folder.txt");
      modifyFile(folderTxt, "change folder/folder.txt");

      // check status
      JSONObject folder1GitSection = folder1.getJSONObject(GitConstants.KEY_GIT);
      String folder1GitStatusUri = folder1GitSection.getString(GitConstants.KEY_STATUS);
      String folder1GitCloneUri = GitStatusTest.getCloneUri(folder1GitStatusUri);

      request = GitStatusTest.getGetGitStatusRequest(folder1GitStatusUri);
      assertStatus(
          new StatusResult()
              .setModifiedNames("folder/folder.txt", "test.txt")
              .setModifiedPaths("folder.txt", "../test.txt"),
          folder1GitStatusUri);

      // use KEY_NAME not KEY_PATH
      // request = getCheckoutRequest(gitCloneUri, new String[]
      // {testTxt.getString(ProtocolConstants.KEY_PATH)});
      request =
          getCheckoutRequest(
              folder1GitCloneUri, new String[] {testTxt.getString(ProtocolConstants.KEY_NAME)});
      response = webConversation.getResponse(request);
      assertEquals(HttpURLConnection.HTTP_OK, response.getResponseCode());

      // 'folder/folder.txt' is still modified
      assertStatus(new StatusResult().setModifiedNames("folder/folder.txt"), folder1GitStatusUri);
    }
  }