亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
中文字幕欧美区| 欧美日本高清视频在线观看| 亚洲成a天堂v人片| 中文字幕亚洲精品在线观看| 国产婷婷色一区二区三区| 日韩视频123| 日韩欧美不卡一区| 欧美不卡123| 国产午夜精品福利| 日本一区二区三区四区| 国产欧美一区二区精品久导航| 精品国产一区二区三区av性色| 欧美成人vr18sexvr| 精品免费视频一区二区| 久久精品水蜜桃av综合天堂| 久久精品这里都是精品| 中文一区在线播放| 一区二区视频免费在线观看| 亚洲欧美在线另类| 亚洲国产毛片aaaaa无费看| 亚洲成人一二三| 久久精品国产一区二区三区免费看| 美女任你摸久久 | 中文字幕中文在线不卡住| 中文字幕欧美日本乱码一线二线 | 国产精品国产三级国产普通话蜜臀| 日本一区二区综合亚洲| 亚洲精品免费在线播放| 日韩精品一卡二卡三卡四卡无卡| 久久精品国产秦先生| 国产成人av一区二区三区在线| 成人福利视频网站| 欧美日韩国产高清一区二区三区 | 亚洲一区二区欧美激情| 视频在线在亚洲| 国产成人精品影院| 色欧美日韩亚洲| 日韩精品在线看片z| 国产精品国产三级国产| 日韩精品一级中文字幕精品视频免费观看 | 欧美色图免费看| 日韩欧美精品三级| 亚洲色图20p| 久久成人羞羞网站| 色哟哟亚洲精品| 久久综合色天天久久综合图片| 亚洲摸摸操操av| 国产乱人伦偷精品视频免下载 | 亚洲欧美另类综合偷拍| 秋霞午夜鲁丝一区二区老狼| 大胆亚洲人体视频| 日韩一区二区视频| 亚洲免费观看高清完整版在线观看| 免费的国产精品| 在线观看中文字幕不卡| 国产亚洲一本大道中文在线| 偷拍与自拍一区| 99精品1区2区| 欧美激情一区二区三区在线| 日韩电影在线观看网站| 91久久线看在观草草青青 | 中文一区在线播放| 极品美女销魂一区二区三区免费| 色婷婷av一区二区三区软件| 国产嫩草影院久久久久| 九九国产精品视频| 日韩一区二区在线看| 日韩激情视频网站| 欧美色中文字幕| 综合av第一页| 91网站在线播放| 一区在线播放视频| jvid福利写真一区二区三区| 国产亚洲欧美一区在线观看| 久久国产精品色婷婷| 91精品国产免费久久综合| 午夜精品一区在线观看| 欧美午夜理伦三级在线观看| 伊人色综合久久天天人手人婷| 盗摄精品av一区二区三区| 中文字幕二三区不卡| 成人一级视频在线观看| 亚洲欧洲精品一区二区三区不卡| 成人午夜电影久久影院| 国产精品视频免费| 99re免费视频精品全部| 亚洲女同一区二区| 欧美天堂一区二区三区| 五月激情综合婷婷| 精品福利二区三区| 国产成人综合在线播放| 国产精品乱人伦| 91麻豆免费视频| 亚洲成av人片在线| 欧美一区二区三区婷婷月色 | 久久人人爽爽爽人久久久| 国产毛片精品国产一区二区三区| 国产婷婷一区二区| 色网站国产精品| 日韩av在线发布| 精品国产乱码久久久久久浪潮| 国产精品中文欧美| 日韩一区中文字幕| 欧美三级午夜理伦三级中视频| 日韩二区三区四区| 亚洲国产精品v| 欧美午夜片在线看| 狠狠色狠狠色综合系列| 国产精品麻豆网站| 欧美精品免费视频| 国产福利一区二区| 亚洲观看高清完整版在线观看| 91超碰这里只有精品国产| 国产一区二区三区美女| 亚洲精品第1页| 精品国产百合女同互慰| 99国产精品久久久久| 日本女人一区二区三区| 欧美激情中文字幕| 欧美精品一卡二卡| 成人免费视频免费观看| 三级一区在线视频先锋| 国产精品久久久久久久久免费桃花| 欧洲一区在线电影| 国产精品2024| 视频一区视频二区中文| 国产精品久久久久7777按摩| 91精品国产综合久久小美女| 成人免费精品视频| 极品销魂美女一区二区三区| 亚洲一区二区成人在线观看| 日本一区二区三区在线不卡| 5月丁香婷婷综合| 91福利国产精品| 日本最新不卡在线| 国产精品久久久久久久第一福利 | 国产欧美精品一区二区三区四区| 欧美色综合影院| 不卡的电影网站| 久久精品国产成人一区二区三区| 亚洲免费观看高清完整版在线 | 天堂成人免费av电影一区| 国产精品久久久久9999吃药| 国产亚洲视频系列| 欧美大片拔萝卜| 欧美一级一级性生活免费录像| 91国产免费看| 91福利社在线观看| 日本黄色一区二区| 91视视频在线观看入口直接观看www| 国产主播一区二区| 精品中文字幕一区二区小辣椒| 日韩精品一二区| 水蜜桃久久夜色精品一区的特点 | 日本欧美在线看| 日本va欧美va瓶| 青青草国产精品97视觉盛宴| 亚洲成年人网站在线观看| 午夜精品久久久久久久99水蜜桃| 亚洲精品中文字幕乱码三区 | 欧美综合亚洲图片综合区| 91免费视频网址| 在线亚洲高清视频| 精品1区2区3区| 欧美一区日韩一区| 精品理论电影在线| 久久久久久毛片| 国产精品夫妻自拍| 一区二区三国产精华液| 亚洲成a人v欧美综合天堂下载| 亚洲18影院在线观看| 喷水一区二区三区| 国产精品一区二区三区四区| 福利91精品一区二区三区| 成人av免费在线观看| 91精品办公室少妇高潮对白| 欧美女孩性生活视频| 欧美白人最猛性xxxxx69交| 久久这里都是精品| 国产精品久久久久久福利一牛影视 | 亚洲自拍偷拍网站| 午夜av一区二区三区| 久久99国内精品| 本田岬高潮一区二区三区| 欧美揉bbbbb揉bbbbb| 欧美一级理论片| 国产精品美女久久久久av爽李琼| 亚洲女人的天堂| 蜜臀91精品一区二区三区| 国产电影一区在线| 在线观看成人小视频| 久久影院视频免费| 亚洲裸体xxx| 精品亚洲国产成人av制服丝袜| 不卡av在线网| 欧美v国产在线一区二区三区| 国产精品大尺度| 麻豆国产一区二区| 在线一区二区三区| 国产日韩亚洲欧美综合|