Mercurial > hg4j
diff src/org/tmatesoft/hg/repo/HgBranches.java @ 340:a54bfe0db959
IAE using stale data from branchheads file (invalid due to repository rollback)
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 17 Nov 2011 06:16:20 +0100 |
parents | 8952f89be195 |
children | a0864b2892cd |
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/repo/HgBranches.java Wed Nov 16 22:42:21 2011 +0100 +++ b/src/org/tmatesoft/hg/repo/HgBranches.java Thu Nov 17 06:16:20 2011 +0100 @@ -54,7 +54,7 @@ repo = hgRepo; } - private int readCache() { + private int readCache() /*XXX throws parse errors, e.g. may fail with NumberFormatException */{ File branchheadsCache = getCacheFile(); int lastInCache = -1; if (!branchheadsCache.canRead()) { @@ -71,8 +71,11 @@ } String[] cacheIdentity = spacePattern.split(line.trim()); lastInCache = Integer.parseInt(cacheIdentity[1]); - // XXX may want to check if nodeid of cset from repo.getChangelog() of lastInCache index match cacheIdentity[0] - // + final int lastKnownRepoRevIndex = repo.getChangelog().getLastRevision(); + if (lastInCache > lastKnownRepoRevIndex || !repo.getChangelog().getRevision(lastKnownRepoRevIndex).equals(Nodeid.fromAscii(cacheIdentity[0]))) { + // there are chances cache file got invalid entries due to e.g. rollback operation + return -1; + } while ((line = br.readLine()) != null) { String[] elements = spacePattern.split(line.trim()); if (elements.length != 2) { @@ -112,65 +115,6 @@ ps.start(1 + repo.getChangelog().getRevisionCount() * 2); // int lastCached = readCache(); - /* - * Next code was supposed to fill missing aspects of the BranchInfo, but is too slow - * - if (lastCached != -1 && lastCached <= repo.getChangelog().getLastRevision()) { - LinkedList<BranchInfo> incompleteBranches = new LinkedList<HgBranches.BranchInfo>(branches.values()); - for (BranchInfo bi : incompleteBranches) { - LinkedList<Nodeid> closedHeads = new LinkedList<Nodeid>(); - for (Nodeid h : bi.getHeads()) { - if ("1".equals(repo.getChangelog().changeset(h).extras().get("close"))) { - closedHeads.add(h); - } - } - HashSet<Nodeid> earliest = new HashSet<Nodeid>(bi.getHeads()); - HashSet<Nodeid> visited = new HashSet<Nodeid>(); - ArrayList<Nodeid> parents = new ArrayList<Nodeid>(2); - HashSet<Nodeid> candidate = new HashSet<Nodeid>(); - do { - candidate.clear(); - for (Nodeid e : earliest) { - parents.clear(); - if (pw.appendParentsOf(e, parents)) { - // at least one parent - Nodeid p1 = parents.get(0); - if (p1 != null && !visited.contains(p1) && bi.getName().equals(repo.getChangelog().changeset(p1).branch())) { - visited.add(p1); - candidate.add(p1); - } - Nodeid p2 = parents.size() > 1 ? parents.get(1) : null; - if (p2 != null && !visited.contains(p2) && bi.getName().equals(repo.getChangelog().changeset(p2).branch())) { - visited.add(p2); - candidate.add(p2); - } - } - } - if (!candidate.isEmpty()) { - earliest.clear(); - earliest.addAll(candidate); - } - } while (!candidate.isEmpty()); - // earliest can't be empty, we've started with non-empty heads. - Nodeid first = null; - if (earliest.size() == 1) { - first = earliest.iterator().next(); - } else { - int earliestRevNum = Integer.MAX_VALUE; - for (Nodeid e : earliest) { - int x = repo.getChangelog().getLocalRevision(e); - if (x < earliestRevNum) { - earliestRevNum = x; - first = e; - } - } - } - assert first != null; - System.out.println("Updated branch " + bi.getName()); - branches.put(bi.getName(), new BranchInfo(bi.getName(), first, bi.getHeads().toArray(new Nodeid[0]), closedHeads.size() == bi.getHeads().size())); - } - } - */ isCacheActual = lastCached == repo.getChangelog().getLastRevision(); if (!isCacheActual) { final HgChangelog.ParentWalker pw = repo.getChangelog().new ParentWalker();