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