레거시 PHP 프로젝트를 봇에서 코딩 규칙을 따르는지 확인

10368 단어 슬랙PHPGitHubHubot

경위



현재 회사에서는 레거시 PHP를 사용한 프로젝트의 유지 보수가 계속되고 있습니다. 일본에서는 아마 많은 웹 사이트에서 레거시 PHP가 사용되고 있다고 생각합니다. 현대적인 최신 프로젝트와 달리 단위 테스트 자동화, CI, 코드 정적 분석 등과는 거리가 멀다. 오랫동안 유지 보수되어 있기 때문에 코딩 규약의 통일도되어 있지 않습니다.

그래서!
새로운 것을 사용하여 레거시 프로젝트를 현대적인 것으로 만드십시오!

그래서 우선 들여 쓰기에 탭이 사용되고 있는지 여부를 체크하는 봇을 만들었습니다. 내가 있는 회사의 전담에 따라 들여쓰기는 탭인 것 같아서 스페이스가 들어가 있는지를 판정합니다.

GitHub의 Webhooks에서 push 이벤트를 건너 뛰고 거기에서 커밋을 얻으러갑니다.

코드



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라고 걸면 터무니 없게 됩니다만, 향후의 변경 개소만 지적해 주기 때문에 꽤 유효하다고 생각합니다.

좋은 웹페이지 즐겨찾기