| 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; |
|---|
| 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{ |
|---|
| 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 | } |
|---|