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

Side by Side Diff: trychange.py

Issue 507061: Move GenerateDiff into a common function. (Closed)
Patch Set: mult Created 11 years 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 | « tests/trychange_unittest.py ('k') | no next file » | 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/python 1 #!/usr/bin/python
2 # Copyright (c) 2009 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2009 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 """Client-side script to send a try job to the try server. It communicates to 5 """Client-side script to send a try job to the try server. It communicates to
6 the try server by either writting to a svn repository or by directly connecting 6 the try server by either writting to a svn repository or by directly connecting
7 to the server by HTTP. 7 to the server by HTTP.
8 """ 8 """
9 9
10 import datetime 10 import datetime
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 if not self.options.email: 92 if not self.options.email:
93 # Assumes the svn credential is an email address. 93 # Assumes the svn credential is an email address.
94 self.options.email = scm.SVN.GetEmail(self.checkout_root) 94 self.options.email = scm.SVN.GetEmail(self.checkout_root)
95 95
96 def _GenerateDiff(self): 96 def _GenerateDiff(self):
97 """Returns a string containing the diff for the given file list. 97 """Returns a string containing the diff for the given file list.
98 98
99 The files in the list should either be absolute paths or relative to the 99 The files in the list should either be absolute paths or relative to the
100 given root. 100 given root.
101 """ 101 """
102 previous_cwd = os.getcwd()
103 os.chdir(self.checkout_root)
104 if not self.options.files: 102 if not self.options.files:
105 self.options.files = [f[1] for f in scm.SVN.CaptureStatus(None)] 103 previous_cwd = os.getcwd()
106 # Directories will return None so filter them out. 104 os.chdir(self.checkout_root)
107 diff = filter(None, [scm.SVN.DiffItem(f) for f in self.options.files]) 105 excluded = ['!', '?', 'X', ' ', '~']
108 os.chdir(previous_cwd) 106 self.options.files = [
109 return "".join(diff) 107 f[1] for f in scm.SVN.CaptureStatus(self.checkout_root)
108 if f[0][0] not in excluded
109 ]
110 os.chdir(previous_cwd)
111 return scm.SVN.GenerateDiff(self.options.files, full_move=True)
110 112
111 def GetLocalRoot(self): 113 def GetLocalRoot(self):
112 """Return the path of the repository root.""" 114 """Return the path of the repository root."""
113 return self.checkout_root 115 return self.checkout_root
114 116
115 def GetBots(self): 117 def GetBots(self):
116 try: 118 try:
117 import gcl 119 import gcl
118 return gcl.GetCachedFile('PRESUBMIT.py', use_root=True) 120 return gcl.GetCachedFile('PRESUBMIT.py', use_root=True)
119 except ImportError: 121 except ImportError:
120 try: 122 try:
121 return gclient_utils.FileRead(os.path.join(self.checkout_root, 123 return gclient_utils.FileRead(os.path.join(self.checkout_root,
122 'PRESUBMIT.py')) 124 'PRESUBMIT.py'))
123 except OSError: 125 except (IOError, OSError):
124 return None 126 return None
125 127
126 128
127 class GIT(SCM): 129 class GIT(SCM):
128 """Gathers the options and diff for a git checkout.""" 130 """Gathers the options and diff for a git checkout."""
129 def __init__(self, *args, **kwargs): 131 def __init__(self, *args, **kwargs):
130 SCM.__init__(self, *args, **kwargs) 132 SCM.__init__(self, *args, **kwargs)
131 self.checkout_root = os.path.abspath( 133 self.checkout_root = os.path.abspath(
132 gclient_utils.CheckCall(['git', 'rev-parse', '--show-cdup']).strip()) 134 gclient_utils.CheckCall(['git', 'rev-parse', '--show-cdup']).strip())
133 if not self.options.diff: 135 if not self.options.diff:
134 self.options.diff = self._GenerateDiff() 136 self.options.diff = self._GenerateDiff()
135 if not self.options.name: 137 if not self.options.name:
136 self.options.name = self._GetPatchName() 138 self.options.name = self._GetPatchName()
137 if not self.options.email: 139 if not self.options.email:
138 self.options.email = scm.GIT.GetEmail('.') 140 self.options.email = scm.GIT.GetEmail('.')
139 141
140 def _GenerateDiff(self): 142 def _GenerateDiff(self):
141 """Get the diff we'll send to the try server. We ignore the files list.""" 143 """Get the diff we'll send to the try server. We ignore the files list."""
142 branch = gclient_utils.CheckCall(['git', 'cl', 'upstream']).strip() 144 return scm.GIT.GenerateDiff(self.checkout_root)
143 diff = gclient_utils.CheckCall(['git', 'diff-tree', '-p', '--no-prefix',
144 branch, 'HEAD']).splitlines(True)
145 for i in range(len(diff)):
146 # In the case of added files, replace /dev/null with the path to the
147 # file being added.
148 if diff[i].startswith('--- /dev/null'):
149 diff[i] = '--- %s' % diff[i+1][4:]
150 return ''.join(diff)
151 145
152 def _GetPatchName(self): 146 def _GetPatchName(self):
153 """Construct a name for this patch.""" 147 """Construct a name for this patch."""
154 # TODO: perhaps include the hash of the current commit, to distinguish 148 # TODO: perhaps include the hash of the current commit, to distinguish
155 # patches? 149 # patches?
156 branch = gclient_utils.CheckCall(['git', 'symbolic-ref', 'HEAD']).strip() 150 branch = gclient_utils.CheckCall(['git', 'symbolic-ref', 'HEAD']).strip()
157 if not branch.startswith('refs/heads/'): 151 if not branch.startswith('refs/heads/'):
158 # TODO(maruel): Find a better type. 152 # TODO(maruel): Find a better type.
159 raise NoTryServerAccess("Couldn't figure out branch name") 153 raise NoTryServerAccess("Couldn't figure out branch name")
160 branch = branch[len('refs/heads/'):] 154 branch = branch[len('refs/heads/'):]
161 return branch 155 return branch
162 156
163 def GetLocalRoot(self): 157 def GetLocalRoot(self):
164 """Return the path of the repository root.""" 158 """Return the path of the repository root."""
165 return self.checkout_root 159 return self.checkout_root
166 160
167 def GetBots(self): 161 def GetBots(self):
168 try: 162 try:
169 return gclient_utils.FileRead(os.path.join(self.checkout_root, 163 return gclient_utils.FileRead(os.path.join(self.checkout_root,
170 'PRESUBMIT.py')) 164 'PRESUBMIT.py'))
171 except OSError: 165 except (IOError, OSError):
172 return None 166 return None
173 167
174 168
175 def _ParseSendChangeOptions(options): 169 def _ParseSendChangeOptions(options):
176 """Parse common options passed to _SendChangeHTTP and _SendChangeSVN.""" 170 """Parse common options passed to _SendChangeHTTP and _SendChangeSVN."""
177 values = {} 171 values = {}
178 if options.email: 172 if options.email:
179 values['email'] = options.email 173 values['email'] = options.email
180 values['user'] = options.user 174 values['user'] = options.user
181 values['name'] = options.name 175 values['name'] = options.name
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 except (InvalidScript, NoTryServerAccess), e: 493 except (InvalidScript, NoTryServerAccess), e:
500 if swallow_exception: 494 if swallow_exception:
501 return 1 495 return 1
502 print e 496 print e
503 return 1 497 return 1
504 return 0 498 return 0
505 499
506 500
507 if __name__ == "__main__": 501 if __name__ == "__main__":
508 sys.exit(TryChange(None, [], False)) 502 sys.exit(TryChange(None, [], False))
OLDNEW
« no previous file with comments | « tests/trychange_unittest.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698