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

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
#!/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
#
# Function to call uncrustify, it returns the re-formated code and
# any errors
#
def uncrustify_file(filename):
args = ("uncrustify", "-c", "uncrustify.cfg", "-f", filename)
popen = subprocess.Popen(args, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
popen.wait()
return [popen.stdout.readlines(),popen.stderr.read()]
# 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"]
#
# This function talks to bzr, and gets the list of modified files
#
# Function to call uncrustify, it returns the re-formated code and
# any errors
#
def bzr_modified():
modifieds = []
args = ("bzr","status")
def uncrustify_file(self, filename=None):
try:
args = ("uncrustify", "-c", "uncrustify.cfg", "-f", filename)
popen = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
popen.wait()
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
def bzr_modified(self):
modified_files = []
args = ("bzr", "status")
try:
popen = subprocess.Popen(args, stdout=subprocess.PIPE)
popen.wait()
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
for line in output:
line = line.rstrip("\r\n")
if line.endswith(":"): in_modifieds = False
if line.endswith(":"):
in_modifieds = False
if line.startswith("modified:"):
in_modifieds = True
continue
......@@ -37,57 +52,83 @@ def bzr_modified():
continue
if in_modifieds:
modifieds.append( line.lstrip("\t ").rstrip("\t ") )
modified_files.append(line.lstrip("\t ").rstrip("\t "))
return modified_files
return modifieds
def extension(filename):
def extension(self, filename):
return os.path.splitext(filename)[1][1:].strip().lower()
def read_file(filename):
f = open(filename,'r')
def read_file(self, filename):
f = open(filename, 'r')
data = f.readlines()
f.close()
return data
def ask_user(filename):
msg = 'Shall I clean %s ?'%filename
def ask_user(self, filename):
msg = 'Shall I clean %s ?' % filename
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 file in modified_files:
for filename in modified_files:
if self.extension(filename) in self.file_filter:
self.compare_and_suggest(filename)
if extension(file) in EXTENSIONS:
def compare_and_suggest(self,filename):
# if it is a 'c' file try to uncrustify
[uncrustified, errors] = self.uncrustify_file(filename)
[uncrustified,errors] = uncrustify_file(file)
original = read_file(file)
if not (uncrustified and errors):
print "Program end"
# problem in uncrustify
return
if len(errors.split("\n"))>2:
print "There was a problem processing "+file+":"+errors
continue
original = self.read_file(filename)
if uncrustified==original:
print file + " looks perfect!, well done!"
if len(errors.split("\n")) > 2:
print "There was a problem processing " + filename + ":" + errors
return
if uncrustified == original:
print filename + " looks perfect!, well done!"
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:
print line.rstrip("\r\n")
print ""
reply = self.ask_user(filename)
reply = ask_user(file)
if reply in ["y","yes"]:
f = open(file,'w')
if reply in ["y", "yes"]:
f = open(filename, 'w')
for line in uncrustified:
f.write(line)
f.close()
print file + " UPDATED"
print filename + " UPDATED"
if reply in ["e", "ed", "edit"]:
os.system("$EDITOR " + filename)
print ""
if reply in ["e","ed","edit"]:
os.system("$EDITOR "+file)
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()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment