소스품질에 걸린 '비어있는 catch 블락'건 일괄 처리하기 위해 몇 광년만에 파이썬 코딩 중. 우선 비어있거나, Comment 만 있는(이클립스 기본 템플릿 설정에 의해서 //ToDo 같은게 자동으로 생성된 경우들 있을 듯 해서 또는 /* ... */ 이런 식을 코멘트만 있는 경우도 있겠지 싶어서) 경우를 찾는 것까지 + 빈 catch 블록에 log.debug 구문 삽입하는 기능.
#-*- coding: utf-8 -*-
import re
import os
regex = re.compile(r"(catch\s*\([^\)]*\)\s*\{)((/\*(.|[\r\n])*?\*/)|\s|(\/\/.*))*\}")
regexWord = re.compile(r"\w+")
wdir = 'D:\\tmp\\emptyc1'
def repl(matchobj):
catch_str = matchobj.group(1)
txt = re.findall(regexWord, catch_str)
# print(catch_str, " : ", matchobj.start())
indent = " " * 8
indent1 = " " * 12
comment = ""
if matchobj.group(3) != None:
comment = indent1 + matchobj.group(3) + "\n"
if matchobj.group(5) != None:
comment = indent1 + matchobj.group(5) + "\n"
return catch_str + "\n" + indent1 + "log.debug(" + txt[2] + ".toString());\n" + comment + indent + "}"
def emptyCatch(cmd):
for dirpath, dirname, filename in os.walk(wdir):
for fname in filename:
if fname.endswith(".java"):
path = os.path.join(dirpath, fname)
strg = open(path, encoding='UTF8').read()
# strg = open(path).read()
if cmd == "R":
listEmptyCatch(path, strg)
elif cmd == "U":
replaceEmptyCatch(path, strg)
def listEmptyCatch(path, strg):
matches = regex.finditer(strg)
for m in matches:
print(path, " : ", m.group())
def replaceEmptyCatch(path, strg):
if re.search(regex, strg):
strg = re.sub(regex, repl, strg)
f = open(path, 'w')
f.write(strg)
f.close()
emptyCatch("U")
처음 코드 짜서 실제 작업 대상인 프로젝트의 자바 소스들에 적용했더니 인코딩 문제 발생. utf8 로 인코딩 적용해주고 다시 했더니 잘 되다가 이상하게 몇 파일에서만 또다시 인코딩 문제 발생. 그래서 strg = open(path, encoding='UTF-8', errors="surrogateescape").read() 이런 식으로 errors="surrogateescape" 옵션 추가해줬더니 잘 되네요. surrogateescape 옵션이 정확히 어떤 용도인지 혹 아시는 분 계신가요?
September 11th, 2017
'Slack 채널 정리' 카테고리의 다른 글
go - db 데이터 json 형식으로 kafka publish (0) | 2019.11.29 |
---|---|
실패한 브라우저 탭 갯수 제한 스크립트 (0) | 2019.11.28 |
바탕화면에 바로가기 버튼 만드는 스크립트 (0) | 2019.11.28 |
bat/cmd 스크립트 작성 (0) | 2019.11.28 |
.svn 폴더 삭제 방법 (0) | 2019.11.27 |