125 # The following provide backwards compatibility with win32text |
125 # The following provide backwards compatibility with win32text |
126 'cleverencode:': tolf, |
126 'cleverencode:': tolf, |
127 'cleverdecode:': tocrlf |
127 'cleverdecode:': tocrlf |
128 } |
128 } |
129 |
129 |
|
130 class eolfile(object): |
|
131 def __init__(self, ui, root, data): |
|
132 self._decode = {'LF': 'to-lf', 'CRLF': 'to-crlf', 'BIN': 'is-binary'} |
|
133 self._encode = {'LF': 'to-lf', 'CRLF': 'to-crlf', 'BIN': 'is-binary'} |
|
134 |
|
135 self.cfg = config.config() |
|
136 # Our files should not be touched. The pattern must be |
|
137 # inserted first override a '** = native' pattern. |
|
138 self.cfg.set('patterns', '.hg*', 'BIN') |
|
139 # We can then parse the user's patterns. |
|
140 self.cfg.parse('.hgeol', data) |
|
141 |
|
142 isrepolf = self.cfg.get('repository', 'native') != 'CRLF' |
|
143 self._encode['NATIVE'] = isrepolf and 'to-lf' or 'to-crlf' |
|
144 iswdlf = ui.config('eol', 'native', os.linesep) in ('LF', '\n') |
|
145 self._decode['NATIVE'] = iswdlf and 'to-lf' or 'to-crlf' |
|
146 |
|
147 include = [] |
|
148 exclude = [] |
|
149 for pattern, style in self.cfg.items('patterns'): |
|
150 key = style.upper() |
|
151 if key == 'BIN': |
|
152 exclude.append(pattern) |
|
153 else: |
|
154 include.append(pattern) |
|
155 # This will match the files for which we need to care |
|
156 # about inconsistent newlines. |
|
157 self.match = match.match(root, '', [], include, exclude) |
|
158 |
|
159 def setfilters(self, ui): |
|
160 for pattern, style in self.cfg.items('patterns'): |
|
161 key = style.upper() |
|
162 try: |
|
163 ui.setconfig('decode', pattern, self._decode[key]) |
|
164 ui.setconfig('encode', pattern, self._encode[key]) |
|
165 except KeyError: |
|
166 ui.warn(_("ignoring unknown EOL style '%s' from %s\n") |
|
167 % (style, self.cfg.source('patterns', pattern))) |
|
168 |
|
169 def parseeol(ui, repo, node=None): |
|
170 try: |
|
171 if node is None: |
|
172 # Cannot use workingctx.data() since it would load |
|
173 # and cache the filters before we configure them. |
|
174 data = repo.wfile('.hgeol').read() |
|
175 else: |
|
176 data = repo[node]['.hgeol'].data() |
|
177 return eolfile(ui, repo.root, data) |
|
178 except (IOError, LookupError): |
|
179 return None |
130 |
180 |
131 def hook(ui, repo, node, hooktype, **kwargs): |
181 def hook(ui, repo, node, hooktype, **kwargs): |
132 """verify that files have expected EOLs""" |
182 """verify that files have expected EOLs""" |
133 files = set() |
183 files = set() |
134 for rev in xrange(repo[node].rev(), len(repo)): |
184 for rev in xrange(repo[node].rev(), len(repo)): |
151 |
201 |
152 |
202 |
153 def preupdate(ui, repo, hooktype, parent1, parent2): |
203 def preupdate(ui, repo, hooktype, parent1, parent2): |
154 #print "preupdate for %s: %s -> %s" % (repo.root, parent1, parent2) |
204 #print "preupdate for %s: %s -> %s" % (repo.root, parent1, parent2) |
155 try: |
205 try: |
156 repo.readhgeol(parent1) |
206 repo.loadeol(parent1) |
157 except error.ParseError, inst: |
207 except error.ParseError, inst: |
158 ui.warn(_("warning: ignoring .hgeol file due to parse error " |
208 ui.warn(_("warning: ignoring .hgeol file due to parse error " |
159 "at %s: %s\n") % (inst.args[1], inst.args[0])) |
209 "at %s: %s\n") % (inst.args[1], inst.args[0])) |
160 return False |
210 return False |
161 |
211 |
182 |
232 |
183 ui.setconfig('patch', 'eol', 'auto') |
233 ui.setconfig('patch', 'eol', 'auto') |
184 |
234 |
185 class eolrepo(repo.__class__): |
235 class eolrepo(repo.__class__): |
186 |
236 |
187 _decode = {'LF': 'to-lf', 'CRLF': 'to-crlf', 'BIN': 'is-binary'} |
237 def loadeol(self, node=None): |
188 _encode = {'LF': 'to-lf', 'CRLF': 'to-crlf', 'BIN': 'is-binary'} |
238 eol = parseeol(self.ui, self, node) |
189 |
239 if eol is None: |
190 def readhgeol(self, node=None): |
|
191 try: |
|
192 if node is None: |
|
193 # Cannot use workingctx.data() since it would load |
|
194 # and cache the filters before we configure them. |
|
195 data = self.wfile('.hgeol').read() |
|
196 else: |
|
197 data = self[node]['.hgeol'].data() |
|
198 except (IOError, LookupError): |
|
199 return None |
240 return None |
200 |
241 eol.setfilters(self.ui) |
201 if self.ui.config('eol', 'native', os.linesep) in ('LF', '\n'): |
242 return eol.match |
202 self._decode['NATIVE'] = 'to-lf' |
|
203 else: |
|
204 self._decode['NATIVE'] = 'to-crlf' |
|
205 |
|
206 eol = config.config() |
|
207 # Our files should not be touched. The pattern must be |
|
208 # inserted first override a '** = native' pattern. |
|
209 eol.set('patterns', '.hg*', 'BIN') |
|
210 # We can then parse the user's patterns. |
|
211 eol.parse('.hgeol', data) |
|
212 |
|
213 if eol.get('repository', 'native') == 'CRLF': |
|
214 self._encode['NATIVE'] = 'to-crlf' |
|
215 else: |
|
216 self._encode['NATIVE'] = 'to-lf' |
|
217 |
|
218 for pattern, style in eol.items('patterns'): |
|
219 key = style.upper() |
|
220 try: |
|
221 self.ui.setconfig('decode', pattern, self._decode[key]) |
|
222 self.ui.setconfig('encode', pattern, self._encode[key]) |
|
223 except KeyError: |
|
224 self.ui.warn(_("ignoring unknown EOL style '%s' from %s\n") |
|
225 % (style, eol.source('patterns', pattern))) |
|
226 |
|
227 include = [] |
|
228 exclude = [] |
|
229 for pattern, style in eol.items('patterns'): |
|
230 key = style.upper() |
|
231 if key == 'BIN': |
|
232 exclude.append(pattern) |
|
233 else: |
|
234 include.append(pattern) |
|
235 |
|
236 # This will match the files for which we need to care |
|
237 # about inconsistent newlines. |
|
238 return match.match(self.root, '', [], include, exclude) |
|
239 |
243 |
240 def _hgcleardirstate(self): |
244 def _hgcleardirstate(self): |
241 try: |
245 try: |
242 self._eolfile = self.readhgeol() or self.readhgeol('tip') |
246 self._eolfile = (self.loadeol() or self.loadeol('tip')) |
243 except error.ParseError, inst: |
247 except error.ParseError, inst: |
244 ui.warn(_("warning: ignoring .hgeol file due to parse error " |
248 ui.warn(_("warning: ignoring .hgeol file due to parse error " |
245 "at %s: %s\n") % (inst.args[1], inst.args[0])) |
249 "at %s: %s\n") % (inst.args[1], inst.args[0])) |
246 self._eolfile = None |
250 self._eolfile = None |
247 |
251 |