Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgDataFile.java @ 424:6437d261048a
Deprecated code removed
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 28 Mar 2012 15:42:15 +0200 |
| parents | 9c9c442b5f2e |
| children | 48f993aa2f41 |
comparison
equal
deleted
inserted
replaced
| 423:9c9c442b5f2e | 424:6437d261048a |
|---|---|
| 26 import java.nio.ByteBuffer; | 26 import java.nio.ByteBuffer; |
| 27 import java.nio.channels.FileChannel; | 27 import java.nio.channels.FileChannel; |
| 28 import java.util.ArrayList; | 28 import java.util.ArrayList; |
| 29 import java.util.Arrays; | 29 import java.util.Arrays; |
| 30 import java.util.Collection; | 30 import java.util.Collection; |
| 31 import java.util.Collections; | |
| 32 import java.util.List; | |
| 33 | 31 |
| 34 import org.tmatesoft.hg.core.HgException; | 32 import org.tmatesoft.hg.core.HgException; |
| 35 import org.tmatesoft.hg.core.HgLogCommand; | |
| 36 import org.tmatesoft.hg.core.Nodeid; | 33 import org.tmatesoft.hg.core.Nodeid; |
| 37 import org.tmatesoft.hg.internal.DataAccess; | 34 import org.tmatesoft.hg.internal.DataAccess; |
| 38 import org.tmatesoft.hg.internal.FilterByteChannel; | 35 import org.tmatesoft.hg.internal.FilterByteChannel; |
| 39 import org.tmatesoft.hg.internal.FilterDataAccess; | 36 import org.tmatesoft.hg.internal.FilterDataAccess; |
| 40 import org.tmatesoft.hg.internal.IntMap; | 37 import org.tmatesoft.hg.internal.IntMap; |
| 103 throw ex.isRevisionSet() ? ex : ex.setRevision(nodeid); | 100 throw ex.isRevisionSet() ? ex : ex.setRevision(nodeid); |
| 104 } | 101 } |
| 105 } | 102 } |
| 106 | 103 |
| 107 /** | 104 /** |
| 108 * @deprecated Use {@link #getLength(Nodeid)} instead | |
| 109 */ | |
| 110 @Deprecated | |
| 111 public int length(Nodeid nodeid) throws HgInvalidControlFileException, HgInvalidRevisionException { | |
| 112 return getLength(nodeid); | |
| 113 } | |
| 114 | |
| 115 /** | |
| 116 * @param fileRevisionIndex - revision local index, non-negative. From predefined constants, only {@link HgRepository#TIP} makes sense. | 105 * @param fileRevisionIndex - revision local index, non-negative. From predefined constants, only {@link HgRepository#TIP} makes sense. |
| 117 * @return size of the file content at the revision identified by local revision number. | 106 * @return size of the file content at the revision identified by local revision number. |
| 118 * @throws HgInvalidRevisionException if supplied argument doesn't represent revision index in this revlog (<em>runtime exception</em>) | 107 * @throws HgInvalidRevisionException if supplied argument doesn't represent revision index in this revlog (<em>runtime exception</em>) |
| 119 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 108 * @throws HgInvalidControlFileException if access to revlog index/data entry failed |
| 120 */ | 109 */ |
| 144 return dataLen - metadata.dataOffset(fileRevisionIndex); | 133 return dataLen - metadata.dataOffset(fileRevisionIndex); |
| 145 } | 134 } |
| 146 return dataLen; | 135 return dataLen; |
| 147 } | 136 } |
| 148 | 137 |
| 149 /** | |
| 150 * @deprecated Use {@link #getLength(int)} instead | |
| 151 */ | |
| 152 @Deprecated | |
| 153 public int length(int fileRevisionIndex) throws HgInvalidControlFileException, HgInvalidRevisionException { | |
| 154 return getLength(fileRevisionIndex); | |
| 155 } | |
| 156 | |
| 157 /** | 138 /** |
| 158 * Reads content of the file from working directory. If file present in the working directory, its actual content without | 139 * Reads content of the file from working directory. If file present in the working directory, its actual content without |
| 159 * any filters is supplied through the sink. If file does not exist in the working dir, this method provides content of a file | 140 * any filters is supplied through the sink. If file does not exist in the working dir, this method provides content of a file |
| 160 * as if it would be refreshed in the working copy, i.e. its corresponding revision (according to dirstate) is read from the | 141 * as if it would be refreshed in the working copy, i.e. its corresponding revision (according to dirstate) is read from the |
| 161 * repository, and filters repo -> working copy get applied. | 142 * repository, and filters repo -> working copy get applied. |
| 324 HgInvalidControlFileException e = new HgInvalidControlFileException("Revision content access failed", ex, null); | 305 HgInvalidControlFileException e = new HgInvalidControlFileException("Revision content access failed", ex, null); |
| 325 throw content.initWithIndexFile(e).setFileName(getPath()).setRevisionIndex(fileRevisionIndex); | 306 throw content.initWithIndexFile(e).setFileName(getPath()).setRevisionIndex(fileRevisionIndex); |
| 326 } | 307 } |
| 327 } | 308 } |
| 328 | 309 |
| 329 private static class HistoryNode { | 310 // FIXME is that still needed? |
| 330 int changeset; | |
| 331 Nodeid cset; | |
| 332 HistoryNode parent1, parent2; | |
| 333 List<HistoryNode> children; | |
| 334 | |
| 335 HistoryNode(int cs, HistoryNode p1, HistoryNode p2) { | |
| 336 changeset = cs; | |
| 337 parent1 = p1; | |
| 338 parent2 = p2; | |
| 339 if (p1 != null) { | |
| 340 p1.addChild(this); | |
| 341 } | |
| 342 if (p2 != null) { | |
| 343 p2.addChild(this); | |
| 344 } | |
| 345 } | |
| 346 | |
| 347 Nodeid changesetRevision() { | |
| 348 assert cset != null : "we initialize all csets prior to use"; | |
| 349 return cset; | |
| 350 } | |
| 351 | |
| 352 void addChild(HistoryNode child) { | |
| 353 if (children == null) { | |
| 354 children = new ArrayList<HistoryNode>(2); | |
| 355 } | |
| 356 children.add(child); | |
| 357 } | |
| 358 } | |
| 359 | |
| 360 /** | |
| 361 * @deprecated use {@link HgLogCommand#execute(org.tmatesoft.hg.core.HgChangesetTreeHandler)} instead | |
| 362 */ | |
| 363 @Deprecated | |
| 364 public void history(HgChangelog.TreeInspector inspector) throws HgInvalidControlFileException{ | |
| 365 final CancelSupport cancelSupport = CancelSupport.Factory.get(inspector); | |
| 366 try { | |
| 367 final boolean[] needsSorting = { false }; | |
| 368 final HistoryNode[] completeHistory = new HistoryNode[getRevisionCount()]; | |
| 369 final int[] commitRevisions = new int[completeHistory.length]; | |
| 370 RevlogStream.Inspector insp = new RevlogStream.Inspector() { | |
| 371 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) { | |
| 372 if (revisionNumber > 0) { | |
| 373 if (commitRevisions[revisionNumber-1] > linkRevision) { | |
| 374 needsSorting[0] = true; | |
| 375 } | |
| 376 } | |
| 377 commitRevisions[revisionNumber] = linkRevision; | |
| 378 HistoryNode p1 = null, p2 = null; | |
| 379 if (parent1Revision != -1) { | |
| 380 p1 = completeHistory[parent1Revision]; | |
| 381 } | |
| 382 if (parent2Revision != -1) { | |
| 383 p2 = completeHistory[parent2Revision]; | |
| 384 } | |
| 385 completeHistory[revisionNumber] = new HistoryNode(linkRevision, p1, p2); | |
| 386 } | |
| 387 }; | |
| 388 content.iterate(0, getLastRevision(), false, insp); | |
| 389 cancelSupport.checkCancelled(); | |
| 390 if (needsSorting[0]) { | |
| 391 Arrays.sort(commitRevisions); | |
| 392 } | |
| 393 // read changeset revisions at once (to avoid numerous changelog.getRevision reads) | |
| 394 // but just nodeids, not RawChangeset (changelog.iterate(data=false) | |
| 395 ArrayList<Nodeid> changesetRevisions = new ArrayList<Nodeid>(commitRevisions.length); | |
| 396 getRepo().getChangelog().getRevisionsInternal(changesetRevisions, commitRevisions); | |
| 397 cancelSupport.checkCancelled(); | |
| 398 // assign them to corresponding HistoryNodes | |
| 399 for (int i = 0; i < completeHistory.length; i++ ) { | |
| 400 final HistoryNode n = completeHistory[i]; | |
| 401 if (needsSorting[0]) { | |
| 402 int x = Arrays.binarySearch(commitRevisions, n.changeset); | |
| 403 assert x >= 0; | |
| 404 n.cset = changesetRevisions.get(x); | |
| 405 } else { | |
| 406 // commit revisions were not sorted, may use original index directly | |
| 407 n.cset = changesetRevisions.get(i); | |
| 408 } | |
| 409 } | |
| 410 cancelSupport.checkCancelled(); | |
| 411 // XXX shall sort completeHistory according to changeset numbers? | |
| 412 for (int i = 0; i < completeHistory.length; i++ ) { | |
| 413 final HistoryNode n = completeHistory[i]; | |
| 414 HistoryNode p; | |
| 415 Nodeid p1, p2; | |
| 416 if ((p = n.parent1) != null) { | |
| 417 p1 = p.changesetRevision(); | |
| 418 } else { | |
| 419 p1 = Nodeid.NULL; | |
| 420 } | |
| 421 if ((p= n.parent2) != null) { | |
| 422 p2 = p.changesetRevision(); | |
| 423 } else { | |
| 424 p2 = Nodeid.NULL; | |
| 425 } | |
| 426 final Pair<Nodeid, Nodeid> parentChangesets = new Pair<Nodeid, Nodeid>(p1, p2); | |
| 427 final List<Nodeid> childChangesets; | |
| 428 if (n.children == null) { | |
| 429 childChangesets = Collections.emptyList(); | |
| 430 } else { | |
| 431 Nodeid[] revisions = new Nodeid[n.children.size()]; | |
| 432 int j = 0; | |
| 433 for (HistoryNode hn : n.children) { | |
| 434 revisions[j++] = hn.changesetRevision(); | |
| 435 } | |
| 436 childChangesets = Arrays.asList(revisions); | |
| 437 } | |
| 438 inspector.next(n.changesetRevision(), parentChangesets, childChangesets); | |
| 439 cancelSupport.checkCancelled(); | |
| 440 } | |
| 441 } catch (CancelledException ex) { | |
| 442 return; | |
| 443 } | |
| 444 } | |
| 445 | |
| 446 public void history(HgChangelog.Inspector inspector) throws HgInvalidControlFileException { | 311 public void history(HgChangelog.Inspector inspector) throws HgInvalidControlFileException { |
| 447 history(0, getLastRevision(), inspector); | 312 history(0, getLastRevision(), inspector); |
| 448 } | 313 } |
| 449 | 314 |
| 450 /** | 315 /** |
| 499 * @throws HgInvalidRevisionException if supplied argument doesn't represent revision index in this revlog | 364 * @throws HgInvalidRevisionException if supplied argument doesn't represent revision index in this revlog |
| 500 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | 365 * @throws HgInvalidControlFileException if access to revlog index/data entry failed |
| 501 */ | 366 */ |
| 502 public int getChangesetRevisionIndex(int revision) throws HgInvalidControlFileException, HgInvalidRevisionException { | 367 public int getChangesetRevisionIndex(int revision) throws HgInvalidControlFileException, HgInvalidRevisionException { |
| 503 return content.linkRevision(revision); | 368 return content.linkRevision(revision); |
| 504 } | |
| 505 /** | |
| 506 * @deprecated use {@link #getChangesetRevisionIndex(int)} instead | |
| 507 */ | |
| 508 @Deprecated | |
| 509 public int getChangesetLocalRevision(int revision) throws HgInvalidControlFileException, HgInvalidRevisionException { | |
| 510 return getChangesetRevisionIndex(revision); | |
| 511 } | 369 } |
| 512 | 370 |
| 513 /** | 371 /** |
| 514 * Complements {@link #getChangesetRevisionIndex(int)} to get changeset revision that corresponds to supplied file revision | 372 * Complements {@link #getChangesetRevisionIndex(int)} to get changeset revision that corresponds to supplied file revision |
| 515 * | 373 * |
