Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/ext/MqManager.java @ 501:d2f6ab541330
Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Mon, 29 Oct 2012 19:04:13 +0100 |
| parents | ba36f66c32b4 |
| children | 507602cb4fb3 |
comparison
equal
deleted
inserted
replaced
| 500:465316bf97e8 | 501:d2f6ab541330 |
|---|---|
| 28 import java.util.Map; | 28 import java.util.Map; |
| 29 | 29 |
| 30 import org.tmatesoft.hg.core.Nodeid; | 30 import org.tmatesoft.hg.core.Nodeid; |
| 31 import org.tmatesoft.hg.internal.Internals; | 31 import org.tmatesoft.hg.internal.Internals; |
| 32 import org.tmatesoft.hg.internal.LineReader; | 32 import org.tmatesoft.hg.internal.LineReader; |
| 33 import org.tmatesoft.hg.repo.HgInternals; | |
| 34 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 33 import org.tmatesoft.hg.repo.HgInvalidControlFileException; |
| 35 import org.tmatesoft.hg.repo.HgInvalidFileException; | 34 import org.tmatesoft.hg.repo.HgInvalidFileException; |
| 36 import org.tmatesoft.hg.repo.HgRepository; | |
| 37 import org.tmatesoft.hg.util.LogFacility; | 35 import org.tmatesoft.hg.util.LogFacility; |
| 38 import org.tmatesoft.hg.util.Path; | 36 import org.tmatesoft.hg.util.Path; |
| 39 | 37 |
| 40 /** | 38 /** |
| 41 * Mercurial Queues Support. | 39 * Mercurial Queues Support. |
| 42 * Access to MqExtension functionality. | 40 * Access to MqExtension functionality. |
| 43 * | 41 * |
| 42 * FIXME check we don't hold any mq files for too long, close them, use | |
| 43 * the same lock mechanism as mq does (if any). Check if MQ uses Mercurial's store lock | |
| 44 * | |
| 45 * @since 1.1 | |
| 44 * @author Artem Tikhomirov | 46 * @author Artem Tikhomirov |
| 45 * @author TMate Software Ltd. | 47 * @author TMate Software Ltd. |
| 46 */ | 48 */ |
| 47 public class MqManager { | 49 public class MqManager { |
| 48 | 50 |
| 49 private static final String PATCHES_DIR = "patches"; | 51 private static final String PATCHES_DIR = "patches"; |
| 50 | 52 |
| 51 private final HgRepository repo; | 53 private final Internals repo; |
| 52 private List<PatchRecord> applied = Collections.emptyList(); | 54 private List<PatchRecord> applied = Collections.emptyList(); |
| 53 private List<PatchRecord> allKnown = Collections.emptyList(); | 55 private List<PatchRecord> allKnown = Collections.emptyList(); |
| 54 private List<String> queueNames = Collections.emptyList(); | 56 private List<String> queueNames = Collections.emptyList(); |
| 55 private String activeQueue = PATCHES_DIR; | 57 private String activeQueue = PATCHES_DIR; |
| 56 | 58 |
| 57 public MqManager(HgRepository hgRepo) { | 59 /*package-local*/ MqManager(Internals internalRepo) { |
| 58 repo = hgRepo; | 60 repo = internalRepo; |
| 59 } | 61 } |
| 60 | 62 |
| 61 /** | 63 /** |
| 62 * Updates manager with up-to-date state of the mercurial queues. | 64 * Updates manager with up-to-date state of the mercurial queues. |
| 63 */ | 65 * @return <code>this</code> for convenience |
| 64 public void refresh() throws HgInvalidControlFileException { | 66 */ |
| 67 public MqManager refresh() throws HgInvalidControlFileException { | |
| 65 applied = allKnown = Collections.emptyList(); | 68 applied = allKnown = Collections.emptyList(); |
| 66 queueNames = Collections.emptyList(); | 69 queueNames = Collections.emptyList(); |
| 67 Internals repoImpl = HgInternals.getImplementationRepo(repo); | |
| 68 final LogFacility log = repo.getSessionContext().getLog(); | 70 final LogFacility log = repo.getSessionContext().getLog(); |
| 69 try { | 71 try { |
| 70 File queues = repoImpl.getFileFromRepoDir("patches.queues"); | 72 File queues = repo.getFileFromRepoDir("patches.queues"); |
| 71 if (queues.isFile()) { | 73 if (queues.isFile()) { |
| 72 LineReader lr = new LineReader(queues, log).trimLines(true).skipEmpty(true); | 74 LineReader lr = new LineReader(queues, log).trimLines(true).skipEmpty(true); |
| 73 lr.read(new LineReader.SimpleLineCollector(), queueNames = new LinkedList<String>()); | 75 lr.read(new LineReader.SimpleLineCollector(), queueNames = new LinkedList<String>()); |
| 74 } | 76 } |
| 75 final String queueLocation; // path under .hg to patch queue information (status, series and diff files) | 77 final String queueLocation; // path under .hg to patch queue information (status, series and diff files) |
| 76 File activeQueueFile = repoImpl.getFileFromRepoDir("patches.queue"); | 78 File activeQueueFile = repo.getFileFromRepoDir("patches.queue"); |
| 77 // file is there only if it's not default queue ('patches') that is active | 79 // file is there only if it's not default queue ('patches') that is active |
| 78 if (activeQueueFile.isFile()) { | 80 if (activeQueueFile.isFile()) { |
| 79 ArrayList<String> contents = new ArrayList<String>(); | 81 ArrayList<String> contents = new ArrayList<String>(); |
| 80 new LineReader(activeQueueFile, log).read(new LineReader.SimpleLineCollector(), contents); | 82 new LineReader(activeQueueFile, log).read(new LineReader.SimpleLineCollector(), contents); |
| 81 if (contents.isEmpty()) { | 83 if (contents.isEmpty()) { |
| 98 sb.append(queueLocation); | 100 sb.append(queueLocation); |
| 99 sb.append(p); | 101 sb.append(p); |
| 100 return Path.create(sb); | 102 return Path.create(sb); |
| 101 } | 103 } |
| 102 }; | 104 }; |
| 103 final File fileStatus = repoImpl.getFileFromRepoDir(queueLocation + "status"); | 105 final File fileStatus = repo.getFileFromRepoDir(queueLocation + "status"); |
| 104 final File fileSeries = repoImpl.getFileFromRepoDir(queueLocation + "series"); | 106 final File fileSeries = repo.getFileFromRepoDir(queueLocation + "series"); |
| 105 if (fileStatus.isFile()) { | 107 if (fileStatus.isFile()) { |
| 106 new LineReader(fileStatus, log).read(new LineReader.LineConsumer<List<PatchRecord>>() { | 108 new LineReader(fileStatus, log).read(new LineReader.LineConsumer<List<PatchRecord>>() { |
| 107 | 109 |
| 108 public boolean consume(String line, List<PatchRecord> result) throws IOException { | 110 public boolean consume(String line, List<PatchRecord> result) throws IOException { |
| 109 int sep = line.indexOf(':'); | 111 int sep = line.indexOf(':'); |
| 138 } catch (HgInvalidFileException ex) { | 140 } catch (HgInvalidFileException ex) { |
| 139 HgInvalidControlFileException th = new HgInvalidControlFileException(ex.getMessage(), ex.getCause(), ex.getFile()); | 141 HgInvalidControlFileException th = new HgInvalidControlFileException(ex.getMessage(), ex.getCause(), ex.getFile()); |
| 140 th.setStackTrace(ex.getStackTrace()); | 142 th.setStackTrace(ex.getStackTrace()); |
| 141 throw th; | 143 throw th; |
| 142 } | 144 } |
| 145 return this; | |
| 143 } | 146 } |
| 144 | 147 |
| 145 /** | 148 /** |
| 146 * Number of patches not yet applied | 149 * Number of patches not yet applied |
| 147 * @return positive value when there are | 150 * @return positive value when there are |
