libv8 6.2.414.42.1 → 6.3.292.48.0beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/libv8/version.rb +1 -1
  4. data/vendor/depot_tools/PRESUBMIT.py +38 -0
  5. data/vendor/depot_tools/bootstrap/win/manifest.txt +3 -1
  6. data/vendor/depot_tools/bootstrap/win/manifest_bleeding_edge.txt +2 -0
  7. data/vendor/depot_tools/checkout.py +1 -1
  8. data/vendor/depot_tools/cipd_manifest.txt +1 -1
  9. data/vendor/depot_tools/gclient_scm.py +23 -14
  10. data/vendor/depot_tools/gerrit_util.py +15 -10
  11. data/vendor/depot_tools/git_cl.py +23 -11
  12. data/vendor/depot_tools/git_drover.py +2 -1
  13. data/vendor/depot_tools/git_upstream_diff.py +2 -1
  14. data/vendor/depot_tools/gsutil.py +1 -1
  15. data/vendor/depot_tools/infra/config/recipes.cfg +1 -1
  16. data/vendor/depot_tools/presubmit_canned_checks.py +8 -1
  17. data/vendor/depot_tools/presubmit_support.py +2 -1
  18. data/vendor/depot_tools/recipes/README.recipes.md +56 -43
  19. data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +1 -0
  20. data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +1 -4
  21. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +105 -0
  22. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +5 -0
  23. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/__init__.py +6 -0
  24. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +25 -0
  25. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +12 -0
  26. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +75 -0
  27. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +12 -0
  28. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.py +10 -1
  29. data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +13 -11
  30. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch.json +2 -0
  31. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch_luci.json +2 -0
  32. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_rietveld_patch.json +2 -0
  33. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_rietveld_patch_new.json +2 -0
  34. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +2 -0
  35. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +2 -0
  36. data/vendor/depot_tools/recipes/trigger_recipe_roller.txt +1 -0
  37. data/vendor/depot_tools/roll_dep.py +116 -78
  38. data/vendor/depot_tools/scm.py +6 -4
  39. data/vendor/depot_tools/split_cl.py +45 -18
  40. metadata +7 -5
  41. data/patches/0005-avoid-constructor-inheritance-due-to-compilation-iss.patch +0 -81
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ae3bfb049df0660c14d04089162524fcf968fbf7
4
- data.tar.gz: 79015a42851a71f3577cedebb35d5b683194a35f
3
+ metadata.gz: 61c3bf8a873f670cef6d2846cb09c8e6e8837160
4
+ data.tar.gz: 3ab377edad709714dfc61f7be3f37f3801ce1b3d
5
5
  SHA512:
6
- metadata.gz: cbcd9277974fb1c7a6d6e7840dce1ffbb6b9ef31a23f2a68d880aa32b5be26cf4e7d2ee1ce46ce14a0f3744b8674440bb40ec6a37cb36f72bac4a527555c8df0
7
- data.tar.gz: 1e8c56ef29095f11b6c414da21f7336a13b033b7e0b937087631b9292a62f27f313d2e898b4bd2d38e6f3e45c9e70184c6bfa77c959421ccda08320c363a8f9f
6
+ metadata.gz: 8645f9ffc99b2b8226880f664f088e76f49038138ed73984d546f88fb2a4bb07f659eb7540aa2694442cc6ea7327fbf39283c86d4c459ef44dd87bbecdc86fb6
7
+ data.tar.gz: 3fdcabaa1d2e7bebd1439a79a79fd0e52ffeebda196fd5b595895314e3128e0ae43a49b1fa17602ffdc1274db1df0eac5a4300f15a777aeaaafc122da70fdc6c
@@ -1,3 +1,7 @@
1
+ ### Unreleased
2
+
3
+ * Update upstream v8 version to 6.3.292.48
4
+
1
5
  ### v6.2.414.42.0, v6.2.414.42.1 - 2017-10-25
2
6
 
3
7
  * Update upstream v8 version to 6.2.414.42
@@ -1,3 +1,3 @@
1
1
  module Libv8
2
- VERSION = "6.2.414.42.1"
2
+ VERSION = "6.3.292.48.0beta1"
3
3
  end
@@ -12,6 +12,16 @@ import fnmatch
12
12
  import os
13
13
 
14
14
 
15
+ ENSURE_FILE_TEMPLATE = r'''
16
+ $VerifiedPlatform linux-386 linux-amd64 linux-arm64 linux-armv6l linux-mips64
17
+ $VerifiedPlatform linux-ppc64 linux-ppc64le linux-s390x
18
+ $VerifiedPlatform mac-amd64
19
+ $VerifiedPlatform windows-386 windows-amd64
20
+
21
+ %s %s
22
+ '''
23
+
24
+
15
25
  def DepotToolsPylint(input_api, output_api):
16
26
  """Gather all the pylint logic into one place to make it self-contained."""
17
27
  white_list = [
@@ -59,6 +69,34 @@ def CommonChecks(input_api, output_api, tests_to_black_list):
59
69
  tests.extend(unit_tests)
60
70
  else:
61
71
  print('Warning: not running unit tests on Windows')
72
+
73
+ # Validate CIPD manifests.
74
+ root = input_api.os_path.normpath(
75
+ input_api.os_path.abspath(input_api.PresubmitLocalPath()))
76
+ rel_file = lambda rel: input_api.os_path.join(root, rel)
77
+ cipd_manifests = set(rel_file(input_api.os_path.join(*x)) for x in (
78
+ ('cipd_manifest.txt',),
79
+ ('bootstrap', 'win', 'manifest.txt'),
80
+ ('bootstrap', 'win', 'manifest_bleeding_edge.txt'),
81
+
82
+ # Also generate a file for the cipd client itself.
83
+ ('cipd_client_version',),
84
+ ))
85
+ affected_manifests = input_api.AffectedFiles(
86
+ include_deletes=False,
87
+ file_filter=lambda x:
88
+ input_api.os_path.normpath(x.AbsoluteLocalPath()) in cipd_manifests)
89
+ for path in affected_manifests:
90
+ path = path.AbsoluteLocalPath()
91
+ if path.endswith('.txt'):
92
+ tests.append(input_api.canned_checks.CheckCIPDManifest(
93
+ input_api, output_api, path=path))
94
+ else:
95
+ pkg = 'infra/tools/cipd/${platform}'
96
+ ver = input_api.ReadFile(path)
97
+ tests.append(input_api.canned_checks.CheckCIPDManifest(
98
+ input_api, output_api, content=ENSURE_FILE_TEMPLATE % (pkg, ver)))
99
+
62
100
  results.extend(input_api.RunTests(tests))
63
101
  return results
64
102
 
@@ -11,8 +11,10 @@
11
11
  # string "cpython" and ends with the CIPD tag "version:VERSION". It uses this
12
12
  # to extract VERSION.
13
13
 
14
+ $VerifiedPlatform windows-386 windows-amd64
15
+
14
16
  @Subdir python
15
17
  infra/python/cpython/windows-386 version:2.7.6
16
18
 
17
19
  @Subdir git
18
- infra/git/${platform} version:2.15.0.chromium12
20
+ infra/git/windows-${arch} version:2.15.1.2.chromium12
@@ -11,6 +11,8 @@
11
11
  # string "cpython" and ends with the CIPD tag "version:VERSION". It uses this
12
12
  # to extract VERSION.
13
13
 
14
+ $VerifiedPlatform windows-386 windows-amd64
15
+
14
16
  @Subdir python
15
17
  infra/python/cpython/${platform} version:2.7.13.chromium7
16
18
 
@@ -301,7 +301,7 @@ class GitCheckout(CheckoutBase):
301
301
  if errors:
302
302
  raise PatchApplicationFailed(errors, verbose)
303
303
  found_files = self._check_output_git(
304
- ['diff', '--ignore-submodules',
304
+ ['-c', 'core.quotePath=false', 'diff', '--ignore-submodules',
305
305
  '--name-only', '--staged']).splitlines(False)
306
306
  if sorted(patches.filenames) != sorted(found_files):
307
307
  extra_files = sorted(set(found_files) - set(patches.filenames))
@@ -11,7 +11,7 @@ $VerifiedPlatform windows-386 windows-amd64
11
11
  infra/tools/luci/vpython/${platform} git_revision:a3d636052088db3daa48413b3e209eed4f5cb4ad
12
12
 
13
13
  # LUCI editor
14
- infra/tools/luci/led/${platform} git_revision:9010ba713ba6fc9982c412161150a5cd70d5b623
14
+ infra/tools/luci/led/${platform} git_revision:54b6b3102fbb15ca3e3bd762ff3df7b08057d653
15
15
 
16
16
  # Mac toolchain installer
17
17
  infra/tools/mac_toolchain/${os=mac}-${arch} git_revision:2b69be6203f56a970202d9b5984557c0453b4eb0
@@ -270,12 +270,19 @@ class GitWrapper(SCMWrapper):
270
270
  # time-stamp of the currently checked out revision.
271
271
  return self._Capture(['log', '-n', '1', '--format=%ai'])
272
272
 
273
+ def _GetDiffFilenames(self, base):
274
+ """Returns the names of files modified since base."""
275
+ return self._Capture(
276
+ # Filter to remove base if it is None.
277
+ filter(bool, ['-c', 'core.quotePath=false', 'diff', '--name-only', base])
278
+ ).split()
279
+
273
280
  def diff(self, options, _args, _file_list):
274
281
  try:
275
282
  merge_base = [self._Capture(['merge-base', 'HEAD', self.remote])]
276
283
  except subprocess2.CalledProcessError:
277
284
  merge_base = []
278
- self._Run(['diff'] + merge_base, options)
285
+ self._Run(['-c', 'core.quotePath=false', 'diff'] + merge_base, options)
279
286
 
280
287
  def pack(self, _options, _args, _file_list):
281
288
  """Generates a patch file which can be applied to the root of the
@@ -305,7 +312,8 @@ class GitWrapper(SCMWrapper):
305
312
  # actually in a broken state here. The index will have both 'a' and 'A',
306
313
  # but only one of them will exist on the disk. To progress, we delete
307
314
  # everything that status thinks is modified.
308
- output = self._Capture(['status', '--porcelain'], strip=False)
315
+ output = self._Capture([
316
+ '-c', 'core.quotePath=false', 'status', '--porcelain'], strip=False)
309
317
  for line in output.splitlines():
310
318
  # --porcelain (v1) looks like:
311
319
  # XY filename
@@ -324,7 +332,8 @@ class GitWrapper(SCMWrapper):
324
332
  self._Fetch(options, prune=True, quiet=options.verbose)
325
333
  self._Scrub(revision, options)
326
334
  if file_list is not None:
327
- files = self._Capture(['ls-files']).splitlines()
335
+ files = self._Capture(
336
+ ['-c', 'core.quotePath=false', 'ls-files']).splitlines()
328
337
  file_list.extend([os.path.join(self.checkout_path, f) for f in files])
329
338
 
330
339
  def _DisableHooks(self):
@@ -358,7 +367,6 @@ class GitWrapper(SCMWrapper):
358
367
  self.Print('FAILED to break lock: %s: %s' % (to_break, ex))
359
368
  raise
360
369
 
361
-
362
370
  def update(self, options, args, file_list):
363
371
  """Runs git to update or transparently checkout the working copy.
364
372
 
@@ -440,7 +448,8 @@ class GitWrapper(SCMWrapper):
440
448
  self._DeleteOrMove(options.force)
441
449
  self._Clone(revision, url, options)
442
450
  if file_list is not None:
443
- files = self._Capture(['ls-files']).splitlines()
451
+ files = self._Capture(
452
+ ['-c', 'core.quotePath=false', 'ls-files']).splitlines()
444
453
  file_list.extend([os.path.join(self.checkout_path, f) for f in files])
445
454
  if not verbose:
446
455
  # Make the output a little prettier. It's nice to have some whitespace
@@ -625,8 +634,7 @@ class GitWrapper(SCMWrapper):
625
634
  raise gclient_utils.Error(switch_error)
626
635
  else:
627
636
  # case 3 - the default case
628
- rebase_files = self._Capture(
629
- ['diff', upstream_branch, '--name-only']).split()
637
+ rebase_files = self._GetDiffFilenames(upstream_branch)
630
638
  if verbose:
631
639
  self.Print('Trying fast-forward merge to branch : %s' % upstream_branch)
632
640
  try:
@@ -719,7 +727,8 @@ class GitWrapper(SCMWrapper):
719
727
  # merge-base by default), so doesn't include untracked files. So we use
720
728
  # 'git ls-files --directory --others --exclude-standard' here directly.
721
729
  paths = scm.GIT.Capture(
722
- ['ls-files', '--directory', '--others', '--exclude-standard'],
730
+ ['-c', 'core.quotePath=false', 'ls-files',
731
+ '--directory', '--others', '--exclude-standard'],
723
732
  self.checkout_path)
724
733
  for path in (p for p in paths.splitlines() if p.endswith('/')):
725
734
  full_path = os.path.join(self.checkout_path, path)
@@ -729,7 +738,6 @@ class GitWrapper(SCMWrapper):
729
738
 
730
739
  return self._Capture(['rev-parse', '--verify', 'HEAD'])
731
740
 
732
-
733
741
  def revert(self, options, _args, file_list):
734
742
  """Reverts local modifications.
735
743
 
@@ -763,7 +771,7 @@ class GitWrapper(SCMWrapper):
763
771
  return self.update(options, [], file_list)
764
772
 
765
773
  if file_list is not None:
766
- files = self._Capture(['diff', deps_revision, '--name-only']).split()
774
+ files = self._GetDiffFilenames(deps_revision)
767
775
 
768
776
  self._Scrub(deps_revision, options)
769
777
  self._Run(['clean', '-f', '-d'], options)
@@ -788,10 +796,11 @@ class GitWrapper(SCMWrapper):
788
796
  merge_base = [self._Capture(['merge-base', 'HEAD', self.remote])]
789
797
  except subprocess2.CalledProcessError:
790
798
  merge_base = []
791
- self._Run(['diff', '--name-status'] + merge_base, options,
792
- stdout=self.out_fh, always=options.verbose)
799
+ self._Run(
800
+ ['-c', 'core.quotePath=false', 'diff', '--name-status'] + merge_base,
801
+ options, stdout=self.out_fh, always=options.verbose)
793
802
  if file_list is not None:
794
- files = self._Capture(['diff', '--name-only'] + merge_base).split()
803
+ files = self._GetDiffFilenames(merge_base[0] if merge_base else None)
795
804
  file_list.extend([os.path.join(self.checkout_path, f) for f in files])
796
805
 
797
806
  def GetUsableRev(self, rev, options):
@@ -956,7 +965,7 @@ class GitWrapper(SCMWrapper):
956
965
  branch=None, printed_path=False, merge=False):
957
966
  """Attempt to rebase onto either upstream or, if specified, newbase."""
958
967
  if files is not None:
959
- files.extend(self._Capture(['diff', upstream, '--name-only']).split())
968
+ files.extend(self._GetDiffFilenames(upstream))
960
969
  revision = upstream
961
970
  if newbase:
962
971
  revision = newbase
@@ -30,7 +30,9 @@ import gclient_utils
30
30
  from third_party import httplib2
31
31
 
32
32
  LOGGER = logging.getLogger()
33
- TRY_LIMIT = 5
33
+ # With a starting sleep time of 1 second, 2^n exponential backoff, and six
34
+ # total tries, the sleep time between the first and last tries will be 31s.
35
+ TRY_LIMIT = 6
34
36
 
35
37
 
36
38
  # Controls the transport protocol used to communicate with gerrit.
@@ -258,13 +260,6 @@ class GceAuthenticator(Authenticator):
258
260
  def _get(url, **kwargs):
259
261
  next_delay_sec = 1
260
262
  for i in xrange(TRY_LIMIT):
261
- if i > 0:
262
- # Retry server error status codes.
263
- LOGGER.info('Encountered server error; retrying after %d second(s).',
264
- next_delay_sec)
265
- time.sleep(next_delay_sec)
266
- next_delay_sec *= 2
267
-
268
263
  p = urlparse.urlparse(url)
269
264
  c = GetConnectionObject(protocol=p.scheme)
270
265
  resp, contents = c.request(url, 'GET', **kwargs)
@@ -272,6 +267,15 @@ class GceAuthenticator(Authenticator):
272
267
  if resp.status < httplib.INTERNAL_SERVER_ERROR:
273
268
  return (resp, contents)
274
269
 
270
+ # Retry server error status codes.
271
+ LOGGER.warn('Encountered server error')
272
+ if TRY_LIMIT - i > 1:
273
+ LOGGER.info('Will retry in %d seconds (%d more times)...',
274
+ next_delay_sec, TRY_LIMIT - i - 1)
275
+ time.sleep(next_delay_sec)
276
+ next_delay_sec *= 2
277
+
278
+
275
279
  @classmethod
276
280
  def _get_token_dict(cls):
277
281
  if cls._token_cache:
@@ -341,7 +345,7 @@ def ReadHttpResponse(conn, accept_statuses=frozenset([200])):
341
345
  Common additions include 204, 400, and 404.
342
346
  Returns: A string buffer containing the connection's reply.
343
347
  """
344
- sleep_time = 0.5
348
+ sleep_time = 1
345
349
  for idx in range(TRY_LIMIT):
346
350
  response, contents = conn.request(**conn.req_params)
347
351
 
@@ -377,7 +381,8 @@ def ReadHttpResponse(conn, accept_statuses=frozenset([200])):
377
381
  conn.req_params['uri'],
378
382
  http_version, http_version, response.status, response.reason)
379
383
  if TRY_LIMIT - idx > 1:
380
- LOGGER.warn('... will retry %d more times.', TRY_LIMIT - idx - 1)
384
+ LOGGER.info('Will retry in %d seconds (%d more times)...',
385
+ sleep_time, TRY_LIMIT - idx - 1)
381
386
  time.sleep(sleep_time)
382
387
  sleep_time = sleep_time * 2
383
388
  if response.status not in accept_statuses:
@@ -716,14 +716,18 @@ def write_try_results_json(output_file, builds):
716
716
  """
717
717
 
718
718
  def convert_build_dict(build):
719
+ """Extracts some of the information from one build dict."""
720
+ parameters = json.loads(build.get('parameters_json', '{}')) or {}
719
721
  return {
720
722
  'buildbucket_id': build.get('id'),
721
- 'status': build.get('status'),
722
- 'result': build.get('result'),
723
723
  'bucket': build.get('bucket'),
724
- 'builder_name': json.loads(
725
- build.get('parameters_json', '{}')).get('builder_name'),
724
+ 'builder_name': parameters.get('builder_name'),
725
+ 'created_ts': build.get('created_ts'),
726
+ 'experimental': build.get('experimental'),
726
727
  'failure_reason': build.get('failure_reason'),
728
+ 'result': build.get('result'),
729
+ 'status': build.get('status'),
730
+ 'tags': build.get('tags'),
727
731
  'url': build.get('url'),
728
732
  }
729
733
 
@@ -2574,7 +2578,9 @@ class _GerritChangelistImpl(_ChangelistCodereviewBase):
2574
2578
 
2575
2579
  def GetMostRecentPatchset(self):
2576
2580
  data = self._GetChangeDetail(['CURRENT_REVISION'])
2577
- return data['revisions'][data['current_revision']]['_number']
2581
+ patchset = data['revisions'][data['current_revision']]['_number']
2582
+ self.SetPatchset(patchset)
2583
+ return patchset
2578
2584
 
2579
2585
  def FetchDescription(self, force=False):
2580
2586
  data = self._GetChangeDetail(['CURRENT_REVISION', 'CURRENT_COMMIT'],
@@ -3877,8 +3883,8 @@ class _GitCookiesChecker(object):
3877
3883
 
3878
3884
  @staticmethod
3879
3885
  def _parse_identity(identity):
3880
- """Parses identity "git-<ldap>.example.com" into <ldap> and domain."""
3881
- # Special case: users whose ldaps contain ".", which are generally not
3886
+ """Parses identity "git-<username>.domain" into <username> and domain."""
3887
+ # Special case: usernames that contain ".", which are generally not
3882
3888
  # distinguishable from sub-domains. But we do know typical domains:
3883
3889
  if identity.endswith('.chromium.org'):
3884
3890
  domain = 'chromium.org'
@@ -4427,7 +4433,7 @@ def CMDstatus(parser, args):
4427
4433
  if issueid:
4428
4434
  print(issueid)
4429
4435
  elif options.field == 'patch':
4430
- patchset = cl.GetPatchset()
4436
+ patchset = cl.GetMostRecentPatchset()
4431
4437
  if patchset:
4432
4438
  print(patchset)
4433
4439
  elif options.field == 'status':
@@ -5050,6 +5056,10 @@ def CMDsplit(parser, args):
5050
5056
  "$directory will be replaced by each CL's directory.")
5051
5057
  parser.add_option("-c", "--comment", dest="comment_file",
5052
5058
  help="A text file containing a CL comment.")
5059
+ parser.add_option("-n", "--dry-run", dest="dry_run", action='store_true',
5060
+ default=False,
5061
+ help="List the files and reviewers for each CL that would "
5062
+ "be created, but don't create branches or CLs.")
5053
5063
  options, _ = parser.parse_args(args)
5054
5064
 
5055
5065
  if not options.description_file:
@@ -5059,7 +5069,7 @@ def CMDsplit(parser, args):
5059
5069
  return CMDupload(OptionParser(), args)
5060
5070
 
5061
5071
  return split_cl.SplitCl(options.description_file, options.comment_file,
5062
- Changelist, WrappedCMDupload)
5072
+ Changelist, WrappedCMDupload, options.dry_run)
5063
5073
 
5064
5074
 
5065
5075
  @subcommand.usage('DEPRECATED')
@@ -5357,7 +5367,8 @@ def PushToGitWithAutoRebase(remote, branch, original_description,
5357
5367
  print('Your patch doesn\'t apply cleanly to \'%s\' HEAD @ %s, '
5358
5368
  'the following files have merge conflicts:' %
5359
5369
  (branch, parent_hash))
5360
- print(RunGit(['diff', '--name-status', '--diff-filter=U']).strip())
5370
+ print(RunGit(['-c', 'core.quotePath=false', 'diff',
5371
+ '--name-status', '--diff-filter=U']).strip())
5361
5372
  print('Please rebase your patch and try again.')
5362
5373
  RunGitWithCode(['cherry-pick', '--abort'])
5363
5374
  break
@@ -5878,7 +5889,8 @@ def CMDowners(parser, args):
5878
5889
  def BuildGitDiffCmd(diff_type, upstream_commit, args):
5879
5890
  """Generates a diff command."""
5880
5891
  # Generate diff for the current branch's changes.
5881
- diff_cmd = ['diff', '--no-ext-diff', '--no-prefix', diff_type,
5892
+ diff_cmd = ['-c', 'core.quotePath=false', 'diff',
5893
+ '--no-ext-diff', '--no-prefix', diff_type,
5882
5894
  upstream_commit, '--']
5883
5895
 
5884
5896
  if args:
@@ -262,7 +262,8 @@ class _Drover(object):
262
262
  # Files that have been deleted between branch and cherry-pick will not have
263
263
  # their skip-worktree bit set so set it manually for those files to avoid
264
264
  # git status incorrectly listing them as unstaged deletes.
265
- repo_status = self._run_git_command(['status', '--porcelain']).splitlines()
265
+ repo_status = self._run_git_command(
266
+ ['-c', 'core.quotePath=false', 'status', '--porcelain']).splitlines()
266
267
  extra_files = [f[3:] for f in repo_status if f[:2] == ' D']
267
268
  if extra_files:
268
269
  self._run_git_command_with_stdin(
@@ -34,7 +34,8 @@ def main(args):
34
34
  print 'fatal: No upstream configured for branch \'%s\'' % opts.branch
35
35
  return 1
36
36
 
37
- cmd = [git.GIT_EXE, 'diff', '--patience', '-C', '-C']
37
+ cmd = [git.GIT_EXE, '-c', 'core.quotePath=false',
38
+ 'diff', '--patience', '-C', '-C']
38
39
  if opts.wordwise:
39
40
  cmd += ['--word-diff=color', r'--word-diff-regex=(\w+|[^[:space:]])']
40
41
  cmd += [git.get_or_create_merge_base(opts.branch, par)]
@@ -156,7 +156,7 @@ def parse_args():
156
156
  bin_dir = os.environ.get('DEPOT_TOOLS_GSUTIL_BIN_DIR', DEFAULT_BIN_DIR)
157
157
 
158
158
  parser = argparse.ArgumentParser()
159
- parser.add_argument('--force-version', default='4.13')
159
+ parser.add_argument('--force-version', default='4.28')
160
160
  parser.add_argument('--clean', action='store_true',
161
161
  help='Clear any existing gsutil package, forcing a new download.')
162
162
  parser.add_argument('--fallback', default=DEFAULT_FALLBACK_GSUTIL)
@@ -15,7 +15,7 @@
15
15
  "deps": {
16
16
  "recipe_engine": {
17
17
  "branch": "master",
18
- "revision": "0f093b369402a86363de15a3fae0c98eab4c8e00",
18
+ "revision": "32e6ba22dd1c75f8b3276bb86112d10542d5e32b",
19
19
  "url": "https://chromium.googlesource.com/infra/luci/recipes-py.git"
20
20
  }
21
21
  },
@@ -1165,15 +1165,22 @@ def CheckCIPDManifest(input_api, output_api, path=None, content=None):
1165
1165
  if path:
1166
1166
  assert content is None, 'Cannot provide both "path" and "content".'
1167
1167
  cmd += ['-ensure-file', path]
1168
+ name = 'Check CIPD manifest %r' % path
1168
1169
  elif content:
1169
1170
  assert path is None, 'Cannot provide both "path" and "content".'
1170
1171
  cmd += ['-ensure-file=-']
1171
1172
  kwargs['stdin'] = content
1173
+ # quick and dirty parser to extract checked packages.
1174
+ packages = [
1175
+ l.split()[0] for l in (ll.strip() for ll in content.splitlines())
1176
+ if ' ' in l and not l.startswith('$')
1177
+ ]
1178
+ name = 'Check CIPD packages from string: %r' % (packages,)
1172
1179
  else:
1173
1180
  raise Exception('Exactly one of "path" or "content" must be provided.')
1174
1181
 
1175
1182
  return input_api.Command(
1176
- 'Check CIPD manifest',
1183
+ name,
1177
1184
  cmd,
1178
1185
  kwargs,
1179
1186
  output_api.PresubmitError)