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