- import BeautifulSoup
- import os.path as op
-
- #path of the csproj file
- filepath = "absolute\path\to\csproj"
- #the directory of the files
- directory = op.split(filepath)[0]
-
- num_of_comments = 0
- num_of_LOC = 0
- raw_num_of_lines = 0
-
- with open(filepath) as f:
-
- soup = BeautifulSoup.BeautifulStoneSoup(f.read())
-
- #find all the files in the projet (that get compiled)
- compileTags = soup.findAll('compile')
-
-
- #a list to store all the file names
- csNames = []
-
- #loop over all the tags
- for elem in compileTags:
- #find the ones with include in in
- for attr in elem.attrs:
- if attr[0] == 'include':
- csPath = attr[1]
- #print csPath
- csNames.append(csPath)
-
- ## now we've got all the relative positions, now to use the read the files
- #since we've got the filepath of the csproj, and we assume the other files are
- #in the same folder or lower, we can split filepath up and use it as a
- # root directory
-
- #make sure each file exists. Race condition though, should use something
- # else isntead. see: http://stackoverflow.com/a/85237/541208
- # hard crashes if the files don't exist.
- for name in csNames:
- #could format the strings to speed things up a bit instead of conct'ing
- fullpath = r"{}\\{}".format(directory, name)
- assert op.exists(fullpath)
- print fullpath + ' exists'
-
- #now, just have to check if a line in the cs files starts with a '\\' or not.
- # you can make changes to allow it to search to '\* *\' comment blocks. I don't
- # use them at all.
-
- for name in csNames:
- with open(fullpath) as f:
- for line in f.readlines():
- #raw lines
- raw_num_of_lines += 1
- #lines with any code in it
- if line.strip():
- num_of_LOC += 1
- if line.strip().startswith(r"//"):
- #save the comment to a list. Only saving one total file.
- # can easily customize it to keep stats for each file
- #print 'a comment!'
- num_of_comments += 1
-
-
- print "Found {} comments, where a comment was a line starting with //.".format(num_of_comments)
- print "Found {} lines total, with {} lines with text in them.".format(raw_num_of_lines, num_of_LOC)