레거시 PHP 프로젝트를 봇에서 코딩 규칙을 따르는지 확인
경위
현재 회사에서는 레거시 PHP를 사용한 프로젝트의 유지 보수가 계속되고 있습니다. 일본에서는 아마 많은 웹 사이트에서 레거시 PHP가 사용되고 있다고 생각합니다. 현대적인 최신 프로젝트와 달리 단위 테스트 자동화, CI, 코드 정적 분석 등과는 거리가 멀다. 오랫동안 유지 보수되어 있기 때문에 코딩 규약의 통일도되어 있지 않습니다.
그래서!
새로운 것을 사용하여 레거시 프로젝트를 현대적인 것으로 만드십시오!
그래서 우선 들여 쓰기에 탭이 사용되고 있는지 여부를 체크하는 봇을 만들었습니다. 내가 있는 회사의 전담에 따라 들여쓰기는 탭인 것 같아서 스페이스가 들어가 있는지를 판정합니다.
GitHub의 Webhooks에서 push 이벤트를 건너 뛰고 거기에서 커밋을 얻으러갑니다.
코드
checkIndentation.coffeetoken = 'token'
apiUrl = "https://api.github.com/repos/[Organization名]"
repository = "hoge"
module.exports = (robot) ->
robot.router.post("/github/check/commits", (req, response) ->
data = req.body
for commit in data.commits
request = robot.http("#{apiUrl}/#{repository}/commits/#{commit.id}")
.query(access_token: token)
.get()
request((err, res, body) ->
if err
robot.messageRoom("チャンネル名", "何かエラーになっちゃいました...")
return
commit = JSON.parse body
if commit.message == "Not Found"
robot.messageRoom("チャンネル名", "#{repository}が見つかりませんでした..")
return
fileNames = []
for file in commit.files
if file.status == 'modified' || file.status == 'added'
if file.filename.match(/^.*\.php$/g) != null
if !checkIndentation(file.patch)
fileNames.push(file.filename)
if fileNames.length != 0
respond = "#{commit.committer.login}さん!\nスペースのインデントが混じってますよ!\n\n"
respond += "#{commit.commit.message}\n\n"
respond += "#{fileNames.join('\n')}"
respond += "\n\n#{commit.html_url}"
robot.messageRoom("チャンネル名", respond)
)
response.end('')
)
checkIndentation = (patch) ->
index = patch.indexOf("\n")
while 1
nextIndex = patch.indexOf("\n", index + 1)
if nextIndex == -1
break
string = patch.slice(index + 1, nextIndex)
if (string.slice(0, 1) == '+')
if (string.substr(1).match(/^ +\S+/) != null)
return false
index = nextIndex
return true
이제 GitHub 설정에서 Webhooks를 [ボットのURL]/github/check/commits
로 설정하면 할 수 있습니다.
이번에는 GitHub API에서 파일별 차이를 패치 형식으로 가져와 들여쓰기를 조사하고 있습니다.
수행한 느낌
방대한 코드를 전부 PHP Code Sniffer라고 걸면 터무니 없게 됩니다만, 향후의 변경 개소만 지적해 주기 때문에 꽤 유효하다고 생각합니다.
Reference
이 문제에 관하여(레거시 PHP 프로젝트를 봇에서 코딩 규칙을 따르는지 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takuseno/items/87c9c201f88fe1ff2a1e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
checkIndentation.coffee
token = 'token'
apiUrl = "https://api.github.com/repos/[Organization名]"
repository = "hoge"
module.exports = (robot) ->
robot.router.post("/github/check/commits", (req, response) ->
data = req.body
for commit in data.commits
request = robot.http("#{apiUrl}/#{repository}/commits/#{commit.id}")
.query(access_token: token)
.get()
request((err, res, body) ->
if err
robot.messageRoom("チャンネル名", "何かエラーになっちゃいました...")
return
commit = JSON.parse body
if commit.message == "Not Found"
robot.messageRoom("チャンネル名", "#{repository}が見つかりませんでした..")
return
fileNames = []
for file in commit.files
if file.status == 'modified' || file.status == 'added'
if file.filename.match(/^.*\.php$/g) != null
if !checkIndentation(file.patch)
fileNames.push(file.filename)
if fileNames.length != 0
respond = "#{commit.committer.login}さん!\nスペースのインデントが混じってますよ!\n\n"
respond += "#{commit.commit.message}\n\n"
respond += "#{fileNames.join('\n')}"
respond += "\n\n#{commit.html_url}"
robot.messageRoom("チャンネル名", respond)
)
response.end('')
)
checkIndentation = (patch) ->
index = patch.indexOf("\n")
while 1
nextIndex = patch.indexOf("\n", index + 1)
if nextIndex == -1
break
string = patch.slice(index + 1, nextIndex)
if (string.slice(0, 1) == '+')
if (string.substr(1).match(/^ +\S+/) != null)
return false
index = nextIndex
return true
이제 GitHub 설정에서 Webhooks를
[ボットのURL]/github/check/commits
로 설정하면 할 수 있습니다.이번에는 GitHub API에서 파일별 차이를 패치 형식으로 가져와 들여쓰기를 조사하고 있습니다.
수행한 느낌
방대한 코드를 전부 PHP Code Sniffer라고 걸면 터무니 없게 됩니다만, 향후의 변경 개소만 지적해 주기 때문에 꽤 유효하다고 생각합니다.
Reference
이 문제에 관하여(레거시 PHP 프로젝트를 봇에서 코딩 규칙을 따르는지 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/takuseno/items/87c9c201f88fe1ff2a1e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(레거시 PHP 프로젝트를 봇에서 코딩 규칙을 따르는지 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takuseno/items/87c9c201f88fe1ff2a1e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)