| # Copyright 2017 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| import os | |
| import os.path | |
| import subprocess | |
| def _get_diff_base(): | |
| """Returns the newest local commit that is also in the upstream branch, or | |
| "HEAD" if no such commit can be found. If no upstream branch is set, assumes | |
| that origin/master is the upstream. | |
| """ | |
| try: | |
| with open(os.devnull, 'w') as devnull: | |
| try: | |
| upstream = subprocess.check_output([ | |
| "git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}" | |
| ], stderr = devnull).strip() | |
| except subprocess.CalledProcessError: | |
| upstream = "origin/master" | |
| # Get local commits not in upstream. | |
| local_commits = filter( | |
| len, | |
| subprocess.check_output( | |
| ["git", "rev-list", "HEAD", "^" + upstream, "--"]).split("\n")) | |
| if not local_commits: | |
| return "HEAD" | |
| # Return parent of the oldest commit. | |
| return subprocess.check_output( | |
| ["git", "rev-parse", local_commits[-1] + "^"], | |
| stderr = devnull).strip() | |
| except subprocess.CalledProcessError: | |
| return "HEAD" | |
| def get_git_root(): | |
| """Returns the path of the root of the git repository.""" | |
| return subprocess.check_output(["git", "rev-parse", | |
| "--show-toplevel"]).strip() | |
| def get_diff_files(): | |
| """Returns absolute paths to files that are locally modified, staged or | |
| touched by any commits introduced on the local branch. | |
| """ | |
| list_command = [ | |
| "git", "diff-index", "--name-only", | |
| _get_diff_base() | |
| ] | |
| git_root_path = get_git_root() | |
| paths = filter(len, subprocess.check_output(list_command).split("\n")) | |
| return [ os.path.join(git_root_path, x) for x in paths ] | |
| def get_all_files(): | |
| """Returns absolute paths to all files in the git repo under the current | |
| working directory. | |
| """ | |
| list_command = ["git", "ls-files"] | |
| paths = filter(len, subprocess.check_output(list_command).split("\n")) | |
| return [ os.path.abspath(x) for x in paths ] |