private void createBranch(final String textForBranch, RevCommit commit, IProgressMonitor monitor) throws CoreException, GitAPIException { monitor.setTaskName(UIText.FetchGerritChangePage_CreatingBranchTaskName); CreateLocalBranchOperation bop = new CreateLocalBranchOperation(repository, textForBranch, commit); bop.execute(monitor); CheckoutCommand co = new Git(repository).checkout(); try { co.setName(textForBranch).call(); } catch (CheckoutConflictException e) { final CheckoutResult result = co.getResult(); if (result.getStatus() == Status.CONFLICTS) { final Shell shell = getWizard().getContainer().getShell(); shell .getDisplay() .asyncExec( new Runnable() { public void run() { new CheckoutConflictDialog(shell, repository, result.getConflictList()).open(); } }); } } monitor.worked(1); }
public void cloneBinaryRepository() throws GitException { // find the name of the "source repository" String srcRepoUrl = getSourceRemoteUrl(); String org = GitUtils.getOrgName(srcRepoUrl); String repoName = GitUtils.getRepositoryName(srcRepoUrl); String binaryRepoName = calculateBinaryRepositoryName(org, repoName); // find where ".git" folder is found File f = sourceRepository.getDirectory(); File sourceDir = f.getParentFile(); String sourceRepoFolderName = f.getParentFile().getName(); // construct the binary repository URL String giturl = "[email protected]:Binary/" + binaryRepoName + ".git"; // calculate binary repository folder File parent = f.getParentFile().getParentFile(); File binaryRepoFolder = new File(parent, ("." + sourceRepoFolderName)); // clone the binary repository CloneCommand cloneCmd = Git.cloneRepository(); cloneCmd.setURI(giturl); cloneCmd.setDirectory(binaryRepoFolder); cloneCmd.setCloneAllBranches(true); Git binrepository = null; try { System.out.println("cloning repository " + giturl); binrepository = cloneCmd.call(); binaryRepository = new FileRepository(binrepository.getRepository().getDirectory()); } catch (InvalidRemoteException e) { throw new GitException("unable to clone " + giturl, e); } catch (TransportException e) { throw new GitException("unable to clone " + giturl, e); } catch (GitAPIException e) { throw new GitException("unable to clone " + giturl, e); } catch (IOException e) { throw new GitException("unable assign " + giturl, e); } // read the branch from "source" repository String branchName = "master"; try { branchName = sourceRepository.getBranch(); } catch (IOException e) { e.printStackTrace(); } // Checkout the "branch" if it is not equal to "master" if (!branchName.toLowerCase().equals("master")) { // check whether the branch exists boolean remoteBranchExists = GitUtils.isRemoteBranchExists(binaryRepository, branchName); CheckoutResult result = null; if (!remoteBranchExists) { try { // create branch Git binrepo = Git.wrap(binaryRepository); CreateBranchCommand branchCmd = binrepo.branchCreate(); branchCmd.setName(branchName); branchCmd.call(); // checkout the branch CheckoutCommand checkout = binrepo.checkout(); checkout.setName(branchName); Ref ref = checkout.call(); if (ref == null) { // TODO: } else { result = checkout.getResult(); } } catch (RefAlreadyExistsException e) { throw new GitException("unable to create branch " + branchName, e); } catch (RefNotFoundException e) { throw new GitException("unable to create branch " + branchName, e); } catch (InvalidRefNameException e) { throw new GitException("unable to create branch " + branchName, e); } catch (GitAPIException e) { throw new GitException("unable to create branch " + branchName, e); } } else { CheckoutCommand checkoutCmd = binrepository.checkout(); checkoutCmd.setCreateBranch(true); checkoutCmd.setName(branchName); checkoutCmd.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK); checkoutCmd.setStartPoint("origin/" + branchName); System.out.println("checking out branch " + branchName); try { // Ref branch = branchCmd.call(); Ref ref = checkoutCmd.call(); System.out.println("checkout is complete"); if (ref != null) { // System.out.println("ref " + ref.getName() ); result = checkoutCmd.getResult(); } } catch (RefAlreadyExistsException e) { throw new GitException("unable to checkout branch " + branchName, e); } catch (RefNotFoundException e) { throw new GitException("unable to checkout branch " + branchName, e); } catch (InvalidRefNameException e) { throw new GitException("unable to checkout branch " + branchName, e); } catch (CheckoutConflictException e) { throw new GitException("unable to checkout branch " + branchName, e); } catch (GitAPIException e) { throw new GitException("unable to checkout branch " + branchName, e); } } if (result.getStatus().equals(CheckoutResult.OK_RESULT)) { System.out.println("checkout is OK"); } else { // TODO: handle the error. } } // System.out.println( result.getStatus()); // TODO: find out whether Binary is upto-date with the sources /* // call the MapSvc to find it out. final org.eclipse.jgit.lib.Repository repository = new org.eclipse.jgit.storage.file.FileRepository(f); final RevWalk revWalk = new RevWalk(repository); final ObjectId resolve = repository.resolve(Constants.HEAD); final RevCommit commit = revWalk.parseCommit(resolve); final String commitHash = commit.getName(); final String url = getUrlForFindByRepoBranchCommit() + "repourl=" + URLEncoder.encode(getSourceRemoteUrl(), UTF_8) + "&branch=" + URLEncoder.encode(branchName, UTF_8) + "&commitid=" + URLEncoder.encode(commitHash, UTF_8); final WebResource webResource = client.resource(url); boolean noContent = false; BinRepoBranchCommitDO binRepoBranchCommitDO = null; try { System.out.println("calling mapsvc "); binRepoBranchCommitDO = webResource.accept(MediaType.APPLICATION_JSON_TYPE).get(BinRepoBranchCommitDO.class); } catch (UniformInterfaceException e) { int statusCode = e.getResponse().getClientResponseStatus().getStatusCode(); noContent = (statusCode == 204); } catch (Exception e) { // catch-all in case there are network problems e.printStackTrace(); } // No matching entry found in mapping service // TODO: RGIROTI Talk to Nambi and find out what we want to do in this case if (noContent) { } else { // if it matches copy the .class files from binaryrepository to source-repository if (binRepoBranchCommitDO != null && binRepoBranchCommitDO.getRepoUrl().equalsIgnoreCase(getSourceRemoteUrl()) && binRepoBranchCommitDO.getBranch().equalsIgnoreCase(branchName) && binRepoBranchCommitDO.getCommitId().equalsIgnoreCase(commitHash)) { } } */ try { FileUtil.copyBinaryFolders(binaryRepoFolder, sourceDir, ".git"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
private boolean handlePut( HttpServletRequest request, HttpServletResponse response, String pathString) throws GitAPIException, CoreException, IOException, JSONException, ServletException { IPath path = pathString == null ? Path.EMPTY : new Path(pathString); if (path.segment(0).equals("file") && path.segmentCount() > 1) { // $NON-NLS-1$ // make sure a clone is addressed WebProject webProject = GitUtils.projectFromPath(path); if (isAccessAllowed(request.getRemoteUser(), webProject)) { Map<IPath, File> gitDirs = GitUtils.getGitDirs(path, Traverse.CURRENT); if (gitDirs.isEmpty()) { String msg = NLS.bind("Request path is not a git repository: {0}", path); return statusHandler.handleRequest( request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, msg, null)); } File gitDir = gitDirs.values().iterator().next(); // make sure required fields are set JSONObject toCheckout = OrionServlet.readJSONRequest(request); JSONArray paths = toCheckout.optJSONArray(ProtocolConstants.KEY_PATH); String branch = toCheckout.optString(GitConstants.KEY_BRANCH_NAME, null); String tag = toCheckout.optString(GitConstants.KEY_TAG_NAME, null); boolean removeUntracked = toCheckout.optBoolean(GitConstants.KEY_REMOVE_UNTRACKED, false); if ((paths == null || paths.length() == 0) && branch == null && tag == null) { String msg = NLS.bind( "Either '{0}' or '{1}' or '{2}' should be provided, got: {3}", new Object[] { ProtocolConstants.KEY_PATH, GitConstants.KEY_BRANCH_NAME, GitConstants.KEY_TAG_NAME, toCheckout }); return statusHandler.handleRequest( request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, msg, null)); } Git git = new Git(new FileRepository(gitDir)); if (paths != null) { Set<String> toRemove = new HashSet<String>(); CheckoutCommand checkout = git.checkout(); for (int i = 0; i < paths.length(); i++) { String p = paths.getString(i); if (removeUntracked && !isInIndex(git.getRepository(), p)) toRemove.add(p); checkout.addPath(p); } checkout.call(); for (String p : toRemove) { File f = new File(git.getRepository().getWorkTree(), p); f.delete(); } return true; } else if (tag != null && branch != null) { CheckoutCommand co = git.checkout(); try { co.setName(branch).setStartPoint(tag).setCreateBranch(true).call(); return true; } catch (RefNotFoundException e) { String msg = NLS.bind("Tag not found: {0}", tag); return statusHandler.handleRequest( request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_NOT_FOUND, msg, e)); } catch (GitAPIException e) { if (org.eclipse.jgit.api.CheckoutResult.Status.CONFLICTS.equals( co.getResult().getStatus())) { return statusHandler.handleRequest( request, response, new ServerStatus( IStatus.ERROR, HttpServletResponse.SC_CONFLICT, "Checkout aborted.", e)); } // TODO: handle other exceptions } } else if (branch != null) { if (!isLocalBranch(git, branch)) { String msg = NLS.bind("{0} is not a branch.", branch); return statusHandler.handleRequest( request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_NOT_FOUND, msg, null)); } CheckoutCommand co = git.checkout(); try { co.setName(Constants.R_HEADS + branch).call(); return true; } catch (CheckoutConflictException e) { return statusHandler.handleRequest( request, response, new ServerStatus( IStatus.ERROR, HttpServletResponse.SC_CONFLICT, "Checkout aborted.", e)); } catch (RefNotFoundException e) { String msg = NLS.bind("Branch name not found: {0}", branch); return statusHandler.handleRequest( request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_NOT_FOUND, msg, e)); } // TODO: handle other exceptions } } else { String msg = NLS.bind("Nothing found for the given ID: {0}", path); return statusHandler.handleRequest( request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_NOT_FOUND, msg, null)); } } String msg = NLS.bind("Invalid checkout request {0}", pathString); return statusHandler.handleRequest( request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, msg, null)); }