style.py (7807:15553b536bd6) style.py (7827:49b7d40ee88a)
1#! /usr/bin/env python
2# Copyright (c) 2006 The Regents of The University of Michigan
3# Copyright (c) 2007 The Hewlett-Packard Development Company
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions are
8# met: redistributions of source code must retain the above copyright

--- 22 unchanged lines hidden (view full) ---

31import re
32import os
33import sys
34
35sys.path.insert(0, os.path.dirname(__file__))
36
37from file_types import lang_type
38
1#! /usr/bin/env python
2# Copyright (c) 2006 The Regents of The University of Michigan
3# Copyright (c) 2007 The Hewlett-Packard Development Company
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions are
8# met: redistributions of source code must retain the above copyright

--- 22 unchanged lines hidden (view full) ---

31import re
32import os
33import sys
34
35sys.path.insert(0, os.path.dirname(__file__))
36
37from file_types import lang_type
38
39tabsize = 8
39lead = re.compile(r'^([ \t]+)')
40trail = re.compile(r'([ \t]+)$')
41any_control = re.compile(r'\b(if|while|for)[ \t]*[(]')
42good_control = re.compile(r'\b(if|while|for) [(]')
43
44whitespace_types = set(('C', 'C++', 'swig', 'python', 'asm', 'isa', 'scons'))
45format_types = set(('C', 'C++'))
46

--- 17 unchanged lines hidden (view full) ---

64 except OSError, msg:
65 print 'could not open file %s: %s' % (filename, msg)
66 return
67
68 for num,line in enumerate(f):
69 if not checkwhite_line(line):
70 yield line,num + 1
71
40lead = re.compile(r'^([ \t]+)')
41trail = re.compile(r'([ \t]+)$')
42any_control = re.compile(r'\b(if|while|for)[ \t]*[(]')
43good_control = re.compile(r'\b(if|while|for) [(]')
44
45whitespace_types = set(('C', 'C++', 'swig', 'python', 'asm', 'isa', 'scons'))
46format_types = set(('C', 'C++'))
47

--- 17 unchanged lines hidden (view full) ---

65 except OSError, msg:
66 print 'could not open file %s: %s' % (filename, msg)
67 return
68
69 for num,line in enumerate(f):
70 if not checkwhite_line(line):
71 yield line,num + 1
72
72def fixwhite_line(line, tabsize):
73def fixwhite_line(line):
73 if lead.search(line):
74 newline = ''
75 for i,c in enumerate(line):
76 if c == ' ':
77 newline += ' '
78 elif c == '\t':
79 newline += ' ' * (tabsize - len(newline) % tabsize)
80 else:
81 newline += line[i:]
82 break
83
84 line = newline
85
86 return line.rstrip() + '\n'
87
74 if lead.search(line):
75 newline = ''
76 for i,c in enumerate(line):
77 if c == ' ':
78 newline += ' '
79 elif c == '\t':
80 newline += ' ' * (tabsize - len(newline) % tabsize)
81 else:
82 newline += line[i:]
83 break
84
85 line = newline
86
87 return line.rstrip() + '\n'
88
88def fixwhite(filename, tabsize, fixonly=None):
89def fixwhite(filename, fixonly=None):
89 if lang_type(filename) not in whitespace_types:
90 return
91
92 try:
93 f = file(filename, 'r+')
94 except OSError, msg:
95 print 'could not open file %s: %s' % (filename, msg)
96 return

--- 122 unchanged lines hidden (view full) ---

219 if i < fbeg:
220 modified.add(i)
221 elif i + 1 >= fend:
222 break
223 elif i > max_lines:
224 break
225 return modified
226
90 if lang_type(filename) not in whitespace_types:
91 return
92
93 try:
94 f = file(filename, 'r+')
95 except OSError, msg:
96 print 'could not open file %s: %s' % (filename, msg)
97 return

--- 122 unchanged lines hidden (view full) ---

220 if i < fbeg:
221 modified.add(i)
222 elif i + 1 >= fend:
223 break
224 elif i > max_lines:
225 break
226 return modified
227
227def do_check_whitespace(ui, repo, *files, **args):
228def do_check_style(ui, repo, *files, **args):
228 """check files for proper m5 style guidelines"""
229 from mercurial import mdiff, util
230
231 if files:
232 files = frozenset(files)
233
234 def skip(name):
235 return files and name in files
236
229 """check files for proper m5 style guidelines"""
230 from mercurial import mdiff, util
231
232 if files:
233 files = frozenset(files)
234
235 def skip(name):
236 return files and name in files
237
237 def prompt(name, fixonly=None):
238 def prompt(name, func, fixonly=None):
238 if args.get('auto', False):
239 result = 'f'
240 else:
241 while True:
242 result = ui.prompt("(a)bort, (i)gnore, or (f)ix?", default='a')
243 if result in 'aif':
244 break
245
246 if result == 'a':
247 return True
248 elif result == 'f':
239 if args.get('auto', False):
240 result = 'f'
241 else:
242 while True:
243 result = ui.prompt("(a)bort, (i)gnore, or (f)ix?", default='a')
244 if result in 'aif':
245 break
246
247 if result == 'a':
248 return True
249 elif result == 'f':
249 fixwhite(repo.wjoin(name), args['tabsize'], fixonly)
250 func(repo.wjoin(name), fixonly)
250
251 return False
252
253 modified, added, removed, deleted, unknown, ignore, clean = repo.status()
254
255 for fname in added:
256 if skip(fname):
257 continue
258
259 ok = True
260 for line,num in checkwhite(repo.wjoin(fname)):
261 ui.write("invalid whitespace in %s:%d\n" % (fname, num))
262 if ui.verbose:
263 ui.write(">>%s<<\n" % line[-1])
264 ok = False
265
266 if not ok:
251
252 return False
253
254 modified, added, removed, deleted, unknown, ignore, clean = repo.status()
255
256 for fname in added:
257 if skip(fname):
258 continue
259
260 ok = True
261 for line,num in checkwhite(repo.wjoin(fname)):
262 ui.write("invalid whitespace in %s:%d\n" % (fname, num))
263 if ui.verbose:
264 ui.write(">>%s<<\n" % line[-1])
265 ok = False
266
267 if not ok:
267 if prompt(fname):
268 if prompt(fname, fixwhite):
268 return True
269
270 try:
271 wctx = repo.workingctx()
272 except:
273 from mercurial import context
274 wctx = context.workingctx(repo)
275

--- 56 unchanged lines hidden (view full) ---

332
333 return False
334
335def check_hook(hooktype):
336 if hooktype not in ('pretxncommit', 'pre-qrefresh'):
337 raise AttributeError, \
338 "This hook is not meant for %s" % hooktype
339
269 return True
270
271 try:
272 wctx = repo.workingctx()
273 except:
274 from mercurial import context
275 wctx = context.workingctx(repo)
276

--- 56 unchanged lines hidden (view full) ---

333
334 return False
335
336def check_hook(hooktype):
337 if hooktype not in ('pretxncommit', 'pre-qrefresh'):
338 raise AttributeError, \
339 "This hook is not meant for %s" % hooktype
340
340def check_whitespace(ui, repo, hooktype, **kwargs):
341def check_style(ui, repo, hooktype, **kwargs):
341 check_hook(hooktype)
342 check_hook(hooktype)
342 args = { 'tabsize' : 8 }
343 return do_check_whitespace(ui, repo, **args)
343 args = {}
344 return do_check_style(ui, repo, **args)
344
345def check_format(ui, repo, hooktype, **kwargs):
346 check_hook(hooktype)
347 args = {}
348 return do_check_format(ui, repo, **args)
349
350try:
351 from mercurial.i18n import _
352except ImportError:
353 def _(arg):
354 return arg
355
356cmdtable = {
357 '^m5style' :
345
346def check_format(ui, repo, hooktype, **kwargs):
347 check_hook(hooktype)
348 args = {}
349 return do_check_format(ui, repo, **args)
350
351try:
352 from mercurial.i18n import _
353except ImportError:
354 def _(arg):
355 return arg
356
357cmdtable = {
358 '^m5style' :
358 ( do_check_whitespace,
359 [ ('a', 'auto', False, _("automatically fix whitespace")),
360 ('t', 'tabsize', 8, _("Number of spaces TAB indents")) ],
361 _('hg m5style [-a] [-t <tabsize>] [FILE]...')),
359 ( do_check_style,
360 [ ('a', 'auto', False, _("automatically fix whitespace")) ],
361 _('hg m5style [-a] [FILE]...')),
362 '^m5format' :
363 ( do_check_format,
364 [ ],
365 _('hg m5format [FILE]...')),
366}
367
368if __name__ == '__main__':
369 import getopt

--- 18 unchanged lines hidden (view full) ---

388 usage = chkformat_usage
389 else:
390 sys.exit(fixwhite_usage + chkwhite_usage + chkformat_usage)
391
392 opts, args = getopt.getopt(sys.argv[2:], flags)
393
394 code = 1
395 verbose = 1
362 '^m5format' :
363 ( do_check_format,
364 [ ],
365 _('hg m5format [FILE]...')),
366}
367
368if __name__ == '__main__':
369 import getopt

--- 18 unchanged lines hidden (view full) ---

388 usage = chkformat_usage
389 else:
390 sys.exit(fixwhite_usage + chkwhite_usage + chkformat_usage)
391
392 opts, args = getopt.getopt(sys.argv[2:], flags)
393
394 code = 1
395 verbose = 1
396 tabsize = 8
397 for opt,arg in opts:
398 if opt == '-n':
399 code = None
400 if opt == '-t':
401 tabsize = int(arg)
402 if opt == '-v':
403 verbose += 1
404

--- 18 unchanged lines hidden ---
396 for opt,arg in opts:
397 if opt == '-n':
398 code = None
399 if opt == '-t':
400 tabsize = int(arg)
401 if opt == '-v':
402 verbose += 1
403

--- 18 unchanged lines hidden ---