benchmarking/repos/git.py (50 lines of code) (raw):

#!/usr/bin/env python ############################################################################## # Copyright 2017-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. ############################################################################## from __future__ import absolute_import, division, print_function, unicode_literals from utils.subprocess_with_logger import processRun from .repo_base import RepoBase class GitRepo(RepoBase): def __init__(self, dir): super(GitRepo, self).__init__(dir) def _run(self, cmd, *args): git = ["git"] if self.dir: git.append("-C") git.append(self.dir) git.append(cmd) git.extend(args) return "\n".join(processRun(git)[0]) def pull(self, *args): return self._run("pull", *args) def checkout(self, *args): self._run("checkout", *args) self._run("submodule", "sync") self._run("submodule", "update", "--init", "--recursive") def getCurrentCommitHash(self): return self.getCommitHash("HEAD") def getCommitHash(self, commit): return self._run("rev-parse", commit).rstrip() def getCommitTime(self, commit): return int(self._run("show", "-s", "--format=%at", commit).strip()) def getNextCommitHash(self, commit, step): commits = ( self._run("rev-list", "--reverse", "--ancestry-path", commit + "..HEAD") .strip() .split("\n") ) if len(commits) <= step: return commit next_commit = commits[step - 1].strip() return next_commit def getCommitsInRange(self, start_date, end_date): return self._run( "log", "--after", start_date.isoformat(), "--before", end_date.isoformat(), "--reverse", "--pretty=format:%H:%ct", ).strip() def getPriorCommits(self, commit, num): return self._run( "log", "-" + str(num), "--pretty=format:%H:%ct", commit ).strip()