Mercurial > jhg
comparison src/com/tmate/hgkit/ll/LocalHgRepo.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 | 865bf07f381f |
| children | 11cfabe692b3 |
comparison
equal
deleted
inserted
replaced
| 17:571e1b2cc3f7 | 18:02ee376bee79 |
|---|---|
| 9 import java.io.IOException; | 9 import java.io.IOException; |
| 10 import java.io.InputStreamReader; | 10 import java.io.InputStreamReader; |
| 11 import java.lang.ref.SoftReference; | 11 import java.lang.ref.SoftReference; |
| 12 import java.util.Arrays; | 12 import java.util.Arrays; |
| 13 import java.util.HashMap; | 13 import java.util.HashMap; |
| 14 import java.util.LinkedList; | |
| 14 import java.util.TreeSet; | 15 import java.util.TreeSet; |
| 15 | 16 |
| 16 import com.tmate.hgkit.fs.DataAccessProvider; | 17 import com.tmate.hgkit.fs.DataAccessProvider; |
| 17 | 18 |
| 18 /** | 19 /** |
| 41 | 42 |
| 42 @Override | 43 @Override |
| 43 public String getLocation() { | 44 public String getLocation() { |
| 44 return repoLocation; | 45 return repoLocation; |
| 45 } | 46 } |
| 46 | 47 |
| 48 @Override | |
| 49 public void status(int rev1, int rev2, StatusInspector inspector) { | |
| 50 throw HgRepository.notImplemented(); | |
| 51 } | |
| 52 | |
| 53 public void statusLocal(int rev1, StatusInspector inspector) { | |
| 54 LinkedList<File> folders = new LinkedList<File>(); | |
| 55 final File rootDir = repoDir.getParentFile(); | |
| 56 folders.add(rootDir); | |
| 57 final HgDirstate dirstate = loadDirstate(); | |
| 58 final HgIgnore hgignore = loadIgnore(); | |
| 59 TreeSet<String> knownEntries = dirstate.all(); | |
| 60 do { | |
| 61 File d = folders.removeFirst(); | |
| 62 for (File f : d.listFiles()) { | |
| 63 if (f.isDirectory()) { | |
| 64 if (!".hg".equals(f.getName())) { | |
| 65 folders.addLast(f); | |
| 66 } | |
| 67 } else { | |
| 68 // FIXME path relative to rootDir | |
| 69 String fname = normalize(f.getPath().substring(rootDir.getPath().length() + 1)); | |
| 70 if (hgignore.isIgnored(fname)) { | |
| 71 inspector.ignored(fname); | |
| 72 } else { | |
| 73 if (knownEntries.remove(fname)) { | |
| 74 // modified, added, removed, clean | |
| 75 HgDirstate.Record r; | |
| 76 if ((r = dirstate.checkNormal(fname)) != null) { | |
| 77 // either clean or modified | |
| 78 if (f.lastModified() / 1000 == r.time && r.size == f.length()) { | |
| 79 inspector.clean(fname); | |
| 80 } else { | |
| 81 // FIXME check actual content to avoid false modified files | |
| 82 inspector.modified(fname); | |
| 83 } | |
| 84 } else if ((r = dirstate.checkAdded(fname)) != null) { | |
| 85 if (r.name2 == null) { | |
| 86 inspector.added(fname); | |
| 87 } else { | |
| 88 inspector.copied(fname, r.name2); | |
| 89 } | |
| 90 } else if ((r = dirstate.checkRemoved(fname)) != null) { | |
| 91 inspector.removed(fname); | |
| 92 } else if ((r = dirstate.checkMerged(fname)) != null) { | |
| 93 inspector.modified(fname); | |
| 94 } | |
| 95 } else { | |
| 96 inspector.unknown(fname); | |
| 97 } | |
| 98 } | |
| 99 } | |
| 100 } | |
| 101 } while (!folders.isEmpty()); | |
| 102 for (String m : knownEntries) { | |
| 103 inspector.missing(m); | |
| 104 } | |
| 105 } | |
| 106 | |
| 47 // XXX package-local, unless there are cases when required from outside (guess, working dir/revision walkers may hide dirstate access and no public visibility needed) | 107 // XXX package-local, unless there are cases when required from outside (guess, working dir/revision walkers may hide dirstate access and no public visibility needed) |
| 48 public final HgDirstate loadDirstate() { | 108 public final HgDirstate loadDirstate() { |
| 49 // XXX may cache in SoftReference if creation is expensive | 109 // XXX may cache in SoftReference if creation is expensive |
| 50 return new HgDirstate(this, new File(repoDir, "dirstate")); | 110 return new HgDirstate(this, new File(repoDir, "dirstate")); |
| 51 } | 111 } |
