[PATCH 1/1] gitdm: convert to Python3

Python 2 is beyond end of life.
gitdm works fine. The other scripts may need further testing.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com --- ConfigFile.py | 4 +-- changelogs | 49 +++++++++++++------------- committags | 10 +++--- csvdump.py | 2 +- database.py | 10 +++--- findoldfiles | 2 +- firstlast | 44 +++++++++++------------ gitdm | 21 ++++++----- gitlog.py | 12 +++---- grabdates | 11 +++--- inittags | 8 ++--- linetags | 17 ++++----- logparser.py | 11 +++--- reports.py | 98 ++++++++++++++++++++++++--------------------------- stablefixes | 8 ++--- treeplot | 27 +++++++------- 16 files changed, 167 insertions(+), 167 deletions(-)
diff --git a/ConfigFile.py b/ConfigFile.py index 3a1e208..559e6d0 100644 --- a/ConfigFile.py +++ b/ConfigFile.py @@ -147,10 +147,10 @@ def ReadFileType (filename): m = regex_file_type.match (line) if not m or len (m.groups ()) != 2: ConfigFile.croak ('Funky file type line "%s"' % (line)) - if not patterns.has_key (m.group (1)): + if not m.group (1) in patterns: patterns[m.group (1)] = [] if m.group (1) not in order: - print '%s not found, appended to the last order' % m.group (1) + print('%s not found, appended to the last order' % m.group (1)) order.append (m.group (1))
patterns[m.group (1)].append (re.compile (m.group (2), re.IGNORECASE)) diff --git a/changelogs b/changelogs index 1077a03..0ca2bb9 100755 --- a/changelogs +++ b/changelogs @@ -1,4 +1,4 @@ -#!/usr/bin/pypy +#!/usr/bin/python3 # -*- python -*- # # Go munging through changelogs for interesting info. @@ -34,15 +34,14 @@ def LogNoSOBCulprit(culprit): NoSOBCulprits[culprit] = 1
def SortedCulprits(culprits): - def compare(c1, c2): - return culprits[c2] - culprits[c1] - names = culprits.keys() - names.sort(compare) + def compare(key): + return culprits[key] + names = sorted(culprits.keys(), key=compare, reverse=True) return names
-def PrintCulprits(culprits, sorted): - for name in sorted: - print '\t%30s: %d' % (name, culprits[name]) +def PrintCulprits(culprits, _sorted): + for name in _sorted: + print('\t%30s: %d' % (name, culprits[name])) # # Patch logging # @@ -112,20 +111,20 @@ while p: Nothers += 1 p = gitlog.grabpatch(sys.stdin)
-print '%d patches, %d w/o changelog' % (Npatches, NemptyCL) -print ' %d w/o signoff, %d w/1 signoff, %d no others, %d SS culprits' % \ - (Nnosob, Nsinglesob, Nsinglesob - Nothers, len(SingleSSCulprits)) -print '\nMost single signoffs:' -sorted = SortedCulprits(SingleSSCulprits)[:20] -PrintCulprits(SingleSSCulprits, sorted) -WritePatches(sorted, SSPatches, 'sspatches.html') - -print '\nMost empty changelogs:' -sorted = SortedCulprits(EmptyCulprits)[:20] -PrintCulprits(EmptyCulprits, sorted) -WritePatches(sorted, EmptyCLPatches, 'emptypatches.html') - -print '\nNoSOB:' -sorted = SortedCulprits(NoSOBCulprits) -PrintCulprits(NoSOBCulprits, sorted) -WritePatches(sorted, NoSOBPatches, 'nosobpatches.html') +print('%d patches, %d w/o changelog' % (Npatches, NemptyCL)) +print(' %d w/o signoff, %d w/1 signoff, %d no others, %d SS culprits' % \ + (Nnosob, Nsinglesob, Nsinglesob - Nothers, len(SingleSSCulprits))) +print('\nMost single signoffs:') +_sorted = SortedCulprits(SingleSSCulprits)[:20] +PrintCulprits(SingleSSCulprits, _sorted) +WritePatches(_sorted, SSPatches, 'sspatches.html') + +print('\nMost empty changelogs:') +_sorted = SortedCulprits(EmptyCulprits)[:20] +PrintCulprits(EmptyCulprits, _sorted) +WritePatches(_sorted, EmptyCLPatches, 'emptypatches.html') + +print('\nNoSOB:') +_sorted = SortedCulprits(NoSOBCulprits) +PrintCulprits(NoSOBCulprits, _sorted) +WritePatches(_sorted, NoSOBPatches, 'nosobpatches.html') diff --git a/committags b/committags index d015237..b96108c 100755 --- a/committags +++ b/committags @@ -1,4 +1,4 @@ -#!/usr/bin/pypy +#!/usr/bin/python3 # # Generate a database of commits and major versions they went into. # @@ -55,10 +55,10 @@ args = p.parse_args() # Pull in an existing database if requested. # if args.load: - DB = pickle.load(open(args.database, 'r')) + DB = pickle.load(open(args.database, 'rb')) else: DB = { } -out = open(args.database, 'w') +out = open(args.database, 'wb')
# # Time to fire up git. @@ -93,9 +93,9 @@ for line in input.readlines(): # nc += 1 if (nc % 25) == 0: - print '%6d %s %s \r' % (nc, commit[:8], tag), + print('%6d %s %s \r' % (nc, commit[:8], tag),) sys.stdout.flush()
-print '\nFound %d/%d commits' % (nc, len(DB.keys())) +print('\nFound %d/%d commits' % (nc, len(DB.keys()))) pickle.dump(DB, out) out.close() diff --git a/csvdump.py b/csvdump.py index 9d1a65e..c3aec3b 100644 --- a/csvdump.py +++ b/csvdump.py @@ -50,7 +50,7 @@ def store_patch(patch): ChangeSets.append([patch.commit, str(patch.date), patch.email, domain, author, employer, patch.added, patch.removed]) - for (filetype, (added, removed)) in patch.filetypes.iteritems(): + for (filetype, (added, removed)) in patch.filetypes.items(): FileTypes.append([patch.commit, filetype, added, removed])
diff --git a/database.py b/database.py index bf13227..232049e 100644 --- a/database.py +++ b/database.py @@ -40,7 +40,7 @@ class Hacker: for edate, empl in self.employer[i]: if edate > date: return empl - print 'OOPS. ', self.name, self.employer, self.email, email, date + print('OOPS. ', self.name, self.employer, self.email, email, date) return None # Should not happen
def addpatch (self, patch): @@ -216,7 +216,7 @@ class VirtualEmployer (Employer):
def store (self): if Employers.has_key (self.name): - print Employers[self.name] + print(Employers[self.name]) sys.stderr.write ('WARNING: Virtual empl %s overwrites another\n' % (self.name)) if len (self.splits) == 0: @@ -261,7 +261,7 @@ def MixVirtuals (): EmailAliases = { }
def AddEmailAlias (variant, canonical): - if EmailAliases.has_key (variant): + if variant in EmailAliases: sys.stderr.write ('Duplicate email alias for %s\n' % (variant)) EmailAliases[variant] = canonical
@@ -288,7 +288,7 @@ def AddEmailEmployerMapping (email, employer, end = nextyear): for i in range (0, len(l)): date, xempl = l[i] if date == end: # probably both nextyear - print 'WARNING: duplicate email/empl for %s' % (email) + print('WARNING: duplicate email/empl for %s' % (email)) if date > end: l.insert (i, (end, empl)) return @@ -305,7 +305,7 @@ def MapToEmployer (email, unknown = 0): pass namedom = email.split ('@') if len (namedom) < 2: - print 'Oops...funky email %s' % email + print('Oops...funky email %s' % email) return [(nextyear, GetEmployer ('Funky'))] s = namedom[1].split ('.') for dots in range (len (s) - 2, -1, -1): diff --git a/findoldfiles b/findoldfiles index 493d5d3..c36dd8a 100755 --- a/findoldfiles +++ b/findoldfiles @@ -19,7 +19,7 @@ def CheckFile(file): git = os.popen('git log --pretty=oneline -1 ' + file, 'r') line = git.readline() if line.startswith(OriginalSin): - print file + print(file) git.close() # # Here we just plow through all the files. diff --git a/firstlast b/firstlast index 2b07952..09e60e8 100755 --- a/firstlast +++ b/firstlast @@ -1,4 +1,4 @@ -#!/usr/bin/pypy +#!/usr/bin/python3 # -*- python -*- # # Crank through the log looking at when developers did their first and @@ -52,15 +52,14 @@ def TrackFirstDirs(patch): except KeyError: FirstDirs[dir] = 1
-def cmpdirs(d1, d2): - return FirstDirs[d2] - FirstDirs[d1] +def cmpdirs(d1): + return FirstDirs[d1]
def PrintFirstDirs(): - print '\nDirectories touched by first commits:' - dirs = FirstDirs.keys() - dirs.sort(cmpdirs) + print('\nDirectories touched by first commits:') + dirs = sorted(FirstDirs.keys(), key=cmpdirs, reverse=True) for dir in dirs[:20]: - print '%5d: %s' % (FirstDirs[dir], dir) + print('%5d: %s' % (FirstDirs[dir], dir))
# # Let's also track who they worked for. @@ -73,22 +72,21 @@ def TrackFirstEmpl(name): except KeyError: FirstEmpls[name] = 1
-def cmpempls(e1, e2): - return FirstEmpls[e2] - FirstEmpls[e1] +def cmpempls(e1): + return - FirstEmpls[e1]
def PrintFirstEmpls(): - empls = FirstEmpls.keys() - empls.sort(cmpempls) - print '\nEmployers:' + empls = sorted(FirstEmpls.keys(), key=cmpempls) + print('\nEmployers:') for e in empls[:30]: - print '%5d: %s' % (FirstEmpls[e], e) + print('%5d: %s' % (FirstEmpls[e], e)) # # We "know" that unknown/none are always the top two... # companies = 0 for e in empls[2:]: companies += FirstEmpls[e] - print 'Companies: %d' % (companies) + print('Companies: %d' % (companies))
# # Version comparison stuff. Kernel-specific, obviously. @@ -126,7 +124,7 @@ def TrackingVersion(vers): # Main program. # args = SetupArgs() -VDB = pickle.load(open(args.versiondb, 'r')) +VDB = pickle.load(open(args.versiondb, 'rb')) ConfigFile.ConfigFile(args.config, args.dbdir) SetTrackingVersions(args)
@@ -142,7 +140,7 @@ while patch: try: v = VDB[patch.commit] except KeyError: - print 'Funky commit', patch.commit + print('Funky commit', patch.commit) patch = gitlog.grabpatch(sys.stdin) continue # @@ -174,21 +172,21 @@ for h in database.AllHackers(): try: empl = h.emailemployer(p.email, p.date) except AttributeError: - print 'No email on ', p.commit + print('No email on ', p.commit) continue if empl.name == '(Unknown)': - print 'UNK: %s %s' % (p.email, h.name) + print('UNK: %s %s' % (p.email, h.name)) TrackFirstEmpl(empl.name)
versions = Lasts.keys()
-def cmpvers(v1, v2): - return versionmap(v1) - versionmap(v2) # reverse sort -versions.sort(cmpvers) +def cmpvers(v1): + return versionmap(v1) +versions = sorted(versions, key=cmpvers) for v in versions: if args.minversions <= 1: - print v, len(Firsts[v]), len(Lasts[v]), Singles[v] + print(v, len(Firsts[v]), len(Lasts[v]), Singles[v]) else: - print v, len(Firsts.get(v, [])), len(Lasts.get(v, [])) + print(v, len(Firsts.get(v, [])), len(Lasts.get(v, []))) PrintFirstDirs() PrintFirstEmpls() diff --git a/gitdm b/gitdm index 61318ad..e4b8b7b 100755 --- a/gitdm +++ b/gitdm @@ -1,4 +1,4 @@ -#!/usr/bin/pypy +#!/usr/bin/python3 #-*- coding:utf-8 -*- #
@@ -15,10 +15,12 @@
import database, csvdump, ConfigFile, reports import getopt, datetime -import os, re, sys, rfc822, string, os.path +import os, re, sys, email.utils as rfc822, string, os.path import logparser from patterns import patterns
+sys.stdin.reconfigure(encoding='utf-8') + Today = datetime.date.today()
# @@ -108,7 +110,7 @@ def ParseOpts(): elif opt[0] == '-p': CSVPrefix = opt[1] elif opt[0] == '-r': - print 'Filter on "%s"' % (opt[1]) + print('Filter on "%s"' % (opt[1])) FileFilter = re.compile(opt[1]) elif opt[0] == '-s': AuthorSOBs = 0 @@ -120,7 +122,7 @@ def ParseOpts(): ReportUnknowns = True elif opt[0] == '-x': CSVFile = open(opt[1], 'w') - print "open output file " + opt[1] + "\n" + print("open output file " + opt[1] + "\n") elif opt [0] == '-w': Aggregate = 'week' elif opt [0] == '-y': @@ -172,7 +174,7 @@ DateMap = { }
def AddDateLines(date, lines): if lines > 1000000: - print 'Skip big patch (%d)' % lines + print('Skip big patch (%d)' % lines) return try: DateMap[date] += lines @@ -208,6 +210,7 @@ class patch: self.reports = [ ] self.filetypes = {} self.files = [ ] + self.date = datetime.date(1970, 1, 1)
def addreviewer(self, reviewer): self.reviews.append(reviewer) @@ -389,7 +392,7 @@ def GripeAboutAuthorName(name): if name in GripedAuthorNames: return GripedAuthorNames.append(name) - print '%s is an author name, probably not what you want' % (name) + print('%s is an author name, probably not what you want' % (name))
def ApplyFileFilter(line, ignore): # @@ -462,14 +465,14 @@ TotalChanged = TotalAdded = TotalRemoved = 0 # # Snarf changesets. # -print >> sys.stderr, 'Grabbing changesets...\r', +print('Grabbing changesets...\r', file=sys.stderr)
patches = logparser.LogPatchSplitter(sys.stdin) printcount = CSCount = 0
for logpatch in patches: if (printcount % 50) == 0: - print >> sys.stderr, 'Grabbing changesets...%d\r' % printcount, + print('Grabbing changesets...%d\r' % printcount, file=sys.stderr) printcount += 1
# We want to ignore commits on svn tags since in Subversion @@ -528,7 +531,7 @@ for logpatch in patches: CSCount += 1 csvdump.AccumulatePatch(p, Aggregate) csvdump.store_patch(p) -print >> sys.stderr, 'Grabbing changesets...done ' +print('Grabbing changesets...done ', file=sys.stderr)
if DumpDB: database.DumpDB() diff --git a/gitlog.py b/gitlog.py index 71efee1..44c9ffe 100644 --- a/gitlog.py +++ b/gitlog.py @@ -3,7 +3,7 @@ # # Someday this will be the only version of grabpatch, honest. # -import re, rfc822, datetime +import re, email.utils, datetime from patterns import patterns import database
@@ -61,7 +61,7 @@ S_DONE = 5 def get_header(patch, line, input): if line == '': if patch.author == '': - print 'Funky auth line in', patch.commit + print('Funky auth line in', patch.commit) patch.author = database.LookupStoreHacker('Unknown', 'unknown@hacker.net') return S_DESC @@ -72,13 +72,13 @@ def get_header(patch, line, input): else: m = patterns['date'].match(line) if m: - dt = rfc822.parsedate(m.group(2)) + dt = email.utils.parsedate(m.group(2)) patch.date = datetime.date(dt[0], dt[1], dt[2]) return S_HEADER
def get_desc(patch, line, input): if not line: - print 'Missing desc in', patch.commit + print('Missing desc in', patch.commit) return S_CHANGELOG patch.desc = line line = getline(input) @@ -188,7 +188,7 @@ def grabpatch(input): return None m = patterns['commit'].match(line) if not m: - print 'noncommit', line + print('noncommit', line) return None p = patch(m.group(1)) state = S_HEADER @@ -199,7 +199,7 @@ def grabpatch(input): line = getline(input) if line is None: if state != S_NUMSTAT: - print 'Ran out of patch', state + print('Ran out of patch', state) return None return p state = grabbers[state](p, line, input) diff --git a/grabdates b/grabdates index 3155792..f67ab67 100755 --- a/grabdates +++ b/grabdates @@ -1,17 +1,18 @@ -#!/usr/bin/pypy +#!/usr/bin/python3 # -*- python -*- # # git log | grep '^Date:' | grabdates # -import sys +import io, sys from utils import accumulator
tzs = accumulator() +input_stream=io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore')
-for line in sys.stdin.readlines(): +for line in input_stream.readlines(): split = line.split() if split[0] != 'Date:': - print 'Funky line: ', line + print('Funky line: ', line) sys.exit(1) zone = int(split[-1]) tzs.incr(zone) @@ -19,4 +20,4 @@ for line in sys.stdin.readlines(): zones = tzs.keys() zones.sort() for zone in zones: - print '%05d %d' % (zone, tzs[zone]) + print('%05d %d' % (zone, tzs[zone])) diff --git a/inittags b/inittags index 3e82913..97261c2 100755 --- a/inittags +++ b/inittags @@ -1,4 +1,4 @@ -#!/usr/bin/pypy +#!/usr/bin/python3 # -*- python -*- # # Generate a database of commits and major versions they went into. @@ -49,10 +49,10 @@ args = p.parse_args() # Pull in an existing database if requested. # if args.load: - DB = pickle.load(open(args.database, 'r')) + DB = pickle.load(open(args.database, 'rb')) else: DB = { } -out = open(args.database, 'w') +out = open(args.database, 'wb') if args.repository: os.chdir(args.repository)
@@ -77,6 +77,6 @@ for v in range(1, final): GetCommits('v4.%d..v4.%d' % (v - 1, v), 'v4.%d' % (v)) GetCommits('v4.%d..' % (final - 1), 'v4.%d' % (final))
-print '\nFound %d commits' % (len(DB.keys())) +print('\nFound %d commits' % (len(DB.keys()))) pickle.dump(DB, out) out.close() diff --git a/linetags b/linetags index 5106be2..f31327c 100755 --- a/linetags +++ b/linetags @@ -1,4 +1,4 @@ -#!/usr/bin/pypy +#!/usr/bin/python3 # # Find out how many lines were introduced in each major release. # @@ -12,16 +12,17 @@ # This file may be distributed under the terms of the GNU General # Public License, version 2. # -import sys, re, os, pickle +import io, sys, re, os, pickle
CommitLines = { }
commitpat = re.compile(r'^([\da-f][\da-f]+) ')
def GetCommitLines(file): - print file + print(file) blame = os.popen('git blame -p ' + file, 'r') - for line in blame.readlines(): + input_stream=io.TextIOWrapper(blame.buffer, encoding='utf-8', errors='ignore') + for line in input_stream.readlines(): m = commitpat.search(line) # # All-zero commits mean we got fed a file that git doesn't @@ -44,12 +45,12 @@ def CommitToTag(commit): try: return DB[commit] except KeyError: - print 'Missing commit %s' % (commit) + print('Missing commit %s' % (commit)) return 'WTF?'
TagLines = { } def MapCommits(): - print 'Mapping tags...' + print('Mapping tags...') for commit in CommitLines.keys(): tag = CommitToTag(commit) try: @@ -66,7 +67,7 @@ if len(sys.argv) != 2: # # Grab the tags/version database. # -dbf = open('committags.db', 'r') +dbf = open('committags.db', 'rb') DB = pickle.load(dbf) dbf.close()
@@ -79,7 +80,7 @@ for file in files.readlines(): MapCommits() # print TagLines tags = TagLines.keys() -tags.sort() +tags = sorted(tags) for tag in tags: out.write('%s %d\n' % (tag, TagLines[tag])) out.close() diff --git a/logparser.py b/logparser.py index b375034..548390c 100644 --- a/logparser.py +++ b/logparser.py @@ -17,7 +17,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
-import sys +import io, sys from patterns import patterns
class LogPatchSplitter: @@ -35,13 +35,14 @@ class LogPatchSplitter:
def __init__(self, fd): self.fd = fd + self.input_stream=io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='ignore') self.buffer = None self.patch = []
def __iter__(self): return self
- def next(self): + def __next__(self): patch = self.__grab_patch__() if not patch: raise StopIteration @@ -76,7 +77,7 @@ class LogPatchSplitter:
patch.append(line) self.buffer = None - line = self.fd.readline() + line = self.input_stream.readline()
return patch
@@ -85,6 +86,6 @@ if __name__ == '__main__': patches = LogPatchSplitter(sys.stdin)
for patch in patches: - print '---------- NEW PATCH ----------' + print('---------- NEW PATCH ----------') for line in patch: - print line, + print(line,) diff --git a/reports.py b/reports.py index d7a96bc..9a2ab2f 100644 --- a/reports.py +++ b/reports.py @@ -69,11 +69,11 @@ def EndReport(): # # Comparison and report generation functions. # -def ComparePCount(h1, h2): - return len(h2.patches) - len(h1.patches) +def ComparePCount(h1): + return - len(h1.patches)
def ReportByPCount(hlist, cscount): - hlist.sort(ComparePCount) + hlist = sorted(hlist, key=ComparePCount) count = 0 BeginReport('Developers with the most changesets') for h in hlist: @@ -87,11 +87,11 @@ def ReportByPCount(hlist, cscount): break EndReport()
-def CompareLChanged(h1, h2): - return h2.changed - h1.changed +def CompareLChanged(h1): + return - h1.changed
def ReportByLChanged(hlist, totalchanged): - hlist.sort(CompareLChanged) + hlist = sorted(hlist, key=CompareLChanged) count = 0 BeginReport('Developers with the most changed lines') for h in hlist: @@ -103,11 +103,11 @@ def ReportByLChanged(hlist, totalchanged): break EndReport()
-def CompareLRemoved(h1, h2): - return (h2.removed - h2.added) - (h1.removed - h1.added) +def CompareLRemoved(h1): + return h1.added - h1.removed
def ReportByLRemoved(hlist, totalremoved): - hlist.sort(CompareLRemoved) + hlist= sorted(hlist, key=CompareLRemoved) count = 0 BeginReport('Developers with the most lines removed') for h in hlist: @@ -121,11 +121,11 @@ def ReportByLRemoved(hlist, totalremoved): break EndReport()
-def CompareEPCount(e1, e2): - return e2.count - e1.count +def CompareEPCount(e1): + return - e1.count
def ReportByPCEmpl(elist, cscount): - elist.sort(CompareEPCount) + elist = sorted(elist, key=CompareEPCount) count = 0 BeginReport('Top changeset contributors by employer') for e in elist: @@ -137,11 +137,11 @@ def ReportByPCEmpl(elist, cscount): EndReport()
-def CompareELChanged(e1, e2): - return e2.changed - e1.changed +def CompareELChanged(e1): + return - e1.changed
def ReportByELChanged(elist, totalchanged): - elist.sort(CompareELChanged) + elist = sorted(elist, key=CompareELChanged) count = 0 BeginReport('Top lines changed by employer') for e in elist: @@ -154,11 +154,11 @@ def ReportByELChanged(elist, totalchanged):
-def CompareSOBs(h1, h2): - return len(h2.signoffs) - len(h1.signoffs) +def CompareSOBs(h1): + return - len(h1.signoffs)
def ReportBySOBs(hlist): - hlist.sort(CompareSOBs) + hlist = sorted(hlist, key=CompareSOBs) totalsobs = 0 for h in hlist: totalsobs += len(h.signoffs) @@ -176,11 +176,11 @@ def ReportBySOBs(hlist): # # Reviewer reporting. # -def CompareRevs(h1, h2): - return len(h2.reviews) - len(h1.reviews) +def CompareRevs(h1): + return - len(h1.reviews)
def ReportByRevs(hlist): - hlist.sort(CompareRevs) + hlist = sorted(hlist, key=CompareRevs) totalrevs = 0 for h in hlist: totalrevs += len(h.reviews) @@ -198,11 +198,11 @@ def ReportByRevs(hlist): # # tester reporting. # -def CompareTests(h1, h2): - return len(h2.tested) - len(h1.tested) +def CompareTests(h1): + return - len(h1.tested)
def ReportByTests(hlist): - hlist.sort(CompareTests) + hlist = sorted(hlist, key=CompareTests) totaltests = 0 for h in hlist: totaltests += len(h.tested) @@ -217,11 +217,11 @@ def ReportByTests(hlist): break EndReport()
-def CompareTestCred(h1, h2): - return h2.testcred - h1.testcred +def CompareTestCred(h1): + return - h1.testcred
def ReportByTestCreds(hlist): - hlist.sort(CompareTestCred) + hlist = sorted(hlist, key=CompareTestCred) totaltests = 0 for h in hlist: totaltests += h.testcred @@ -240,11 +240,11 @@ def ReportByTestCreds(hlist): # # Reporter reporting. # -def CompareReports(h1, h2): - return len(h2.reports) - len(h1.reports) +def CompareReports(h1): + return - len(h1.reports)
def ReportByReports(hlist): - hlist.sort(CompareReports) + hlist = sorted(hlist, key=CompareReports) totalreps = 0 for h in hlist: totalreps += len(h.reports) @@ -259,11 +259,11 @@ def ReportByReports(hlist): break EndReport()
-def CompareRepCred(h1, h2): - return h2.repcred - h1.repcred +def CompareRepCred(h1): + return - h1.repcred
def ReportByRepCreds(hlist): - hlist.sort(CompareRepCred) + hlist = sorted(hlist, key=CompareRepCred) totalreps = 0 for h in hlist: totalreps += h.repcred @@ -280,13 +280,9 @@ def ReportByRepCreds(hlist): # # Versions. # -def CompareVersionCounts(h1, h2): - if h1.versions and h2.versions: - return len(h2.versions) - len(h1.versions) - if h2.versions: - return 1 +def CompareVersionCounts(h1): if h1.versions: - return -1 + return - h1.version return 0
def MissedVersions(hv, allv): @@ -295,7 +291,7 @@ def MissedVersions(hv, allv): return ' '.join(missed)
def ReportVersions(hlist): - hlist.sort(CompareVersionCounts) + hlist = sorted(hlist, CompareVersionCounts) BeginReport('Developers represented in the most kernel versions') count = 0 allversions = hlist[0].versions @@ -307,11 +303,11 @@ def ReportVersions(hlist): EndReport()
-def CompareESOBs(e1, e2): - return e2.sobs - e1.sobs +def CompareESOBs(e1): + return - e1.sobs
def ReportByESOBs(elist): - elist.sort(CompareESOBs) + elist = sorted(elist, key=CompareESOBs) totalsobs = 0 for e in elist: totalsobs += e.sobs @@ -325,11 +321,11 @@ def ReportByESOBs(elist): break EndReport()
-def CompareHackers(e1, e2): - return len(e2.hackers) - len(e1.hackers) +def CompareHackers(e1): + return - len(e1.hackers)
def ReportByEHackers(elist): - elist.sort(CompareHackers) + elist = sorted(elist, key=CompareHackers) totalhackers = 0 for e in elist: totalhackers += len(e.hackers) @@ -413,9 +409,9 @@ def ReportByFileType(hacker_list): total[filetype] = [added, removed, []]
# Print a summary by hacker - print h.name + print(h.name) for filetype, counters in by_hacker.iteritems(): - print '\t', filetype, counters + print('\t', filetype, counters) h_added = by_hacker[filetype][patch.ADDED] h_removed = by_hacker[filetype][patch.REMOVED] total[filetype][2].append([h.name, h_added, h_removed]) @@ -423,14 +419,14 @@ def ReportByFileType(hacker_list): # Print the global summary BeginReport('Contributions by type and developers') for filetype, (added, removed, hackers) in total.iteritems(): - print filetype, added, removed + print(filetype, added, removed) for h, h_added, h_removed in hackers: - print '\t%s: [%d, %d]' % (h, h_added, h_removed) + print('\t%s: [%d, %d]' % (h, h_added, h_removed))
# Print the very global summary BeginReport('General contributions by type') for filetype, (added, removed, hackers) in total.iteritems(): - print filetype, added, removed + print(filetype, added, removed)
# # The file access report is a special beast. diff --git a/stablefixes b/stablefixes index 6325597..06a36f4 100755 --- a/stablefixes +++ b/stablefixes @@ -1,4 +1,4 @@ -#!/usr/bin/pypy +#!/usr/bin/python3 # -*- python -*- # # Read through a set of patches and see how many of them are fixes @@ -100,8 +100,8 @@ while patch: FindRefs(patch) patch = gitlog.grabpatch(sys.stdin)
-print 'Found %d patches, %d fixes' % (Npatches, len(Fixes)) -print '%d had no upstream reference' % (len(UpstreamMissing)) +print('Found %d patches, %d fixes' % (Npatches, len(Fixes))) +print('%d had no upstream reference' % (len(UpstreamMissing)))
# # Now see how many fixes have been seen before. @@ -128,4 +128,4 @@ for id in Ids: nfound += 1 out.write('</table>') out.close() -print 'Found %d refixes' % (nfound) +print('Found %d refixes' % (nfound)) diff --git a/treeplot b/treeplot index 688c150..910260a 100755 --- a/treeplot +++ b/treeplot @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 # # git log --pretty="%H %P" | this program # See option descriptions at bottom @@ -13,7 +13,7 @@ # "git clone --reference" is a relatively easy way to come up with such # a tree without redownloading the whole mess. # -import sys, subprocess, argparse, pickle +import io, sys, subprocess, argparse, pickle import graphviz import patterns
@@ -92,7 +92,8 @@ class Merge: def ingest_commits(src): count = 0 expected = 'nothing yet' - for line in src.readlines(): + input_stream=io.TextIOWrapper(src.buffer, encoding='utf-8', errors='ignore') + for line in input_stream.readlines(): sline = line[:-1].split() commit = sline[0] is_merge = (len(sline) > 2) @@ -222,9 +223,9 @@ def dumptree(start, indent = ''): int = '' if start.internal: int = 'I: ' - print '%s%s%s: %d/%d %s' % (indent, int, start.id[:10], + print('%s%s%s: %d/%d %s' % (indent, int, start.id[:10], len(start.merges), len(start.commits), - start.tree) + start.tree)) for merge in start.merges: dumptree(merge, indent + ' ')
@@ -237,12 +238,12 @@ def dumpflow(tree, indent = '', seen = []): srctrees.sort(lambda t1, t2: srcs[t2] - srcs[t1]) for src in srctrees: if src in seen: - print 'Skip', src, srcs[src], seen + print('Skip', src, srcs[src], seen) else: if src in SignedTrees: - print '%s%4d ** %s' % (indent, srcs[src], src) + print('%s%4d ** %s' % (indent, srcs[src], src)) else: - print '%s%4d %s' % (indent, srcs[src], src) + print('%s%4d %s' % (indent, srcs[src], src)) dumpflow(src, indent = indent + ' ', seen = seen + [tree])
def SigStats(tree): @@ -255,9 +256,9 @@ def SigStats(tree): else: upulls += 1 ucommits += srcs[src] - print '%d repos total, %d signed, %d unsigned' % (spulls + upulls, - spulls, upulls) - print ' %d commits from signed, %d from unsigned' % (scommits, ucommits) + print('%d repos total, %d signed, %d unsigned' % (spulls + upulls, + spulls, upulls)) + print(' %d commits from signed, %d from unsigned' % (scommits, ucommits))
# # Graphviz. @@ -379,11 +380,11 @@ else: zorch_internals(Mainline) #dumptree(Mainline) Treecounts['mainline'] = { 'Applied by Linus': len(Mainline.commits) } -print 'total commits', count_commits(Mainline) +print('total commits', count_commits(Mainline)) tree_stats(Mainline) if args.trim: trim_trees(args.trim) -print 'Tree flow' +print('Tree flow') dumpflow('mainline') if args.gvoutput: GV_out(args.gvoutput)

On Sat, Jul 16, 2022 at 09:43:15AM +0200, Heinrich Schuchardt wrote:
Python 2 is beyond end of life.
gitdm works fine. The other scripts may need further testing.
Signed-off-by: Heinrich Schuchardt heinrich.schuchardt@canonical.com
Right, so I posted the merge commit here: https://patchwork.ozlabs.org/project/uboot/patch/20220707192215.509444-1-tri... to bring us up to 0b8875225750 of upstream (git://git.lwn.net/gitdm.git) which already has been converted to python3.
participants (2)
-
Heinrich Schuchardt
-
Tom Rini