Mercurial > hg
annotate hgext/eol.py @ 38865:899b4c74209c
fileset: combine union of basic patterns into single matcher
This appears to improve query performance in a big repository than I thought.
Writing less Python in a hot loop, faster computation we gain.
$ hg files --cwd mozilla-central --time 'set:a* + b* + c* + d* + e*'
(orig) time: real 0.670 secs (user 0.640+0.000 sys 0.030+0.000)
(new) time: real 0.210 secs (user 0.180+0.000 sys 0.020+0.000)
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 21 Jul 2018 17:19:12 +0900 |
parents | e7aa113b14f7 |
children | d98ec36be808 |
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 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 ) |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36667
diff
changeset
|
109 from mercurial.utils import ( |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36667
diff
changeset
|
110 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36667
diff
changeset
|
111 ) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
112 |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
28969
diff
changeset
|
113 # 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
|
114 # 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
|
115 # 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
|
116 # leave the attribute unspecified. |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
28969
diff
changeset
|
117 testedwith = 'ships-with-hg-core' |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
16683
diff
changeset
|
118 |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
119 configtable = {} |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
120 configitem = registrar.configitem(configtable) |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
121 |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
122 configitem('eol', 'fix-trailing-newline', |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
123 default=False, |
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
124 ) |
34118
4a6ef3a5b282
configitems: register the 'eol.native' config
Boris Feld <boris.feld@octobus.net>
parents:
34117
diff
changeset
|
125 configitem('eol', 'native', |
4a6ef3a5b282
configitems: register the 'eol.native' config
Boris Feld <boris.feld@octobus.net>
parents:
34117
diff
changeset
|
126 default=pycompat.oslinesep, |
4a6ef3a5b282
configitems: register the 'eol.native' config
Boris Feld <boris.feld@octobus.net>
parents:
34117
diff
changeset
|
127 ) |
34119
d4a5193332b3
configitems: register the 'eol.only-consistent' config
Boris Feld <boris.feld@octobus.net>
parents:
34118
diff
changeset
|
128 configitem('eol', 'only-consistent', |
d4a5193332b3
configitems: register the 'eol.only-consistent' config
Boris Feld <boris.feld@octobus.net>
parents:
34118
diff
changeset
|
129 default=True, |
d4a5193332b3
configitems: register the 'eol.only-consistent' config
Boris Feld <boris.feld@octobus.net>
parents:
34118
diff
changeset
|
130 ) |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
131 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
132 # Matches a lone LF, i.e., one that is not part of CRLF. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
133 singlelf = re.compile('(^|[^\r])\n') |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
134 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
135 def inconsistenteol(data): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
136 return '\r\n' in data and singlelf.search(data) |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
137 |
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 |
34119
d4a5193332b3
configitems: register the 'eol.only-consistent' config
Boris Feld <boris.feld@octobus.net>
parents:
34118
diff
changeset
|
142 if ui.configbool('eol', 'only-consistent') and inconsistenteol(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
143 return s |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
144 if (ui.configbool('eol', 'fix-trailing-newline') |
38329
f47608575c10
py3: replace s[-1] with s.endswith() in eol handling
Yuya Nishihara <yuya@tcha.org>
parents:
37678
diff
changeset
|
145 and s and not s.endswith('\n')): |
14855
f33579435378
eol: fix missing trailing newlines in comitted files
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
14854
diff
changeset
|
146 s = s + '\n' |
31776
fe9b33bcec6a
util: extract pure tolf/tocrlf() functions from eol extension
Yuya Nishihara <yuya@tcha.org>
parents:
31775
diff
changeset
|
147 return util.tolf(s) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
148 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
149 def tocrlf(s, params, ui, **kwargs): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
150 """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
|
151 if stringutil.binary(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
152 return s |
34119
d4a5193332b3
configitems: register the 'eol.only-consistent' config
Boris Feld <boris.feld@octobus.net>
parents:
34118
diff
changeset
|
153 if ui.configbool('eol', 'only-consistent') and inconsistenteol(s): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
154 return s |
34117
0f685a229a81
configitems: register the 'eol.fix-trailing-newline' config
Boris Feld <boris.feld@octobus.net>
parents:
32988
diff
changeset
|
155 if (ui.configbool('eol', 'fix-trailing-newline') |
38329
f47608575c10
py3: replace s[-1] with s.endswith() in eol handling
Yuya Nishihara <yuya@tcha.org>
parents:
37678
diff
changeset
|
156 and s and not s.endswith('\n')): |
14855
f33579435378
eol: fix missing trailing newlines in comitted files
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
14854
diff
changeset
|
157 s = s + '\n' |
31776
fe9b33bcec6a
util: extract pure tolf/tocrlf() functions from eol extension
Yuya Nishihara <yuya@tcha.org>
parents:
31775
diff
changeset
|
158 return util.tocrlf(s) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
159 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
160 def isbinary(s, params): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
161 """Filter to do nothing with the file.""" |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
162 return s |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
163 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
164 filters = { |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
165 'to-lf': tolf, |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
166 'to-crlf': tocrlf, |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
167 'is-binary': isbinary, |
12975
278e3c9b939e
eol: added filter aliases for backwards compatibility with win32text
Colin Caughie <c.caughie@indigovision.com>
parents:
12802
diff
changeset
|
168 # The following provide backwards compatibility with win32text |
12979
733345a127ca
eol: fix win32text encode/decode filter names
Martin Geisler <mg@lazybytes.net>
parents:
12976
diff
changeset
|
169 'cleverencode:': tolf, |
733345a127ca
eol: fix win32text encode/decode filter names
Martin Geisler <mg@lazybytes.net>
parents:
12976
diff
changeset
|
170 'cleverdecode:': tocrlf |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
171 } |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
172 |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
173 class eolfile(object): |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
174 def __init__(self, ui, root, data): |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
175 self._decode = {'LF': 'to-lf', 'CRLF': 'to-crlf', 'BIN': 'is-binary'} |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
176 self._encode = {'LF': 'to-lf', 'CRLF': 'to-crlf', 'BIN': 'is-binary'} |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
177 |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
178 self.cfg = config.config() |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
179 # 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
|
180 # inserted first override a '** = native' pattern. |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
19997
diff
changeset
|
181 self.cfg.set('patterns', '.hg*', 'BIN', 'eol') |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
182 # We can then parse the user's patterns. |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
183 self.cfg.parse('.hgeol', data) |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
184 |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
185 isrepolf = self.cfg.get('repository', 'native') != 'CRLF' |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
186 self._encode['NATIVE'] = isrepolf and 'to-lf' or 'to-crlf' |
34118
4a6ef3a5b282
configitems: register the 'eol.native' config
Boris Feld <boris.feld@octobus.net>
parents:
34117
diff
changeset
|
187 iswdlf = ui.config('eol', 'native') in ('LF', '\n') |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
188 self._decode['NATIVE'] = iswdlf and 'to-lf' or 'to-crlf' |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
189 |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
190 include = [] |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
191 exclude = [] |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
192 self.patterns = [] |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
193 for pattern, style in self.cfg.items('patterns'): |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
194 key = style.upper() |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
195 if key == 'BIN': |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
196 exclude.append(pattern) |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
197 else: |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
198 include.append(pattern) |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
199 m = match.match(root, '', [pattern]) |
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
200 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
|
201 # 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
|
202 # about inconsistent newlines. |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
203 self.match = match.match(root, '', [], include, exclude) |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
204 |
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
205 def copytoui(self, ui): |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
206 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
|
207 try: |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
19997
diff
changeset
|
208 ui.setconfig('decode', pattern, self._decode[key], 'eol') |
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
19997
diff
changeset
|
209 ui.setconfig('encode', pattern, self._encode[key], 'eol') |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
210 except KeyError: |
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
211 ui.warn(_("ignoring unknown EOL style '%s' from %s\n") |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
212 % (key, self.cfg.source('patterns', pattern))) |
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
213 # eol.only-consistent can be specified in ~/.hgrc or .hgeol |
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
214 for k, v in self.cfg.items('eol'): |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
19997
diff
changeset
|
215 ui.setconfig('eol', k, v, 'eol') |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
216 |
13615
686dec753b52
eol: the hook no longer requires the extension to be loaded
Patrick Mezard <pmezard@gmail.com>
parents:
13614
diff
changeset
|
217 def checkrev(self, repo, ctx, files): |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
218 failed = [] |
13650
56e71e7d2ba2
eol: no need to accumulate files when checking all changesets
Patrick Mezard <pmezard@gmail.com>
parents:
13649
diff
changeset
|
219 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
|
220 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
|
221 continue |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
222 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
|
223 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
|
224 continue |
30114
ad43458d3529
eol: store and reuse pattern matchers instead of creating in tight loop
Mads Kiilerich <madski@unity3d.com>
parents:
30113
diff
changeset
|
225 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
|
226 data = ctx[f].data() |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
227 if (target == "to-lf" and "\r\n" in data |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
228 or target == "to-crlf" and singlelf.search(data)): |
36667
bcfc4e3b6548
py3: use bytes() instead of str()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34830
diff
changeset
|
229 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
|
230 break |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
231 return failed |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
232 |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
233 def parseeol(ui, repo, nodes): |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
234 try: |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
235 for node in nodes: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
236 try: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
237 if node is None: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
238 # 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
|
239 # and cache the filters before we configure them. |
31417
4cffaf8c4853
eol: use 'wvfs' instead of 'wfile'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31328
diff
changeset
|
240 data = repo.wvfs('.hgeol').read() |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
241 else: |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
242 data = repo[node]['.hgeol'].data() |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
243 return eolfile(ui, repo.root, data) |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
244 except (IOError, LookupError): |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
245 pass |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
246 except errormod.ParseError as inst: |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
247 ui.warn(_("warning: ignoring .hgeol file due to parse error " |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
248 "at %s: %s\n") % (inst.args[1], inst.args[0])) |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
249 return None |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
250 |
34830
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
251 def ensureenabled(ui): |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
252 """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
|
253 |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
254 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
|
255 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
|
256 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
|
257 hooks. |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
258 """ |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
259 if 'eol' in ui._knownconfig: |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
260 return |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
261 ui.setconfig('extensions', 'eol', '', source='internal') |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
262 extensions.loadall(ui, ['eol']) |
60802bba1090
eol: ensure the eol extensions is loaded when hooks run
Boris Feld <boris.feld@octobus.net>
parents:
34119
diff
changeset
|
263 |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
264 def _checkhook(ui, repo, node, headsonly): |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
265 # 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
|
266 ensureenabled(ui) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
267 files = set() |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
268 revs = set() |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38329
diff
changeset
|
269 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
|
270 revs.add(rev) |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
271 if headsonly: |
13650
56e71e7d2ba2
eol: no need to accumulate files when checking all changesets
Patrick Mezard <pmezard@gmail.com>
parents:
13649
diff
changeset
|
272 ctx = repo[rev] |
56e71e7d2ba2
eol: no need to accumulate files when checking all changesets
Patrick Mezard <pmezard@gmail.com>
parents:
13649
diff
changeset
|
273 files.update(ctx.files()) |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
274 for pctx in ctx.parents(): |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
275 revs.discard(pctx.rev()) |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
276 failed = [] |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
277 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
|
278 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
|
279 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
|
280 if eol: |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
281 failed.extend(eol.checkrev(repo, ctx, files)) |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
282 |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
283 if failed: |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
284 eols = {'to-lf': 'CRLF', 'to-crlf': 'LF'} |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
285 msgs = [] |
27524
f5b6b4e574c1
eol: make output stable
Bryan O'Sullivan <bos@serpentine.com>
parents:
26587
diff
changeset
|
286 for f, target, node in sorted(failed): |
13649
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
287 msgs.append(_(" %s in %s should not have %s line endings") % |
328ce8a405ac
eol: improve hook failure output
Patrick Mezard <pmezard@gmail.com>
parents:
13625
diff
changeset
|
288 (f, node, eols[target])) |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
289 raise errormod.Abort(_("end-of-line check failed:\n") + "\n".join(msgs)) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
290 |
13617
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
291 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
|
292 """verify that files have expected EOLs""" |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
293 _checkhook(ui, repo, node, False) |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
294 |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
295 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
|
296 """verify that files have expected EOLs""" |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
297 _checkhook(ui, repo, node, True) |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
298 |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
299 # "checkheadshook" used to be called "hook" |
9cb1a42cd4b3
eol: rename hook into checkheadshook, add checkallhook (issue2665)
Patrick Mezard <pmezard@gmail.com>
parents:
13616
diff
changeset
|
300 hook = checkheadshook |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
301 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
302 def preupdate(ui, repo, hooktype, parent1, parent2): |
37678
5f8f013e7d52
scmutil: rename resolvepartialhexnodeid() to resolvehexnodeidprefix()
Martin von Zweigbergk <martinvonz@google.com>
parents:
37507
diff
changeset
|
303 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
|
304 repo.loadeol([p1node]) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
305 return False |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
306 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
307 def uisetup(ui): |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
19997
diff
changeset
|
308 ui.setconfig('hooks', 'preupdate.eol', preupdate, 'eol') |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
309 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
310 def extsetup(ui): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
311 try: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
312 extensions.find('win32text') |
13624
78cc35e75ecc
eol: do not abort when win32text is found, only warn
Steve Borho <steve@borho.org>
parents:
13581
diff
changeset
|
313 ui.warn(_("the eol extension is incompatible with the " |
78cc35e75ecc
eol: do not abort when win32text is found, only warn
Steve Borho <steve@borho.org>
parents:
13581
diff
changeset
|
314 "win32text extension\n")) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
315 except KeyError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
316 pass |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
317 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
318 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
319 def reposetup(ui, repo): |
12307
0852da25a31b
eol: setup the repo.ui in reposetup()
Steve Borho <steve@borho.org>
parents:
11249
diff
changeset
|
320 uisetup(repo.ui) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
321 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
322 if not repo.local(): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
323 return |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
324 for name, fn in filters.iteritems(): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
325 repo.adddatafilter(name, fn) |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
326 |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
19997
diff
changeset
|
327 ui.setconfig('patch', 'eol', 'auto', 'eol') |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
328 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
329 class eolrepo(repo.__class__): |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
330 |
13614
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
331 def loadeol(self, nodes): |
40d0cf79cb2c
eol: extract parsing error handling in parseeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13613
diff
changeset
|
332 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
|
333 if eol is None: |
13612
21367c3da8aa
eol: remove unused argument in readhgeol()
Patrick Mezard <pmezard@gmail.com>
parents:
13611
diff
changeset
|
334 return None |
14854
23c2d7d25329
eol: eol.only-consistent can now be specified in .hgeol
Stepan Koltsov <stepancheg@yandex-team.ru>
parents:
13650
diff
changeset
|
335 eol.copytoui(self.ui) |
13613
85b80261ca10
eol: separate .hgeol parsing from merge in ui
Patrick Mezard <pmezard@gmail.com>
parents:
13612
diff
changeset
|
336 return eol.match |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
337 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
338 def _hgcleardirstate(self): |
30113
ffb682412b98
eol: fix variable naming - call it _eolmatch instead of _eolfile
Mads Kiilerich <madski@unity3d.com>
parents:
29841
diff
changeset
|
339 self._eolmatch = self.loadeol([None, 'tip']) |
ffb682412b98
eol: fix variable naming - call it _eolmatch instead of _eolfile
Mads Kiilerich <madski@unity3d.com>
parents:
29841
diff
changeset
|
340 if not self._eolmatch: |
ffb682412b98
eol: fix variable naming - call it _eolmatch instead of _eolfile
Mads Kiilerich <madski@unity3d.com>
parents:
29841
diff
changeset
|
341 self._eolmatch = util.never |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
342 return |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
343 |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
344 oldeol = None |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
345 try: |
31328
ab45421285d0
eol: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30164
diff
changeset
|
346 cachemtime = os.path.getmtime(self.vfs.join("eol.cache")) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
347 except OSError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
348 cachemtime = 0 |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
349 else: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
350 olddata = self.vfs.read("eol.cache") |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
351 if olddata: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
352 oldeol = eolfile(self.ui, self.root, olddata) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
353 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
354 try: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
355 eolmtime = os.path.getmtime(self.wjoin(".hgeol")) |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
356 except OSError: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
357 eolmtime = 0 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
358 |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
359 if eolmtime > cachemtime: |
17955
4ae21a7568f3
eol: don't refer to a random name-captured ui object
Bryan O'Sullivan <bryano@fb.com>
parents:
17501
diff
changeset
|
360 self.ui.debug("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
|
361 |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
362 hgeoldata = self.wvfs.read('.hgeol') |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
363 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
|
364 |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
365 wlock = None |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
366 try: |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
367 wlock = self.wlock() |
13581
b30a488762e1
eol: use dirstate methods to clear dirstate
Martin Geisler <mg@lazybytes.net>
parents:
13505
diff
changeset
|
368 for f in self.dirstate: |
30140
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
369 if self.dirstate[f] != 'n': |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
370 continue |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
371 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
|
372 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
|
373 continue |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
374 oldkey = None |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
375 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
|
376 if m(f): |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
377 oldkey = key |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
378 break |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
379 newkey = None |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
380 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
|
381 if m(f): |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
382 newkey = key |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
383 break |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
384 if oldkey == newkey: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
385 continue |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
386 # 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
|
387 # 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
|
388 self.dirstate.normallookup(f) |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
389 # Write the cache to update mtime and cache .hgeol |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
390 with self.vfs("eol.cache", "w") as f: |
747e546c561f
eol: on update, only re-check files if filtering changed
Mads Kiilerich <madski@unity3d.com>
parents:
30114
diff
changeset
|
391 f.write(hgeoldata) |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
392 except errormod.LockUnavailable: |
13475
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
393 # If we cannot lock the repository and clear the |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
394 # dirstate, then a commit might not see all files |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
395 # as modified. But if we cannot lock the |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
396 # repository, then we can also not make a commit, |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
397 # so ignore the error. |
c7bef25ca393
eol: handle LockUnavailable error (issue2569)
Martin Geisler <mg@aragost.com>
parents:
13471
diff
changeset
|
398 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
|
399 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
|
400 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
|
401 wlock.release() |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
402 |
32988
4e7352b8325c
eol: fix 'error' parameter name in the commitctx wrapper
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32987
diff
changeset
|
403 def commitctx(self, ctx, error=False): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
404 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
|
405 if not self._eolmatch(f): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
406 continue |
23068
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
407 fctx = ctx[f] |
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
408 if fctx is None: |
14862
abf915f537be
eol: ignore IOError from deleted files in commitctx
Nicholas Riley <njriley@illinois.edu>
parents:
13650
diff
changeset
|
409 continue |
23068
fb3e63c603e8
eol: fix crash when handling removed files
Mads Kiilerich <madski@unity3d.com>
parents:
20870
diff
changeset
|
410 data = fctx.data() |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36667
diff
changeset
|
411 if stringutil.binary(data): |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
412 # We should not abort here, since the user should |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
413 # be able to say "** = native" to automatically |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
414 # have all non-binary files taken care of. |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
415 continue |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
416 if inconsistenteol(data): |
32987
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
417 raise errormod.Abort(_("inconsistent newline style " |
74930cf4a10e
eol: import 'error' as 'errormod'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
31776
diff
changeset
|
418 "in %s\n") % f) |
32988
4e7352b8325c
eol: fix 'error' parameter name in the commitctx wrapper
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32987
diff
changeset
|
419 return super(eolrepo, self).commitctx(ctx, error) |
11249
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
420 repo.__class__ = eolrepo |
0bb67503ad4b
eol: extension for managing file EOLs
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
421 repo._hgcleardirstate() |