星期二, 10月 08, 2013

git commit前做coding style檢查

雖然規定團隊Coding Standard要follow PSR規範
不過實在不容易一項項比對~ 再說改都是小地方,實在不知怎麼盯起
聽朋友推薦神器~ git hooks!!!

在commit前,會觸發相關的script檢查
因此只搭PSR定義的script就可以強制規範Coding Standard
這真是太棒了!!!

  • 安裝三步驟
    1. install git
      # yum install git
    2. install PHP Code Sniffer
      # pear install PHP_CodeSniffer
    3. setup script
      裝好PHP_CodeSniffer後,到git專案的資料夾下找.git/hooks資料夾
      # cd project/.git/hooks
      # vi pre-commit #記得要chmod 755 pre-commit
      可以在不同時機點觸發script,這邊就指定pre-commit時,相對也有post-commit,按這看更多
      #!/usr/bin/php
      <?php
      
      $output = array();
      $return = 0;
      exec('git rev-parse --verify HEAD 2> /dev/null', $output, $return);
       
      // Get GIT revision
      $against = $return == 0 ? 'HEAD' : '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
       
      // Get the list of files in this commit.
      $output = array();
      exec("git diff-index --cached --name-only {$against}", $output);
       
      $filename_pattern = '/\.php$/';
      $exit_status = 0;
       
      // Loop through files.
      foreach ($output as $file) {
          if ( ! preg_match($filename_pattern, $file)) {
              // don't check files that aren't PHP
              continue;
          }
       
          // If file is removed from git do not sniff. 
          if ( ! file_exists($file))
          {
              continue;
          }
       
          $lint_output = array();
          // Run the sniff
          exec("phpcs --standard=PSR2 --warning-severity=0 " . escapeshellarg($file), $lint_output, $return);
          if ($return == 0) {
              continue;
          }
          echo implode("\n", $lint_output), "\n";
          $exit_status = 1;
      }
       
      exit($exit_status);
  • 使用方法
    很簡單,commit前,就會觸發,如果有未符合規範,就出現如下的訊息

    一行行修吧 = =+

    如果只是驗證單一隻程式的話,就以直接在console下
    也不用一定得透過commit觸發script
    # phpcs --standard=PSR2 --warning-severity=0 [檔案名稱]

後來發現原來早就有這東西了~ 而且還滿多運用的~
現在看團隊每次commit前,就得先努力的code修成符PSR規範
心理莫明的覺得好爽~~ 哈哈

使用過程遇到的問題
  • .git/hooks/pre-commit: No such file or directory
    找好久,一直看不出問題...
    後來查是換行符號問題!!!當初朋友給的時候是從linux的檔案複製容到,直接貼到windows下txt裡...
    把\r去掉就好了...
    # cp .git/hooks/pre-commit /tmp/pre-commit
    # tr -d '\r' < /tmp/pre-commit > .git/hooks/pre-commit

    References
    Pre Commit hook git error

沒有留言: