Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 295:981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Fri, 16 Sep 2011 05:35:32 +0200 |
parents | 32890bab7209 |
children | fb74133d2025 |
comparison
equal
deleted
inserted
replaced
294:32890bab7209 | 295:981f9f50bb6c |
---|---|
395 return !ioFailed && areTheSame(f, bac.toArray(), dataFile.getPath()); | 395 return !ioFailed && areTheSame(f, bac.toArray(), dataFile.getPath()); |
396 } | 396 } |
397 | 397 |
398 private boolean areTheSame(FileInfo f, final byte[] data, Path p) { | 398 private boolean areTheSame(FileInfo f, final byte[] data, Path p) { |
399 ReadableByteChannel is = null; | 399 ReadableByteChannel is = null; |
400 class Check implements ByteChannel { | |
401 final boolean debug = repo.getContext().getLog().isDebug(); | |
402 boolean sameSoFar = true; | |
403 int x = 0; | |
404 | |
405 public int write(ByteBuffer buffer) { | |
406 for (int i = buffer.remaining(); i > 0; i--, x++) { | |
407 if (x >= data.length /*file has been appended*/ || data[x] != buffer.get()) { | |
408 if (debug) { | |
409 byte[] xx = new byte[15]; | |
410 if (buffer.position() > 5) { | |
411 buffer.position(buffer.position() - 5); | |
412 } | |
413 buffer.get(xx, 0, min(xx.length, i)); | |
414 repo.getContext().getLog().debug(getClass(), "expected >>%s<< but got >>%s<<", new String(data, max(0, x - 4), min(data.length - x, 20)), new String(xx)); | |
415 } | |
416 sameSoFar = false; | |
417 break; | |
418 } | |
419 } | |
420 buffer.position(buffer.limit()); // mark as read | |
421 return buffer.limit(); | |
422 } | |
423 | |
424 public boolean sameSoFar() { | |
425 return sameSoFar; | |
426 } | |
427 public boolean ultimatelyTheSame() { | |
428 return sameSoFar && x == data.length; | |
429 } | |
430 }; | |
431 Check check = new Check(); | |
400 try { | 432 try { |
401 try { | 433 is = f.newInputChannel(); |
402 is = f.newInputChannel(); | 434 ByteBuffer fb = ByteBuffer.allocate(min(1 + data.length * 2 /*to fit couple of lines appended; never zero*/, 8192)); |
403 ByteBuffer fb = ByteBuffer.allocate(min(1 + data.length * 2 /*to fit couple of lines appended; never zero*/, 8192)); | 435 FilterByteChannel filters = new FilterByteChannel(check, repo.getFiltersFromWorkingDirToRepo(p)); |
404 class Check implements ByteChannel { | 436 while (is.read(fb) != -1 && check.sameSoFar()) { |
405 final boolean debug = false; // XXX may want to add global variable to allow clients to turn | 437 fb.flip(); |
406 boolean sameSoFar = true; | 438 filters.write(fb); |
407 int x = 0; | 439 fb.compact(); |
408 | 440 } |
409 public int write(ByteBuffer buffer) { | 441 return check.ultimatelyTheSame(); |
410 for (int i = buffer.remaining(); i > 0; i--, x++) { | 442 } catch (CancelledException ex) { |
411 if (x >= data.length /*file has been appended*/ || data[x] != buffer.get()) { | 443 repo.getContext().getLog().warn(getClass(), ex, "Unexpected cancellation"); |
412 if (debug) { | 444 return check.ultimatelyTheSame(); |
413 byte[] xx = new byte[15]; | 445 } catch (IOException ex) { |
414 if (buffer.position() > 5) { | 446 repo.getContext().getLog().warn(getClass(), ex, null); |
415 buffer.position(buffer.position() - 5); | 447 } finally { |
416 } | 448 if (is != null) { |
417 buffer.get(xx); | 449 try { |
418 System.out.print("expected >>" + new String(data, max(0, x - 4), 20) + "<< but got >>"); | |
419 System.out.println(new String(xx) + "<<"); | |
420 } | |
421 sameSoFar = false; | |
422 break; | |
423 } | |
424 } | |
425 buffer.position(buffer.limit()); // mark as read | |
426 return buffer.limit(); | |
427 } | |
428 | |
429 public boolean sameSoFar() { | |
430 return sameSoFar; | |
431 } | |
432 public boolean ultimatelyTheSame() { | |
433 return sameSoFar && x == data.length; | |
434 } | |
435 }; | |
436 Check check = new Check(); | |
437 FilterByteChannel filters = new FilterByteChannel(check, repo.getFiltersFromWorkingDirToRepo(p)); | |
438 while (is.read(fb) != -1 && check.sameSoFar()) { | |
439 fb.flip(); | |
440 filters.write(fb); | |
441 fb.compact(); | |
442 } | |
443 return check.ultimatelyTheSame(); | |
444 } catch (IOException ex) { | |
445 ex.printStackTrace(); // log warn | |
446 } finally { | |
447 if (is != null) { | |
448 is.close(); | 450 is.close(); |
449 } | 451 } catch (IOException ex) { |
450 } | 452 repo.getContext().getLog().info(getClass(), ex, null); |
451 } catch (/*TODO typed*/Exception ex) { | 453 } |
452 ex.printStackTrace(); | 454 } |
453 } | 455 } |
454 return false; | 456 return false; |
455 } | 457 } |
456 | 458 |
457 private static boolean todoCheckFlagsEqual(FileInfo f, HgManifest.Flags originalManifestFlags) { | 459 private static boolean todoCheckFlagsEqual(FileInfo f, HgManifest.Flags originalManifestFlags) { |