--- a/hgext/win32text.py Sat Oct 05 10:29:34 2019 -0400
+++ b/hgext/win32text.py Sun Oct 06 09:45:02 2019 -0400
@@ -45,16 +45,12 @@
import re
from mercurial.i18n import _
-from mercurial.node import (
- short,
-)
+from mercurial.node import short
from mercurial import (
pycompat,
registrar,
)
-from mercurial.utils import (
- stringutil,
-)
+from mercurial.utils import stringutil
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
@@ -65,8 +61,8 @@
configtable = {}
configitem = registrar.configitem(configtable)
-configitem('win32text', 'warn',
- default=True,
+configitem(
+ 'win32text', 'warn', default=True,
)
# regexp for single LF without CR preceding.
@@ -75,53 +71,67 @@
newlinestr = {'\r\n': 'CRLF', '\r': 'CR'}
filterstr = {'\r\n': 'clever', '\r': 'mac'}
+
def checknewline(s, newline, ui=None, repo=None, filename=None):
# warn if already has 'newline' in repository.
# it might cause unexpected eol conversion.
# see issue 302:
# https://bz.mercurial-scm.org/302
if newline in s and ui and filename and repo:
- ui.warn(_('WARNING: %s already has %s line endings\n'
- 'and does not need EOL conversion by the win32text plugin.\n'
- 'Before your next commit, please reconsider your '
- 'encode/decode settings in \nMercurial.ini or %s.\n') %
- (filename, newlinestr[newline], repo.vfs.join('hgrc')))
+ ui.warn(
+ _(
+ 'WARNING: %s already has %s line endings\n'
+ 'and does not need EOL conversion by the win32text plugin.\n'
+ 'Before your next commit, please reconsider your '
+ 'encode/decode settings in \nMercurial.ini or %s.\n'
+ )
+ % (filename, newlinestr[newline], repo.vfs.join('hgrc'))
+ )
+
def dumbdecode(s, cmd, **kwargs):
checknewline(s, '\r\n', **kwargs)
# replace single LF to CRLF
return re_single_lf.sub('\\1\r\n', s)
+
def dumbencode(s, cmd):
return s.replace('\r\n', '\n')
+
def macdumbdecode(s, cmd, **kwargs):
checknewline(s, '\r', **kwargs)
return s.replace('\n', '\r')
+
def macdumbencode(s, cmd):
return s.replace('\r', '\n')
+
def cleverdecode(s, cmd, **kwargs):
if not stringutil.binary(s):
return dumbdecode(s, cmd, **kwargs)
return s
+
def cleverencode(s, cmd):
if not stringutil.binary(s):
return dumbencode(s, cmd)
return s
+
def macdecode(s, cmd, **kwargs):
if not stringutil.binary(s):
return macdumbdecode(s, cmd, **kwargs)
return s
+
def macencode(s, cmd):
if not stringutil.binary(s):
return macdumbencode(s, cmd)
return s
+
_filters = {
'dumbdecode:': dumbdecode,
'dumbencode:': dumbencode,
@@ -131,7 +141,8 @@
'macdumbencode:': macdumbencode,
'macdecode:': macdecode,
'macencode:': macencode,
- }
+}
+
def forbidnewline(ui, repo, hooktype, node, newline, **kwargs):
halt = False
@@ -142,8 +153,9 @@
# changegroup that contains an unacceptable commit followed later
# by a commit that fixes the problem.
tip = repo['tip']
- for rev in pycompat.xrange(repo.changelog.tiprev(),
- repo[node].rev() - 1, -1):
+ for rev in pycompat.xrange(
+ repo.changelog.tiprev(), repo[node].rev() - 1, -1
+ ):
c = repo[rev]
for f in c.files():
if f in seen or f not in tip or f not in c:
@@ -152,44 +164,61 @@
data = c[f].data()
if not stringutil.binary(data) and newline in data:
if not halt:
- ui.warn(_('attempt to commit or push text file(s) '
- 'using %s line endings\n') %
- newlinestr[newline])
+ ui.warn(
+ _(
+ 'attempt to commit or push text file(s) '
+ 'using %s line endings\n'
+ )
+ % newlinestr[newline]
+ )
ui.warn(_('in %s: %s\n') % (short(c.node()), f))
halt = True
if halt and hooktype == 'pretxnchangegroup':
crlf = newlinestr[newline].lower()
filter = filterstr[newline]
- ui.warn(_('\nTo prevent this mistake in your local repository,\n'
- 'add to Mercurial.ini or .hg/hgrc:\n'
- '\n'
- '[hooks]\n'
- 'pretxncommit.%s = python:hgext.win32text.forbid%s\n'
- '\n'
- 'and also consider adding:\n'
- '\n'
- '[extensions]\n'
- 'win32text =\n'
- '[encode]\n'
- '** = %sencode:\n'
- '[decode]\n'
- '** = %sdecode:\n') % (crlf, crlf, filter, filter))
+ ui.warn(
+ _(
+ '\nTo prevent this mistake in your local repository,\n'
+ 'add to Mercurial.ini or .hg/hgrc:\n'
+ '\n'
+ '[hooks]\n'
+ 'pretxncommit.%s = python:hgext.win32text.forbid%s\n'
+ '\n'
+ 'and also consider adding:\n'
+ '\n'
+ '[extensions]\n'
+ 'win32text =\n'
+ '[encode]\n'
+ '** = %sencode:\n'
+ '[decode]\n'
+ '** = %sdecode:\n'
+ )
+ % (crlf, crlf, filter, filter)
+ )
return halt
+
def forbidcrlf(ui, repo, hooktype, node, **kwargs):
return forbidnewline(ui, repo, hooktype, node, '\r\n', **kwargs)
+
def forbidcr(ui, repo, hooktype, node, **kwargs):
return forbidnewline(ui, repo, hooktype, node, '\r', **kwargs)
+
def reposetup(ui, repo):
if not repo.local():
return
for name, fn in _filters.iteritems():
repo.adddatafilter(name, fn)
+
def extsetup(ui):
# deprecated config: win32text.warn
if ui.configbool('win32text', 'warn'):
- ui.warn(_("win32text is deprecated: "
- "https://mercurial-scm.org/wiki/Win32TextExtension\n"))
+ ui.warn(
+ _(
+ "win32text is deprecated: "
+ "https://mercurial-scm.org/wiki/Win32TextExtension\n"
+ )
+ )