mtd/scripts creatediffs.py,NONE,1.1 mtdusers.txt,NONE,1.1

gleixner at infradead.org gleixner at infradead.org
Wed Jul 6 16:14:20 EDT 2005


Update of /home/cvs/mtd/scripts
In directory phoenix.infradead.org:/tmp/cvs-serv2647

Added Files:
	creatediffs.py mtdusers.txt 
Log Message:
CVS commit mailinglist to git patching script. 

Works probably only on my box, but it's not hard to fix the
few hardcoded manifestos of my laziness :)



--- NEW FILE creatediffs.py ---
#!/usr/bin/env python
#
# Scan a mbox of CVS commit Mailinglist and display the
# patches (including the patch --dry-run messages), 
# convert CVS users to real names, create patchscripts
# to apply to the mtd git repository ....
# 
# (C) 2005 Thomas Gleixner <tglx at linutronix.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#

import os
import sys
import getopt
import difflib
import email
import mailbox
import string
from Tkinter import *

# The script should be invoked from mtd cvs root
mtdusers = "scripts/mtdusers.txt"
# Should be a commandline argument
mtdrepo = "~/work/git-repos/mtd-2.6"
userhash = {}

# Make this configurable !!
mysign = ["Thomas Gleixner", "tglx at linutronix.de"]

# Fix me: read this from the treewalk/patchin xml config
includepaths = ["drivers", "fs", "include"]
excludepatterns = ["jffs3","ecos"]

# Print the usage information
def usage(res):
    print "USAGE:"
    print "creatediffs.py <-m mtdusers> mailbox mailnr"
    print "-m mtdusers    supply a list of mtd users (default:scripts/mtdusers.txt)"
    print "mailbox containing MTD CVS Mailinglist"

#    print "targetdir to put the diffs and logs"
    sys.exit(res)

# Helper to run a shell command
def doShellCommand(cmd, data=None):
    (inp, out, err) = os.popen3(cmd)
    if data:
        inp.write(data)
    inp.close()
    res = out.read()
    out.close()
    res = res + "\n" + err.read()
    err.close()
    return res

# The commit class
class commitView:

    def __init__(self, root, mbox):
        self.root = root
        fd = open(mbox,"r")
        mbx = mailbox.PortableUnixMailbox(fd, email.message_from_file)
        #mbx = mailbox.Maildir(mbox, email.message_from_file)
        self.entries= []
        msg = mbx.next()
        while msg:
            self.entries.append(msg)
            msg = mbx.next()
        self.entries.reverse()
        fd.close()    
        f1 = Frame(root)
        f1.pack()
        f2 = Frame(root)
        f2.pack()
        f3 = Frame(root)
        f3.pack()
        f4 = Frame(root)
        f4.pack()
        f5 = Frame(root)
        f5.pack()
        self.subject = StringVar()
        self.user = StringVar()
        self.realuser = StringVar()
        self.date = StringVar()
        Button(f1, text="Back", command=self.back).grid(row=0,column=0)
        Button(f1, text="Next", command=self.next).grid(row=0,column=1)
        Button(f1, text="Apply", command=self.apply).grid(row=0,column=2)
        self.signAuthor = IntVar()
        Checkbutton(f1, text="Add Author Signed-off", variable=self.signAuthor).grid(row=0,column=3)
        self.signOwn = IntVar()
        Checkbutton(f1, text="Add own Signed-off", variable=self.signOwn).grid(row=0,column=4)

        Label(f2, text="What").grid(row=0, column=0, sticky=W)
        Label(f2, textvariable = self.subject, justify=LEFT, relief=SUNKEN).grid(row=0, column=1, sticky=W)
        Label(f2, text="User").grid(row=1, column=0, sticky=W)
        Label(f2, textvariable = self.user, justify=LEFT, relief=SUNKEN).grid(row=1, column=1, sticky=W)
        Label(f2, text="Real user").grid(row=1, column=2, sticky=W)
        Label(f2, textvariable = self.realuser, justify=LEFT, relief=SUNKEN).grid(row=1, column=3, sticky=W)
        Label(f2, text="Date").grid(row=2, column=0, sticky=W)
        Label(f2, textvariable = self.date, justify=LEFT, relief=SUNKEN).grid(row=2, column=1, sticky=W)
        self.log = Text(f3)
        self.patch = Text(f4)
        self.patchres = Text(f5)

        self.curnr = -1
        self.next()

    def getMsg(self):
        self.log.delete(1.0,END)
        self.patch.delete(1.0,END)
        self.patchres.delete(1.0,END)
        print self.curnr
        msg = self.entries[self.curnr]

        subj = msg.get("Subject")
        print subj
        files = subj.split(" ", 1)
        self.patchpath = files[0].split("/",1)[1]
        self.files = files[1]
        print self.patchpath
        for p in excludepatterns:
            if subj.find(p) > 0:
                return 1

        valid = 0
        for p in includepaths:
            if self.patchpath.startswith(p):
                valid = 1
                break
        if valid == 0:
            return 1
        
        self.subject.set(subj)
        usr = msg.get("From")
        self.user.set(usr)
        if usr.find("<") > 0:
            usr = usr.split("<")[1][:-1]
        print usr
        self.usr = userhash.get(usr.split("@")[0],"???")
        self.realuser.set("%s %s" %(self.usr[0],self.usr[1]))
        self.cdate = msg.get("Date")
        self.date.set(self.cdate)
        body = msg.get_payload().splitlines()
        while len(body):
            line = body.pop(0).strip()
            if line.startswith("Log Message:"):
                break
        self.logmsg = ""
        while len(body):
            line = body.pop(0)
            if line.startswith("Index:"):
                break
            self.logmsg = self.logmsg + line + "\n"
        self.log.insert(END, self.logmsg)
        self.log.pack()
        self.patchmsg = ""
        while len(body):
            self.patchmsg = self.patchmsg + \
            body.pop(0).replace("Makefile.common", "Makefile") + "\n"
        self.patch.insert(END, self.patchmsg)
        self.patch.pack()

        # Try to apply the patch and display the results
        cmd = "patch -d %s/%s -p0 -f --verbose --dry-run" %(mtdrepo,self.patchpath)
        print cmd
        self.pres = doShellCommand(cmd, self.patchmsg)
        self.patchres.insert(END, self.pres)
        self.patchres.pack()
        return 0
        
    def apply(self):
        fd = open("%s/patchfromcvs.sh" %(mtdrepo), "w")
        files = self.files.strip()
        while len(files) > 0:
            try:
                fname, files = files.strip().split(",", 1)
                frev1, files = files.strip().split(",", 1)
                files = files.strip()
                if files.find(" ") > 0:
                    frev2, files = files.strip().split(" ", 1)
                else:
                    frev2 = files
                    files = ""
            except:
                break
            
            if frev1 == "NONE":
                fd.write("pushd %s\n" %(os.getcwd()))
                fd.write("cvs up -p -r%s %s/%s >%s/%s/%s\n" %(
                    frev2 ,self.patchpath, fname, mtdrepo, self.patchpath, fname))
                fd.write("popd\n")
                fd.write("cg-add %s/%s\n" %(self.patchpath, fname))
            elif frev2 == "NONE":
                fd.write("cg-rm %s/%s\n" %(self.patchpath, fname))
            else:
                fd.write("pushd %s\n" %(os.getcwd()))
                fd.write("cvs diff -u -r%s -r%s %s/%s >%s/cvspatch\n" %(
                    frev1, frev2, self.patchpath, fname, mtdrepo))
                fd.write("popd\n")
                fd.write("patch -p0 <cvspatch\n")
                fd.write("rm -f cvspatch\n")
            fd.write("find -iname *.rej\n")
            fd.write("find -iname *.orig\n")
            fd.write("cg-status\n")
        fd.close()
        
        fd = open(mtdrepo + "/.git/author", "w")
        fd.write('export GIT_AUTHOR_NAME="%s"\n' %(self.usr[0]))
        fd.write('export GIT_AUTHOR_EMAIL="%s"\n' %(self.usr[1]))
        fd.write('export GIT_AUTHOR_DATE="%s"\n' %(self.cdate))
        fd.close()
        fd = open(mtdrepo+"/.git/logmessage", "w")
        lines = self.log.get(1.0,END).splitlines()
        # Strip trailing newlines
        while len(lines) and len(lines[-1].strip()) == 0:
            lines.pop(-1)
        for line in lines:
            fd.write(line+"\n")
        if lines[-1].find("Signed") < 0:
            fd.write("\n")
        if self.signAuthor.get() == 1:
            fd.write("Signed-off-by: %s <%s>\n" %(self.usr[0], self.usr[1]))
        if self.signOwn.get() == 1:
            fd.write("Signed-off-by: %s <%s>\n" %(mysign[0], mysign[1]))
        fd.close()
        self.next()
        
    def next(self):
        if self.curnr == len(self.entries) - 1:
            return
        self.curnr = self.curnr + 1
        while self.getMsg() > 0:
            self.curnr = self.curnr + 1

    def back(self):
        if self.curnr == 0:
            return
        self.curnr = self.curnr - 1
        while self.getMsg() > 0:
            self.curnr = self.curnr - 1
        

# Here we go
# Parse the commandline
try:
    (options, arguments) = getopt.getopt(sys.argv[1:],'m:')
except getopt.GetoptError, ex:
    print
    print "ERROR:"
    print ex.msg
    usage(1)

for option, value in options:
    if option == "-m":
        mtdusers = value
    elif option == '-h':
        usage(0)

if len(arguments) != 1:
    usage(1)

# Get filenames
mbox = arguments[0]

# Read the user list
fd = open(mtdusers,"r")
lines = fd.readlines()
fd.close()
for line in lines:
    if line.startswith("#"):
    	continue
    if len(line) > 0:
        usr,name,mail=line.strip().split(":")
        userhash[usr] = [name,mail]

root = Tk()

viewer = commitView(root, mbox)
root.mainloop()


--- NEW FILE mtdusers.txt ---
# user at infradead.org : Real Name : Real Mail
dmarlin:David A. Marlin:dmarlin at redhat.com
dedekind:Artem B. Bityuckiy:dedekind at infradead.org
bjd:Ben Dooks:ben at simtec.co.uk
hvr:Herbert Valerio Riedel:hvr at inso.tuwien.ac.at
jonashg:Jonas Holmberg:jonas.holmberg at axis.com
rmk:Russell King:linux at arm.linux.org.uk
joern:Joern Engel:joern at wohnheim.fh-wedel.de
dvrabel:David Vrabel:dvrabel at arcom.com
hammache:Estelle Hammache:estelle.hammache at st.com
andrew:Andrew Victor:andrew at sanpeople.com
dwmw2:David Woodhouse:dwmw2 at infradead.org
nico:Nicolas Pitre:nico at cam.org
jwboyer:Josh Boyer:jdub at us.ibm.com
rpurdie:Richard Purdie:rpurdie at rpsys.net
gleixner:Thomas Gleixner:tglx at linutronix.de
havasi:Ferenc Havasi:havasi at inf.u-szeged.hu
lennert:Lennert Buytenhek:buytenh at wantstofly.org
lavinen:Jarkko Lavinen:jarkko.lavinen at nokia.com
dbrown:Dan Brown:dan_brown at ieee.org
tpoynor:Todd Poynor:tpoynor at mvista.com
ebiedermann:Eric W. Biederman:ebiederman at lnxi.com
pavlov:Andrew Victor:andrew at sanpeople.com
ppopov:Pete Popov:ppopov at pacbell.net
sean:Sean Young:sean at mess.org
macro:Maciej W. Rozycki:macro at infradead.org





More information about the linux-mtd-cvs mailing list