Mercurial > hg
annotate hgext/eol.py @ 51634:3b69324d9535 stable
exchange: fix locking to actually be scoped
The previous code was taking locks before entering with statements, so
exception before the with statement would not release the lock (except for
garbage collection).
We need to move to a try except here because the logic is more complicated.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 11 Jun 2024 11:14:13 +0200 |
parents | 092db6464321 |
children | f4733654f144 |
rev | line source |
---|---|
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 |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
95 import os |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
96 import re |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
97 from mercurial.i18n import _ |
28969
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
98 from mercurial import ( |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
99 config, |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
100 error as errormod, |
28969
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
101 extensions, |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
102 match, |
31775
8181f378b073
pycompat: provide bytes os.linesep
Yuya Nishihara <yuya@tcha.org>
parents:
31417
diff
changeset
|
103 pycompat, |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
104 registrar, |
37507
9b16a67cef56
eol: look up partial nodeid as partial nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37084
diff
changeset
|
105 scmutil, |
28969
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
106 util, |
cca011fd1ea7
py3: make eol use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
27524
diff
changeset
|
107 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
108 from mercurial.utils import stringutil |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
109 |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
28969
diff
changeset
|
110 # 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
|
111 # 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
|
112 # 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
|
113 # leave the attribute unspecified. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
114 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
|
115 |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
116 configtable = {} |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
117 configitem = registrar.configitem(configtable) |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
118 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
119 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
120 b'eol', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
121 b'fix-trailing-newline', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
122 default=False, |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
123 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
124 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
125 b'eol', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
126 b'native', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
127 default=pycompat.oslinesep, |
34118
4a6ef3a5b282
configitems: register the 'eol.native' config
Boris Feld <boris.feld@octobus.net>
parents:
34117
diff
changeset
|
128 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
129 configitem( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
130 b'eol', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
131 b'only-consistent', |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45894
diff
changeset
|
132 default=True, |
34119
d4a5193332b3
configitems: register the 'eol.only-consistent' config
Boris Feld <boris.feld@octobus.net>
parents:
34118
diff
changeset
|
133 ) |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
134 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
135 # 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
|
136 singlelf = re.compile(b'(^|[^\r])\n') |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
137 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
138 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
139 def inconsistenteol(data): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
140 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
|
141 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
142 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
143 def tolf(s, params, ui, **kwargs): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
144 """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
|
145 if stringutil.binary(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
146 return s |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
147 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
|
148 return s |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
149 if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
150 ui.configbool(b'eol', b'fix-trailing-newline') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
151 and s |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
152 and not s.endswith(b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
153 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
154 s = s + b'\n' |
31776
fe9b33bcec6a
util: extract pure tolf/tocrlf() functions from eol extension
Yuya Nishihara <yuya@tcha.org>
parents:
31775
diff
changeset
|
155 return util.tolf(s) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
156 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
157 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
158 def tocrlf(s, params, ui, **kwargs): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
159 """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
|
160 if stringutil.binary(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
161 return s |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
162 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
|
163 return s |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
164 if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
165 ui.configbool(b'eol', b'fix-trailing-newline') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
166 and s |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
167 and not s.endswith(b'\n') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
168 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
169 s = s + b'\n' |
31776
fe9b33bcec6a
util: extract pure tolf/tocrlf() functions from eol extension
Yuya Nishihara <yuya@tcha.org>
parents:
31775
diff
changeset
|
170 return util.tocrlf(s) |
11249
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 |
43203
d38f9117ee15
eol: update isbinary filter to work without compat wrapper
Mads Kiilerich <mads@kiilerich.com>
parents:
43117
diff
changeset
|
173 def isbinary(s, params, ui, **kwargs): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
174 """Filter to do nothing with the file.""" |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
175 return s |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
176 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
177 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
178 filters = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
179 b'to-lf': tolf, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
180 b'to-crlf': tocrlf, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
181 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
|
182 # 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
|
183 b'cleverencode:': tolf, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
184 b'cleverdecode:': tocrlf, |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
185 } |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
186 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
187 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48913
diff
changeset
|
188 class eolfile: |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
189 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
|
190 self._decode = { |
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 } |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
195 self._encode = { |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
196 b'LF': b'to-lf', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
197 b'CRLF': b'to-crlf', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
198 b'BIN': b'is-binary', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
199 } |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
200 |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
201 self.cfg = config.config() |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
202 # 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
|
203 # 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
|
204 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
|
205 # 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
|
206 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
|
207 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
208 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
|
209 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
|
210 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
|
211 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
|
212 |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
213 include = [] |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
214 exclude = [] |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
215 self.patterns = [] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
216 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
|
217 key = style.upper() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
218 if key == b'BIN': |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
219 exclude.append(pattern) |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
220 else: |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
221 include.append(pattern) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
222 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
|
223 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
|
224 # 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
|
225 # about inconsistent newlines. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
226 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
|
227 |
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
228 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
|
229 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
|
230 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
|
231 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
|
232 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
|
233 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
|
234 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
|
235 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
|
236 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
237 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
|
238 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
|
239 except KeyError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
240 ui.warn( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
241 _(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
|
242 % (key, self.cfg.source(b'patterns', pattern)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
243 ) |
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
244 # 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
|
245 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
|
246 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
|
247 |
13615
686dec753b52
eol: the hook no longer requires the extension to be loaded
Patrick Mezard <pmezard@gmail.com>
parents:
13614
diff
changeset
|
248 def checkrev(self, repo, ctx, files): |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
249 failed = [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
250 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
|
251 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
|
252 continue |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
253 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
|
254 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
|
255 continue |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
256 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
|
257 data = ctx[f].data() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
258 if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
259 target == b"to-lf" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
260 and b"\r\n" in data |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
261 or target == b"to-crlf" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
262 and singlelf.search(data) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
263 ): |
36667
bcfc4e3b6548
py3: use bytes() instead of str()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34830
diff
changeset
|
264 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
|
265 break |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
266 return failed |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
267 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
268 |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
269 def parseeol(ui, repo, nodes): |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
270 try: |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
271 for node in nodes: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
272 try: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
273 if node is None: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
274 # 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
|
275 # 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
|
276 data = repo.wvfs(b'.hgeol').read() |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
277 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
278 data = repo[node][b'.hgeol'].data() |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
279 return eolfile(ui, repo.root, data) |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
280 except (IOError, LookupError): |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
281 pass |
45894
9dc1351d0b5f
errors: raise ConfigError on failure to parse config file
Martin von Zweigbergk <martinvonz@google.com>
parents:
45776
diff
changeset
|
282 except errormod.ConfigError as inst: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
283 ui.warn( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
284 _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
285 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
|
286 b"at %s: %s\n" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
287 ) |
45776
0fc8b066928a
errors: name arguments to ParseError constructor
Martin von Zweigbergk <martinvonz@google.com>
parents:
44452
diff
changeset
|
288 % (inst.location, inst.message) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
289 ) |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
290 return None |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
291 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
292 |
34830
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
293 def ensureenabled(ui): |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
294 """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
|
295 |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
296 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
|
297 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
|
298 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
|
299 hooks. |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
300 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
301 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
|
302 return |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
303 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
|
304 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
|
305 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
306 |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
307 def _checkhook(ui, repo, node, headsonly): |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
308 # 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
|
309 ensureenabled(ui) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
310 files = set() |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
311 revs = set() |
49284
d44e3c45f0e4
py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents:
48946
diff
changeset
|
312 for rev in range(repo[node].rev(), len(repo)): |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
313 revs.add(rev) |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
314 if headsonly: |
13650
56e71e7d2ba2
eol: no need to accumulate files when checking all changesets
Patrick Mezard <pmezard@gmail.com>
parents:
13649
diff
changeset
|
315 ctx = repo[rev] |
56e71e7d2ba2
eol: no need to accumulate files when checking all changesets
Patrick Mezard <pmezard@gmail.com>
parents:
13649
diff
changeset
|
316 files.update(ctx.files()) |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
317 for pctx in ctx.parents(): |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
318 revs.discard(pctx.rev()) |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
319 failed = [] |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
320 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
|
321 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
|
322 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
|
323 if eol: |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
324 failed.extend(eol.checkrev(repo, ctx, files)) |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
325 |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
326 if failed: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
327 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
|
328 msgs = [] |
27524
f5b6b4e574c1
eol: make output stable
Bryan O'Sullivan <bos@serpentine.com>
parents:
26587
diff
changeset
|
329 for f, target, node in sorted(failed): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
330 msgs.append( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
331 _(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
|
332 % (f, node, eols[target]) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
333 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
334 raise errormod.Abort( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
335 _(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
|
336 ) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
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 checkallhook(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, False) |
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 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
|
345 """verify that files have expected EOLs""" |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
346 _checkhook(ui, repo, node, True) |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
347 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
348 |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
349 # "checkheadshook" used to be called "hook" |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
350 hook = checkheadshook |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
351 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
352 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
353 def preupdate(ui, repo, hooktype, parent1, parent2): |
37678
5f8f013e7d52
scmutil: rename resolvepartialhexnodeid() to resolvehexnodeidprefix()
Martin von Zweigbergk <martinvonz@google.com>
parents:
37507
diff
changeset
|
354 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
|
355 repo.loadeol([p1node]) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
356 return False |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
357 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
358 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
359 def uisetup(ui): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
360 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
|
361 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
362 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
363 def extsetup(ui): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
364 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
365 extensions.find(b'win32text') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
366 ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
367 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
368 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
|
369 b"win32text extension\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
370 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
371 ) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
372 except KeyError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
373 pass |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
374 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
375 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
376 def reposetup(ui, repo): |
12307
0852da25a31b
eol: setup the repo.ui in reposetup()
Steve Borho <steve@borho.org>
parents:
11249
diff
changeset
|
377 uisetup(repo.ui) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
378 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
379 if not repo.local(): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
380 return |
48913
f254fc73d956
global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
381 for name, fn in filters.items(): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
382 repo.adddatafilter(name, fn) |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
383 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
384 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
|
385 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
386 class eolrepo(repo.__class__): |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
387 def loadeol(self, nodes): |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
388 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
|
389 if eol is None: |
13612
21367c3da8aa
eol: remove unused argument in readhgeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13611
diff
changeset
|
390 return None |
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
391 eol.copytoui(self.ui) |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
392 return eol.match |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
393 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
394 def _hgcleardirstate(self): |
43207
4aa9f3a1c1df
eol: don't fallback to use .hgeol from tip (BC)
Mads Kiilerich <mads@kiilerich.com>
parents:
43205
diff
changeset
|
395 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
|
396 if not self._eolmatch: |
ffb682412b98
eol: fix variable naming - call it _eolmatch instead of _eolfile
Mads Kiilerich <madski@unity3d.com>
parents:
29841
diff
changeset
|
397 self._eolmatch = util.never |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
398 return |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
399 |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
400 oldeol = None |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
401 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
402 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
|
403 except OSError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
404 cachemtime = 0 |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
405 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
406 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
|
407 if olddata: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
408 oldeol = eolfile(self.ui, self.root, olddata) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
409 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
410 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
411 eolmtime = os.path.getmtime(self.wjoin(b".hgeol")) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
412 except OSError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
413 eolmtime = 0 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
414 |
43204
fd8c3f59b544
eol: cache needs update, also if it has same timestamp as the source
Mads Kiilerich <mads@kiilerich.com>
parents:
43203
diff
changeset
|
415 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
|
416 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
|
417 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
418 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
|
419 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
|
420 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
421 wlock = None |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
422 try: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
423 wlock = self.wlock() |
50151
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
424 with self.dirstate.changing_files(self): |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
425 for f in self.dirstate: |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
426 if not self.dirstate.get_entry(f).maybe_clean: |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
427 continue |
50151
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
428 if oldeol is not None: |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
429 if not oldeol.match(f) and not neweol.match(f): |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
430 continue |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
431 oldkey = None |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
432 for pattern, key, m in oldeol.patterns: |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
433 if m(f): |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
434 oldkey = key |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
435 break |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
436 newkey = None |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
437 for pattern, key, m in neweol.patterns: |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
438 if m(f): |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
439 newkey = key |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
440 break |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
441 if oldkey == newkey: |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
442 continue |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
443 # all normal files need to be looked at again since |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
444 # the new .hgeol file specify a different filter |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
445 self.dirstate.set_possibly_dirty(f) |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
446 # Write the cache to update mtime and cache .hgeol |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
447 with self.vfs(b"eol.cache", b"w") as f: |
092db6464321
keyword: wrap dirstate mutation in `changing_files` context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
49997
diff
changeset
|
448 f.write(hgeoldata) |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
449 except errormod.LockUnavailable: |
13475
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
450 # If we cannot lock the repository and clear the |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
451 # dirstate, then a commit might not see all files |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
452 # as modified. But if we cannot lock the |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
453 # repository, then we can also not make a commit, |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
454 # so ignore the error. |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
455 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
|
456 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
|
457 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
|
458 wlock.release() |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
459 |
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
|
460 def commitctx(self, ctx, error=False, origctx=None): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
461 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
|
462 if not self._eolmatch(f): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
463 continue |
23068
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
464 fctx = ctx[f] |
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
465 if fctx is None: |
14862
abf915f537be
eol: ignore IOError from deleted files in commitctx
Nicholas Riley <njriley@illinois.edu>
parents:
13650
diff
changeset
|
466 continue |
23068
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
467 data = fctx.data() |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36667
diff
changeset
|
468 if stringutil.binary(data): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
469 # We should not abort here, since the user should |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
470 # be able to say "** = native" to automatically |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
471 # have all non-binary files taken care of. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
472 continue |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
473 if inconsistenteol(data): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
474 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
|
475 _(b"inconsistent newline style in %s\n") % f |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
476 ) |
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
|
477 return super(eolrepo, self).commitctx(ctx, error, origctx) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42620
diff
changeset
|
478 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
479 repo.__class__ = eolrepo |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
480 repo._hgcleardirstate() |