| # 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] |