15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import re
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import sys
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from http_client_local import HttpClientLocal
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GIT_HASH_PATTERN = re.compile(r'^[0-9a-fA-F]{40}$')
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def GetOSName(platform_name=sys.platform):
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if platform_name == 'cygwin' or platform_name.startswith('win'):
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 'win'
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  elif platform_name.startswith('linux'):
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 'unix'
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  elif platform_name.startswith('darwin'):
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 'mac'
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  else:
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return platform_name
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def IsGitHash(revision):
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return GIT_HASH_PATTERN.match(str(revision))
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)def GetHttpClient():
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  # TODO(stgao): return implementation for appengine when running on appengine.
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return HttpClientLocal
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef JoinLineNumbers(line_numbers, accepted_gap=1):
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Join line numbers into line blocks.
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Args:
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    line_numbers: a list of line number.
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    accepted_gap: if two line numbers are within the give gap,
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  they would be combined together into a block.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  Eg: for (1, 2, 3, 6, 7, 8, 12), if |accepted_gap| = 1, result
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  would be 1-3, 6-8, 12; if |accepted_gap| = 3, result would be
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  1-8, 12; if |accepted_gap| =4, result would be 1-12.
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if not line_numbers:
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ''
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  line_numbers = map(int, line_numbers)
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  line_numbers.sort()
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  block = []
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  start_line_number = line_numbers[0]
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  last_line_number = start_line_number
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for current_line_number in line_numbers[1:]:
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if last_line_number + accepted_gap < current_line_number:
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if start_line_number == last_line_number:
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        block.append('%d' % start_line_number)
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      else:
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        block.append('%d-%d' % (start_line_number, last_line_number))
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      start_line_number = current_line_number
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_line_number = current_line_number
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else:
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if start_line_number == last_line_number:
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      block.append('%d' % start_line_number)
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else:
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      block.append('%d-%d' % (start_line_number, last_line_number))
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ', '.join(block)
69