Commit da9e6b16 authored by Miguel Angel Ajo's avatar Miguel Angel Ajo
Browse files

checkcoding.py refactor from Edwin van den Oetelaar, some extra refactorings...

checkcoding.py refactor from Edwin van den Oetelaar, some extra refactorings by me, improvement suggestions from Carl Poirier
parent 3e8bd559
Loading
Loading
Loading
Loading
+128 −87
Original line number Original line Diff line number Diff line
#!/usr/bin/env python
#!/usr/bin/env python
import subprocess, os, difflib
# Created for KiCad project by Miguel
# Some modifications by Edwin
# GPL2


EXTENSIONS=["cpp","cxx","h","hpp","c"]
import subprocess
import os
import difflib


# class for checking and uncrustifying files
# defaults to cpp,cxx,h,hpp and c files
class coding_checker(object):
    file_filter = ["cpp", "cxx", "h", "hpp", "c"]


#
    # Function to call uncrustify, it returns the re-formated code and
    # Function to call uncrustify, it returns the re-formated code and
    # any errors
    # any errors
    #
    #


def uncrustify_file(filename):
    def uncrustify_file(self, filename=None):
        try:
            args = ("uncrustify", "-c", "uncrustify.cfg", "-f", filename)
            args = ("uncrustify", "-c", "uncrustify.cfg", "-f", filename)
            popen = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            popen = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            popen.wait()
            popen.wait()
            return [popen.stdout.readlines(), popen.stderr.read()]
            return [popen.stdout.readlines(), popen.stderr.read()]
        except OSError as e:
            print "System returned : {e}\nCould not run uncrustify. Is it installed?".format(e=e.strerror)
            return [None, None]


#
    # This function runs bzr, and gets the list of modified files
# This function talks to bzr, and gets the list of modified files
    def bzr_modified(self):
#
        modified_files = []

def bzr_modified():
	modifieds = []
        args = ("bzr", "status")
        args = ("bzr", "status")
        try:
            popen = subprocess.Popen(args, stdout=subprocess.PIPE)
            popen = subprocess.Popen(args, stdout=subprocess.PIPE)
            popen.wait()
            popen.wait()
            output = popen.stdout.readlines()
            output = popen.stdout.readlines()
        except OSError as e:
            print "System returned : {e}\nCould not run bzr. Is it installed?".format(e=e.strerror)
            return None


        in_modifieds = False
        in_modifieds = False
        for line in output:
        for line in output:
            line = line.rstrip("\r\n")
            line = line.rstrip("\r\n")
		if line.endswith(":"): in_modifieds = False
            if line.endswith(":"):
                in_modifieds = False
            if line.startswith("modified:"):
            if line.startswith("modified:"):
                in_modifieds = True
                in_modifieds = True
                continue
                continue
@@ -37,57 +52,83 @@ def bzr_modified():
                continue
                continue


            if in_modifieds:
            if in_modifieds:
			modifieds.append( line.lstrip("\t ").rstrip("\t ") )
                modified_files.append(line.lstrip("\t ").rstrip("\t "))


	return modifieds
        return modified_files


def extension(filename):

    def extension(self, filename):
        return os.path.splitext(filename)[1][1:].strip().lower()
        return os.path.splitext(filename)[1][1:].strip().lower()


def read_file(filename):

    def read_file(self, filename):
        f = open(filename, 'r')
        f = open(filename, 'r')
        data = f.readlines()
        data = f.readlines()
        f.close()
        f.close()
        return data
        return data


def ask_user(filename):

    def ask_user(self, filename):
        msg = 'Shall I clean %s ?' % filename
        msg = 'Shall I clean %s ?' % filename
        return raw_input("%s (y/N/E) " % msg).lower()
        return raw_input("%s (y/N/E) " % msg).lower()




modified_files = bzr_modified()
    def main(self):
        # make list of modified file names
        modified_files = self.bzr_modified()

        if not modified_files:
            print "No modified files\n"
        else:


            for filename in modified_files:
                if self.extension(filename) in self.file_filter:
                    self.compare_and_suggest(filename)


for file in modified_files:
    def compare_and_suggest(self,filename):
        # if it is a 'c' file try to uncrustify
        [uncrustified, errors] = self.uncrustify_file(filename)


	if extension(file) in EXTENSIONS:
        if not (uncrustified and errors):
            print "Program end"
            # problem in uncrustify
            return


		[uncrustified,errors] = uncrustify_file(file)
        original = self.read_file(filename)
		original = read_file(file)


        if len(errors.split("\n")) > 2:
        if len(errors.split("\n")) > 2:
			print "There was a problem processing "+file+":"+errors
            print "There was a problem processing " + filename + ":" + errors
			continue
            return


        if uncrustified == original:
        if uncrustified == original:
			print file + " looks perfect!, well done!"
            print filename + " looks perfect!, well done!"
        else:
        else:
			print "Suggestions for: "+file
            print "Suggestions for: " + filename


			diff = difflib.unified_diff(original,uncrustified,file,file+".uncrustified")
            diff = difflib.unified_diff(original, uncrustified, filename, filename + ".uncrustified")


            for line in diff:
            for line in diff:
                print line.rstrip("\r\n")
                print line.rstrip("\r\n")

            print ""
			reply = ask_user(file)
            reply = self.ask_user(filename)


            if reply in ["y", "yes"]:
            if reply in ["y", "yes"]:
				f = open(file,'w')
                f = open(filename, 'w')
                for line in uncrustified:
                for line in uncrustified:
                    f.write(line)
                    f.write(line)
                f.close()
                f.close()
				print file + " UPDATED"
                print filename + " UPDATED"


            if reply in ["e", "ed", "edit"]:
            if reply in ["e", "ed", "edit"]:
				os.system("$EDITOR "+file)
                os.system("$EDITOR " + filename)

            print ""


if __name__ == '__main__':
    print "This program tries to do 2 things\n" \
          "1) call bzr to find changed files (related to the KiCad project)\n" \
          "2) call uncrustify on the changed files (to make the files comply with coding standards)\n"


    cc = coding_checker()
    cc.main()