Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(144)

Side by Side Diff: presubmit_support.py

Issue 195793021: Infer CL author and reviewer list from local state if the issue has not previously been uploaded. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Add an additional test Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « presubmit_canned_checks.py ('k') | tests/presubmit_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Enables directory-specific presubmit checks to run at upload and/or commit. 6 """Enables directory-specific presubmit checks to run at upload and/or commit.
7 """ 7 """
8 8
9 __version__ = '1.8.0' 9 __version__ = '1.8.0'
10 10
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 # Matches key/value (or "tag") lines in changelist descriptions. 787 # Matches key/value (or "tag") lines in changelist descriptions.
788 TAG_LINE_RE = re.compile( 788 TAG_LINE_RE = re.compile(
789 '^[ \t]*(?P<key>[A-Z][A-Z_0-9]*)[ \t]*=[ \t]*(?P<value>.*?)[ \t]*$') 789 '^[ \t]*(?P<key>[A-Z][A-Z_0-9]*)[ \t]*=[ \t]*(?P<value>.*?)[ \t]*$')
790 scm = '' 790 scm = ''
791 791
792 def __init__( 792 def __init__(
793 self, name, description, local_root, files, issue, patchset, author): 793 self, name, description, local_root, files, issue, patchset, author):
794 if files is None: 794 if files is None:
795 files = [] 795 files = []
796 self._name = name 796 self._name = name
797 self._full_description = description
798 # Convert root into an absolute path. 797 # Convert root into an absolute path.
799 self._local_root = os.path.abspath(local_root) 798 self._local_root = os.path.abspath(local_root)
800 self.issue = issue 799 self.issue = issue
801 self.patchset = patchset 800 self.patchset = patchset
802 self.author_email = author 801 self.author_email = author
803 802
804 # From the description text, build up a dictionary of key/value pairs 803 self._full_description = ''
805 # plus the description minus all key/value or "tag" lines.
806 description_without_tags = []
807 self.tags = {} 804 self.tags = {}
808 for line in self._full_description.splitlines(): 805 self._description_without_tags = ''
809 m = self.TAG_LINE_RE.match(line) 806 self.SetDescriptionText(description)
810 if m:
811 self.tags[m.group('key')] = m.group('value')
812 else:
813 description_without_tags.append(line)
814
815 # Change back to text and remove whitespace at end.
816 self._description_without_tags = (
817 '\n'.join(description_without_tags).rstrip())
818 807
819 assert all( 808 assert all(
820 (isinstance(f, (list, tuple)) and len(f) == 2) for f in files), files 809 (isinstance(f, (list, tuple)) and len(f) == 2) for f in files), files
821 810
822 diff_cache = self._AFFECTED_FILES.DIFF_CACHE() 811 diff_cache = self._AFFECTED_FILES.DIFF_CACHE()
823 self._affected_files = [ 812 self._affected_files = [
824 self._AFFECTED_FILES(path, action.strip(), self._local_root, diff_cache) 813 self._AFFECTED_FILES(path, action.strip(), self._local_root, diff_cache)
825 for action, path in files 814 for action, path in files
826 ] 815 ]
827 816
828 def Name(self): 817 def Name(self):
829 """Returns the change name.""" 818 """Returns the change name."""
830 return self._name 819 return self._name
831 820
832 def DescriptionText(self): 821 def DescriptionText(self):
833 """Returns the user-entered changelist description, minus tags. 822 """Returns the user-entered changelist description, minus tags.
834 823
835 Any line in the user-provided description starting with e.g. "FOO=" 824 Any line in the user-provided description starting with e.g. "FOO="
836 (whitespace permitted before and around) is considered a tag line. Such 825 (whitespace permitted before and around) is considered a tag line. Such
837 lines are stripped out of the description this function returns. 826 lines are stripped out of the description this function returns.
838 """ 827 """
839 return self._description_without_tags 828 return self._description_without_tags
840 829
841 def FullDescriptionText(self): 830 def FullDescriptionText(self):
842 """Returns the complete changelist description including tags.""" 831 """Returns the complete changelist description including tags."""
843 return self._full_description 832 return self._full_description
844 833
834 def SetDescriptionText(self, description):
835 """Sets the full description text (including tags) to |description|.
836
837 Also updates the list of tags."""
838 self._full_description = description
839
840 # From the description text, build up a dictionary of key/value pairs
841 # plus the description minus all key/value or "tag" lines.
842 description_without_tags = []
843 self.tags = {}
844 for line in self._full_description.splitlines():
845 m = self.TAG_LINE_RE.match(line)
846 if m:
847 self.tags[m.group('key')] = m.group('value')
848 else:
849 description_without_tags.append(line)
850
851 # Change back to text and remove whitespace at end.
852 self._description_without_tags = (
853 '\n'.join(description_without_tags).rstrip())
854
845 def RepositoryRoot(self): 855 def RepositoryRoot(self):
846 """Returns the repository (checkout) root directory for this change, 856 """Returns the repository (checkout) root directory for this change,
847 as an absolute path. 857 as an absolute path.
848 """ 858 """
849 return self._local_root 859 return self._local_root
850 860
851 def __getattr__(self, attr): 861 def __getattr__(self, attr):
852 """Return tags directly as attributes on the object.""" 862 """Return tags directly as attributes on the object."""
853 if not re.match(r"^[A-Z_]*$", attr): 863 if not re.match(r"^[A-Z_]*$", attr):
854 raise AttributeError(self, attr) 864 raise AttributeError(self, attr)
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
1607 except PresubmitFailure, e: 1617 except PresubmitFailure, e:
1608 print >> sys.stderr, e 1618 print >> sys.stderr, e
1609 print >> sys.stderr, 'Maybe your depot_tools is out of date?' 1619 print >> sys.stderr, 'Maybe your depot_tools is out of date?'
1610 print >> sys.stderr, 'If all fails, contact maruel@' 1620 print >> sys.stderr, 'If all fails, contact maruel@'
1611 return 2 1621 return 2
1612 1622
1613 1623
1614 if __name__ == '__main__': 1624 if __name__ == '__main__':
1615 fix_encoding.fix_encoding() 1625 fix_encoding.fix_encoding()
1616 sys.exit(Main(None)) 1626 sys.exit(Main(None))
OLDNEW
« no previous file with comments | « presubmit_canned_checks.py ('k') | tests/presubmit_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698