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

Side by Side Diff: build/util/lastchange.py

Issue 7104106: Unify the version string to be displayed on "About Chromium" dialog. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Reuse the original lastchange.py as much as possible Created 9 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/app/nibs/About.xib » ('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) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 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 """ 6 """
7 lastchange.py -- Chromium revision fetching utility. 7 lastchange.py -- Chromium revision fetching utility.
8 """ 8 """
9 9
10 import re 10 import re
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 a VersionInfo object or None on error. 95 a VersionInfo object or None on error.
96 """ 96 """
97 proc = RunGitCommand(directory, ['rev-parse', 'HEAD']) 97 proc = RunGitCommand(directory, ['rev-parse', 'HEAD'])
98 if proc: 98 if proc:
99 output = proc.communicate()[0].strip() 99 output = proc.communicate()[0].strip()
100 if proc.returncode == 0 and output: 100 if proc.returncode == 0 and output:
101 return VersionInfo('git', 'git', output[:7]) 101 return VersionInfo('git', 'git', output[:7])
102 return None 102 return None
103 103
104 104
105 def IsGitSVN(directory): 105 def FetchGitSVNRoot(directory):
106 """ 106 """
107 Checks whether git-svn has been set up. 107 Fetch the SVN root repository through Git.
108 108
109 Errors are swallowed. 109 Errors are swallowed.
110 110
111 Returns: 111 Returns:
112 whether git-svn has been set up. 112 the SVN root repository or 'git-svn' on error.
113 """ 113 """
114 # To test whether git-svn has been set up, query the config for any 114 proc = RunGitCommand(directory,
115 # svn-related configuration. This command exits with an error code 115 ['config', '--get-regexp', '^svn-remote.svn.url$'])
116 # if there aren't any matches, so ignore its output.
117 proc = RunGitCommand(directory, ['config', '--get-regexp', '^svn'])
118 if proc: 116 if proc:
119 return (proc.wait() == 0) 117 output = proc.communicate()[0].strip()
120 return False 118 if proc.returncode == 0 and output:
119 # Zero return code implies presence of requested configuration variable.
120 # Its value is second (last) field of output.
121 match = re.search(r'\S+$', output)
122 if match:
123 return match.group(0)
124 return 'git-svn'
121 125
122 126
123 def FetchGitSVNURL(directory): 127 def FetchGitSVNURLAndRevision(directory):
124 """ 128 """
125 Fetch URL of SVN repository bound to git. 129 Fetch the SVN URL and revision through Git.
126 130
127 Errors are swallowed. 131 Errors are swallowed.
128 132
129 Returns: 133 Returns:
130 SVN URL. 134 the SVN URL and revision.
131 """ 135 """
132 if IsGitSVN(directory): 136 proc = RunGitCommand(directory, ['log', '-1',
133 proc = RunGitCommand(directory, ['svn', 'info', '--url']) 137 '--grep=git-svn-id', '--format=%b'])
134 if proc:
135 output = proc.communicate()[0].strip()
136 if proc.returncode == 0:
137 match = re.search(r'^\w+://.*$', output, re.M)
138 if match:
139 return match.group(0)
140 return ''
141
142
143 def FetchGitSVNRoot(directory):
144 """
145 Fetch root of SVN repository bound to git.
146
147 Errors are swallowed.
148
149 Returns:
150 SVN root repository.
151 """
152 if IsGitSVN(directory):
153 git_command = ['config', '--get-regexp', '^svn-remote.svn.url$']
154 proc = RunGitCommand(directory, git_command)
155 if proc:
156 output = proc.communicate()[0].strip()
157 if proc.returncode == 0:
158 # Zero return code implies presence of requested configuration variable.
159 # Its value is second (last) field of output.
160 match = re.search(r'\S+$', output)
161 if match:
162 return match.group(0)
163 return ''
164
165
166 def LookupGitSVNRevision(directory, depth):
167 """
168 Fetch the Git-SVN identifier for the local tree.
169 Parses first |depth| commit messages.
170
171 Errors are swallowed.
172 """
173 if not IsGitSVN(directory):
174 return None
175 git_re = re.compile(r'^\s*git-svn-id:\s+(\S+)@(\d+)')
176 proc = RunGitCommand(directory, ['log', '-' + str(depth)])
177 if proc: 138 if proc:
178 for line in proc.stdout: 139 output = proc.communicate()[0].strip()
179 match = git_re.match(line) 140 if proc.returncode == 0 and output:
141 # Extract the latest SVN revision and the SVN URL.
142 # The target line is the last "git-svn-id: ..." line like this:
143 #
144 # git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85528 0039d316....
145 match = re.search(r'.*git-svn-id:\s*([^@]*)@([0-9]+)', output, re.DOTALL)
180 if match: 146 if match:
181 id = match.group(2) 147 return match.group(1), match.group(2)
182 if id: 148 return None, None
183 proc.stdout.close() # Cut pipe for fast exit.
184 return id
185 return None
186 149
187 150
188 def IsGitSVNDirty(directory): 151 def IsGitSVNDirty(directory):
189 """ 152 """
190 Checks whether our git-svn tree contains clean trunk or some branch. 153 Checks whether our git-svn tree contains clean trunk or any local changes.
191 154
192 Errors are swallowed. 155 Errors are swallowed.
193 """ 156 """
194 # For git branches the last commit message is either 157 proc = RunGitCommand(directory, ['log', '-1'])
195 # some local commit or a merge. 158 if proc:
196 return LookupGitSVNRevision(directory, 1) is None 159 output = proc.communicate()[0].strip()
160 if proc.returncode == 0 and output:
161 # Check if there are any local commits.
162 # We check if the "git-svn-id: ..." line appears or not
163 # after "Review URL: ..." line, like this:
164 #
165 # Review URL: http://codereview.chromium.org/7057025
166 # git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85528 0039d316...
167 match = re.search(r'^Review URL:', output, re.MULTILINE)
Denis Lagno 2011/06/17 11:01:27 since now you extract last match of 'git-svn-id' t
haraken1 2011/06/17 13:45:08 Done.
168 if match:
169 match = re.search(r'^git-svn-id:\s*([^@]*)@([0-9]+)',
170 output[match.end():], re.MULTILINE)
171 if match:
172 # Check if there are any local uncommitted changes.
173 proc = RunGitCommand(directory, ['checkout'])
174 if proc:
175 output = proc.communicate()[0].strip()
176 if proc.returncode == 0 and not output:
177 return False
178 return True
197 179
198 180
199 def FetchGitSVNRevision(directory): 181 def FetchGitSVNRevision(directory):
200 """ 182 """
201 Fetch the Git-SVN identifier for the local tree. 183 Fetch the Git-SVN identifier for the local tree.
202 184
203 Errors are swallowed. 185 Errors are swallowed.
204 """ 186 """
205 # We assume that at least first 999 commit messages contain svn evidence. 187 url, revision = FetchGitSVNURLAndRevision(directory)
206 revision = LookupGitSVNRevision(directory, 999) 188 if url and revision:
207 if not revision: 189 root = FetchGitSVNRoot(directory)
208 return None 190 if IsGitSVNDirty(directory):
209 if IsGitSVNDirty(directory): 191 revision = revision + '-dirty'
210 revision = revision + '-dirty' 192 return VersionInfo(url, root, revision)
211 url = FetchGitSVNURL(directory) 193 return None
212 root = FetchGitSVNRoot(directory)
213 return VersionInfo(url, root, revision)
214 194
215 195
216 def FetchVersionInfo(default_lastchange, directory=None): 196 def FetchVersionInfo(default_lastchange, directory=None):
217 """ 197 """
218 Returns the last change (in the form of a branch, revision tuple), 198 Returns the last change (in the form of a branch, revision tuple),
219 from some appropriate revision control system. 199 from some appropriate revision control system.
220 """ 200 """
221 version_info = (FetchSVNRevision(directory) or 201 version_info = (FetchSVNRevision(directory) or
222 FetchGitSVNRevision(directory) or FetchGitRevision(directory)) 202 FetchGitSVNRevision(directory) or FetchGitRevision(directory))
223 if not version_info: 203 if not version_info:
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 if out_file: 257 if out_file:
278 WriteIfChanged(out_file, contents) 258 WriteIfChanged(out_file, contents)
279 else: 259 else:
280 sys.stdout.write(contents) 260 sys.stdout.write(contents)
281 261
282 return 0 262 return 0
283 263
284 264
285 if __name__ == '__main__': 265 if __name__ == '__main__':
286 sys.exit(main()) 266 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | chrome/app/nibs/About.xib » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698