OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 ''' | 2 ''' |
3 Copyright 2012 Google Inc. | 3 Copyright 2012 Google Inc. |
4 | 4 |
5 Use of this source code is governed by a BSD-style license that can be | 5 Use of this source code is governed by a BSD-style license that can be |
6 found in the LICENSE file. | 6 found in the LICENSE file. |
7 ''' | 7 ''' |
8 | 8 |
9 ''' | 9 ''' |
10 Generates a visual diff of all pending changes in the local SVN (or git!) | 10 Generates a visual diff of all pending changes in the local SVN (or git!) |
11 checkout. | 11 checkout. |
12 | 12 |
13 Launch with --help to see more information. | 13 Launch with --help to see more information. |
14 | 14 |
15 TODO(epoger): Now that this tool supports either git or svn, rename it. | 15 TODO(epoger): Now that this tool supports either git or svn, rename it. |
16 TODO(epoger): Fix indentation in this file (2-space indents, not 4-space). | 16 TODO(epoger): Fix indentation in this file (2-space indents, not 4-space). |
17 ''' | 17 ''' |
18 | 18 |
19 # common Python modules | 19 # common Python modules |
20 import optparse | 20 import optparse |
21 import os | 21 import os |
| 22 import posixpath |
22 import re | 23 import re |
23 import shutil | 24 import shutil |
24 import subprocess | 25 import subprocess |
25 import sys | 26 import sys |
26 import tempfile | 27 import tempfile |
27 import urllib2 | 28 import urllib2 |
28 | 29 |
29 # Imports from within Skia | 30 # Imports from within Skia |
30 # | 31 # |
31 # We need to add the 'gm' directory, so that we can import gm_json.py within | 32 # We need to add the 'gm' directory, so that we can import gm_json.py within |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 | 81 |
81 @param user_set_path if None, the user did not specify a path, so look in | 82 @param user_set_path if None, the user did not specify a path, so look in |
82 some likely places; otherwise, only check at this path | 83 some likely places; otherwise, only check at this path |
83 """ | 84 """ |
84 if user_set_path is not None: | 85 if user_set_path is not None: |
85 if os.path.isfile(user_set_path): | 86 if os.path.isfile(user_set_path): |
86 return user_set_path | 87 return user_set_path |
87 raise Exception('unable to find skdiff at user-set path %s' % | 88 raise Exception('unable to find skdiff at user-set path %s' % |
88 user_set_path) | 89 user_set_path) |
89 trunk_path = os.path.join(os.path.dirname(__file__), os.pardir) | 90 trunk_path = os.path.join(os.path.dirname(__file__), os.pardir) |
90 possible_paths = [os.path.join(trunk_path, 'out', 'Release', 'skdiff'), | 91 |
91 os.path.join(trunk_path, 'out', 'Debug', 'skdiff')] | 92 extension = '' |
| 93 if os.name is 'nt': |
| 94 extension = '.exe' |
| 95 |
| 96 possible_paths = [os.path.join(trunk_path, 'out', 'Release', |
| 97 'skdiff' + extension), |
| 98 os.path.join(trunk_path, 'out', 'Debug', |
| 99 'skdiff' + extension)] |
92 for try_path in possible_paths: | 100 for try_path in possible_paths: |
93 if os.path.isfile(try_path): | 101 if os.path.isfile(try_path): |
94 return try_path | 102 return try_path |
95 raise Exception('cannot find skdiff in paths %s; maybe you need to ' | 103 raise Exception('cannot find skdiff in paths %s; maybe you need to ' |
96 'specify the %s option or build skdiff?' % ( | 104 'specify the %s option or build skdiff?' % ( |
97 possible_paths, OPTION_PATH_TO_SKDIFF)) | 105 possible_paths, OPTION_PATH_TO_SKDIFF)) |
98 | 106 |
99 def _DownloadUrlToFile(source_url, dest_path): | 107 def _DownloadUrlToFile(source_url, dest_path): |
100 """Download source_url, and save its contents to dest_path. | 108 """Download source_url, and save its contents to dest_path. |
101 Raises an exception if there were any problems.""" | 109 Raises an exception if there were any problems.""" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 """ | 203 """ |
196 # TODO(epoger): Replace use of "git show" command with lower-level git | 204 # TODO(epoger): Replace use of "git show" command with lower-level git |
197 # commands? senorblanco points out that "git show" is a "porcelain" | 205 # commands? senorblanco points out that "git show" is a "porcelain" |
198 # command, intended for human use, as opposed to the "plumbing" commands | 206 # command, intended for human use, as opposed to the "plumbing" commands |
199 # generally more suitable for scripting. (See | 207 # generally more suitable for scripting. (See |
200 # http://git-scm.com/book/en/Git-Internals-Plumbing-and-Porcelain ) | 208 # http://git-scm.com/book/en/Git-Internals-Plumbing-and-Porcelain ) |
201 # | 209 # |
202 # For now, though, "git show" is the most straightforward implementation | 210 # For now, though, "git show" is the most straightforward implementation |
203 # I could come up with. I tried using "git cat-file", but I had trouble | 211 # I could come up with. I tried using "git cat-file", but I had trouble |
204 # getting it to work as desired. | 212 # getting it to work as desired. |
205 args = ['git', 'show', os.path.join('HEAD:.', file_within_repo)] | 213 # Note that git expects / rather than \ as a path separator even on |
| 214 # windows. |
| 215 args = ['git', 'show', posixpath.join('HEAD:.', file_within_repo)] |
206 with open(dest_path, 'wb') as outfile: | 216 with open(dest_path, 'wb') as outfile: |
207 proc = subprocess.Popen(args, stdout=outfile) | 217 proc = subprocess.Popen(args, stdout=outfile) |
208 proc.communicate() | 218 proc.communicate() |
209 if proc.returncode is not 0: | 219 if proc.returncode is not 0: |
210 raise Exception('command "%s" failed' % args) | 220 raise Exception('command "%s" failed' % args) |
211 | 221 |
212 def SvnDiff(path_to_skdiff, dest_dir, source_dir): | 222 def SvnDiff(path_to_skdiff, dest_dir, source_dir): |
213 """Generates a visual diff of all pending changes in source_dir. | 223 """Generates a visual diff of all pending changes in source_dir. |
214 | 224 |
215 @param path_to_skdiff | 225 @param path_to_skdiff |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 help='path to already-built skdiff tool; if not set, ' | 327 help='path to already-built skdiff tool; if not set, ' |
318 'will search for it in typical directories near this ' | 328 'will search for it in typical directories near this ' |
319 'script') | 329 'script') |
320 parser.add_option(OPTION_SOURCE_DIR, | 330 parser.add_option(OPTION_SOURCE_DIR, |
321 action='store', type='string', | 331 action='store', type='string', |
322 default=os.path.join('expectations', 'gm'), | 332 default=os.path.join('expectations', 'gm'), |
323 help='root directory within which to compare all ' + | 333 help='root directory within which to compare all ' + |
324 'files; defaults to "%default"') | 334 'files; defaults to "%default"') |
325 (options, args) = parser.parse_args() | 335 (options, args) = parser.parse_args() |
326 Main(options, args) | 336 Main(options, args) |
OLD | NEW |