OLD | NEW |
---|---|
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 | 5 |
6 """Update third_party/WebKit using git. | 6 """Update third_party/WebKit using git. |
7 | 7 |
8 Under the assumption third_party/WebKit is a clone of git.webkit.org, | 8 Under the assumption third_party/WebKit is a clone of git.webkit.org, |
9 we can use git commands to make it match the version requested by DEPS. | 9 we can use git commands to make it match the version requested by DEPS. |
10 | 10 |
11 To use this: | 11 See http://code.google.com/p/chromium/wiki/UsingWebKitGit for details on |
12 1) rm -rf third_party/WebKit | 12 how to use this. |
13 2) git clone git://git.webkit.org/WebKit.git third_party/WebKit | |
14 3) edit your .gclient "custom_deps" section to exclude components underneath | |
15 third_party/WebKit: | |
16 "src/third_party/WebKit/LayoutTests": None, | |
17 "src/third_party/WebKit/JavaScriptCore": None, | |
18 "src/third_party/WebKit/WebCore": None, | |
19 4) run ./tools/sync-webkit-git.py now, and again whenever you run gclient | |
20 sync. | |
21 | |
22 FAQ: | |
23 Q. Why not add this functionality to gclient itself? | |
24 A. DEPS actually specifies to only pull some subdirectories of | |
25 third_party/WebKit. So even if gclient supported git, we'd still need | |
26 to special-case this. | |
27 """ | 13 """ |
28 | 14 |
29 import os | 15 import os |
30 import subprocess | 16 import subprocess |
31 import sys | 17 import sys |
32 | 18 |
33 # The name of the magic branch that lets us know that DEPS is managing | 19 # The name of the magic branch that lets us know that DEPS is managing |
34 # the update cycle. | 20 # the update cycle. |
35 MAGIC_GCLIENT_BRANCH = 'refs/heads/gclient' | 21 MAGIC_GCLIENT_BRANCH = 'refs/heads/gclient' |
36 | 22 |
37 def RunGit(command): | 23 def RunGit(command): |
38 """Run a git subcommand, returning its output.""" | 24 """Run a git subcommand, returning its output.""" |
39 proc = subprocess.Popen(['git'] + command, stdout=subprocess.PIPE) | 25 proc = subprocess.Popen(['git'] + command, stdout=subprocess.PIPE) |
40 return proc.communicate()[0].strip() | 26 return proc.communicate()[0].strip() |
41 | 27 |
42 def GetWebKitRev(): | 28 def GetWebKitRev(): |
43 """Extract the 'webkit_revision' variable out of DEPS.""" | 29 """Extract the 'webkit_revision' variable out of DEPS.""" |
44 locals = {'Var': lambda _: ''} | 30 locals = {'Var': lambda _: ''} |
45 execfile('DEPS', {}, locals) | 31 execfile('DEPS', {}, locals) |
46 return locals['vars']['webkit_revision'] | 32 return locals['vars']['webkit_revision'] |
47 | 33 |
48 def FindSVNRev(rev): | 34 def FindSVNRev(rev): |
49 """Map an SVN revision to a git hash. | 35 """Map an SVN revision to a git hash. |
50 Like 'git svn find-rev' but without the git-svn bits.""" | 36 Like 'git svn find-rev' but without the git-svn bits.""" |
51 return RunGit(['rev-list', '-n', '1', '--grep=^git-svn-id: .*@%s' % rev, | 37 # We find r123 by grepping for a line with "git-svn-id: blahblahblah@123". |
38 return RunGit(['rev-list', '-n', '1', '--grep=^git-svn-id: .*@%s$' % rev, | |
52 'origin']) | 39 'origin']) |
53 | 40 |
54 def UpdateGClientBranch(webkit_rev): | 41 def UpdateGClientBranch(webkit_rev): |
55 """Update the magic gclient branch to point at |webkit_rev|. | 42 """Update the magic gclient branch to point at |webkit_rev|. |
56 | 43 |
57 Returns: true if the branch didn't need changes.""" | 44 Returns: true if the branch didn't need changes.""" |
58 target = FindSVNRev(webkit_rev) | 45 target = FindSVNRev(webkit_rev) |
59 if not target: | 46 if not target: |
60 print "r%s not available; fetching." % webkit_rev | 47 print "r%s not available; fetching." % webkit_rev |
61 subprocess.check_call(['git', 'fetch']) | 48 subprocess.check_call(['git', 'fetch']) |
62 target = FindSVNRev(webkit_rev) | 49 target = FindSVNRev(webkit_rev) |
63 if not target: | 50 if not target: |
64 print "ERROR: Couldn't map r%s to a git revision." % webkit_rev | 51 print "ERROR: Couldn't map r%s to a git revision." % webkit_rev |
65 sys.exit(1) | 52 sys.exit(1) |
66 | 53 |
67 current = RunGit(['show-ref', '--hash', MAGIC_GCLIENT_BRANCH]) | 54 current = RunGit(['show-ref', '--hash', MAGIC_GCLIENT_BRANCH]) |
68 if current == target: | 55 if current == target: |
69 return False # No change necessary. | 56 return False # No change necessary. |
70 | 57 |
71 subprocess.check_call(['git', 'update-ref', '-m', 'gclient sync', | 58 subprocess.check_call(['git', 'update-ref', '-m', 'gclient sync', |
72 MAGIC_GCLIENT_BRANCH, target]) | 59 MAGIC_GCLIENT_BRANCH, target]) |
73 return True | 60 return True |
74 | 61 |
75 def UpdateCurrentCheckoutIfAppropriate(): | 62 def UpdateCurrentCheckoutIfAppropriate(): |
76 """Reset the current gclient branch if that's what we have checked out.""" | 63 """Reset the current gclient branch if that's what we have checked out.""" |
77 branch = RunGit(['symbolic-ref', '-q', 'HEAD']) | 64 branch = RunGit(['symbolic-ref', '-q', 'HEAD']) |
78 if branch != MAGIC_GCLIENT_BRANCH: | 65 if branch != MAGIC_GCLIENT_BRANCH: |
79 print "Directory has some other branch ('%s') checked out." % branch | 66 print "third_party/WebKit has some other branch ('%s') checked out." % branc h |
tony
2009/09/15 22:42:50
Nit: 80 cols.
| |
80 print "Run 'git checkout gclient' to put this under control of gclient." | 67 print "Run 'git checkout gclient' to put this under control of gclient." |
81 return | 68 return |
82 | 69 |
83 if subprocess.call(['git', 'diff-index', '--exit-code', '--shortstat', | 70 if subprocess.call(['git', 'diff-index', '--exit-code', '--shortstat', |
84 'HEAD']): | 71 'HEAD']): |
85 print "Resetting tree state to new revision." | 72 print "Resetting tree state to new revision." |
86 subprocess.check_call(['git', 'reset', '--hard']) | 73 subprocess.check_call(['git', 'reset', '--hard']) |
87 | 74 |
88 def main(): | 75 def main(): |
76 if not os.path.exists('third_party/WebKit/.git'): | |
77 print "ERROR: third_party/WebKit appears to not be under git control." | |
78 print "See http://code.google.com/p/chromium/wiki/UsingWebKitGit for" | |
79 print "setup instructions." | |
80 return | |
81 | |
89 webkit_rev = GetWebKitRev() | 82 webkit_rev = GetWebKitRev() |
90 print 'Desired revision: r%s.' % webkit_rev | 83 print 'Desired revision: r%s.' % webkit_rev |
91 os.chdir('third_party/WebKit') | 84 os.chdir('third_party/WebKit') |
92 changed = UpdateGClientBranch(webkit_rev) | 85 changed = UpdateGClientBranch(webkit_rev) |
93 if changed: | 86 if changed: |
94 UpdateCurrentCheckoutIfAppropriate() | 87 UpdateCurrentCheckoutIfAppropriate() |
88 else: | |
89 print "Already on correct revision." | |
95 | 90 |
96 if __name__ == '__main__': | 91 if __name__ == '__main__': |
97 main() | 92 main() |
OLD | NEW |