<gh_stars>0
from __future__ import absolute_import
from __future__ import unicode_literals

import os.path
import pytest
from plumbum import local

from pre_commit import git
from pre_commit.errors import FatalError
from testing.fixtures import git_dir


def test_get_root_at_root(tmpdir_factory):
    path = git_dir(tmpdir_factory)
    with local.cwd(path):
        assert git.get_root() == path


def test_get_root_deeper(tmpdir_factory):
    path = git_dir(tmpdir_factory)

    foo_path = os.path.join(path, 'foo')
    os.mkdir(foo_path)
    with local.cwd(foo_path):
        assert git.get_root() == path


def test_get_root_not_git_dir(tmpdir_factory):
    with local.cwd(tmpdir_factory.get()):
        with pytest.raises(FatalError):
            git.get_root()


def test_is_not_in_merge_conflict(tmpdir_factory):
    path = git_dir(tmpdir_factory)
    with local.cwd(path):
        assert git.is_in_merge_conflict() is False


def test_is_in_merge_conflict(in_merge_conflict):
    assert git.is_in_merge_conflict() is True


def test_cherry_pick_conflict(in_merge_conflict):
    local['git']('merge', '--abort')
    foo_ref = local['git']('rev-parse', 'foo').strip()
    local['git']('cherry-pick', foo_ref, retcode=None)
    assert git.is_in_merge_conflict() is False


@pytest.fixture
def get_files_matching_func():
    def get_filenames():
        return (
            'pre_commit/main.py',
            'pre_commit/git.py',
            'im_a_file_that_doesnt_exist.py',
            'hooks.yaml',
        )

    return git.get_files_matching(get_filenames)


def test_get_files_matching_base(get_files_matching_func):
    ret = get_files_matching_func('', '^$')
    assert ret == set([
        'pre_commit/main.py',
        'pre_commit/git.py',
        'hooks.yaml',
    ])


def test_get_files_matching_total_match(get_files_matching_func):
    ret = get_files_matching_func('^.*\\.py$', '^$')
    assert ret == set([
        'pre_commit/main.py',
        'pre_commit/git.py',
    ])


def test_does_search_instead_of_match(get_files_matching_func):
    ret = get_files_matching_func('\\.yaml$', '^$')
    assert ret == set(['hooks.yaml'])


def test_does_not_include_deleted_fileS(get_files_matching_func):
    ret = get_files_matching_func('exist.py', '^$')
    assert ret == set()


def test_exclude_removes_files(get_files_matching_func):
    ret = get_files_matching_func('', '\\.py$')
    assert ret == set(['hooks.yaml'])


def resolve_conflict():
    with open('conflict_file', 'w') as conflicted_file:
        conflicted_file.write('herp\nderp\n')
    local['git']('add', 'conflict_file')


def test_get_conflicted_files(in_merge_conflict):
    resolve_conflict()
    with open('other_file', 'w') as other_file:
        other_file.write('oh hai')
    local['git']('add', 'other_file')

    ret = set(git.get_conflicted_files())
    assert ret == set(('conflict_file', 'other_file'))


def test_get_conflicted_files_unstaged_files(in_merge_conflict):
    # If they for whatever reason did pre-commit run --no-stash during a
    # conflict
    resolve_conflict()

    # Make unstaged file.
    with open('bar_only_file', 'w') as bar_only_file:
        bar_only_file.write('new contents!\n')

    ret = set(git.get_conflicted_files())
    assert ret == set(('conflict_file',))


MERGE_MSG = "Merge branch 'foo' into bar\n\nConflicts:\n\tconflict_file\n"
OTHER_MERGE_MSG = MERGE_MSG + '\tother_conflict_file\n'


@pytest.mark.parametrize(
    ('input', 'expected_output'),
    (
        (MERGE_MSG, ['conflict_file']),
        (OTHER_MERGE_MSG, ['conflict_file', 'other_conflict_file']),
    ),
)
def test_parse_merge_msg_for_conflicts(input, expected_output):
    ret = git.parse_merge_msg_for_conflicts(input)
    assert ret == expected_output

from __future__ import absolute_import
from __future__ import unicode_literals

import os.path
import pytest
from plumbum import local

from pre_commit import git
from pre_commit.errors import FatalError
from testing.fixtures import git_dir


def test_get_root_at_root(tmpdir_factory):
    path = git_dir(tmpdir_factory)
    with local.cwd(path):
        assert git.get_root() == path


def test_get_root_deeper(tmpdir_factory):
    path = git_dir(tmpdir_factory)

    foo_path = os.path.join(path, 'foo')
    os.mkdir(foo_path)
    with local.cwd(foo_path):
        assert git.get_root() == path


def test_get_root_not_git_dir(tmpdir_factory):
    with local.cwd(tmpdir_factory.get()):
        with pytest.raises(FatalError):
            git.get_root()


def test_is_not_in_merge_conflict(tmpdir_factory):
    path = git_dir(tmpdir_factory)
    with local.cwd(path):
        assert git.is_in_merge_conflict() is False


def test_is_in_merge_conflict(in_merge_conflict):
    assert git.is_in_merge_conflict() is True


def test_cherry_pick_conflict(in_merge_conflict):
    local['git']('merge', '--abort')
    foo_ref = local['git']('rev-parse', 'foo').strip()
    local['git']('cherry-pick', foo_ref, retcode=None)
    assert git.is_in_merge_conflict() is False


@pytest.fixture
def get_files_matching_func():
    def get_filenames():
        return (
            'pre_commit/main.py',
            'pre_commit/git.py',
            'im_a_file_that_doesnt_exist.py',
            'hooks.yaml',
        )

    return git.get_files_matching(get_filenames)


def test_get_files_matching_base(get_files_matching_func):
    ret = get_files_matching_func('', '^$')
    assert ret == set([
        'pre_commit/main.py',
        'pre_commit/git.py',
        'hooks.yaml',
    ])


def test_get_files_matching_total_match(get_files_matching_func):
    ret = get_files_matching_func('^.*\\.py$', '^$')
    assert ret == set([
        'pre_commit/main.py',
        'pre_commit/git.py',
    ])


def test_does_search_instead_of_match(get_files_matching_func):
    ret = get_files_matching_func('\\.yaml$', '^$')
    assert ret == set(['hooks.yaml'])


def test_does_not_include_deleted_fileS(get_files_matching_func):
    ret = get_files_matching_func('exist.py', '^$')
    assert ret == set()


def test_exclude_removes_files(get_files_matching_func):
    ret = get_files_matching_func('', '\\.py$')
    assert ret == set(['hooks.yaml'])


def resolve_conflict():
    with open('conflict_file', 'w') as conflicted_file:
        conflicted_file.write('herp\nderp\n')
    local['git']('add', 'conflict_file')


def test_get_conflicted_files(in_merge_conflict):
    resolve_conflict()
    with open('other_file', 'w') as other_file:
        other_file.write('oh hai')
    local['git']('add', 'other_file')

    ret = set(git.get_conflicted_files())
    assert ret == set(('conflict_file', 'other_file'))


def test_get_conflicted_files_unstaged_files(in_merge_conflict):
    # If they for whatever reason did pre-commit run --no-stash during a
    # conflict
    resolve_conflict()

    # Make unstaged file.
    with open('bar_only_file', 'w') as bar_only_file:
        bar_only_file.write('new contents!\n')

    ret = set(git.get_conflicted_files())
    assert ret == set(('conflict_file',))


MERGE_MSG = "Merge branch 'foo' into bar\n\nConflicts:\n\tconflict_file\n"
OTHER_MERGE_MSG = MERGE_MSG + '\tother_conflict_file\n'


@pytest.mark.parametrize(
    ('input', 'expected_output'),
    (
        (MERGE_MSG, ['conflict_file']),
        (OTHER_MERGE_MSG, ['conflict_file', 'other_conflict_file']),
    ),
)
def test_parse_merge_msg_for_conflicts(input, expected_output):
    ret = git.parse_merge_msg_for_conflicts(input)
    assert ret == expected_output
# If they for whatever reason did pre-commit run --no-stash during a # conflict # Make unstaged file.