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