Handle .COLOR_DIFF in the same way as .DIFF (#1673)

This commit is contained in:
Tom Saunders 2020-09-05 20:15:28 +01:00 committed by GitHub
parent 1790871833
commit 6b5753a417
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 6 deletions

View File

@ -12,6 +12,8 @@
- fixed a crash when PWD=/ on POSIX (#1631) - fixed a crash when PWD=/ on POSIX (#1631)
- Prevent coloured diff output being interleaved with multiple files (#1673)
### 20.8b1 ### 20.8b1
#### _Packaging_ #### _Packaging_

View File

@ -661,7 +661,7 @@ def reformat_one(
changed = Changed.YES changed = Changed.YES
else: else:
cache: Cache = {} cache: Cache = {}
if write_back != WriteBack.DIFF: if write_back not in (WriteBack.DIFF, WriteBack.COLOR_DIFF):
cache = read_cache(mode) cache = read_cache(mode)
res_src = src.resolve() res_src = src.resolve()
if res_src in cache and cache[res_src] == get_cache_info(res_src): if res_src in cache and cache[res_src] == get_cache_info(res_src):
@ -735,7 +735,7 @@ async def schedule_formatting(
:func:`format_file_in_place`. :func:`format_file_in_place`.
""" """
cache: Cache = {} cache: Cache = {}
if write_back != WriteBack.DIFF: if write_back not in (WriteBack.DIFF, WriteBack.COLOR_DIFF):
cache = read_cache(mode) cache = read_cache(mode)
sources, cached = filter_cached(cache, sources) sources, cached = filter_cached(cache, sources)
for src in sorted(cached): for src in sorted(cached):
@ -746,7 +746,7 @@ async def schedule_formatting(
cancelled = [] cancelled = []
sources_to_cache = [] sources_to_cache = []
lock = None lock = None
if write_back == WriteBack.DIFF: if write_back in (WriteBack.DIFF, WriteBack.COLOR_DIFF):
# For diff output, we need locks to ensure we don't interleave output # For diff output, we need locks to ensure we don't interleave output
# from different processes. # from different processes.
manager = Manager() manager = Manager()

View File

@ -1,4 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import multiprocessing
import asyncio import asyncio
import logging import logging
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
@ -1395,9 +1396,55 @@ def test_no_cache_when_writeback_diff(self) -> None:
src = (workspace / "test.py").resolve() src = (workspace / "test.py").resolve()
with src.open("w") as fobj: with src.open("w") as fobj:
fobj.write("print('hello')") fobj.write("print('hello')")
with patch("black.read_cache") as read_cache, patch(
"black.write_cache"
) as write_cache:
self.invokeBlack([str(src), "--diff"]) self.invokeBlack([str(src), "--diff"])
cache_file = black.get_cache_file(mode) cache_file = black.get_cache_file(mode)
self.assertFalse(cache_file.exists()) self.assertFalse(cache_file.exists())
write_cache.assert_not_called()
read_cache.assert_not_called()
def test_no_cache_when_writeback_color_diff(self) -> None:
mode = DEFAULT_MODE
with cache_dir() as workspace:
src = (workspace / "test.py").resolve()
with src.open("w") as fobj:
fobj.write("print('hello')")
with patch("black.read_cache") as read_cache, patch(
"black.write_cache"
) as write_cache:
self.invokeBlack([str(src), "--diff", "--color"])
cache_file = black.get_cache_file(mode)
self.assertFalse(cache_file.exists())
write_cache.assert_not_called()
read_cache.assert_not_called()
@event_loop()
def test_output_locking_when_writeback_diff(self) -> None:
with cache_dir() as workspace:
for tag in range(0, 4):
src = (workspace / f"test{tag}.py").resolve()
with src.open("w") as fobj:
fobj.write("print('hello')")
with patch("black.Manager", wraps=multiprocessing.Manager) as mgr:
self.invokeBlack(["--diff", str(workspace)], exit_code=0)
# this isn't quite doing what we want, but if it _isn't_
# called then we cannot be using the lock it provides
mgr.assert_called()
@event_loop()
def test_output_locking_when_writeback_color_diff(self) -> None:
with cache_dir() as workspace:
for tag in range(0, 4):
src = (workspace / f"test{tag}.py").resolve()
with src.open("w") as fobj:
fobj.write("print('hello')")
with patch("black.Manager", wraps=multiprocessing.Manager) as mgr:
self.invokeBlack(["--diff", "--color", str(workspace)], exit_code=0)
# this isn't quite doing what we want, but if it _isn't_
# called then we cannot be using the lock it provides
mgr.assert_called()
def test_no_cache_when_stdin(self) -> None: def test_no_cache_when_stdin(self) -> None:
mode = DEFAULT_MODE mode = DEFAULT_MODE