blob: d21526927bb5bf8b432445813aa0283ed5b271d5 [file] [log] [blame]
# 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 ]