Mercurial > hg4j
comparison src/com/tmate/hgkit/ll/HgDirstate.java @ 18:02ee376bee79
status operation against current working directory
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Mon, 03 Jan 2011 20:42:52 +0100 |
| parents | 442dc6ee647b |
| children | b771e94a4f7c |
comparison
equal
deleted
inserted
replaced
| 17:571e1b2cc3f7 | 18:02ee376bee79 |
|---|---|
| 4 package com.tmate.hgkit.ll; | 4 package com.tmate.hgkit.ll; |
| 5 | 5 |
| 6 import java.io.File; | 6 import java.io.File; |
| 7 import java.io.IOException; | 7 import java.io.IOException; |
| 8 import java.util.Collections; | 8 import java.util.Collections; |
| 9 import java.util.LinkedList; | 9 import java.util.LinkedHashMap; |
| 10 import java.util.List; | 10 import java.util.Map; |
| 11 import java.util.TreeSet; | |
| 11 | 12 |
| 12 import com.tmate.hgkit.fs.DataAccess; | 13 import com.tmate.hgkit.fs.DataAccess; |
| 13 import com.tmate.hgkit.fs.DataAccessProvider; | 14 import com.tmate.hgkit.fs.DataAccessProvider; |
| 14 | 15 |
| 15 /** | 16 /** |
| 19 */ | 20 */ |
| 20 public class HgDirstate { | 21 public class HgDirstate { |
| 21 | 22 |
| 22 private final LocalHgRepo repo; | 23 private final LocalHgRepo repo; |
| 23 private final File dirstateFile; | 24 private final File dirstateFile; |
| 24 private List<Record> normal; | 25 private Map<String, Record> normal; |
| 25 private List<Record> added; | 26 private Map<String, Record> added; |
| 26 private List<Record> removed; | 27 private Map<String, Record> removed; |
| 27 private List<Record> merged; | 28 private Map<String, Record> merged; |
| 28 | 29 |
| 29 public HgDirstate(LocalHgRepo hgRepo, File dirstate) { | 30 public HgDirstate(LocalHgRepo hgRepo, File dirstate) { |
| 30 this.repo = hgRepo; | 31 this.repo = hgRepo; |
| 31 this.dirstateFile = dirstate; | 32 this.dirstateFile = dirstate; |
| 32 } | 33 } |
| 33 | 34 |
| 34 private void read() { | 35 private void read() { |
| 35 normal = added = removed = merged = Collections.emptyList(); | 36 normal = added = removed = merged = Collections.<String, Record>emptyMap(); |
| 36 if (!dirstateFile.exists()) { | 37 if (!dirstateFile.exists()) { |
| 37 return; | 38 return; |
| 38 } | 39 } |
| 39 DataAccessProvider dap = repo.getDataAccess(); | 40 DataAccessProvider dap = repo.getDataAccess(); |
| 40 DataAccess da = dap.create(dirstateFile); | 41 DataAccess da = dap.create(dirstateFile); |
| 41 if (da.isEmpty()) { | 42 if (da.isEmpty()) { |
| 42 return; | 43 return; |
| 43 } | 44 } |
| 44 normal = new LinkedList<Record>(); | 45 // not sure linked is really needed here, just for ease of debug |
| 45 added = new LinkedList<Record>(); | 46 normal = new LinkedHashMap<String, Record>(); |
| 46 removed = new LinkedList<Record>(); | 47 added = new LinkedHashMap<String, Record>(); |
| 47 merged = new LinkedList<Record>(); | 48 removed = new LinkedHashMap<String, Record>(); |
| 49 merged = new LinkedHashMap<String, Record>(); | |
| 48 try { | 50 try { |
| 49 // XXX skip(40) if we don't need these? | 51 // XXX skip(40) if we don't need these? |
| 50 byte[] parents = new byte[40]; | 52 byte[] parents = new byte[40]; |
| 51 da.readBytes(parents, 0, 40); | 53 da.readBytes(parents, 0, 40); |
| 52 parents = null; | 54 parents = null; |
| 69 if (fn1 == null) { | 71 if (fn1 == null) { |
| 70 fn1 = new String(name); | 72 fn1 = new String(name); |
| 71 } | 73 } |
| 72 Record r = new Record(fmode, size, time, fn1, fn2); | 74 Record r = new Record(fmode, size, time, fn1, fn2); |
| 73 if (state == 'n') { | 75 if (state == 'n') { |
| 74 normal.add(r); | 76 normal.put(r.name1, r); |
| 75 } else if (state == 'a') { | 77 } else if (state == 'a') { |
| 76 added.add(r); | 78 added.put(r.name1, r); |
| 77 } else if (state == 'r') { | 79 } else if (state == 'r') { |
| 78 removed.add(r); | 80 removed.put(r.name1, r); |
| 79 } else if (state == 'm') { | 81 } else if (state == 'm') { |
| 80 merged.add(r); | 82 merged.put(r.name1, r); |
| 81 } else { | 83 } else { |
| 82 // FIXME log error? | 84 // FIXME log error? |
| 83 } | 85 } |
| 84 } while (!da.isEmpty()); | 86 } while (!da.isEmpty()); |
| 85 } catch (IOException ex) { | 87 } catch (IOException ex) { |
| 87 } finally { | 89 } finally { |
| 88 da.done(); | 90 da.done(); |
| 89 } | 91 } |
| 90 } | 92 } |
| 91 | 93 |
| 94 // new, modifiable collection | |
| 95 /*package-local*/ TreeSet<String> all() { | |
| 96 read(); | |
| 97 TreeSet<String> rv = new TreeSet<String>(); | |
| 98 @SuppressWarnings("unchecked") | |
| 99 Map<String, Record>[] all = new Map[] { normal, added, removed, merged }; | |
| 100 for (int i = 0; i < all.length; i++) { | |
| 101 for (Record r : all[i].values()) { | |
| 102 rv.add(r.name1); | |
| 103 } | |
| 104 } | |
| 105 return rv; | |
| 106 } | |
| 107 | |
| 108 /*package-local*/ Record checkNormal(String fname) { | |
| 109 return normal.get(fname); | |
| 110 } | |
| 111 | |
| 112 /*package-local*/ Record checkAdded(String fname) { | |
| 113 return added.get(fname); | |
| 114 } | |
| 115 /*package-local*/ Record checkRemoved(String fname) { | |
| 116 return removed.get(fname); | |
| 117 } | |
| 118 /*package-local*/ Record checkMerged(String fname) { | |
| 119 return merged.get(fname); | |
| 120 } | |
| 121 | |
| 122 | |
| 123 | |
| 124 | |
| 92 public void dump() { | 125 public void dump() { |
| 93 read(); | 126 read(); |
| 94 @SuppressWarnings("unchecked") | 127 @SuppressWarnings("unchecked") |
| 95 List<Record>[] all = new List[] { normal, added, removed, merged }; | 128 Map<String, Record>[] all = new Map[] { normal, added, removed, merged }; |
| 96 char[] x = new char[] {'n', 'a', 'r', 'm' }; | 129 char[] x = new char[] {'n', 'a', 'r', 'm' }; |
| 97 for (int i = 0; i < all.length; i++) { | 130 for (int i = 0; i < all.length; i++) { |
| 98 for (Record r : all[i]) { | 131 for (Record r : all[i].values()) { |
| 99 System.out.printf("%c %3o%6d %30tc\t\t%s", x[i], r.mode, r.size, (long) r.time * 1000, r.name1); | 132 System.out.printf("%c %3o%6d %30tc\t\t%s", x[i], r.mode, r.size, (long) r.time * 1000, r.name1); |
| 100 if (r.name2 != null) { | 133 if (r.name2 != null) { |
| 101 System.out.printf(" --> %s", r.name2); | 134 System.out.printf(" --> %s", r.name2); |
| 102 } | 135 } |
| 103 System.out.println(); | 136 System.out.println(); |
| 104 } | 137 } |
| 105 System.out.println(); | 138 System.out.println(); |
| 106 } | 139 } |
| 107 } | 140 } |
| 108 | 141 |
| 109 private static class Record { | 142 /*package-local*/ static class Record { |
| 110 final int mode; | 143 final int mode; |
| 111 final int size; | 144 final int size; |
| 112 final int time; | 145 final int time; |
| 113 final String name1; | 146 final String name1; |
| 114 final String name2; | 147 final String name2; |
