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

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: Add "git config --get-regexp ^svn-remote.svn.url" 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 MatchGitSVNRevision(output):
106 """ 106 """
107 Checks whether git-svn has been set up. 107 Extract the latest SVN revision and the SVN URL.
108
109 Errors are swallowed.
110
111 Returns:
112 whether git-svn has been set up.
113 """
114 # To test whether git-svn has been set up, query the config for any
115 # svn-related configuration. This command exits with an error code
116 # if there aren't any matches, so ignore its output.
117 proc = RunGitCommand(directory, ['config', '--get-regexp', '^svn'])
118 if proc:
119 return (proc.wait() == 0)
120 return False
121
122
123 def FetchGitSVNURL(directory):
124 """
125 Fetch URL of SVN repository bound to git.
126
127 Errors are swallowed.
128
129 Returns:
130 SVN URL.
131 """
132 if IsGitSVN(directory):
133 proc = RunGitCommand(directory, ['svn', 'info', '--url'])
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 108
171 Errors are swallowed. 109 Errors are swallowed.
172 """ 110 """
173 if not IsGitSVN(directory): 111 # The target line is the last "git-svn-id: ..." line.
174 return None 112 #
175 git_re = re.compile(r'^\s*git-svn-id:\s+(\S+)@(\d+)') 113 # git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85528 0039d316...
176 proc = RunGitCommand(directory, ['log', '-' + str(depth)]) 114 match = re.search(r'.*git-svn-id:\s*([^@]*)@([0-9]+)', output, re.DOTALL)
177 if proc: 115 if match:
178 for line in proc.stdout: 116 return (match.group(1), match.group(2))
179 match = git_re.match(line) 117 return (None, None)
180 if match:
181 id = match.group(2)
182 if id:
183 proc.stdout.close() # Cut pipe for fast exit.
184 return id
185 return None
186 118
187 119 def FetchGitSVNRevision(directory):
188 def IsGitSVNDirty(directory):
189 """ 120 """
190 Checks whether our git-svn tree contains clean trunk or some branch. 121 Fetch the SVN revision for a given directory through Git.
191 122
192 Errors are swallowed. 123 Errors are swallowed.
193 """ 124 """
194 # For git branches the last commit message is either 125 proc = RunGitCommand(directory, ['log', '-1',
195 # some local commit or a merge. 126 '--grep=git-svn-id', '--format=%b'])
196 return LookupGitSVNRevision(directory, 1) is None 127 if proc:
tony 2011/06/17 02:05:51 Nit: Can we just early return if not proc to avoid
128 output = proc.communicate()[0].strip()
129 if proc.returncode == 0 and output:
130 # Extract the latest SVN revision and the SVN URL.
131 url, revision = MatchGitSVNRevision(output)
197 132
133 if url and revision:
134 # Check if there are any local changes.
135 dirty = True
tony 2011/06/17 02:05:51 Nit: Can we make the dirty check a function?
136 proc = RunGitCommand(directory, ['log', '-1'])
137 if proc:
138 output = proc.communicate()[0].strip()
139 if proc.returncode == 0 and output:
140 # Check if there are any local commits.
141 dummy_url, dummy_revision = MatchGitSVNRevision(output)
198 142
199 def FetchGitSVNRevision(directory): 143 if dummy_url and dummy_revision:
200 """ 144 # Check if there are any local uncommitted changes.
201 Fetch the Git-SVN identifier for the local tree. 145 proc = RunGitCommand(directory, ['checkout'])
146 if proc:
147 output = proc.communicate()[0].strip()
148 if proc.returncode == 0 and not output:
149 dirty = False
202 150
203 Errors are swallowed. 151 if dirty:
204 """ 152 revision = revision + "-dirty"
205 # We assume that at least first 999 commit messages contain svn evidence. 153
206 revision = LookupGitSVNRevision(directory, 999) 154 # Extract the SVN root. This succeeds if git-svn is available.
207 if not revision: 155 root = 'git-svn'
208 return None 156 proc = RunGitCommand(directory,
209 if IsGitSVNDirty(directory): 157 ['config', '--get-regexp', '^svn-remote.svn.url$'])
210 revision = revision + '-dirty' 158 if proc:
211 url = FetchGitSVNURL(directory) 159 output = proc.communicate()[0].strip()
212 root = FetchGitSVNRoot(directory) 160 if proc.returncode == 0 and output:
213 return VersionInfo(url, root, revision) 161 match = re.search(r'\S+$', output)
162 if match:
163 root = match.group(0)
tony 2011/06/17 02:05:51 Nit: Can we make this root extraction a function t
164 return VersionInfo(url, root, revision)
165 return None
214 166
215 167
216 def FetchVersionInfo(default_lastchange, directory=None): 168 def FetchVersionInfo(default_lastchange, directory=None):
217 """ 169 """
218 Returns the last change (in the form of a branch, revision tuple), 170 Returns the last change (in the form of a branch, revision tuple),
219 from some appropriate revision control system. 171 from some appropriate revision control system.
220 """ 172 """
221 version_info = (FetchSVNRevision(directory) or 173 version_info = (FetchSVNRevision(directory) or
222 FetchGitSVNRevision(directory) or FetchGitRevision(directory)) 174 FetchGitSVNRevision(directory) or FetchGitRevision(directory))
223 if not version_info: 175 if not version_info:
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 if out_file: 229 if out_file:
278 WriteIfChanged(out_file, contents) 230 WriteIfChanged(out_file, contents)
279 else: 231 else:
280 sys.stdout.write(contents) 232 sys.stdout.write(contents)
281 233
282 return 0 234 return 0
283 235
284 236
285 if __name__ == '__main__': 237 if __name__ == '__main__':
286 sys.exit(main()) 238 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