Index: gcl.py |
diff --git a/gcl.py b/gcl.py |
index 76a217c442c46ab97ac2bfe7dd086c0fa5abff1f..e7fa919954e37dd5deca5393f6b6a284792e0a3a 100755 |
--- a/gcl.py |
+++ b/gcl.py |
@@ -290,9 +290,7 @@ class ChangeInfo(object): |
self.name = name |
self.issue = int(issue) |
self.patchset = int(patchset) |
- self._description = None |
- self._subject = None |
- self._reviewers = None |
+ self._change_desc = None |
self._set_description(description) |
if files is None: |
files = [] |
@@ -306,42 +304,21 @@ class ChangeInfo(object): |
self.rietveld = GetCodeReviewSetting('CODE_REVIEW_SERVER') |
def _get_description(self): |
- return self._description |
+ return self._change_desc.description |
def _set_description(self, description): |
- # TODO(dpranke): Cloned from git_cl.py. These should be shared. |
- if not description: |
- self._description = description |
- return |
- |
- parsed_lines = [] |
- reviewers_re = re.compile(REVIEWERS_REGEX) |
- reviewers = '' |
- subject = '' |
- for l in description.splitlines(): |
- if not subject: |
- subject = l |
- matched_reviewers = reviewers_re.match(l) |
- if matched_reviewers: |
- reviewers = matched_reviewers.group(1).split(',') |
- parsed_lines.append(l) |
- |
- if len(subject) > 100: |
- subject = subject[:97] + '...' |
- |
- self._subject = subject |
- self._reviewers = reviewers |
- self._description = '\n'.join(parsed_lines) |
+ self._change_desc = presubmit_support.ChangeDescription( |
+ description=description) |
description = property(_get_description, _set_description) |
@property |
def reviewers(self): |
- return self._reviewers |
+ return self._change_desc.reviewers |
@property |
def subject(self): |
- return self._subject |
+ return self._change_desc.subject |
def NeedsUpload(self): |
return self.needs_upload |
@@ -378,7 +355,7 @@ class ChangeInfo(object): |
'patchset': self.patchset, |
'needs_upload': self.NeedsUpload(), |
'files': self.GetFiles(), |
- 'description': self.description, |
+ 'description': self._change_desc.description, |
'rietveld': self.rietveld, |
}, sort_keys=True, indent=2) |
gclient_utils.FileWrite(GetChangelistInfoFile(self.name), data) |
@@ -739,20 +716,6 @@ def ListFiles(show_unknown_files): |
return 0 |
-def GetEditor(): |
- editor = os.environ.get("SVN_EDITOR") |
- if not editor: |
- editor = os.environ.get("EDITOR") |
- |
- if not editor: |
- if sys.platform.startswith("win"): |
- editor = "notepad" |
- else: |
- editor = "vi" |
- |
- return editor |
- |
- |
def GenerateDiff(files, root=None): |
return SVN.GenerateDiff(files, root=root) |
@@ -1093,38 +1056,34 @@ def CMDchange(args): |
unaffected_files = [x for x in other_files if not file_re.match(x[0])] |
description = description.rstrip() + '\n' |
+ reviewers = change_info.reviewers |
separator1 = ("\n---All lines above this line become the description.\n" |
"---Repository Root: " + change_info.GetLocalRoot() + "\n" |
"---Paths in this changelist (" + change_info.name + "):\n") |
separator2 = "\n\n---Paths modified but not in any changelist:\n\n" |
- text = (description + separator1 + '\n' + |
- '\n'.join([f[0] + f[1] for f in change_info.GetFiles()])) |
+ |
+ footer = (separator1 + '\n' + |
+ '\n'.join([f[0] + f[1] for f in change_info.GetFiles()])) |
if change_info.Exists(): |
- text += (separator2 + |
- '\n'.join([f[0] + f[1] for f in affected_files]) + '\n') |
+ footer += (separator2 + |
+ '\n'.join([f[0] + f[1] for f in affected_files]) + '\n') |
else: |
- text += ('\n'.join([f[0] + f[1] for f in affected_files]) + '\n' + |
- separator2) |
- text += '\n'.join([f[0] + f[1] for f in unaffected_files]) + '\n' |
+ footer += ('\n'.join([f[0] + f[1] for f in affected_files]) + '\n' + |
+ separator2) |
+ footer += '\n'.join([f[0] + f[1] for f in unaffected_files]) + '\n' |
- handle, filename = tempfile.mkstemp(text=True) |
- os.write(handle, text) |
- os.close(handle) |
+ change_desc = presubmit_support.ChangeDescription(description=description, |
+ reviewers=reviewers) |
- # Open up the default editor in the system to get the CL description. |
- try: |
- if not silent: |
- cmd = '%s %s' % (GetEditor(), filename) |
- if sys.platform == 'win32' and os.environ.get('TERM') == 'msys': |
- # Msysgit requires the usage of 'env' to be present. |
- cmd = 'env ' + cmd |
- # shell=True to allow the shell to handle all forms of quotes in $EDITOR. |
- subprocess.check_call(cmd, shell=True) |
- result = gclient_utils.FileRead(filename, 'r') |
- finally: |
- os.remove(filename) |
+ # These next few lines are equivalent to change_desc.UserUpdate(). We |
+ # call them individually to avoid passing a lot of state back and forth. |
+ original_description = change_desc.description |
+ |
+ result = change_desc.EditableDescription() + footer |
+ if not silent: |
+ result = change_desc.editor(result) |
if not result: |
return 0 |
@@ -1136,8 +1095,8 @@ def CMDchange(args): |
# Update the CL description if it has changed. |
new_description = split_result[0] |
cl_files_text = split_result[1] |
- if new_description != description or override_description: |
- change_info.description = new_description |
+ change_desc.Parse(new_description) |
+ if change_desc.description != original_description or override_description: |
change_info.needs_upload = True |
new_cl_files = [] |
@@ -1151,7 +1110,7 @@ def CMDchange(args): |
new_cl_files.append((status, filename)) |
if (not len(change_info.GetFiles()) and not change_info.issue and |
- not len(new_description) and not new_cl_files): |
+ not len(change_desc.description) and not new_cl_files): |
ErrorExit("Empty changelist not saved") |
change_info._files = new_cl_files |