/** * Gets info of the given commit and checks if it was a RENAME. If yes, returns the older file * path, which file was renamed from. If it's not a rename, returns null. */ @Nullable private static FilePath getFirstCommitRenamePath( Project project, VirtualFile root, String commit, FilePath filePath) throws VcsException { // 'git show -M --name-status <commit hash>' returns the information about commit and detects // renames. // NB: we can't specify the filepath, because then rename detection will work only with the // '--follow' option, which we don't wanna use. final GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.SHOW); final GitLogParser parser = new GitLogParser(project, GitLogParser.NameStatus.STATUS, HASH, COMMIT_TIME, SHORT_PARENTS); h.setNoSSH(true); h.setStdoutSuppressed(true); h.addParameters("-M", "--name-status", parser.getPretty(), "--encoding=UTF-8", commit); h.endOptions(); final String output = h.run(); final List<GitLogRecord> records = parser.parse(output); if (records.isEmpty()) return null; // we have information about all changed files of the commit. Extracting information about the // file we need. final List<Change> changes = records.get(0).parseChanges(project, root); for (Change change : changes) { if ((change.isMoved() || change.isRenamed()) && filePath.equals(change.getAfterRevision().getFile())) { return change.getBeforeRevision().getFile(); } } return null; }
public static List<GitCommit> commitsDetails( Project project, FilePath path, SymbolicRefsI refs, final Collection<String> commitsIds) throws VcsException { // adjust path using change manager path = getLastCommitName(project, path); final VirtualFile root = GitUtil.getGitRoot(path); GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.SHOW); GitLogParser parser = new GitLogParser( project, GitLogParser.NameStatus.STATUS, SHORT_HASH, HASH, COMMIT_TIME, AUTHOR_NAME, AUTHOR_TIME, AUTHOR_EMAIL, COMMITTER_NAME, COMMITTER_EMAIL, SHORT_PARENTS, REF_NAMES, SUBJECT, BODY, RAW_BODY); h.setNoSSH(true); h.setStdoutSuppressed(true); h.addParameters("--name-status", parser.getPretty(), "--encoding=UTF-8"); h.addParameters(new ArrayList<String>(commitsIds)); // h.endOptions(); // h.addRelativePaths(path); String output; try { output = h.run(); final List<GitCommit> rc = new ArrayList<GitCommit>(); for (GitLogRecord record : parser.parse(output)) { final GitCommit gitCommit = createCommit(project, refs, root, record); rc.add(gitCommit); } return rc; } catch (VcsException e) { throw e; } }
public static List<Pair<SHAHash, Date>> onlyHashesHistory( Project project, FilePath path, final VirtualFile root, final String... parameters) throws VcsException { // adjust path using change manager path = getLastCommitName(project, path); GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.LOG); GitLogParser parser = new GitLogParser(project, HASH, COMMIT_TIME); h.setNoSSH(true); h.setStdoutSuppressed(true); h.addParameters(parameters); h.addParameters(parser.getPretty(), "--encoding=UTF-8"); h.endOptions(); h.addRelativePaths(path); String output = h.run(); final List<Pair<SHAHash, Date>> rc = new ArrayList<Pair<SHAHash, Date>>(); for (GitLogRecord record : parser.parse(output)) { record.setUsedHandler(h); rc.add(new Pair<SHAHash, Date>(new SHAHash(record.getHash()), record.getDate())); } return rc; }
public static long getAuthorTime(Project project, FilePath path, final String commitsId) throws VcsException { // adjust path using change manager path = getLastCommitName(project, path); final VirtualFile root = GitUtil.getGitRoot(path); GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.SHOW); GitLogParser parser = new GitLogParser(project, GitLogParser.NameStatus.STATUS, AUTHOR_TIME); h.setNoSSH(true); h.setStdoutSuppressed(true); h.addParameters("--name-status", parser.getPretty(), "--encoding=UTF-8"); h.addParameters(commitsId); String output; try { output = h.run(); GitLogRecord logRecord = parser.parseOneRecord(output); return logRecord.getAuthorTimeStamp() * 1000; } catch (VcsException e) { throw e; } }