Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 456:909306e412e2
Refactor LogFacility and SessionContext, better API for both
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Mon, 18 Jun 2012 16:54:00 +0200 |
| parents | 12f668401613 |
| children | 7bcfbc255f48 |
comparison
equal
deleted
inserted
replaced
| 454:36fd1fd06492 | 456:909306e412e2 |
|---|---|
| 17 package org.tmatesoft.hg.repo; | 17 package org.tmatesoft.hg.repo; |
| 18 | 18 |
| 19 import static java.lang.Math.max; | 19 import static java.lang.Math.max; |
| 20 import static java.lang.Math.min; | 20 import static java.lang.Math.min; |
| 21 import static org.tmatesoft.hg.repo.HgRepository.*; | 21 import static org.tmatesoft.hg.repo.HgRepository.*; |
| 22 import static org.tmatesoft.hg.util.LogFacility.Severity.*; | |
| 22 | 23 |
| 23 import java.io.File; | 24 import java.io.File; |
| 24 import java.io.IOException; | 25 import java.io.IOException; |
| 25 import java.nio.ByteBuffer; | 26 import java.nio.ByteBuffer; |
| 26 import java.nio.channels.ReadableByteChannel; | 27 import java.nio.channels.ReadableByteChannel; |
| 31 import java.util.TreeSet; | 32 import java.util.TreeSet; |
| 32 | 33 |
| 33 import org.tmatesoft.hg.core.Nodeid; | 34 import org.tmatesoft.hg.core.Nodeid; |
| 34 import org.tmatesoft.hg.core.SessionContext; | 35 import org.tmatesoft.hg.core.SessionContext; |
| 35 import org.tmatesoft.hg.internal.ByteArrayChannel; | 36 import org.tmatesoft.hg.internal.ByteArrayChannel; |
| 36 import org.tmatesoft.hg.internal.Experimental; | |
| 37 import org.tmatesoft.hg.internal.FilterByteChannel; | 37 import org.tmatesoft.hg.internal.FilterByteChannel; |
| 38 import org.tmatesoft.hg.internal.Internals; | 38 import org.tmatesoft.hg.internal.Internals; |
| 39 import org.tmatesoft.hg.internal.ManifestRevision; | 39 import org.tmatesoft.hg.internal.ManifestRevision; |
| 40 import org.tmatesoft.hg.internal.PathPool; | 40 import org.tmatesoft.hg.internal.PathPool; |
| 41 import org.tmatesoft.hg.internal.PathScope; | 41 import org.tmatesoft.hg.internal.PathScope; |
| 360 } else { | 360 } else { |
| 361 inspector.clean(df.getPath()); | 361 inspector.clean(df.getPath()); |
| 362 } | 362 } |
| 363 } | 363 } |
| 364 } catch (HgRuntimeException ex) { | 364 } catch (HgRuntimeException ex) { |
| 365 repo.getContext().getLog().warn(getClass(), ex, null); | 365 repo.getContext().getLog().dump(getClass(), Warn, ex, null); |
| 366 inspector.invalid(fname, ex); | 366 inspector.invalid(fname, ex); |
| 367 } | 367 } |
| 368 } | 368 } |
| 369 } else if ((r = getDirstateImpl().checkAdded(fname)) != null) { | 369 } else if ((r = getDirstateImpl().checkAdded(fname)) != null) { |
| 370 if (r.copySource() == null) { | 370 if (r.copySource() == null) { |
| 449 inspector.clean(fname); | 449 inspector.clean(fname); |
| 450 } else { | 450 } else { |
| 451 inspector.modified(fname); | 451 inspector.modified(fname); |
| 452 } | 452 } |
| 453 } catch (HgRuntimeException ex) { | 453 } catch (HgRuntimeException ex) { |
| 454 repo.getContext().getLog().warn(getClass(), ex, null); | 454 repo.getContext().getLog().dump(getClass(), Warn, ex, null); |
| 455 inspector.invalid(fname, ex); | 455 inspector.invalid(fname, ex); |
| 456 } | 456 } |
| 457 baseRevNames.remove(fname); // consumed, processed, handled. | 457 baseRevNames.remove(fname); // consumed, processed, handled. |
| 458 } else if (getDirstateImpl().checkRemoved(fname) != null) { | 458 } else if (getDirstateImpl().checkRemoved(fname) != null) { |
| 459 // was known, and now marked as removed, report it right away, do not rely on baseRevNames processing later | 459 // was known, and now marked as removed, report it right away, do not rely on baseRevNames processing later |
| 506 exp = new String(data, max(0, x - 4), min(data.length - x, 20)); | 506 exp = new String(data, max(0, x - 4), min(data.length - x, 20)); |
| 507 } else { | 507 } else { |
| 508 int offset = max(0, x - 4); | 508 int offset = max(0, x - 4); |
| 509 exp = new String(data, offset, min(data.length - offset, 20)); | 509 exp = new String(data, offset, min(data.length - offset, 20)); |
| 510 } | 510 } |
| 511 repo.getContext().getLog().debug(getClass(), "expected >>%s<< but got >>%s<<", exp, new String(xx)); | 511 repo.getContext().getLog().dump(getClass(), Debug, "expected >>%s<< but got >>%s<<", exp, new String(xx)); |
| 512 } | 512 } |
| 513 sameSoFar = false; | 513 sameSoFar = false; |
| 514 break; | 514 break; |
| 515 } | 515 } |
| 516 } | 516 } |
| 539 } | 539 } |
| 540 // reset channel to read once again | 540 // reset channel to read once again |
| 541 try { | 541 try { |
| 542 is.close(); | 542 is.close(); |
| 543 } catch (IOException ex) { | 543 } catch (IOException ex) { |
| 544 repo.getContext().getLog().info(getClass(), ex, null); | 544 repo.getContext().getLog().dump(getClass(), Info, ex, null); |
| 545 } | 545 } |
| 546 is = f.newInputChannel(); | 546 is = f.newInputChannel(); |
| 547 fb.clear(); | 547 fb.clear(); |
| 548 } | 548 } |
| 549 while (is.read(fb) != -1 && check.sameSoFar()) { | 549 while (is.read(fb) != -1 && check.sameSoFar()) { |
| 551 filters.write(fb); | 551 filters.write(fb); |
| 552 fb.compact(); | 552 fb.compact(); |
| 553 } | 553 } |
| 554 return check.ultimatelyTheSame(); | 554 return check.ultimatelyTheSame(); |
| 555 } catch (CancelledException ex) { | 555 } catch (CancelledException ex) { |
| 556 repo.getContext().getLog().warn(getClass(), ex, "Unexpected cancellation"); | 556 repo.getContext().getLog().dump(getClass(), Warn, ex, "Unexpected cancellation"); |
| 557 return check.ultimatelyTheSame(); | 557 return check.ultimatelyTheSame(); |
| 558 } catch (IOException ex) { | 558 } catch (IOException ex) { |
| 559 throw new HgInvalidFileException("File comparison failed", ex).setFileName(p); | 559 throw new HgInvalidFileException("File comparison failed", ex).setFileName(p); |
| 560 } finally { | 560 } finally { |
| 561 if (is != null) { | 561 if (is != null) { |
| 562 try { | 562 try { |
| 563 is.close(); | 563 is.close(); |
| 564 } catch (IOException ex) { | 564 } catch (IOException ex) { |
| 565 repo.getContext().getLog().info(getClass(), ex, null); | 565 repo.getContext().getLog().dump(getClass(), Info, ex, null); |
| 566 } | 566 } |
| 567 } | 567 } |
| 568 } | 568 } |
| 569 } | 569 } |
| 570 | 570 |
| 610 * @param hgRepo repository | 610 * @param hgRepo repository |
| 611 * @param paths repository-relative files and/or directories. Directories are processed recursively. | 611 * @param paths repository-relative files and/or directories. Directories are processed recursively. |
| 612 * | 612 * |
| 613 * @return new instance of {@link HgWorkingCopyStatusCollector}, ready to {@link #walk(int, HgStatusInspector) walk} associated working copy | 613 * @return new instance of {@link HgWorkingCopyStatusCollector}, ready to {@link #walk(int, HgStatusInspector) walk} associated working copy |
| 614 */ | 614 */ |
| 615 @Experimental(reason="Provisional API") | |
| 616 public static HgWorkingCopyStatusCollector create(HgRepository hgRepo, Path... paths) { | 615 public static HgWorkingCopyStatusCollector create(HgRepository hgRepo, Path... paths) { |
| 617 ArrayList<Path> f = new ArrayList<Path>(5); | 616 ArrayList<Path> f = new ArrayList<Path>(5); |
| 618 ArrayList<Path> d = new ArrayList<Path>(5); | 617 ArrayList<Path> d = new ArrayList<Path>(5); |
| 619 for (Path p : paths) { | 618 for (Path p : paths) { |
| 620 if (p.isDirectory()) { | 619 if (p.isDirectory()) { |
| 642 * (thus supplied matcher doesn't need to care if directories to files in question are also in scope, | 641 * (thus supplied matcher doesn't need to care if directories to files in question are also in scope, |
| 643 * see {@link FileWalker#FileWalker(File, Path.Source, Path.Matcher)}) | 642 * see {@link FileWalker#FileWalker(File, Path.Source, Path.Matcher)}) |
| 644 * | 643 * |
| 645 * @return new instance of {@link HgWorkingCopyStatusCollector}, ready to {@link #walk(int, HgStatusInspector) walk} associated working copy | 644 * @return new instance of {@link HgWorkingCopyStatusCollector}, ready to {@link #walk(int, HgStatusInspector) walk} associated working copy |
| 646 */ | 645 */ |
| 647 @Experimental(reason="Provisional API. May add boolean strict argument for those who write smart matchers that can be used in FileWalker") | |
| 648 public static HgWorkingCopyStatusCollector create(HgRepository hgRepo, Path.Matcher scope) { | 646 public static HgWorkingCopyStatusCollector create(HgRepository hgRepo, Path.Matcher scope) { |
| 649 FileIterator w = new HgInternals(hgRepo).createWorkingDirWalker(null); | 647 FileIterator w = new HgInternals(hgRepo).createWorkingDirWalker(null); |
| 650 FileIterator wf = (scope == null || scope instanceof Path.Matcher.Any) ? w : new FileIteratorFilter(w, scope); | 648 FileIterator wf = (scope == null || scope instanceof Path.Matcher.Any) ? w : new FileIteratorFilter(w, scope); |
| 651 // the reason I need to iterate over full repo and apply filter is that I have no idea whatsoever about | 649 // the reason I need to iterate over full repo and apply filter is that I have no idea whatsoever about |
| 652 // patterns in the scope. I.e. if scope lists a file (PathGlobMatcher("a/b/c.txt")), FileWalker won't get deep | 650 // patterns in the scope. I.e. if scope lists a file (PathGlobMatcher("a/b/c.txt")), FileWalker won't get deep |
