675 result = False |
675 result = False |
676 |
676 |
677 return result |
677 return result |
678 |
678 |
679 def _checkfiledata(name, f, filedata, filters, pats, context, |
679 def _checkfiledata(name, f, filedata, filters, pats, context, |
680 logfunc, maxerr, warnings, blame, debug, lineno): |
680 logfunc, maxerr, warnings, blame, debug, lineno, |
|
681 offset=None): |
681 """Execute actual error check for file data |
682 """Execute actual error check for file data |
682 |
683 |
683 :name: of the checking category |
684 :name: of the checking category |
684 :f: filepath |
685 :f: filepath |
685 :filedata: content of a file |
686 :filedata: content of a file |
693 report all errors |
694 report all errors |
694 :warnings: whether warning level checks should be applied |
695 :warnings: whether warning level checks should be applied |
695 :blame: whether blame information should be displayed at error reporting |
696 :blame: whether blame information should be displayed at error reporting |
696 :debug: whether debug information should be displayed |
697 :debug: whether debug information should be displayed |
697 :lineno: whether lineno should be displayed at error reporting |
698 :lineno: whether lineno should be displayed at error reporting |
|
699 :offset: line number offset of 'filedata' in 'f' for checking |
|
700 an embedded code fragment, or None (offset=0 is different |
|
701 from offset=None) |
698 |
702 |
699 returns number of detected errors. |
703 returns number of detected errors. |
700 """ |
704 """ |
701 blamecache = context['blamecache'] |
705 blamecache = context['blamecache'] |
|
706 if offset is None: |
|
707 lineoffset = 0 |
|
708 else: |
|
709 lineoffset = offset |
702 |
710 |
703 fc = 0 |
711 fc = 0 |
704 pre = post = filedata |
712 pre = post = filedata |
705 |
713 |
706 if True: # TODO: get rid of this redundant 'if' block |
714 if True: # TODO: get rid of this redundant 'if' block |
744 l = prelines[n] |
752 l = prelines[n] |
745 |
753 |
746 if ignore and re.search(ignore, l, re.MULTILINE): |
754 if ignore and re.search(ignore, l, re.MULTILINE): |
747 if debug: |
755 if debug: |
748 print("Skipping %s for %s:%s (ignore pattern)" % ( |
756 print("Skipping %s for %s:%s (ignore pattern)" % ( |
749 name, f, n)) |
757 name, f, (n + lineoffset))) |
750 continue |
758 continue |
751 bd = "" |
759 bd = "" |
752 if blame: |
760 if blame: |
753 bd = 'working directory' |
761 bd = 'working directory' |
754 if blamecache is None: |
762 if blamecache is None: |
755 blamecache = getblame(f) |
763 blamecache = getblame(f) |
756 context['blamecache'] = blamecache |
764 context['blamecache'] = blamecache |
757 if n < len(blamecache): |
765 if (n + lineoffset) < len(blamecache): |
758 bl, bu, br = blamecache[n] |
766 bl, bu, br = blamecache[(n + lineoffset)] |
759 if bl == l: |
767 if offset is None and bl == l: |
760 bd = '%s@%s' % (bu, br) |
768 bd = '%s@%s' % (bu, br) |
761 |
769 elif offset is not None and bl.endswith(l): |
762 errors.append((f, lineno and n + 1, l, msg, bd)) |
770 # "offset is not None" means "checking |
|
771 # embedded code fragment". In this case, |
|
772 # "l" does not have information about the |
|
773 # beginning of an *original* line in the |
|
774 # file (e.g. ' > '). |
|
775 # Therefore, use "str.endswith()", and |
|
776 # show "maybe" for a little loose |
|
777 # examination. |
|
778 bd = '%s@%s, maybe' % (bu, br) |
|
779 |
|
780 errors.append((f, lineno and (n + lineoffset + 1), l, msg, bd)) |
763 |
781 |
764 errors.sort() |
782 errors.sort() |
765 for e in errors: |
783 for e in errors: |
766 logfunc(*e) |
784 logfunc(*e) |
767 fc += 1 |
785 fc += 1 |