mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 08:14:42 +04:00
Fix staged-files-only for git add --intent-to-add files
This commit is contained in:
parent
2941a1142b
commit
e60579d9f3
4 changed files with 71 additions and 5 deletions
|
|
@ -97,6 +97,20 @@ def get_staged_files():
|
|||
)[1])
|
||||
|
||||
|
||||
def intent_to_add_files():
|
||||
_, stdout_binary, _ = cmd_output('git', 'status', '--porcelain', '-z')
|
||||
parts = list(reversed(zsplit(stdout_binary)))
|
||||
intent_to_add = []
|
||||
while parts:
|
||||
line = parts.pop()
|
||||
status, filename = line[:3], line[3:]
|
||||
if status[0] in {'C', 'R'}: # renames / moves have an additional arg
|
||||
parts.pop()
|
||||
if status[1] == 'A':
|
||||
intent_to_add.append(filename)
|
||||
return intent_to_add
|
||||
|
||||
|
||||
def get_all_files():
|
||||
return zsplit(cmd_output('git', 'ls-files', '-z')[1])
|
||||
|
||||
|
|
|
|||
|
|
@ -6,9 +6,11 @@ import logging
|
|||
import os.path
|
||||
import time
|
||||
|
||||
from pre_commit import git
|
||||
from pre_commit.util import CalledProcessError
|
||||
from pre_commit.util import cmd_output
|
||||
from pre_commit.util import mkdirp
|
||||
from pre_commit.xargs import xargs
|
||||
|
||||
|
||||
logger = logging.getLogger('pre_commit')
|
||||
|
|
@ -24,11 +26,22 @@ def _git_apply(patch):
|
|||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def staged_files_only(patch_dir):
|
||||
"""Clear any unstaged changes from the git working directory inside this
|
||||
context.
|
||||
"""
|
||||
# Determine if there are unstaged files
|
||||
def _intent_to_add_cleared():
|
||||
intent_to_add = git.intent_to_add_files()
|
||||
if intent_to_add:
|
||||
logger.warning('Unstaged intent-to-add files detected.')
|
||||
|
||||
xargs(('git', 'rm', '--cached', '--'), intent_to_add)
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
xargs(('git', 'add', '--intent-to-add', '--'), intent_to_add)
|
||||
else:
|
||||
yield
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def _unstaged_changes_cleared(patch_dir):
|
||||
tree = cmd_output('git', 'write-tree')[1].strip()
|
||||
retcode, diff_stdout_binary, _ = cmd_output(
|
||||
'git', 'diff-index', '--ignore-submodules', '--binary',
|
||||
|
|
@ -71,3 +84,12 @@ def staged_files_only(patch_dir):
|
|||
# There weren't any staged files so we don't need to do anything
|
||||
# special
|
||||
yield
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def staged_files_only(patch_dir):
|
||||
"""Clear any unstaged changes from the git working directory inside this
|
||||
context.
|
||||
"""
|
||||
with _intent_to_add_cleared(), _unstaged_changes_cleared(patch_dir):
|
||||
yield
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue