[Libreoffice-commits] dev-tools.git: scripts/bz_comments.py scripts/esc-mentoring.py
Jan Iversen
jani at documentfoundation.org
Wed Apr 13 15:34:24 UTC 2016
scripts/bz_comments.py | 110 --------------
scripts/esc-mentoring.py | 345 -----------------------------------------------
2 files changed, 455 deletions(-)
New commits:
commit aee16a14dd5c13c23659b031fac3cef4852b6008
Author: Jan Iversen <jani at documentfoundation.org>
Date: Wed Apr 13 17:33:14 2016 +0200
mentoring scrips
moved scripts to SALT, since they will be
installed on vm174, the new mentoring statistic
vm.
diff --git a/scripts/bz_comments.py b/scripts/bz_comments.py
deleted file mode 100755
index 4709609..0000000
--- a/scripts/bz_comments.py
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/usr/bin/env python3
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-import sys
-import csv
-import io
-import datetime
-import json
-import xmltodict
-from xml.etree.ElementTree import XML
-from urllib.request import urlopen, URLError
-
-
-
-def get_list_easyHacks() :
- url = 'https://bugs.documentfoundation.org/buglist.cgi?' \
- 'bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=VERIFIED&bug_status=NEEDINFO' \
- '&columnlist=Cbug_id' \
- '&keywords=easyHack%2C%20' \
- '&keywords_type=allwords' \
- '&query_format=advanced' \
- '&resolution=---' \
- '&ctype=csv' \
- '&human=0'
- try:
- resp = urlopen(url)
- except URLError:
- sys.stderr.write('Error fetching {}'.format(url))
- sys.exit(1)
- xCSV = list(csv.reader(io.TextIOWrapper(resp)))
- resp.close()
- rawList = []
- for row in xCSV[1:]:
- rawList.append(row[0])
- return rawList
-
-
-
-def get_bug(id) :
- url = 'https://bugs.documentfoundation.org/show_bug.cgi?ctype=xml&id=' + id
- try:
- resp = urlopen(url)
- except URLError:
- sys.stderr.write('Error fetching {}'.format(url))
- sys.exit(1)
- bug = xmltodict.parse(resp.read())
- resp.close()
- return bug
-
-
-
-def optimize_bug(bug_org) :
- bug = bug_org['bugzilla']['bug']
- del bug['bug_file_loc']
- del bug['cclist_accessible']
- del bug['classification']
- del bug['classification_id']
- del bug['comment_sort_order']
- del bug['creation_ts']
- del bug['delta_ts']
- del bug['reporter_accessible']
- del bug['resolution']
-
- # collect info for new comments:
- if 'reporter' not in bug :
- newText = 'org_reporter: MISSING'
- else :
- if type(bug['reporter']) is str:
- newText = 'org_reporter: ' + bug['reporter'] + '\n'
- else :
- newText = 'org_reporter: ' + bug['reporter']['@name'] + '/' + bug['reporter']['#text'] + '\n'
- del bug['reporter']
-
- for line in bug['long_desc'] :
- if 'who' not in line or type(line) is str:
- newText += 'who: UNKNOWN' + '\n' + line
- else :
- newText += 'who: ' + line['who']['@name'] + '/' + line['who']['#text']
- bug['long_desc'] = []
- bug['long_desc'].append({'thetext' : newText})
- addAlso = 'https://issues.apache.org/ooo/show_bug.cgi?id='+bug['bug_id']
- if 'see_also' not in bug :
- bug['see_also'] = addAlso
- elif not type(bug['see_also']) is list :
- x = bug['see_also']
- bug['see_also'] = [x, addAlso]
- else :
- bug['see_also'].append(addAlso)
- return bug
-
-
-
-
-if __name__ == '__main__':
- # get data from bugzilla and gerrit
- easyHacks = get_list_easyHacks()
- easyHacks.sort()
- bugs = []
-
- for id in easyHacks :
- bugs.append(optimize_bug(get_bug(id)))
-
- print(json.dumps(bugs))
-
diff --git a/scripts/esc-mentoring.py b/scripts/esc-mentoring.py
deleted file mode 100755
index ef91f9c..0000000
--- a/scripts/esc-mentoring.py
+++ /dev/null
@@ -1,345 +0,0 @@
-#!/usr/bin/env python3
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-import sys
-import csv
-import io
-import datetime
-import json
-import xmltodict
-from xml.etree.ElementTree import XML
-from urllib.request import urlopen, URLError
-
-
-
-def get_count_needsDevEval() :
- url = 'https://bugs.documentfoundation.org/buglist.cgi?' \
- 'bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=VERIFIED&bug_status=NEEDINFO' \
- '&columnlist=Cbug_id%2Cassigned_to%2Cbug_status%2Cshort_desc%2Cchangeddate%2Creporter%2Clongdescs.count%2Copendate%2Cstatus_whiteboard' \
- '&keywords=needsDevEval%2C%20' \
- '&keywords_type=allwords' \
- '&query_format=advanced' \
- '&resolution=---' \
- '&ctype=csv' \
- '&human=0'
- try:
- resp = urlopen(url)
- except URLError:
- sys.stderr.write('Error fetching {}'.format(url))
- sys.exit(1)
- xCSV = list(csv.reader(io.TextIOWrapper(resp)))
- return len(xCSV) -1
-
-
-
-def get_easyHacks() :
- url = 'https://bugs.documentfoundation.org/buglist.cgi?' \
- 'bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=VERIFIED&bug_status=NEEDINFO' \
- '&columnlist=Cbug_id%2Cassigned_to%2Cbug_status%2Cshort_desc%2Cchangeddate%2Creporter%2Clongdescs.count%2Copendate%2Cstatus_whiteboard' \
- '&keywords=easyHack%2C%20' \
- '&keywords_type=allwords' \
- '&query_format=advanced' \
- '&resolution=---' \
- '&ctype=csv' \
- '&human=0'
- try:
- resp = urlopen(url)
- except URLError:
- sys.stderr.write('Error fetching {}'.format(url))
- sys.exit(1)
- xCSV = list(csv.reader(io.TextIOWrapper(resp)))[1:]
- resp.close()
- xCSV.sort()
- rawList = {}
- for row in xCSV:
- id = int(row[0])
- if row[1] == 'libreoffice-bugs' :
- assign = ''
- else :
- assign = row[1]
- status = row[2]
- if status == 'REOPENED' :
- status = 'NEW'
- rawList[id] = {'id' : id,
- 'assign' : assign,
- 'status' : status,
- 'desc' : row[3],
- 'change' : datetime.datetime.strptime(row[4].split(' ')[0], '%Y-%m-%d').date(),
- 'reporter' : row[5],
- 'comments' : int(row[6]),
- 'created' : datetime.datetime.strptime(row[7].split(' ')[0], '%Y-%m-%d').date(),
- 'whiteboard' : row[8]
- }
- return rawList
-
-
-
-def get_gerrit(doNonCom) :
- url = 'https://gerrit.libreoffice.org/changes/?' \
- 'q=status:open'
- if (doNonCom) :
- url = url + '+-ownerin:committer'
-
- # Add needed fields
- url = url + '&o=DETAILED_LABELS&o=MESSAGES&o=DETAILED_ACCOUNTS'
- #url = url + '&o=code_review&o=reviewers&pp=0'
-
- try:
- resp = urlopen(url)
- except URLError:
- sys.stderr.write('Error fetching {}'.format(url))
- sys.exit(1)
-
- data = resp.read().decode('utf8')[5:]
- rawList = json.loads(data)
- resp.close()
- for row in rawList :
- row['updated'] = datetime.datetime.strptime(row['updated'].split(' ')[0], '%Y-%m-%d').date()
- return rawList
-
-
-
-def get_bug(id) :
- url = 'https://bugs.documentfoundation.org/show_bug.cgi?ctype=xml&id=' + str(id)
- try:
- resp = urlopen(url)
- except URLError:
- sys.stderr.write('Error fetching {}'.format(url))
- sys.exit(1)
- bug = xmltodict.parse(resp.read())
- resp.close()
- return bug
-
-
-
-def optimize_bug(bug_org) :
- bug = bug_org['bugzilla']['bug']
- del bug['bug_file_loc']
- del bug['cclist_accessible']
- del bug['classification']
- del bug['classification_id']
- del bug['comment_sort_order']
- del bug['creation_ts']
- del bug['delta_ts']
- del bug['reporter_accessible']
- del bug['resolution']
-
- # collect info for new comments:
- if 'reporter' not in bug :
- newText = 'org_reporter: MISSING'
- else :
- if type(bug['reporter']) is str:
- newText = 'org_reporter: ' + bug['reporter'] + '\n'
- else :
- newText = 'org_reporter: ' + bug['reporter']['@name'] + '/' + bug['reporter']['#text'] + '\n'
- del bug['reporter']
-
- for line in bug['long_desc'] :
- if 'who' not in line or type(line) is str:
- newText += 'who: UNKNOWN' + '\n' + line
- else :
- newText += 'who: ' + line['who']['@name'] + '/' + line['who']['#text']
- bug['long_desc'] = []
- bug['long_desc'].append({'thetext' : newText})
- addAlso = 'https://issues.apache.org/ooo/show_bug.cgi?id='+bug['bug_id']
- if 'see_also' not in bug :
- bug['see_also'] = addAlso
- elif not type(bug['see_also']) is list :
- x = bug['see_also']
- bug['see_also'] = [x, addAlso]
- else :
- bug['see_also'].append(addAlso)
- return bug
-
-
-
-def formatEasy(easyHack) :
- return 'https://bugs.documentfoundation.org/show_bug.cgi?id={} mentor:{} -> "{}"'.format(easyHack['id'], easyHack['reporter'], easyHack['desc'])
-
-
-
-def formatGerrit(patch) :
- return 'https://gerrit.libreoffice.org/#/c/{}/ author:{} -> "{}"'.format(patch['_number'], patch['owner']['name'], patch['subject'])
-
-
-
-def checkGerrit(checkType, patch, cDate=0, eDate=0) :
- if checkType == 1 or checkType == 3:
- # True, if there are no -1 and patch is mergeable
- # 3 also checks on start/end date
- # Optional Check no open comments
-
- # date check (3 days old)
- if checkType == 3 and (patch['updated'] < cDate or patch['updated'] > eDate) :
- return False
-
- # not mergeable
- if not patch['mergeable'] :
- return False
-
- # review or verify -1
- if 'labels' in patch and 'Code-Review' in patch['labels'] and 'all' in patch['labels']['Code-Review'] :
- for chk in patch['labels']['Code-Review']['all'] :
- if 'value' in chk and chk['value'] < 0 :
- return False
- if 'labels' in patch and 'Verified' in patch['labels'] and 'all' in patch['labels']['Verified'] :
- for chk in patch['labels']['Verified']['all'] :
- if 'value' in chk and chk['value'] < 0 :
- return False
- return True
- elif checkType == 2 :
- # True if there are reviewer
- if 'labels' in patch and 'Code-Review' in patch['labels'] and 'all' in patch['labels']['Code-Review'] :
- for chk in patch['labels']['Code-Review']['all'] :
- name = chk['name']
- if not name == 'Jenkins' and not name == patch['owner'] :
- return True
- return False
- elif checkType == 4 :
- # True if merge conflict and no jani comment
- return False
- elif checkType == 5 :
- # true if last change is older than startDate
- if patch['updated'] <= cDate :
- return True
- return False
- return False
-
-
-
-def ESC_report(easyHacks, gerritOpen, gerritContributor, needsDevEval) :
- # prepare to count easyHacks, and list special status, new hacks (7 days)
- xTot = len(easyHacks)
- xAssign = 0
- xOpen = 0
- xInfo = 0
- xComm = 0
- xRevi = 0
- pNew = []
- pInfo = []
- cDate = datetime.date.today() - datetime.timedelta(days=8)
- for key, row in easyHacks.items():
- # Calculate type of status
- status = row['status']
- if status == 'ASSIGNED' :
- xAssign += 1
- elif status == 'NEEDINFO' :
- xInfo += 1
- pInfo.append(row)
- elif status == 'NEW' :
- xOpen += 1
- if row['comments'] >= 5 :
- xComm += 1
- if row['whiteboard'] == 'ToBeReviewed':
- xRevi += 1
-
- if row['created'] >= cDate :
- pNew.append(row)
- print('* Easy Hacks (JanI)')
- print(' + total {}: {} not assigned, {} Assigned to contributors, {} need info'.format(xTot, xOpen, xAssign, xInfo))
- print(' + needsDevEval {} needs to be evaluated'.format(needsDevEval))
- print(' + cleanup: {} has more than 4 comments, {} needs to be reviewed'.format(xComm, xRevi))
- print(' + new last 8 days:')
- for row in pNew :
- print(' ', end='')
- print(formatEasy(row))
- print (' + <text>')
- print('\n\n')
-
- xTot = len(gerritOpen)
- xRevi = 0
- for row in gerritOpen:
- # can be merged (depending comments)
- if checkGerrit(1, row) :
- xRevi += 1
- print ('* Mentoring Update (JanI)')
- print (' + total: {} open gerrit patches of which {} are mergeable'.format(xTot, xRevi))
- xTot = len(gerritContributor)
- xRevi = 0
- for row in gerritContributor:
- # can be merged (depending comments)
- if checkGerrit(1, row) :
- xRevi += 1
- print (' + contributors: {} open gerrit patches of which {} are mergeable'.format(xTot, xRevi))
- print (' + <text>')
-
-
-
-def DAY_report(runMsg, easyHacks, gerritOpen, gerritContributor) :
- # Day report looks 8 days back
- cDate = datetime.date.today() - datetime.timedelta(days=8)
-
- print("*** new easyHacks (verify who created it):")
- for key, row in easyHacks.items():
- if row['created'] >= cDate :
- print(' ', end='')
- print(formatEasy(row))
-
- print("\n\n*** Gerrit mangler reviewer:")
- for row in gerritContributor:
- if not checkGerrit(2, row) :
- print(' ', end='')
- print(formatGerrit(row))
-
- # Month report looks 30 days back
- cDate = datetime.date.today() - datetime.timedelta(days=30)
-
- print("\n\n*** Gerrit to abandon:")
- for row in gerritContributor:
- # can be merged (depending comments)
- if checkGerrit(5, row, cDate=cDate) :
- print(' ', end='')
- print(formatGerrit(row))
-
- print('\n\n*** assigned easyHacks, no movement')
- for key, row in easyHacks.items():
- if row['change'] <= cDate and row['status'] == 'ASSIGNED':
- print(' ', end='')
- print(formatEasy(row))
-
- print("\n\ne*** asyHacks needing review due to whiteboard:")
- bugs = []
- for key, row in easyHacks.items():
- if row['comments'] < 5 and 'ToBeReviewed' in row['whiteboard'] :
- print(' ', end='')
- print(formatEasy(row))
-
- if runMsg == "dump" :
- print("\n\n*** easyHacks with more than 5 comments:")
- bugs = []
- for key, row in easyHacks.items():
- if row['comments'] >= 5 :
- bugs.append(optimize_bug(get_bug(key)))
- with open('bz_comments.json', 'w') as f:
- json.dump(bugs, f, ensure_ascii=False, indent=4, sort_keys=True)
- xTot = len(bugs)
- print(' wrote {} entries to bz_comments.json'.format(xTot))
-
-
-
-
-if __name__ == '__main__':
- # check command line options
- doESC = True
- if len(sys.argv) > 1 :
- if sys.argv[1] != 'esc' :
- doESC = False
-
- # get data from bugzilla and gerrit
- easyHacks = get_easyHacks()
- needsDevEval = get_count_needsDevEval()
- gerritOpen = get_gerrit(False)
- gerritContributor = get_gerrit(True)
-
- if doESC :
- ESC_report(easyHacks, gerritOpen, gerritContributor, needsDevEval)
- else :
- DAY_report(sys.argv[1],easyHacks, gerritOpen, gerritContributor)
- print('\n\nend of report')
-
More information about the Libreoffice-commits
mailing list