author | Yuya Nishihara <yuya@tcha.org> |
Sat, 20 Jun 2020 11:10:23 +0900 | |
changeset 44993 | 98f97026fa05 |
parent 44452 | 9d2b2df2c2ba |
child 45776 | 0fc8b066928a |
permissions | -rw-r--r-- |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
1 |
"""automatically manage newlines in repository files |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
2 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
3 |
This extension allows you to manage the type of line endings (CRLF or |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
4 |
LF) that are used in the repository and in the local working |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
5 |
directory. That way you can get CRLF line endings on Windows and LF on |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
6 |
Unix/Mac, thereby letting everybody use their OS native line endings. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
7 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
8 |
The extension reads its configuration from a versioned ``.hgeol`` |
24367
aba1916c1b23
eol: replace "working copy" with "working directory" in extension help
Yuya Nishihara <yuya@tcha.org>
parents:
23877
diff
changeset
|
9 |
configuration file found in the root of the working directory. The |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
10 |
``.hgeol`` file use the same syntax as all other Mercurial |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
11 |
configuration files. It uses two sections, ``[patterns]`` and |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
12 |
``[repository]``. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
13 |
|
13124
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
14 |
The ``[patterns]`` section specifies how line endings should be |
24367
aba1916c1b23
eol: replace "working copy" with "working directory" in extension help
Yuya Nishihara <yuya@tcha.org>
parents:
23877
diff
changeset
|
15 |
converted between the working directory and the repository. The format is |
13124
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
16 |
specified by a file pattern. The first match is used, so put more |
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
17 |
specific patterns first. The available line endings are ``LF``, |
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
18 |
``CRLF``, and ``BIN``. |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
19 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
20 |
Files with the declared format of ``CRLF`` or ``LF`` are always |
13124
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
21 |
checked out and stored in the repository in that format and files |
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
22 |
declared to be binary (``BIN``) are left unchanged. Additionally, |
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
23 |
``native`` is an alias for checking out in the platform's default line |
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
24 |
ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on |
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
25 |
Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's |
26098 | 26 |
default behavior; it is only needed if you need to override a later, |
13124
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
27 |
more general pattern. |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
28 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
29 |
The optional ``[repository]`` section specifies the line endings to |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
30 |
use for files stored in the repository. It has a single setting, |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
31 |
``native``, which determines the storage line endings for files |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
32 |
declared as ``native`` in the ``[patterns]`` section. It can be set to |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
33 |
``LF`` or ``CRLF``. The default is ``LF``. For example, this means |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
34 |
that on Windows, files configured as ``native`` (``CRLF`` by default) |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
35 |
will be converted to ``LF`` when stored in the repository. Files |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
36 |
declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
37 |
are always stored as-is in the repository. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
38 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
39 |
Example versioned ``.hgeol`` file:: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
40 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
41 |
[patterns] |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
42 |
**.py = native |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
43 |
**.vcproj = CRLF |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
44 |
**.txt = native |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
45 |
Makefile = LF |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
46 |
**.jpg = BIN |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
47 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
48 |
[repository] |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
49 |
native = LF |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
50 |
|
13124
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
51 |
.. note:: |
19997
de16c673455b
documentation: add an extra newline after note directive
Simon Heimberg <simohe@besonet.ch>
parents:
17955
diff
changeset
|
52 |
|
13124
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
53 |
The rules will first apply when files are touched in the working |
24367
aba1916c1b23
eol: replace "working copy" with "working directory" in extension help
Yuya Nishihara <yuya@tcha.org>
parents:
23877
diff
changeset
|
54 |
directory, e.g. by updating to null and back to tip to touch all files. |
13124
cc5f0c0c19bc
eol: improve help on whether EOLs are changed in working copy or repository
Erik Zielke <ez@aragost.com>
parents:
12980
diff
changeset
|
55 |
|
14856
9f5cd6b6d758
eol: document new eol.fix-trailing-newline setting
Martin Geisler <mg@aragost.com>
parents:
14855
diff
changeset
|
56 |
The extension uses an optional ``[eol]`` section read from both the |
9f5cd6b6d758
eol: document new eol.fix-trailing-newline setting
Martin Geisler <mg@aragost.com>
parents:
14855
diff
changeset
|
57 |
normal Mercurial configuration files and the ``.hgeol`` file, with the |
9f5cd6b6d758
eol: document new eol.fix-trailing-newline setting
Martin Geisler <mg@aragost.com>
parents:
14855
diff
changeset
|
58 |
latter overriding the former. You can use that section to control the |
9f5cd6b6d758
eol: document new eol.fix-trailing-newline setting
Martin Geisler <mg@aragost.com>
parents:
14855
diff
changeset
|
59 |
overall behavior. There are three settings: |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
60 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
61 |
- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or |
12802
c82cd7b08158
eol: add missing word in module docstring
Georg Brandl <georg@python.org>
parents:
12308
diff
changeset
|
62 |
``CRLF`` to override the default interpretation of ``native`` for |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
63 |
checkout. This can be used with :hg:`archive` on Unix, say, to |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
64 |
generate an archive where files have line endings for Windows. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
65 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
66 |
- ``eol.only-consistent`` (default True) can be set to False to make |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
67 |
the extension convert files with inconsistent EOLs. Inconsistent |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
68 |
means that there is both ``CRLF`` and ``LF`` present in the file. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
69 |
Such files are normally not touched under the assumption that they |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
70 |
have mixed EOLs on purpose. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
71 |
|
14856
9f5cd6b6d758
eol: document new eol.fix-trailing-newline setting
Martin Geisler <mg@aragost.com>
parents:
14855
diff
changeset
|
72 |
- ``eol.fix-trailing-newline`` (default False) can be set to True to |
14857
5b46c16e7121
eol: fix silly test-gendoc breakage by escaping control characters
Matt Mackall <mpm@selenic.com>
parents:
14856
diff
changeset
|
73 |
ensure that converted files end with a EOL character (either ``\\n`` |
5b46c16e7121
eol: fix silly test-gendoc breakage by escaping control characters
Matt Mackall <mpm@selenic.com>
parents:
14856
diff
changeset
|
74 |
or ``\\r\\n`` as per the configured patterns). |
14856
9f5cd6b6d758
eol: document new eol.fix-trailing-newline setting
Martin Geisler <mg@aragost.com>
parents:
14855
diff
changeset
|
75 |
|
12979
733345a127ca
eol: fix win32text encode/decode filter names
Martin Geisler <mg@lazybytes.net>
parents:
12976
diff
changeset
|
76 |
The extension provides ``cleverencode:`` and ``cleverdecode:`` filters |
733345a127ca
eol: fix win32text encode/decode filter names
Martin Geisler <mg@lazybytes.net>
parents:
12976
diff
changeset
|
77 |
like the deprecated win32text extension does. This means that you can |
733345a127ca
eol: fix win32text encode/decode filter names
Martin Geisler <mg@lazybytes.net>
parents:
12976
diff
changeset
|
78 |
disable win32text and enable eol and your filters will still work. You |
733345a127ca
eol: fix win32text encode/decode filter names
Martin Geisler <mg@lazybytes.net>
parents:
12976
diff
changeset
|
79 |
only need to these filters until you have prepared a ``.hgeol`` file. |
733345a127ca
eol: fix win32text encode/decode filter names
Martin Geisler <mg@lazybytes.net>
parents:
12976
diff
changeset
|
80 |
|
12980
20974e51383a
eol: mention the hook in the module docstring
Martin Geisler <mg@lazybytes.net>
parents:
12974
diff
changeset
|
81 |
The ``win32text.forbid*`` hooks provided by the win32text extension |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
82 |
have been unified into a single hook named ``eol.checkheadshook``. The |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
83 |
hook will lookup the expected line endings from the ``.hgeol`` file, |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
84 |
which means you must migrate to a ``.hgeol`` file first before using |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
85 |
the hook. ``eol.checkheadshook`` only checks heads, intermediate |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
86 |
invalid revisions will be pushed. To forbid them completely, use the |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
87 |
``eol.checkallhook`` hook. These hooks are best used as |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
88 |
``pretxnchangegroup`` hooks. |
12980
20974e51383a
eol: mention the hook in the module docstring
Martin Geisler <mg@lazybytes.net>
parents:
12974
diff
changeset
|
89 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
90 |
See :hg:`help patterns` for more information about the glob patterns |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
91 |
used. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
92 |
""" |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
93 |
|
28969
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
94 |
from __future__ import absolute_import |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
95 |
|
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
96 |
import os |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
97 |
import re |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
98 |
from mercurial.i18n import _ |
28969
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
99 |
from mercurial import ( |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
100 |
config, |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
101 |
error as errormod, |
28969
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
102 |
extensions, |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
103 |
match, |
31775
8181f378b073
pycompat: provide bytes os.linesep
Yuya Nishihara <yuya@tcha.org>
parents:
31417
diff
changeset
|
104 |
pycompat, |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
105 |
registrar, |
37507
9b16a67cef56
eol: look up partial nodeid as partial nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37084
diff
changeset
|
106 |
scmutil, |
28969
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
107 |
util, |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
108 |
) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
109 |
from mercurial.utils import stringutil |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
110 |
|
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
28969
diff
changeset
|
111 |
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24367
diff
changeset
|
112 |
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24367
diff
changeset
|
113 |
# be specifying the version(s) of Mercurial they are tested with, or |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24367
diff
changeset
|
114 |
# leave the attribute unspecified. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
115 |
testedwith = b'ships-with-hg-core' |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
16683
diff
changeset
|
116 |
|
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
117 |
configtable = {} |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
118 |
configitem = registrar.configitem(configtable) |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
119 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
120 |
configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
121 |
b'eol', b'fix-trailing-newline', default=False, |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
122 |
) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
123 |
configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
124 |
b'eol', b'native', default=pycompat.oslinesep, |
34118
4a6ef3a5b282
configitems: register the 'eol.native' config
Boris Feld <boris.feld@octobus.net>
parents:
34117
diff
changeset
|
125 |
) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
126 |
configitem( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
127 |
b'eol', b'only-consistent', default=True, |
34119
d4a5193332b3
configitems: register the 'eol.only-consistent' config
Boris Feld <boris.feld@octobus.net>
parents:
34118
diff
changeset
|
128 |
) |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
129 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
130 |
# Matches a lone LF, i.e., one that is not part of CRLF. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
131 |
singlelf = re.compile(b'(^|[^\r])\n') |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
132 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
133 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
134 |
def inconsistenteol(data): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
135 |
return b'\r\n' in data and singlelf.search(data) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
136 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
137 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
138 |
def tolf(s, params, ui, **kwargs): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
139 |
"""Filter to convert to LF EOLs.""" |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36667
diff
changeset
|
140 |
if stringutil.binary(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
141 |
return s |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
142 |
if ui.configbool(b'eol', b'only-consistent') and inconsistenteol(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
143 |
return s |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
144 |
if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
145 |
ui.configbool(b'eol', b'fix-trailing-newline') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
146 |
and s |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
147 |
and not s.endswith(b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
148 |
): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
149 |
s = s + b'\n' |
31776
fe9b33bcec6a
util: extract pure tolf/tocrlf() functions from eol extension
Yuya Nishihara <yuya@tcha.org>
parents:
31775
diff
changeset
|
150 |
return util.tolf(s) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
151 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
152 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
153 |
def tocrlf(s, params, ui, **kwargs): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
154 |
"""Filter to convert to CRLF EOLs.""" |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36667
diff
changeset
|
155 |
if stringutil.binary(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
156 |
return s |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
157 |
if ui.configbool(b'eol', b'only-consistent') and inconsistenteol(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
158 |
return s |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
159 |
if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
160 |
ui.configbool(b'eol', b'fix-trailing-newline') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
161 |
and s |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
162 |
and not s.endswith(b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
163 |
): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
164 |
s = s + b'\n' |
31776
fe9b33bcec6a
util: extract pure tolf/tocrlf() functions from eol extension
Yuya Nishihara <yuya@tcha.org>
parents:
31775
diff
changeset
|
165 |
return util.tocrlf(s) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
166 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
167 |
|
43203
d38f9117ee15
eol: update isbinary filter to work without compat wrapper
Mads Kiilerich <mads@kiilerich.com>
parents:
43117
diff
changeset
|
168 |
def isbinary(s, params, ui, **kwargs): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
169 |
"""Filter to do nothing with the file.""" |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
170 |
return s |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
171 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
172 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
173 |
filters = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
174 |
b'to-lf': tolf, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
175 |
b'to-crlf': tocrlf, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
176 |
b'is-binary': isbinary, |
12975
278e3c9b939e
eol: added filter aliases for backwards compatibility with win32text
Colin Caughie <c.caughie@indigovision.com>
parents:
12802
diff
changeset
|
177 |
# The following provide backwards compatibility with win32text |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
178 |
b'cleverencode:': tolf, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
179 |
b'cleverdecode:': tocrlf, |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
180 |
} |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
181 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
182 |
|
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
183 |
class eolfile(object): |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
184 |
def __init__(self, ui, root, data): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 |
self._decode = { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
186 |
b'LF': b'to-lf', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
187 |
b'CRLF': b'to-crlf', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
188 |
b'BIN': b'is-binary', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
189 |
} |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
190 |
self._encode = { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
191 |
b'LF': b'to-lf', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
192 |
b'CRLF': b'to-crlf', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
193 |
b'BIN': b'is-binary', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
194 |
} |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
195 |
|
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
196 |
self.cfg = config.config() |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
197 |
# Our files should not be touched. The pattern must be |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
198 |
# inserted first override a '** = native' pattern. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
199 |
self.cfg.set(b'patterns', b'.hg*', b'BIN', b'eol') |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
200 |
# We can then parse the user's patterns. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
201 |
self.cfg.parse(b'.hgeol', data) |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
202 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
203 |
isrepolf = self.cfg.get(b'repository', b'native') != b'CRLF' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
204 |
self._encode[b'NATIVE'] = isrepolf and b'to-lf' or b'to-crlf' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
205 |
iswdlf = ui.config(b'eol', b'native') in (b'LF', b'\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
206 |
self._decode[b'NATIVE'] = iswdlf and b'to-lf' or b'to-crlf' |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
207 |
|
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
208 |
include = [] |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
209 |
exclude = [] |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
210 |
self.patterns = [] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
211 |
for pattern, style in self.cfg.items(b'patterns'): |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
212 |
key = style.upper() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
213 |
if key == b'BIN': |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
214 |
exclude.append(pattern) |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
215 |
else: |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
216 |
include.append(pattern) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
217 |
m = match.match(root, b'', [pattern]) |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
218 |
self.patterns.append((pattern, key, m)) |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
219 |
# This will match the files for which we need to care |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
220 |
# about inconsistent newlines. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
221 |
self.match = match.match(root, b'', [], include, exclude) |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
222 |
|
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
223 |
def copytoui(self, ui): |
44452
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
43207
diff
changeset
|
224 |
newpatterns = {pattern for pattern, key, m in self.patterns} |
43205
dfaa477e37a8
eol: fix update - don't use and apply removed .hgeol patterns
Mads Kiilerich <mads@kiilerich.com>
parents:
43204
diff
changeset
|
225 |
for section in (b'decode', b'encode'): |
dfaa477e37a8
eol: fix update - don't use and apply removed .hgeol patterns
Mads Kiilerich <mads@kiilerich.com>
parents:
43204
diff
changeset
|
226 |
for oldpattern, _filter in ui.configitems(section): |
dfaa477e37a8
eol: fix update - don't use and apply removed .hgeol patterns
Mads Kiilerich <mads@kiilerich.com>
parents:
43204
diff
changeset
|
227 |
if oldpattern not in newpatterns: |
dfaa477e37a8
eol: fix update - don't use and apply removed .hgeol patterns
Mads Kiilerich <mads@kiilerich.com>
parents:
43204
diff
changeset
|
228 |
if ui.configsource(section, oldpattern) == b'eol': |
dfaa477e37a8
eol: fix update - don't use and apply removed .hgeol patterns
Mads Kiilerich <mads@kiilerich.com>
parents:
43204
diff
changeset
|
229 |
ui.setconfig(section, oldpattern, b'!', b'eol') |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
230 |
for pattern, key, m in self.patterns: |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
231 |
try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
232 |
ui.setconfig(b'decode', pattern, self._decode[key], b'eol') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
233 |
ui.setconfig(b'encode', pattern, self._encode[key], b'eol') |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
234 |
except KeyError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
235 |
ui.warn( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
236 |
_(b"ignoring unknown EOL style '%s' from %s\n") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
237 |
% (key, self.cfg.source(b'patterns', pattern)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
238 |
) |
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
239 |
# eol.only-consistent can be specified in ~/.hgrc or .hgeol |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
240 |
for k, v in self.cfg.items(b'eol'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
241 |
ui.setconfig(b'eol', k, v, b'eol') |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
242 |
|
13615
686dec753b52
eol: the hook no longer requires the extension to be loaded
Patrick Mezard <pmezard@gmail.com>
parents:
13614
diff
changeset
|
243 |
def checkrev(self, repo, ctx, files): |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
244 |
failed = [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
245 |
for f in files or ctx.files(): |
13615
686dec753b52
eol: the hook no longer requires the extension to be loaded
Patrick Mezard <pmezard@gmail.com>
parents:
13614
diff
changeset
|
246 |
if f not in ctx: |
686dec753b52
eol: the hook no longer requires the extension to be loaded
Patrick Mezard <pmezard@gmail.com>
parents:
13614
diff
changeset
|
247 |
continue |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
248 |
for pattern, key, m in self.patterns: |
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
249 |
if not m(f): |
13615
686dec753b52
eol: the hook no longer requires the extension to be loaded
Patrick Mezard <pmezard@gmail.com>
parents:
13614
diff
changeset
|
250 |
continue |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
251 |
target = self._encode[key] |
13615
686dec753b52
eol: the hook no longer requires the extension to be loaded
Patrick Mezard <pmezard@gmail.com>
parents:
13614
diff
changeset
|
252 |
data = ctx[f].data() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
253 |
if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
254 |
target == b"to-lf" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
255 |
and b"\r\n" in data |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
256 |
or target == b"to-crlf" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
257 |
and singlelf.search(data) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
258 |
): |
36667
bcfc4e3b6548
py3: use bytes() instead of str()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34830
diff
changeset
|
259 |
failed.append((f, target, bytes(ctx))) |
13501
50b825c1adb1
eol: stop after first matched rule in hook (issue2660)
Antoine Pitrou <solipsis@pitrou.net>
parents:
13475
diff
changeset
|
260 |
break |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
261 |
return failed |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
262 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
263 |
|
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
264 |
def parseeol(ui, repo, nodes): |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
265 |
try: |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
266 |
for node in nodes: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
267 |
try: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
268 |
if node is None: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
269 |
# Cannot use workingctx.data() since it would load |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
270 |
# and cache the filters before we configure them. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
271 |
data = repo.wvfs(b'.hgeol').read() |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
272 |
else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
273 |
data = repo[node][b'.hgeol'].data() |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
274 |
return eolfile(ui, repo.root, data) |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
275 |
except (IOError, LookupError): |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
276 |
pass |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
277 |
except errormod.ParseError as inst: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
278 |
ui.warn( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
279 |
_( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
280 |
b"warning: ignoring .hgeol file due to parse error " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
281 |
b"at %s: %s\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
282 |
) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
283 |
% (inst.args[1], inst.args[0]) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
284 |
) |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
285 |
return None |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
286 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
287 |
|
34830
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
288 |
def ensureenabled(ui): |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
289 |
"""make sure the extension is enabled when used as hook |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
290 |
|
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
291 |
When eol is used through hooks, the extension is never formally loaded and |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
292 |
enabled. This has some side effect, for example the config declaration is |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
293 |
never loaded. This function ensure the extension is enabled when running |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
294 |
hooks. |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
295 |
""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
296 |
if b'eol' in ui._knownconfig: |
34830
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
297 |
return |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
298 |
ui.setconfig(b'extensions', b'eol', b'', source=b'internal') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
299 |
extensions.loadall(ui, [b'eol']) |
34830
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
300 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
301 |
|
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
302 |
def _checkhook(ui, repo, node, headsonly): |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
303 |
# Get revisions to check and touched files at the same time |
34830
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
304 |
ensureenabled(ui) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
305 |
files = set() |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
306 |
revs = set() |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38329
diff
changeset
|
307 |
for rev in pycompat.xrange(repo[node].rev(), len(repo)): |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
308 |
revs.add(rev) |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
309 |
if headsonly: |
13650
56e71e7d2ba2
eol: no need to accumulate files when checking all changesets
Patrick Mezard <pmezard@gmail.com>
parents:
13649
diff
changeset
|
310 |
ctx = repo[rev] |
56e71e7d2ba2
eol: no need to accumulate files when checking all changesets
Patrick Mezard <pmezard@gmail.com>
parents:
13649
diff
changeset
|
311 |
files.update(ctx.files()) |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
312 |
for pctx in ctx.parents(): |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
313 |
revs.discard(pctx.rev()) |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
314 |
failed = [] |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
315 |
for rev in revs: |
13616
e6f93ca9ce86
eol: make the hook check all new heads, not only tip (issue2666)
Patrick Mezard <pmezard@gmail.com>
parents:
13615
diff
changeset
|
316 |
ctx = repo[rev] |
e6f93ca9ce86
eol: make the hook check all new heads, not only tip (issue2666)
Patrick Mezard <pmezard@gmail.com>
parents:
13615
diff
changeset
|
317 |
eol = parseeol(ui, repo, [ctx.node()]) |
e6f93ca9ce86
eol: make the hook check all new heads, not only tip (issue2666)
Patrick Mezard <pmezard@gmail.com>
parents:
13615
diff
changeset
|
318 |
if eol: |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
319 |
failed.extend(eol.checkrev(repo, ctx, files)) |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
320 |
|
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
321 |
if failed: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
322 |
eols = {b'to-lf': b'CRLF', b'to-crlf': b'LF'} |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
323 |
msgs = [] |
27524
f5b6b4e574c1
eol: make output stable
Bryan O'Sullivan <bos@serpentine.com>
parents:
26587
diff
changeset
|
324 |
for f, target, node in sorted(failed): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
325 |
msgs.append( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
326 |
_(b" %s in %s should not have %s line endings") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
327 |
% (f, node, eols[target]) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
328 |
) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
329 |
raise errormod.Abort( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
330 |
_(b"end-of-line check failed:\n") + b"\n".join(msgs) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
331 |
) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
332 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
333 |
|
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
334 |
def checkallhook(ui, repo, node, hooktype, **kwargs): |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
335 |
"""verify that files have expected EOLs""" |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
336 |
_checkhook(ui, repo, node, False) |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
337 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
338 |
|
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
339 |
def checkheadshook(ui, repo, node, hooktype, **kwargs): |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
340 |
"""verify that files have expected EOLs""" |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
341 |
_checkhook(ui, repo, node, True) |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
342 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
343 |
|
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
344 |
# "checkheadshook" used to be called "hook" |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
345 |
hook = checkheadshook |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
346 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
347 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
348 |
def preupdate(ui, repo, hooktype, parent1, parent2): |
37678
5f8f013e7d52
scmutil: rename resolvepartialhexnodeid() to resolvehexnodeidprefix()
Martin von Zweigbergk <martinvonz@google.com>
parents:
37507
diff
changeset
|
349 |
p1node = scmutil.resolvehexnodeidprefix(repo, parent1) |
37507
9b16a67cef56
eol: look up partial nodeid as partial nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37084
diff
changeset
|
350 |
repo.loadeol([p1node]) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
351 |
return False |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
352 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
353 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
354 |
def uisetup(ui): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
355 |
ui.setconfig(b'hooks', b'preupdate.eol', preupdate, b'eol') |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
356 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
357 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
358 |
def extsetup(ui): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
359 |
try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
360 |
extensions.find(b'win32text') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
361 |
ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
362 |
_( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
363 |
b"the eol extension is incompatible with the " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
364 |
b"win32text extension\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
365 |
) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
366 |
) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
367 |
except KeyError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
368 |
pass |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
369 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
370 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
371 |
def reposetup(ui, repo): |
12307
0852da25a31b
eol: setup the repo.ui in reposetup()
Steve Borho <steve@borho.org>
parents:
11249
diff
changeset
|
372 |
uisetup(repo.ui) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
373 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
374 |
if not repo.local(): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
375 |
return |
43105
649d3ac37a12
py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
376 |
for name, fn in pycompat.iteritems(filters): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
377 |
repo.adddatafilter(name, fn) |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
378 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
379 |
ui.setconfig(b'patch', b'eol', b'auto', b'eol') |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
380 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
381 |
class eolrepo(repo.__class__): |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
382 |
def loadeol(self, nodes): |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
383 |
eol = parseeol(self.ui, self, nodes) |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
384 |
if eol is None: |
13612
21367c3da8aa
eol: remove unused argument in readhgeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13611
diff
changeset
|
385 |
return None |
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
386 |
eol.copytoui(self.ui) |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
387 |
return eol.match |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
388 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
389 |
def _hgcleardirstate(self): |
43207
4aa9f3a1c1df
eol: don't fallback to use .hgeol from tip (BC)
Mads Kiilerich <mads@kiilerich.com>
parents:
43205
diff
changeset
|
390 |
self._eolmatch = self.loadeol([None]) |
30113
ffb682412b98
eol: fix variable naming - call it _eolmatch instead of _eolfile
Mads Kiilerich <madski@unity3d.com>
parents:
29841
diff
changeset
|
391 |
if not self._eolmatch: |
ffb682412b98
eol: fix variable naming - call it _eolmatch instead of _eolfile
Mads Kiilerich <madski@unity3d.com>
parents:
29841
diff
changeset
|
392 |
self._eolmatch = util.never |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
393 |
return |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
394 |
|
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
395 |
oldeol = None |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
396 |
try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
397 |
cachemtime = os.path.getmtime(self.vfs.join(b"eol.cache")) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
398 |
except OSError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
399 |
cachemtime = 0 |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
400 |
else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
401 |
olddata = self.vfs.read(b"eol.cache") |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
402 |
if olddata: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
403 |
oldeol = eolfile(self.ui, self.root, olddata) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
404 |
|
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
405 |
try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
406 |
eolmtime = os.path.getmtime(self.wjoin(b".hgeol")) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
407 |
except OSError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
408 |
eolmtime = 0 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
409 |
|
43204
fd8c3f59b544
eol: cache needs update, also if it has same timestamp as the source
Mads Kiilerich <mads@kiilerich.com>
parents:
43203
diff
changeset
|
410 |
if eolmtime >= cachemtime and eolmtime > 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
411 |
self.ui.debug(b"eol: detected change in .hgeol\n") |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
412 |
|
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
413 |
hgeoldata = self.wvfs.read(b'.hgeol') |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
414 |
neweol = eolfile(self.ui, self.root, hgeoldata) |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
415 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
416 |
wlock = None |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
417 |
try: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
418 |
wlock = self.wlock() |
13581
b30a488762e1
eol: use dirstate methods to clear dirstate
Martin Geisler <mg@lazybytes.net>
parents:
13505
diff
changeset
|
419 |
for f in self.dirstate: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
420 |
if self.dirstate[f] != b'n': |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
421 |
continue |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
422 |
if oldeol is not None: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
423 |
if not oldeol.match(f) and not neweol.match(f): |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
424 |
continue |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
425 |
oldkey = None |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
426 |
for pattern, key, m in oldeol.patterns: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
427 |
if m(f): |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
428 |
oldkey = key |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
429 |
break |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
430 |
newkey = None |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
431 |
for pattern, key, m in neweol.patterns: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
432 |
if m(f): |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
433 |
newkey = key |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
434 |
break |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
435 |
if oldkey == newkey: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
436 |
continue |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
437 |
# all normal files need to be looked at again since |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
438 |
# the new .hgeol file specify a different filter |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
439 |
self.dirstate.normallookup(f) |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
440 |
# Write the cache to update mtime and cache .hgeol |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
441 |
with self.vfs(b"eol.cache", b"w") as f: |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
442 |
f.write(hgeoldata) |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
443 |
except errormod.LockUnavailable: |
13475
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
444 |
# If we cannot lock the repository and clear the |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
445 |
# dirstate, then a commit might not see all files |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
446 |
# as modified. But if we cannot lock the |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
447 |
# repository, then we can also not make a commit, |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
448 |
# so ignore the error. |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
449 |
pass |
30164
1c518d69d994
eol: make sure we always release the wlock when writing cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30140
diff
changeset
|
450 |
finally: |
1c518d69d994
eol: make sure we always release the wlock when writing cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30140
diff
changeset
|
451 |
if wlock is not None: |
1c518d69d994
eol: make sure we always release the wlock when writing cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30140
diff
changeset
|
452 |
wlock.release() |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
453 |
|
42620
d98ec36be808
convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
38783
diff
changeset
|
454 |
def commitctx(self, ctx, error=False, origctx=None): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
455 |
for f in sorted(ctx.added() + ctx.modified()): |
30113
ffb682412b98
eol: fix variable naming - call it _eolmatch instead of _eolfile
Mads Kiilerich <madski@unity3d.com>
parents:
29841
diff
changeset
|
456 |
if not self._eolmatch(f): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
457 |
continue |
23068
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
458 |
fctx = ctx[f] |
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
459 |
if fctx is None: |
14862
abf915f537be
eol: ignore IOError from deleted files in commitctx
Nicholas Riley <njriley@illinois.edu>
parents:
13650
diff
changeset
|
460 |
continue |
23068
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
461 |
data = fctx.data() |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36667
diff
changeset
|
462 |
if stringutil.binary(data): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
463 |
# We should not abort here, since the user should |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
464 |
# be able to say "** = native" to automatically |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
465 |
# have all non-binary files taken care of. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
466 |
continue |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
467 |
if inconsistenteol(data): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
468 |
raise errormod.Abort( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43105
diff
changeset
|
469 |
_(b"inconsistent newline style in %s\n") % f |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
470 |
) |
42620
d98ec36be808
convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents:
38783
diff
changeset
|
471 |
return super(eolrepo, self).commitctx(ctx, error, origctx) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
472 |
|
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
473 |
repo.__class__ = eolrepo |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
474 |
repo._hgcleardirstate() |