/** * Returns absolute paths which have changed remotely comparing to the current branch, i.e. * performs <code>git diff --name-only master..origin/master</code> * * <p>Paths are absolute, Git-formatted (i.e. with forward slashes). */ @NotNull public static Collection<String> getPathsDiffBetweenRefs( @NotNull Git git, @NotNull GitRepository repository, @NotNull String beforeRef, @NotNull String afterRef) throws VcsException { List<String> parameters = Arrays.asList("--name-only", "--pretty=format:"); String range = beforeRef + ".." + afterRef; GitCommandResult result = git.diff(repository, parameters, range); if (!result.success()) { LOG.info( String.format( "Couldn't get diff in range [%s] for repository [%s]", range, repository.toLogString())); return Collections.emptyList(); } final Collection<String> remoteChanges = new HashSet<String>(); for (StringScanner s = new StringScanner(result.getOutputAsJoinedString()); s.hasMoreData(); ) { final String relative = s.line(); if (StringUtil.isEmptyOrSpaces(relative)) { continue; } final String path = repository.getRoot().getPath() + "/" + unescapePath(relative); remoteChanges.add(path); } return remoteChanges; }
/** * Get git roots for the project. The method shows dialogs in the case when roots cannot be * retrieved, so it should be called from the event dispatch thread. * * @param project the project * @param vcs the git Vcs * @return the list of the roots * @deprecated because uses the java.io.File. * @use GitRepositoryManager#getRepositoryForFile(). */ @NotNull public static List<VirtualFile> getGitRoots(Project project, GitVcs vcs) throws VcsException { final VirtualFile[] contentRoots = ProjectLevelVcsManager.getInstance(project).getRootsUnderVcs(vcs); if (contentRoots == null || contentRoots.length == 0) { throw new VcsException( GitBundle.getString("repository.action.missing.roots.unconfigured.message")); } final List<VirtualFile> roots = new ArrayList<VirtualFile>(gitRootsForPaths(Arrays.asList(contentRoots))); if (roots.size() == 0) { throw new VcsException(GitBundle.getString("repository.action.missing.roots.misconfigured")); } Collections.sort(roots, VIRTUAL_FILE_COMPARATOR); return roots; }
private static GitCommit createCommit( Project project, SymbolicRefsI refs, VirtualFile root, GitLogRecord record) throws VcsException { GitCommit gitCommit; final Collection<String> currentRefs = record.getRefs(); List<String> locals = new ArrayList<String>(); List<String> remotes = new ArrayList<String>(); List<String> tags = new ArrayList<String>(); final String s = parseRefs(refs, currentRefs, locals, remotes, tags); gitCommit = new GitCommit( root, AbstractHash.create(record.getShortHash()), new SHAHash(record.getHash()), record.getAuthorName(), record.getCommitterName(), record.getDate(), record.getSubject(), record.getFullMessage(), new HashSet<String>(Arrays.asList(record.getParentsShortHashes())), record.getFilePaths(root), record.getAuthorEmail(), record.getCommitterEmail(), tags, locals, remotes, record.parseChanges(project, root), record.getAuthorTimeStamp() * 1000); gitCommit.setCurrentBranch(s); /*final String current = refs.getCurrent().getName(); gitCommit.setOnLocal((current != null) && (! current.startsWith(GitBranch.REFS_REMOTES_PREFIX)) && (! current.startsWith("remotes/")) && branches.contains(current)); String remoteName = refs.getTrackedRemoteName(); if (".".equals(remoteName)) { gitCommit.setOnTracked(gitCommit.isOnLocal()); } else { remoteName = remoteName.startsWith("refs/") ? remoteName.substring("refs/".length()) : remoteName; gitCommit.setOnTracked(remoteName != null && branches.contains(remoteName)); }*/ return gitCommit; }