From patchwork Mon Mar 6 14:54:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [stable] fsmonitor: match watchman and local encoding From: Olivier Trempe X-Patchwork-Id: 18943 Message-Id: <06a427b6b4a4efe3c190.1488812095@ronce.innov.local> To: mercurial-devel@mercurial-scm.org Date: Mon, 06 Mar 2017 09:54:55 -0500 # HG changeset patch # User Olivier Trempe # Date 1488810111 18000 # Mon Mar 06 09:21:51 2017 -0500 # Branch stable # Node ID 06a427b6b4a4efe3c19029951c654a2c8d835fb3 # Parent 6b00c3ecd15b26587de8cca6fab811069cba3b2f fsmonitor: match watchman and local encoding watchman's paths encoding is os dependant. For example, on Windows, it's always utf-8. This causes paths comparison mismatch when paths contain non ascii characters. diff -r 6b00c3ecd15b -r 06a427b6b4a4 hgext/fsmonitor/__init__.py --- a/hgext/fsmonitor/__init__.py Thu Mar 02 20:19:45 2017 -0500 +++ b/hgext/fsmonitor/__init__.py Mon Mar 06 09:21:51 2017 -0500 @@ -110,6 +110,7 @@ from mercurial import match as matchmod from . import ( + pywatchman, state, watchmanclient, ) @@ -159,6 +160,16 @@ sha1.update('\0') return sha1.hexdigest() +def _watchmanencodingtolocal(path): + """Fix path to match watchman and local encoding + + watchman's paths encoding is os dependant. For example, on Windows, it's + always utf-8. This converts watchman encoded paths to local encoding to + avoid paths comparison mismatch. + """ + watchmandecode = pywatchman.encoding.decode_local + return watchmandecode(path).encode(encoding.encoding) + def overridewalk(orig, self, match, subrepos, unknown, ignored, full=True): '''Replacement for dirstate.walk, hooking into Watchman. @@ -302,7 +313,7 @@ # Watchman tracks files. We use this property to reconcile deletes # for name case changes. for entry in result['files']: - fname = entry['name'] + fname = _watchmanencodingtolocal(entry['name']) if switch_slashes: fname = fname.replace('\\', '/') if normalize: