Mercurial > hg4j
annotate src/org/tmatesoft/hg/repo/ext/MqManager.java @ 478:e74580e24feb
Test for subprogress
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 12 Jul 2012 19:11:12 +0200 | 
| parents | 0e34b8f3946a | 
| children | f3fab7a20841 | 
| rev | line source | 
|---|---|
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 2 * Copyright (c) 2012 TMate Software Ltd | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 3 * | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 4 * This program is free software; you can redistribute it and/or modify | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 5 * it under the terms of the GNU General Public License as published by | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 7 * | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 8 * This program is distributed in the hope that it will be useful, | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 11 * GNU General Public License for more details. | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 12 * | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 13 * For information on how to redistribute this software under | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 14 * the terms of a license other than GNU General Public License | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 15 * contact TMate Software at support@hg4j.com | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 17 package org.tmatesoft.hg.repo.ext; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 471 
7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
465diff
changeset | 19 import static org.tmatesoft.hg.util.LogFacility.Severity.Warn; | 
| 
7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
465diff
changeset | 20 | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 21 import java.io.BufferedReader; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 22 import java.io.File; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 23 import java.io.FileReader; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 24 import java.io.IOException; | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 25 import java.util.ArrayList; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 26 import java.util.Collection; | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 27 import java.util.Collections; | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 28 import java.util.HashMap; | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 29 import java.util.LinkedList; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 30 import java.util.List; | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 31 import java.util.Map; | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 32 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 33 import org.tmatesoft.hg.core.Nodeid; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 34 import org.tmatesoft.hg.repo.HgInternals; | 
| 471 
7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
465diff
changeset | 35 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 
| 
7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
465diff
changeset | 36 import org.tmatesoft.hg.repo.HgInvalidFileException; | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 37 import org.tmatesoft.hg.repo.HgRepository; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 38 import org.tmatesoft.hg.util.LogFacility; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 39 import org.tmatesoft.hg.util.Path; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 40 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 41 /** | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 42 * Mercurial Queues Support. | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 * Access to MqExtension functionality. | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 44 * | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 45 * @author Artem Tikhomirov | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 46 * @author TMate Software Ltd. | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 47 */ | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 48 public class MqManager { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 49 | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 50 private static final String PATCHES_DIR = "patches"; | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 51 | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 52 private final HgRepository repo; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 53 private List<PatchRecord> applied = Collections.emptyList(); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 54 private List<PatchRecord> allKnown = Collections.emptyList(); | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 55 private List<String> queueNames = Collections.emptyList(); | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 56 private String activeQueue = PATCHES_DIR; | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 57 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 58 public MqManager(HgRepository hgRepo) { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 59 repo = hgRepo; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 60 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 61 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 62 /** | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 63 * Updates manager with up-to-date state of the mercurial queues. | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 64 */ | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 65 public void refresh() throws HgInvalidControlFileException { | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 66 applied = allKnown = Collections.emptyList(); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 67 queueNames = Collections.emptyList(); | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 68 File repoDir = HgInternals.getRepositoryDir(repo); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 69 final LogFacility log = HgInternals.getContext(repo).getLog(); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 70 try { | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 71 File queues = new File(repoDir, "patches.queues"); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 72 if (queues.isFile()) { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 73 LineReader lr = new LineReader(queues, log).trimLines(true).skipEmpty(true); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 74 lr.read(new SimpleLineCollector(), queueNames = new LinkedList<String>()); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 75 } | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 76 final String queueLocation; // path under .hg to patch queue information (status, series and diff files) | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 77 File activeQueueFile = new File(repoDir, "patches.queue"); | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 78 // file is there only if it's not default queue ('patches') that is active | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 79 if (activeQueueFile.isFile()) { | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 80 ArrayList<String> contents = new ArrayList<String>(); | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 81 new LineReader(activeQueueFile, log).read(new SimpleLineCollector(), contents); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 82 if (contents.isEmpty()) { | 
| 471 
7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
465diff
changeset | 83 log.dump(getClass(), Warn, "File %s with active queue name is empty", activeQueueFile.getName()); | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 84 activeQueue = PATCHES_DIR; | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 85 queueLocation = PATCHES_DIR + '/'; | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 86 } else { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 87 activeQueue = contents.get(0); | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 88 queueLocation = PATCHES_DIR + '-' + activeQueue + '/'; | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 89 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 90 } else { | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 91 activeQueue = PATCHES_DIR; | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 92 queueLocation = PATCHES_DIR + '/'; | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 93 } | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 94 final Path.Source patchLocation = new Path.Source() { | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 95 | 
| 471 
7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
465diff
changeset | 96 public Path path(CharSequence p) { | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 97 StringBuilder sb = new StringBuilder(64); | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 98 sb.append(".hg/"); | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 99 sb.append(queueLocation); | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 100 sb.append(p); | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 101 return Path.create(sb); | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 102 } | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 103 }; | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 104 final File fileStatus = new File(repoDir, queueLocation + "status"); | 
| 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 105 final File fileSeries = new File(repoDir, queueLocation + "series"); | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 106 if (fileStatus.isFile()) { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 107 new LineReader(fileStatus, log).read(new LineConsumer<List<PatchRecord>>() { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 108 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 109 public boolean consume(String line, List<PatchRecord> result) throws IOException { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 110 int sep = line.indexOf(':'); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 111 if (sep == -1) { | 
| 471 
7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
465diff
changeset | 112 log.dump(MqManager.class, Warn, "Bad line in %s:%s", fileStatus.getPath(), line); | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 113 return true; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 114 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 115 Nodeid nid = Nodeid.fromAscii(line.substring(0, sep)); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 116 String name = new String(line.substring(sep+1)); | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 117 result.add(new PatchRecord(nid, name, patchLocation.path(name))); | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 118 return true; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 119 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 120 }, applied = new LinkedList<PatchRecord>()); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 121 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 122 if (fileSeries.isFile()) { | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 123 final Map<String,PatchRecord> name2patch = new HashMap<String, PatchRecord>(); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 124 for (PatchRecord pr : applied) { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 125 name2patch.put(pr.getName(), pr); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 126 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 127 LinkedList<String> knownPatchNames = new LinkedList<String>(); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 128 new LineReader(fileSeries, log).read(new SimpleLineCollector(), knownPatchNames); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 129 // XXX read other queues? | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 130 allKnown = new ArrayList<PatchRecord>(knownPatchNames.size()); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 131 for (String name : knownPatchNames) { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 132 PatchRecord pr = name2patch.get(name); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 133 if (pr == null) { | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 134 pr = new PatchRecord(null, name, patchLocation.path(name)); | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 135 } | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 136 allKnown.add(pr); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 137 } | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 138 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 139 } catch (HgInvalidFileException ex) { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 140 HgInvalidControlFileException th = new HgInvalidControlFileException(ex.getMessage(), ex.getCause(), ex.getFile()); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 141 th.setStackTrace(ex.getStackTrace()); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 142 throw th; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 143 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 144 } | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 145 | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 146 static class SimpleLineCollector implements LineConsumer<Collection<String>> { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 147 | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 148 public boolean consume(String line, Collection<String> result) throws IOException { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 149 result.add(line); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 150 return true; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 151 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 152 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 153 | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 154 /** | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 155 * Number of patches not yet applied | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 156 * @return positive value when there are | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 157 */ | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 158 public int getQueueSize() { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 159 return getAllKnownPatches().size() - getAppliedPatches().size(); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 160 } | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 161 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 162 /** | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 163 * Subset of the patches from the queue that were already applied to the repository | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 164 * <p>Analog of 'hg qapplied' | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 165 * | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 166 * <p>Clients shall call {@link #refresh()} prior to first use | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 167 * @return collection of records in no particular order, may be empty if none applied | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 168 */ | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 169 public List<PatchRecord> getAppliedPatches() { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 170 return Collections.unmodifiableList(applied); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 171 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 172 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 173 /** | 
| 465 
2078692eeb58
MqManager: read status/series of the active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
464diff
changeset | 174 * All of the patches in the active queue that MQ knows about for this repository | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 175 * | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 176 * <p>Clients shall call {@link #refresh()} prior to first use | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 177 * @return collection of records in no particular order, may be empty if there are no patches in the queue | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 178 */ | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 179 public List<PatchRecord> getAllKnownPatches() { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 180 return Collections.unmodifiableList(allKnown); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 181 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 182 | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 183 /** | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 184 * Name of the patch queue <code>hg qqueue --active</code> which is active now. | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 185 * @return patch queue name | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 186 */ | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 187 public String getActiveQueueName() { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 188 return activeQueue; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 189 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 190 | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 191 /** | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 192 * Patch queues known in the repository, <code>hg qqueue -l</code> analog. | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 193 * There's at least one patch queue (default one names 'patches'). Only one patch queue at a time is active. | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 194 * | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 195 * @return names of patch queues | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 196 */ | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 197 public List<String> getQueueNames() { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 198 return Collections.unmodifiableList(queueNames); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 199 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 200 | 
| 475 
0e34b8f3946a
Tests for MqManager
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
471diff
changeset | 201 public final class PatchRecord { | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 202 private final Nodeid nodeid; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 203 private final String name; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 204 private final Path location; | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 205 | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 206 // hashCode/equals might be useful if cons becomes public | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 207 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 208 PatchRecord(Nodeid revision, String name, Path diffLocation) { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 209 nodeid = revision; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 210 this.name = name; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 211 this.location = diffLocation; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 212 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 213 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 214 /** | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 215 * Identifies changeset of the patch that has been applied to the repository | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 216 * | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 217 * @return changeset revision or <code>null</code> if this patch is not yet applied | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 218 */ | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 219 public Nodeid getRevision() { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 220 return nodeid; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 221 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 222 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 223 /** | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 224 * Identifies patch, either based on a user-supplied name (<code>hg qnew <i>patch-name</i></code>) or | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 225 * an automatically generated name (like <code><i>revisionIndex</i>.diff</code> for imported changesets). | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 226 * Clients shall not rely on this naming scheme, though. | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 227 * | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 228 * @return never <code>null</code> | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 229 */ | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 230 public String getName() { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 231 return name; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 232 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 233 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 234 /** | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 235 * Location of diff file with the patch, relative to repository root | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 236 * @return path to the patch, never <code>null</code> | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 237 */ | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 238 public Path getPatchLocation() { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 239 return location; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 240 } | 
| 475 
0e34b8f3946a
Tests for MqManager
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
471diff
changeset | 241 | 
| 
0e34b8f3946a
Tests for MqManager
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
471diff
changeset | 242 @Override | 
| 
0e34b8f3946a
Tests for MqManager
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
471diff
changeset | 243 public String toString() { | 
| 
0e34b8f3946a
Tests for MqManager
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
471diff
changeset | 244 String fmt = "mq.PatchRecord[name:%s; %spath:%s]"; | 
| 
0e34b8f3946a
Tests for MqManager
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
471diff
changeset | 245 String ni = nodeid != null ? String.format("applied as: %s; ", nodeid.shortNotation()) : ""; | 
| 
0e34b8f3946a
Tests for MqManager
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
471diff
changeset | 246 return String.format(fmt, name, ni, location); | 
| 
0e34b8f3946a
Tests for MqManager
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
471diff
changeset | 247 } | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 248 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 249 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 250 // TODO refine API and extract into separate classes | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 251 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 252 interface LineConsumer<T> { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 253 // boolean begin(File f, T paramObj) throws IOException; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 254 boolean consume(String line, T paramObj) throws IOException; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 255 // boolean end(File f, T paramObj) throws IOException; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 256 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 257 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 258 class LineReader { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 259 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 260 private final File file; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 261 private final LogFacility log; | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 262 private boolean trimLines = true; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 263 private boolean skipEmpty = true; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 264 private String ignoreThatStars = null; | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 265 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 266 LineReader(File f, LogFacility logFacility) { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 267 file = f; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 268 log = logFacility; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 269 } | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 270 | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 271 /** | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 272 * default: <code>true</code> | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 273 * <code>false</code> to return line as is | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 274 */ | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 275 LineReader trimLines(boolean trim) { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 276 trimLines = trim; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 277 return this; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 278 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 279 | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 280 /** | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 281 * default: <code>true</code> | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 282 * <code>false</code> to pass empty lines to consumer | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 283 */ | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 284 LineReader skipEmpty(boolean skip) { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 285 skipEmpty = skip; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 286 return this; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 287 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 288 | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 289 /** | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 290 * default: doesn't skip any line. | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 291 * set e.g. to "#" or "//" to skip lines that start with such prefix | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 292 */ | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 293 LineReader ignoreLineComments(String lineStart) { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 294 ignoreThatStars = lineStart; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 295 return this; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 296 } | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 297 | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 298 <T> void read(LineConsumer<T> consumer, T paramObj) throws HgInvalidFileException { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 299 BufferedReader statusFileReader = null; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 300 try { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 301 // consumer.begin(file, paramObj); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 302 statusFileReader = new BufferedReader(new FileReader(file)); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 303 String line; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 304 boolean ok = true; | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 305 while (ok && (line = statusFileReader.readLine()) != null) { | 
| 464 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 306 if (trimLines) { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 307 line = line.trim(); | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 308 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 309 if (ignoreThatStars != null && line.startsWith(ignoreThatStars)) { | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 310 continue; | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 311 } | 
| 
1a3c18d57a8e
MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
463diff
changeset | 312 if (!skipEmpty || line.length() > 0) { | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 313 ok = consumer.consume(line, paramObj); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 314 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 315 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 316 } catch (IOException ex) { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 317 throw new HgInvalidFileException(ex.getMessage(), ex, file); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 318 } finally { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 319 try { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 320 statusFileReader.close(); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 321 } catch (IOException ex) { | 
| 471 
7bcfbc255f48
Merge changes from smartgit3 branch into 1.1 stream
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
465diff
changeset | 322 log.dump(MqManager.class, Warn, ex, null); | 
| 463 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 323 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 324 // try { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 325 // consumer.end(file, paramObj); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 326 // } catch (IOException ex) { | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 327 // log.warn(MqManager.class, ex, null); | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 328 // } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 329 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 330 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 331 } | 
| 
a0507a9f3da0
Initial support for MqExtension
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 332 } | 
