チェンジセット 13

差分発生行の前後
無視リスト:
コミット日時:
2007/09/03 17:30:49 (14 年前)
コミッタ:
shinomiya
ログメッセージ:

diffFilePathExtractタスクで、「urlFrom」と「urlTo」に違うURLを指定した場合、結果が出力されない場合がある問題を修正。

原因は、ヒストリー情報取得時に「revisionFrom」を利用していたこと。(「urlTo」に「revisionFrom」が含まれていない場合ヒストリーが取得できませんでした)

あわせて、以下の修正を行いました。
ヘッダーを出力するように変更
コミット日時を出力するように変更

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • trunk/im-svn-diff-exporter/src/main/java/org/intra_mart/svn/util/DiffExporter.java

    r10 r13  
    1010import java.io.IOException; 
    1111import java.io.InputStreamReader; 
     12import java.text.SimpleDateFormat; 
    1213import java.util.Collection; 
    1314import java.util.Iterator; 
    1415import java.util.Map; 
    1516 
     17import org.tmatesoft.svn.core.SVNDirEntry; 
    1618import org.tmatesoft.svn.core.SVNErrorCode; 
    1719import org.tmatesoft.svn.core.SVNErrorMessage; 
     
    8082                expoter.extractFilePathAndAuthorBasedOnDiff( 
    8183                                                        SVNURL.parseURIEncoded(urlTo), 
    82                                                         DiffExporter.convertRevision(revisionFrom), 
    8384                                                        DiffExporter.convertRevision(revisionTo), 
    8485                                                        diffFile, 
     
    278279         *   
    279280         * @param url 
    280          * @param svnRevisionFrom 
    281281         * @param svnRevisionTo 
    282282         * @param diffFile 
     
    285285        public void extractFilePathAndAuthorBasedOnDiff( 
    286286                                                                                                        SVNURL url, 
    287                                                                                                         SVNRevision svnRevisionFrom, 
    288287                                                                                                        SVNRevision svnRevisionTo, 
    289288                                                                                                        String diffFile, 
     
    311310                System.out.println("I'm creating the result file -> " + outFile.getAbsolutePath()); 
    312311                 
    313                 try{ 
     312                // ヘッダーを出力 
     313                writer.write( 
     314                                "Type"     + "\t" + // ('A':added, 'D':deleted, 'M':modified, 'R':replaced, 'Err':Error、’?’:)  
     315                                "Path"     + "\t" +  
     316                                "Revision" + "\t" + 
     317                                "Author"   + "\t" + 
     318                                "Date"     + "\t" + 
     319                                "Message"  + "\n"); 
     320                 
     321        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_kk:mm:ss"); 
     322 
     323        try{ 
    314324                        String line; 
    315325                        while ((line = br.readLine()) != null) { 
     
    318328                                if (index == 0) { 
    319329                                        String path = line.substring(index + DIFF_FILE_LABEL.length()); 
     330 
     331                                        String path4Log = url.toString() + "/" + path; 
     332 
     333                                        // 対象パス&リビジョンの情報を取得 
     334                                        SVNDirEntry dirEntry = repository.info(path, svnRevisionTo.getNumber()); 
    320335                                         
    321                                         try{ 
    322                                                 Collection logEntries = repository.log(new String[] { path }, 
    323                                                                                                                                 null, 
    324                                                                                                                                 svnRevisionFrom.getNumber(), 
    325                                                                                                                                 svnRevisionTo.getNumber(), 
    326                                                                                                                                 true, 
    327                                                                                                                                 true); 
    328                                  
    329                                                  
    330                                                 SVNLogEntry latestLogEntry = null; 
     336                                        if(dirEntry == null){ 
     337                                                //=============================== 
     338                                                // ログ書き込み (ファイルが削除されている or 不正なリビジョン指定) 
     339                                                //=============================== 
     340                                                writer.write("Err"         + "\t" +  
     341                                                                         path4Log      + "\t" +  
     342                                                                         svnRevisionTo + "\t" + 
     343                                                                         "-"           + "\t" + 
     344                                                                         "-"           + "\t" + 
     345                                                                         "SVNDirEntry is null. (File was deleted or specified invalid revision.)" + "\n"); 
     346                                        } 
     347                                        else{ 
     348                                                long targetRevision = dirEntry.getRevision();  
     349 
     350                                                // リビジョン「targetRevision」 から リビジョン「HEAD」 のコミット・ログを取得 
     351                                                Collection logEntries = repository.log( 
     352                                                                                                                        new String[]{ path }, 
     353                                                                                                                        null,  
     354                                                                                                                        targetRevision, 
     355                                                                                                                        SVNRevision.HEAD.getNumber(), 
     356                                                                                                                        true, 
     357                                                                                                                        false); // ← コピー・ヒストリーも取得するので「false」指定 
     358 
     359                                                SVNLogEntry targetLogEntry = null; 
    331360                                                for (Iterator entries = logEntries.iterator(); entries.hasNext();) { 
    332                                                         latestLogEntry = (SVNLogEntry) entries.next(); 
    333                                                 } 
    334                                                  
    335                                                 if(latestLogEntry == null) {     
    336                                                         // latestLogEntryがnullなのは、リビジョン指定が不正な場合です。 
    337                                                         System.err.println(path + ": latestLogEntry is null. Please check SvnRevision 'From' and SvnRevision 'To'."); 
    338          
    339         //                                              br.close(); 
    340         //                                              throw new NullPointerException("latestLogEntry is null."); 
    341                                                 } 
    342                                                 else { 
     361                                                        SVNLogEntry logEntry = (SVNLogEntry) entries.next(); 
     362                                                        if(logEntry.getRevision() == targetRevision){ 
     363                                                                targetLogEntry = logEntry; 
     364                                                                break; 
     365                                                        } 
     366                                                } 
     367 
     368                                                if(targetLogEntry == null){ 
     369                                                        //=============================== 
     370                                                        // ログ書き込み (更新タイプが不明) 
     371                                                        //=============================== 
     372                                                        // (「コミットメッセージ(=dirEntry.getCommitMessage())」は取得できません → なぜ?) 
     373                                                        writer.write("?"                            + "\t" +  
     374                                                                                 path4Log                       + "\t" +  
     375                                                                                 dirEntry.getRevision()         + "\t" + 
     376                                                                                 dirEntry.getAuthor()           + "\t" + 
     377                                                                                 sdf.format(dirEntry.getDate()) + "\t" + 
     378                                                                                 dirEntry.getCommitMessage()    + "\n"); 
     379                                                } 
     380                                                else{ 
    343381                                                        SVNLogEntryPath svnLogEntryPath = null; 
    344          
    345                                                         Map paths = latestLogEntry.getChangedPaths(); 
    346          
     382                                                         
     383                                                        Map paths = targetLogEntry.getChangedPaths(); 
    347384                                                        Iterator it = paths.entrySet().iterator(); 
    348385                                                        while(it.hasNext()){ 
     
    356393                                                        } 
    357394                                                         
    358                                                         // 「path」で指定されるファイルの上位ディレクトリが移動されている 
    359                                                         if(svnLogEntryPath == null){ 
    360                                                                 break; 
     395                                                        char type4Log = '?'; 
     396                                                        if(svnLogEntryPath != null){ 
     397                                                                type4Log = svnLogEntryPath.getType(); 
     398                                                                // path4Log = svnLogEntryPath.getPath(); 
    361399                                                        } 
    362                                                          
     400                                                 
     401                                                        //=============================== 
    363402                                                        // ログ書き込み 
    364                                                         writer.write(svnLogEntryPath.getType()    + "\t" +  
    365                                                                                  svnLogEntryPath.getPath()    + "\t" +  
    366                                                                                  latestLogEntry.getRevision() + "\t" + 
    367                                                                                  latestLogEntry.getAuthor()   + "\t" + 
    368                                                                                  latestLogEntry.getMessage().replace('\n', ' ') + "\n"); 
    369                                                 } 
    370          
    371                                         } 
    372                                         catch(SVNException e){ 
    373                                                  
    374                                                 SVNErrorMessage errorMessage = e.getErrorMessage();  
    375                                                  
    376                                                 // ファイルが見つからない場合(=404 Not Found)は、削除ファイルとみなし処理続行 
    377                                                 if(errorMessage.getErrorCode().equals(SVNErrorCode.RA_DAV_PATH_NOT_FOUND)){ 
    378                                                         System.err.println(errorMessage.getFullMessage()); 
    379                                                 } 
    380                                                 // 上記以外は例外をそのままスロー 
    381                                                 else { 
    382                                                         throw e; 
    383                                                 } 
    384                                         } 
    385                                         catch(Exception e){ 
    386                                                 e.printStackTrace(); 
    387                                         } 
    388  
    389                                          
     403                                                        //=============================== 
     404                                                        // (SVNLogEntry、および、SVNLogEntryPathを利用してログ出力する理由 
     405                                                        //    ∵SVNDirEntryでは、「更新タイプ」と「コミットメッセージ」が取得できないから) 
     406                                                        writer.write(type4Log                                       + "\t" +  
     407                                                                                 path4Log                                       + "\t" +  
     408                                                                                 targetLogEntry.getRevision()                   + "\t" + 
     409                                                                                 targetLogEntry.getAuthor()                     + "\t" + 
     410                                                                                 sdf.format(targetLogEntry.getDate())           + "\t" + 
     411                                                                                 targetLogEntry.getMessage().replace('\n', ' ') + "\n"); 
     412                                                } 
     413                                        } 
    390414                                } 
    391415                        } 
  • trunk/im-svn-diff-exporter/src/main/java/org/intra_mart/svn/util/DiffFilePathExtractTask.java

    r10 r13  
    4848                        expoter.extractFilePathAndAuthorBasedOnDiff( 
    4949                                                                SVNURL.parseURIEncoded(urlTo), 
    50                                                                 DiffExporter.convertRevision(revisionFrom), 
    5150                                                                DiffExporter.convertRevision(revisionTo), 
    5251                                                                diffFile,