Mercurial > hg
annotate hgext/eol.py @ 42620:d98ec36be808
convert: add a config option to help doing identity hg->hg conversion
I want to change the computation of the list of files modified by a
commit. In principle, this would simply change a cache. But since this
information is stored in commits rather than a cache, changing it
means changing commit hashes (going forward).
Some users rely on the convert extension from hg to hg not changing
hashes when nothing changes (usually). Allow these users to preserve
hashes despite changes to the changelog files computation by reusing
these files lists when the manifest is unchanged (since these files
list are derived from the manifest).
Differential Revision: https://phab.mercurial-scm.org/D6643
author | Valentin Gatien-Baron <valentin.gatienbaron@gmail.com> |
---|---|
date | Sat, 13 Jul 2019 23:45:32 -0400 |
parents | e7aa113b14f7 |
children | 2372284d9457 |
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 |
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
|
403 def commitctx(self, ctx, error=False, origctx=None): |
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) |
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
|
419 return super(eolrepo, self).commitctx(ctx, error, origctx) |
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() |