Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/ext/MqManager.java @ 465:2078692eeb58 smartgit3
MqManager: read status/series of the active queue
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Thu, 21 Jun 2012 21:36:06 +0200 |
| parents | 1a3c18d57a8e |
| children | 7bcfbc255f48 |
comparison
equal
deleted
inserted
replaced
| 464:1a3c18d57a8e | 465:2078692eeb58 |
|---|---|
| 43 * @author Artem Tikhomirov | 43 * @author Artem Tikhomirov |
| 44 * @author TMate Software Ltd. | 44 * @author TMate Software Ltd. |
| 45 */ | 45 */ |
| 46 public class MqManager { | 46 public class MqManager { |
| 47 | 47 |
| 48 private static final String PATCHES_DIR = "patches"; | |
| 49 | |
| 48 private final HgRepository repo; | 50 private final HgRepository repo; |
| 49 private List<PatchRecord> applied = Collections.emptyList(); | 51 private List<PatchRecord> applied = Collections.emptyList(); |
| 50 private List<PatchRecord> allKnown = Collections.emptyList(); | 52 private List<PatchRecord> allKnown = Collections.emptyList(); |
| 51 private List<String> queueNames = Collections.emptyList(); | 53 private List<String> queueNames = Collections.emptyList(); |
| 52 private String activeQueue = "patches"; | 54 private String activeQueue = PATCHES_DIR; |
| 53 | 55 |
| 54 public MqManager(HgRepository hgRepo) { | 56 public MqManager(HgRepository hgRepo) { |
| 55 repo = hgRepo; | 57 repo = hgRepo; |
| 56 } | 58 } |
| 57 | 59 |
| 61 public void refresh() throws HgInvalidControlFileException { | 63 public void refresh() throws HgInvalidControlFileException { |
| 62 applied = allKnown = Collections.emptyList(); | 64 applied = allKnown = Collections.emptyList(); |
| 63 queueNames = Collections.emptyList(); | 65 queueNames = Collections.emptyList(); |
| 64 File repoDir = HgInternals.getRepositoryDir(repo); | 66 File repoDir = HgInternals.getRepositoryDir(repo); |
| 65 final LogFacility log = HgInternals.getContext(repo).getLog(); | 67 final LogFacility log = HgInternals.getContext(repo).getLog(); |
| 66 final File fileStatus = new File(repoDir, "patches/status"); | |
| 67 final File fileSeries = new File(repoDir, "patches/series"); | |
| 68 try { | 68 try { |
| 69 File queues = new File(repoDir, "patches.queues"); | 69 File queues = new File(repoDir, "patches.queues"); |
| 70 if (queues.isFile()) { | 70 if (queues.isFile()) { |
| 71 LineReader lr = new LineReader(queues, log).trimLines(true).skipEmpty(true); | 71 LineReader lr = new LineReader(queues, log).trimLines(true).skipEmpty(true); |
| 72 lr.read(new SimpleLineCollector(), queueNames = new LinkedList<String>()); | 72 lr.read(new SimpleLineCollector(), queueNames = new LinkedList<String>()); |
| 73 } | 73 } |
| 74 final String queueLocation; // path under .hg to patch queue information (status, series and diff files) | |
| 74 File activeQueueFile = new File(repoDir, "patches.queue"); | 75 File activeQueueFile = new File(repoDir, "patches.queue"); |
| 75 ArrayList<String> contents = new ArrayList<String>(); | 76 // file is there only if it's not default queue ('patches') that is active |
| 76 if (activeQueueFile.isFile()) { | 77 if (activeQueueFile.isFile()) { |
| 78 ArrayList<String> contents = new ArrayList<String>(); | |
| 77 new LineReader(activeQueueFile, log).read(new SimpleLineCollector(), contents); | 79 new LineReader(activeQueueFile, log).read(new SimpleLineCollector(), contents); |
| 78 if (contents.isEmpty()) { | 80 if (contents.isEmpty()) { |
| 79 log.warn(getClass(), "File %s with active queue name is empty", activeQueueFile.getName()); | 81 log.warn(getClass(), "File %s with active queue name is empty", activeQueueFile.getName()); |
| 80 activeQueue = "patches"; | 82 activeQueue = PATCHES_DIR; |
| 83 queueLocation = PATCHES_DIR + '/'; | |
| 81 } else { | 84 } else { |
| 82 activeQueue = contents.get(0); | 85 activeQueue = contents.get(0); |
| 86 queueLocation = PATCHES_DIR + '-' + activeQueue + '/'; | |
| 83 } | 87 } |
| 84 } else { | 88 } else { |
| 85 activeQueue = "patches"; | 89 activeQueue = PATCHES_DIR; |
| 86 } | 90 queueLocation = PATCHES_DIR + '/'; |
| 91 } | |
| 92 final Path.Source patchLocation = new Path.Source() { | |
| 93 | |
| 94 public Path path(String p) { | |
| 95 StringBuilder sb = new StringBuilder(64); | |
| 96 sb.append(".hg/"); | |
| 97 sb.append(queueLocation); | |
| 98 sb.append(p); | |
| 99 return Path.create(sb); | |
| 100 } | |
| 101 }; | |
| 102 final File fileStatus = new File(repoDir, queueLocation + "status"); | |
| 103 final File fileSeries = new File(repoDir, queueLocation + "series"); | |
| 87 if (fileStatus.isFile()) { | 104 if (fileStatus.isFile()) { |
| 88 new LineReader(fileStatus, log).read(new LineConsumer<List<PatchRecord>>() { | 105 new LineReader(fileStatus, log).read(new LineConsumer<List<PatchRecord>>() { |
| 89 | 106 |
| 90 public boolean consume(String line, List<PatchRecord> result) throws IOException { | 107 public boolean consume(String line, List<PatchRecord> result) throws IOException { |
| 91 int sep = line.indexOf(':'); | 108 int sep = line.indexOf(':'); |
| 93 log.warn(MqManager.class, "Bad line in %s:%s", fileStatus.getPath(), line); | 110 log.warn(MqManager.class, "Bad line in %s:%s", fileStatus.getPath(), line); |
| 94 return true; | 111 return true; |
| 95 } | 112 } |
| 96 Nodeid nid = Nodeid.fromAscii(line.substring(0, sep)); | 113 Nodeid nid = Nodeid.fromAscii(line.substring(0, sep)); |
| 97 String name = new String(line.substring(sep+1)); | 114 String name = new String(line.substring(sep+1)); |
| 98 result.add(new PatchRecord(nid, name, Path.create(".hg/patches/" + name))); | 115 result.add(new PatchRecord(nid, name, patchLocation.path(name))); |
| 99 return true; | 116 return true; |
| 100 } | 117 } |
| 101 }, applied = new LinkedList<PatchRecord>()); | 118 }, applied = new LinkedList<PatchRecord>()); |
| 102 } | 119 } |
| 103 if (fileSeries.isFile()) { | 120 if (fileSeries.isFile()) { |
| 110 // XXX read other queues? | 127 // XXX read other queues? |
| 111 allKnown = new ArrayList<PatchRecord>(knownPatchNames.size()); | 128 allKnown = new ArrayList<PatchRecord>(knownPatchNames.size()); |
| 112 for (String name : knownPatchNames) { | 129 for (String name : knownPatchNames) { |
| 113 PatchRecord pr = name2patch.get(name); | 130 PatchRecord pr = name2patch.get(name); |
| 114 if (pr == null) { | 131 if (pr == null) { |
| 115 pr = new PatchRecord(null, name, Path.create(".hg/patches/" + name)); | 132 pr = new PatchRecord(null, name, patchLocation.path(name)); |
| 116 } | 133 } |
| 117 allKnown.add(pr); | 134 allKnown.add(pr); |
| 118 } | 135 } |
| 119 } | 136 } |
| 120 } catch (HgInvalidFileException ex) { | 137 } catch (HgInvalidFileException ex) { |
| 150 public List<PatchRecord> getAppliedPatches() { | 167 public List<PatchRecord> getAppliedPatches() { |
| 151 return Collections.unmodifiableList(applied); | 168 return Collections.unmodifiableList(applied); |
| 152 } | 169 } |
| 153 | 170 |
| 154 /** | 171 /** |
| 155 * All of the patches that MQ knows about for this repository | 172 * All of the patches in the active queue that MQ knows about for this repository |
| 156 * | 173 * |
| 157 * <p>Clients shall call {@link #refresh()} prior to first use | 174 * <p>Clients shall call {@link #refresh()} prior to first use |
| 158 * @return collection of records in no particular order, may be empty if there are no patches in the queue | 175 * @return collection of records in no particular order, may be empty if there are no patches in the queue |
| 159 */ | 176 */ |
| 160 public List<PatchRecord> getAllKnownPatches() { | 177 public List<PatchRecord> getAllKnownPatches() { |
