亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? contribulyze.py

?? subversion-1.4.5.tar.gz 配置svn的源碼
?? PY
?? 第 1 頁 / 共 2 頁
字號:
#!/usr/bin/env python# See usage() for details, or run with --help option.# #          .-------------------------------------------------.#          |  "An ad hoc format deserves an ad hoc parser."  |#          `-------------------------------------------------'# # Some Subversion project log messages include parseable data to help# track who's contributing what.  The exact syntax is described in# hacking.html#crediting, but here's an example, indented by three# spaces, i.e., the "Patch by:" starts at the beginning of a line:##    Patch by: David Anderson <david.anderson@calixo.net>#              <justin@erenkrantz.com>#              me#    (I wrote the regression tests.)#    Found by: Phineas T. Phinder <phtph@ph1nderz.com>#    Suggested by: Snosbig Q. Ptermione <sqptermione@example.com>#    Review by: Justin Erenkrantz <justin@erenkrantz.com>#               rooneg#    (They caught an off-by-one error in the main loop.)## This is a pathological example, but it shows all the things we might# need to parse.  We need to:##   - Detect the officially-approved "WORD by: " fields.#   - Grab every name (one per line) in each field.#   - Handle names in various formats, unifying where possible.#   - Expand "me" to the committer name for this revision.#   - Associate a parenthetical aside following a field with that field.## NOTES: You might be wondering, why not take 'svn log --xml' input?# Well, that would be the Right Thing to do, but in practice this was# a lot easier to whip up for straight 'svn log' output.  I'd have no# objection to it being rewritten to take XML input.import osimport sysimport reimport shutilimport getoptfrom urllib import quote as url_encode# Pretend we have true booleans on older python versionstry:  Trueexcept:  True = 1  False = 0# Warnings and errors start with these strings.  They are typically# followed by a colon and a space, as in "%s: " ==> "WARNING: ".warning_prefix = 'WARNING'error_prefix = 'ERROR'def complain(msg, fatal=False):  """Print MSG as a warning, or if FATAL is true, print it as an error  and exit."""  prefix = 'WARNING: '  if fatal:    prefix = 'ERROR: '  sys.stderr.write(prefix + msg + '\n')  if fatal:    sys.exit(1)def html_spam_guard(addr):  """Return a spam-protected version of email ADDR that renders the  same in HTML as the original address."""  return "".join(map(lambda x: "<span>&#%d;</span>" % ord(x), addr))def escape_html(str):  """Return an HTML-escaped version of STR."""  return str.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')_spam_guard_in_html_block_re = re.compile(r'&lt;([^&]*@[^&]*)&gt;')def _spam_guard_in_html_block_func(m):  return "&lt;%s&gt;" % html_spam_guard(m.group(1))def spam_guard_in_html_block(str):  """Take a block of HTML data, and run html_spam_guard() on parts of it."""  return _spam_guard_in_html_block_re.subn(_spam_guard_in_html_block_func,                                           str)[0]  def html_header(title):  """Write HTML file header.  TITLE parameter is expected to already by HTML-escaped if needed."""  s  = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n'  s += ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n'  s += '<html><head>\n'  s += '<meta http-equiv="Content-Type"'  s += ' content="text/html; charset=UTF-8" />\n'  s += '<title>%s</title>\n' % title  s += '</head>\n\n'  s += '<body style="text-color: black; background-color: white">\n\n'  s += '<h1 style="text-align: center">%s</h1>\n\n' % title  s += '<hr />\n\n'  return sdef html_footer():  return '\n</body>\n</html>\n'class Contributor:  # Map contributor names to contributor instances, so that there  # exists exactly one instance associated with a given name.  # Fold names with email addresses.  That is, if we see someone  # listed first with just an email address, but later with a real  # name and that same email address together, we create only one  # instance, and store it under both the email and the real name.  all_contributors = { }  # See __hash__() for why this is necessary.  hash_value = 1  def __init__(self, username, real_name, email):    """Instantiate a contributor.  Don't use this to generate a    Contributor for an external caller, though, use .get() instead."""    self.real_name = real_name    self.username  = username    self.email     = email    self.is_committer = False       # Assume not until hear otherwise.    self.is_full_committer = False  # Assume not until hear otherwise.    # Map verbs (e.g., "Patch", "Suggested", "Review") to lists of    # LogMessage objects.  For example, the log messages stored under    # "Patch" represent all the revisions for which this contributor    # contributed a patch.    self.activities = { }    # Sigh.    self.unique_hash_value = Contributor.hash_value    Contributor.hash_value += 1  def add_activity(self, field_name, log):    """Record that this contributor was active in FIELD_NAME in LOG."""    logs = self.activities.get(field_name)    if not logs:      logs = [ ]      self.activities[field_name] = logs    if not log in logs:      logs.append(log)  def get(username, real_name, email):    """If this contributor is already registered, just return it;    otherwise, register it then return it.  Hint: use parse() to    generate the arguments."""    c = None    for key in username, real_name, email:      if key and Contributor.all_contributors.has_key(key):        c = Contributor.all_contributors[key]        break    # If we didn't get a Contributor, create one now.    if not c:      c = Contributor(username, real_name, email)    # If we know identifying information that the Contributor lacks,    # then give it to the Contributor now.    if username:      if not c.username:        c.username = username      Contributor.all_contributors[username]  = c    if real_name:      if not c.real_name:        c.real_name = real_name      Contributor.all_contributors[real_name] = c    if email:      if not c.email:        c.email = email      Contributor.all_contributors[email]     = c    # This Contributor has never been in better shape; return it.    return c  get = staticmethod(get)  def score(self):    """Return a contribution score for this contributor."""    # Right now we count a patch as 2, anything else as 1.    score = 0    for activity in self.activities.keys():      if activity == 'Patch':        score += len(self.activities[activity]) * 2      else:        score += len(self.activities[activity])    return score  def score_str(self):    """Return a contribution score HTML string for this contributor."""    patch_score = 0    other_score = 0    for activity in self.activities.keys():      if activity == 'Patch':        patch_score += len(self.activities[activity])      else:        other_score += len(self.activities[activity])    if patch_score == 0:      patch_str = ""    elif patch_score == 1:      patch_str = "1&nbsp;patch"    else:      patch_str = "%d&nbsp;patches" % patch_score    if other_score == 0:      other_str = ""    elif other_score == 1:      other_str = "1&nbsp;non-patch"    else:      other_str = "%d&nbsp;non-patches" % other_score    if patch_str:      if other_str:        return ",&nbsp;".join((patch_str, other_str))      else:        return patch_str    else:      return other_str  def __cmp__(self, other):    if self.is_full_committer and not other.is_full_committer:      return 1    if other.is_full_committer and not self.is_full_committer:      return -1    result = cmp(self.score(), other.score())    if result == 0:      return cmp(self.big_name(), other.big_name())    else:      return 0 - result  def __hash__(self):    """See LogMessage.__hash__() for why this exists."""    return self.hash_value  def parse(name):    """Parse NAME, which can be       - A committer username, or       - A space-separated real name, or       - A space-separated real name followed by an email address in           angle brackets, or       - Just an email address in angle brackets.     Return a tuple of (committer_username, real_name, email_address)     any of which can be None if not available in NAME."""    username  = None    real_name = None    email     = None    name_components = name.split()    if len(name_components) == 1:      name = name_components[0] # Effectively, name = name.strip()      if name[0] == '<' and name[-1] == '>':        email = name[1:-1]      elif name.find('@') != -1:        email = name      else:        username = name    elif name_components[-1][0] == '<' and name_components[-1][-1] == '>':      real_name = ' '.join(name_components[0:-1])      email = name_components[-1][1:-1]    else:      real_name = ' '.join(name_components)    return username, real_name, email  parse = staticmethod(parse)  def canonical_name(self):    """Return a canonical name for this contributor.  The canonical    name may or may not be based on the contributor's actual email    address.    The canonical name will not contain filename-unsafe characters.    This method is guaranteed to return the same canonical name every    time only if no further contributions are recorded from this    contributor after the first call.  This is because a contribution    may bring a new form of the contributor's name, one which affects    the algorithm used to construct canonical names."""    retval = None    if self.username:      retval = self.username    elif self.email:      # Take some rudimentary steps to shorten the email address, to      # make it more manageable.  If this is ever discovered to result      # in collisions, we can always just use to the full address.      try:        at_posn = self.email.index('@')        first_dot_after_at = self.email.index('.', at_posn)        retval = self.email[0:first_dot_after_at]      except ValueError:        retval = self.email    elif self.real_name:      # Last resort: construct canonical name based on real name.        retval = ''.join(self.real_name.lower().split(' '))    if retval is None:      complain('Unable to construct a canonical name for Contributor.', True)    return url_encode(retval, safe="!#$&'()+,;<=>@[]^`{}~")  def big_name(self, html=False):    """Return as complete a name as possible for this contributor."""    name_bits = []    if self.real_name:      if html:        name_bits.append(escape_html(self.real_name))      else:        name_bits.append(self.real_name)    if self.email:      if not self.real_name and not self.username:        name_bits.append(self.email)      elif html:        name_bits.append("&lt;%s&gt;" % html_spam_guard(self.email))      else:        name_bits.append("<%s>" % self.email)    if self.username:      if not self.real_name and not self.email:        name_bits.append(self.username)      else:        name_bits.append("(%s)" % self.username)    return " ".join(name_bits)  def __str__(self):    s = 'CONTRIBUTOR: '    s += self.big_name()    s += "\ncanonical name: '%s'" % self.canonical_name()    if len(self.activities) > 0:      s += '\n   '    for activity in self.activities.keys():      val = self.activities[activity]      s += '[%s:' % activity      for log in val:        s += ' %s' % log.revision      s += ']'    return s  def html_out(self, revision_url_pattern, filename):    """Create an HTML file named FILENAME, showing all the revisions in which    this contributor was active."""    out = open(filename, 'w')    out.write(html_header(self.big_name(html=True)))    unique_logs = { }    sorted_activities = self.activities.keys()    sorted_activities.sort()    out.write('<div class="h2" id="activities" title="activities">\n\n')    out.write('<table border="1">\n')    out.write('<tr>\n')    for activity in sorted_activities:      out.write('<td>%s</td>\n\n' % activity)    out.write('</tr>\n')    out.write('<tr>\n')    for activity in sorted_activities:      out.write('<td>\n')      first_activity = True      for log in self.activities[activity]:        s = ',\n'        if first_activity:          s = ''          first_activity = False        out.write('%s<a href="#%s">%s</a>' % (s, log.revision, log.revision))        unique_logs[log] = True      out.write('</td>\n')

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜精品美女毛片视频| 中文字幕一区二区三区在线不卡| 精品va天堂亚洲国产| 欧美激情一区二区三区在线| 亚洲精品videosex极品| 日本aⅴ亚洲精品中文乱码| 国产老妇另类xxxxx| 色老综合老女人久久久| 欧美一卡二卡三卡| 国产精品久久久久天堂| 日本麻豆一区二区三区视频| 成人久久视频在线观看| 欧美放荡的少妇| 国产精品嫩草99a| 亚洲综合视频网| 强制捆绑调教一区二区| 高清在线观看日韩| 欧美日韩亚洲丝袜制服| 久久婷婷久久一区二区三区| 亚洲麻豆国产自偷在线| 韩国女主播成人在线观看| 在线观看一区二区视频| 日本一区二区视频在线| 久久99蜜桃精品| 欧美日韩你懂得| 亚洲三级在线看| 调教+趴+乳夹+国产+精品| 国产精品1024久久| 欧美高清性hdvideosex| 国产精品国产三级国产有无不卡 | 丁香天五香天堂综合| 在线观看国产日韩| 欧美极品xxx| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲欧洲日产国产综合网| 免费看黄色91| 欧美性受xxxx黑人xyx| 亚洲国产精品99久久久久久久久| 蜜臀av性久久久久av蜜臀妖精| 91免费看片在线观看| 欧美激情一区二区三区在线| 麻豆精品一区二区三区| 欧美日韩在线播放一区| 亚洲欧美日韩综合aⅴ视频| 波多野结衣精品在线| 欧美激情中文字幕| 亚洲在线成人精品| 日韩伦理免费电影| 欧美精品日韩综合在线| 午夜精品福利久久久| 久久久天堂av| 欧美一区二区三区白人| 欧美少妇bbb| 亚洲美女在线国产| 国产91丝袜在线18| 中文字幕免费观看一区| 国产成人精品一区二区三区四区| 成人免费小视频| 丁香天五香天堂综合| 中文字幕乱码亚洲精品一区| 成人午夜碰碰视频| 亚洲女子a中天字幕| 日本丶国产丶欧美色综合| 亚洲在线视频一区| 在线综合视频播放| 精品一区二区久久久| 久久久精品免费网站| 成av人片一区二区| 亚洲欧美日韩久久| 欧美高清www午色夜在线视频| 亚洲午夜电影在线| 6080午夜不卡| 精品亚洲porn| 国产精品亲子伦对白| 一本到一区二区三区| 日韩高清在线一区| 久久精品夜夜夜夜久久| 色哟哟国产精品免费观看| 亚洲成人av中文| 欧美成人精品福利| 成人av影院在线| 亚洲国产成人av网| 国产精品久久久久久久第一福利| 国产日韩欧美精品电影三级在线| 亚洲制服丝袜一区| 欧美一a一片一级一片| 日本不卡一区二区| 久久久高清一区二区三区| 99国产精品久久久久久久久久| 亚洲一区日韩精品中文字幕| 欧美第一区第二区| 91蜜桃传媒精品久久久一区二区| 日韩福利电影在线观看| 欧美国产丝袜视频| 日韩午夜三级在线| 99热在这里有精品免费| 青娱乐精品视频在线| 亚洲桃色在线一区| 日韩三级精品电影久久久| av成人免费在线| 蜜臂av日日欢夜夜爽一区| 自拍视频在线观看一区二区| 欧美一区二区三区公司| 色综合久久综合中文综合网| 日本aⅴ精品一区二区三区| 国产区在线观看成人精品| 欧美一区二区视频在线观看| 成人激情小说乱人伦| 奇米精品一区二区三区四区| 亚洲欧美一区二区三区国产精品 | 国产精品一区二区果冻传媒| 亚洲欧美另类图片小说| 国产清纯在线一区二区www| 欧美一级淫片007| 色天天综合色天天久久| 成人性视频网站| 精品无人码麻豆乱码1区2区| 午夜精品久久久久久久99樱桃| 国产精品第五页| 国产情人综合久久777777| 日韩欧美一区二区免费| 91精品黄色片免费大全| 欧美在线一区二区| 色哟哟国产精品免费观看| 成人激情黄色小说| 国产成a人亚洲精| 国产精品一线二线三线精华| 蜜桃av噜噜一区| 免费在线成人网| 首页国产欧美久久| 亚洲电影激情视频网站| 综合激情成人伊人| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 欧美性感一区二区三区| 国产精品亚洲第一| 久久99国产精品免费网站| 日韩精品亚洲一区二区三区免费| 一区二区三区影院| 国产精品国产三级国产aⅴ入口| 亚洲国产成人一区二区三区| 国产色综合久久| 久久久久97国产精华液好用吗| 精品少妇一区二区三区| 日韩丝袜美女视频| 日韩免费视频一区二区| 2020国产精品| 久久五月婷婷丁香社区| 2021国产精品久久精品| 欧美激情资源网| 中文字幕一区日韩精品欧美| 《视频一区视频二区| 亚洲精品久久久蜜桃| 亚洲五月六月丁香激情| 免费在线成人网| 国产精品亚洲第一区在线暖暖韩国| 国产精品资源在线看| 不卡一区二区在线| 欧洲精品在线观看| 欧美放荡的少妇| 久久久青草青青国产亚洲免观| 欧美激情一区二区三区全黄| 一区在线观看视频| 亚洲成人自拍一区| 另类调教123区| 不卡电影免费在线播放一区| 色先锋资源久久综合| 欧美性视频一区二区三区| 91精品婷婷国产综合久久竹菊| 日韩一区二区三区免费观看| 久久精品日产第一区二区三区高清版 | 国产成人精品亚洲午夜麻豆| av毛片久久久久**hd| 欧美日韩午夜影院| 精品国产麻豆免费人成网站| 欧美激情综合在线| 亚洲1区2区3区4区| 国产东北露脸精品视频| 色婷婷av一区二区三区之一色屋| 欧美日本在线播放| 久久久久久一级片| 亚洲成精国产精品女| 激情六月婷婷久久| 一本到不卡免费一区二区| 欧美肥胖老妇做爰| 国产精品三级电影| 日韩国产一二三区| 成人黄色大片在线观看| 欧美日高清视频| 国产欧美精品在线观看| 一区二区三区产品免费精品久久75| 亚洲国产成人精品视频| 国产尤物一区二区在线| 91蜜桃传媒精品久久久一区二区| 欧美成人精品1314www| 亚洲欧美另类综合偷拍| 免费av网站大全久久| 99久久精品久久久久久清纯| 欧美精品视频www在线观看| 久久久久九九视频| 午夜视频在线观看一区|