Mercurial > jhg
annotate src/com/tmate/hgkit/ll/StatusCollector.java @ 62:25819103de17
Few more tests for status
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Tue, 18 Jan 2011 18:42:01 +0100 | 
| parents | b771e94a4f7c | 
| children | 19e9e220bf68 | 
| rev | line source | 
|---|---|
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 2 * Copyright (c) 2011 Artem Tikhomirov | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 3 */ | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 4 package com.tmate.hgkit.ll; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 5 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 6 import java.util.Collection; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 7 import java.util.Collections; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 8 import java.util.HashMap; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 9 import java.util.LinkedHashMap; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 10 import java.util.LinkedList; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 11 import java.util.List; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 12 import java.util.Map; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 13 import java.util.TreeSet; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 14 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 15 /** | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 * RevisionWalker? | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 17 * @author artem | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 */ | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 19 public class StatusCollector { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 20 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 21 private final HgRepository repo; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 22 private final Map<Integer, ManifestRevisionInspector> cache; // sparse array, in fact | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 23 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 24 public StatusCollector(HgRepository hgRepo) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 25 this.repo = hgRepo; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 26 cache = new HashMap<Integer, ManifestRevisionInspector>(); | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 27 ManifestRevisionInspector emptyFakeState = new ManifestRevisionInspector(-1, -1); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 28 emptyFakeState.begin(-1, null); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 29 emptyFakeState.end(-1); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 30 cache.put(-1, emptyFakeState); | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 31 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 32 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 33 private ManifestRevisionInspector get(int rev) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 34 ManifestRevisionInspector i = cache.get(rev); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 35 if (i == null) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 36 i = new ManifestRevisionInspector(rev, rev); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 37 cache.put(rev, i); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 38 repo.getManifest().walk(rev, rev, i); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 39 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 40 return i; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 41 } | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 42 | 
| 59 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 43 /*package-local*/ ManifestRevisionInspector raw(int rev) { | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 44 return get(rev); | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 45 } | 
| 
b771e94a4f7c
Introduce Internals to keep LocalHgRepo casts and alike in a single place. WCSC optionally to reuse SC data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
56diff
changeset | 46 | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 47 // hg status --change <rev> | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 48 public void change(int rev, Inspector inspector) { | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 49 int[] parents = new int[2]; | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 50 repo.getChangelog().parents(rev, parents, null, null); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 51 walk(parents[0], rev, inspector); | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 52 } | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 53 | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 54 // I assume revision numbers are the same for changelog and manifest - here | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 55 // user would like to pass changelog revision numbers, and I use them directly to walk manifest. | 
| 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 56 // if this assumption is wrong, fix this (lookup manifest revisions from changeset). | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 57 public void walk(int rev1, int rev2, Inspector inspector) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 58 if (rev1 == rev2) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 59 throw new IllegalArgumentException(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 60 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 61 // in fact, rev1 and rev2 are often next (or close) to each other, | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 62 // thus, we can optimize Manifest reads here (manifest.walk(rev1, rev2)) | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 63 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 64 ManifestRevisionInspector r1, r2; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 65 if (!cache.containsKey(rev1) && !cache.containsKey(rev2) && Math.abs(rev1 - rev2) < 5 /*subjective equivalent of 'close enough'*/) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 66 int minRev = rev1 < rev2 ? rev1 : rev2; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 67 int maxRev = minRev == rev1 ? rev2 : rev1; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 68 r1 = r2 = new ManifestRevisionInspector(minRev, maxRev); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 69 for (int i = minRev; i <= maxRev; i++) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 70 cache.put(i, r1); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 71 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 72 repo.getManifest().walk(minRev, maxRev, r1); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 73 } else { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 74 r1 = get(rev1); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 75 r2 = get(rev2); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 76 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 77 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 78 TreeSet<String> r1Files = new TreeSet<String>(r1.files(rev1)); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 79 for (String fname : r2.files(rev2)) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 80 if (r1Files.remove(fname)) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 81 Nodeid nidR1 = r1.nodeid(rev1, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 82 Nodeid nidR2 = r2.nodeid(rev2, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 83 String flagsR1 = r1.flags(rev1, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 84 String flagsR2 = r2.flags(rev2, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 85 if (nidR1.equals(nidR2) && ((flagsR2 == null && flagsR1 == null) || flagsR2.equals(flagsR1))) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 86 inspector.clean(fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 87 } else { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 88 inspector.modified(fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 89 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 90 } else { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 91 inspector.added(fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 92 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 93 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 94 for (String left : r1Files) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 95 inspector.removed(left); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 96 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 97 // inspector.done() if useful e.g. in UI client | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 98 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 99 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 100 public Record status(int rev1, int rev2) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 101 Record rv = new Record(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 102 walk(rev1, rev2, rv); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 103 return rv; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 104 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 105 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 106 public interface Inspector { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 107 void modified(String fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 108 void added(String fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 109 void copied(String fnameOrigin, String fnameAdded); // if copied files of no interest, should delegate to self.added(fnameAdded); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 110 void removed(String fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 111 void clean(String fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 112 void missing(String fname); // aka deleted (tracked by Hg, but not available in FS any more | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 113 void unknown(String fname); // not tracked | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 114 void ignored(String fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 115 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 116 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 117 // XXX for r1..r2 status, only modified, added, removed (and perhaps, clean) make sense | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 118 public static class Record implements Inspector { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 119 private List<String> modified, added, removed, clean, missing, unknown, ignored; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 120 private Map<String, String> copied; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 121 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 122 public List<String> getModified() { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 123 return proper(modified); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 124 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 125 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 126 public List<String> getAdded() { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 127 return proper(added); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 128 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 129 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 130 public List<String> getRemoved() { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 131 return proper(removed); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 132 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 133 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 134 public Map<String,String> getCopied() { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 135 if (copied == null) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 136 return Collections.emptyMap(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 137 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 138 return Collections.unmodifiableMap(copied); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 139 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 140 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 141 public List<String> getClean() { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 142 return proper(clean); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 143 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 144 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 145 public List<String> getMissing() { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 146 return proper(missing); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 147 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 148 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 149 public List<String> getUnknown() { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 150 return proper(unknown); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 151 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 152 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 153 public List<String> getIgnored() { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 154 return proper(ignored); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 155 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 156 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 157 private List<String> proper(List<String> l) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 158 if (l == null) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 159 return Collections.emptyList(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 160 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 161 return Collections.unmodifiableList(l); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 162 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 163 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 164 // | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 165 // | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 166 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 167 public void modified(String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 168 modified = doAdd(modified, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 169 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 170 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 171 public void added(String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 172 added = doAdd(added, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 173 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 174 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 175 public void copied(String fnameOrigin, String fnameAdded) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 176 if (copied == null) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 177 copied = new LinkedHashMap<String, String>(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 178 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 179 copied.put(fnameOrigin, fnameAdded); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 180 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 181 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 182 public void removed(String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 183 removed = doAdd(removed, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 184 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 185 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 186 public void clean(String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 187 clean = doAdd(clean, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 188 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 189 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 190 public void missing(String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 191 missing = doAdd(missing, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 192 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 193 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 194 public void unknown(String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 195 unknown = doAdd(unknown, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 196 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 197 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 198 public void ignored(String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 199 ignored = doAdd(ignored, fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 200 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 201 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 202 private static List<String> doAdd(List<String> l, String s) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 203 if (l == null) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 204 l = new LinkedList<String>(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 205 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 206 l.add(s); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 207 return l; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 208 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 209 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 210 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 211 public /*XXX private, actually. Made public unless repo.statusLocal finds better place*/ static final class ManifestRevisionInspector implements HgManifest.Inspector { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 212 private final HashMap<String, Nodeid>[] idsMap; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 213 private final HashMap<String, String>[] flagsMap; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 214 private final int baseRevision; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 215 private int r = -1; // cursor | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 216 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 217 /** | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 218 * [minRev, maxRev] | 
| 56 
576d6e8a09f6
Analog of 'hg status --change' command
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
55diff
changeset | 219 * [-1,-1] also accepted (for fake empty instance) | 
| 55 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 220 * @param minRev - inclusive | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 221 * @param maxRev - inclusive | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 222 */ | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 223 @SuppressWarnings("unchecked") | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 224 public ManifestRevisionInspector(int minRev, int maxRev) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 225 baseRevision = minRev; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 226 int range = maxRev - minRev + 1; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 227 idsMap = new HashMap[range]; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 228 flagsMap = new HashMap[range]; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 229 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 230 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 231 public Collection<String> files(int rev) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 232 if (rev < baseRevision || rev >= baseRevision + idsMap.length) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 233 throw new IllegalArgumentException(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 234 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 235 return idsMap[rev - baseRevision].keySet(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 236 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 237 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 238 public Nodeid nodeid(int rev, String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 239 if (rev < baseRevision || rev >= baseRevision + idsMap.length) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 240 throw new IllegalArgumentException(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 241 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 242 return idsMap[rev - baseRevision].get(fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 243 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 244 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 245 public String flags(int rev, String fname) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 246 if (rev < baseRevision || rev >= baseRevision + idsMap.length) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 247 throw new IllegalArgumentException(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 248 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 249 return flagsMap[rev - baseRevision].get(fname); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 250 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 251 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 252 // | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 253 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 254 public boolean next(Nodeid nid, String fname, String flags) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 255 idsMap[r].put(fname, nid); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 256 flagsMap[r].put(fname, flags); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 257 return true; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 258 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 259 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 260 public boolean end(int revision) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 261 assert revision == r + baseRevision; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 262 r = -1; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 263 return revision+1 < baseRevision + idsMap.length; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 264 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 265 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 266 public boolean begin(int revision, Nodeid nid) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 267 if (revision < baseRevision || revision >= baseRevision + idsMap.length) { | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 268 throw new IllegalArgumentException(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 269 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 270 r = revision - baseRevision; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 271 idsMap[r] = new HashMap<String, Nodeid>(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 272 flagsMap[r] = new HashMap<String, String>(); | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 273 return true; | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 274 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 275 } | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 276 | 
| 
05829a70b30b
Status operation extracted into separate, cache-friendly class
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 277 } | 
