annotate src/org/tmatesoft/hg/repo/ext/MqManager.java @ 709:497e697636fc

Report merged lines as changed block if possible, not as a sequence of added/deleted blocks. To facilitate access to merge parent lines AddBlock got mergeLineAt() method that reports index of the line in the second parent (if any), while insertedAt() has been changed to report index in the first parent always
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 21 Aug 2013 16:23:27 +0200
parents 6526d8adbc0f
children
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: 465
diff 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: 465
diff changeset
20
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
21 import java.io.File;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
22 import java.io.IOException;
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
23 import java.util.ArrayList;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
24 import java.util.Collections;
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
25 import java.util.HashMap;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
26 import java.util.LinkedList;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
27 import java.util.List;
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
28 import java.util.Map;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
29
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 624
diff changeset
30 import org.tmatesoft.hg.core.HgIOException;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
31 import org.tmatesoft.hg.core.Nodeid;
493
ba36f66c32b4 Refactor to keep knowledge about repository control files and their location in respect to .hg/ in a single place (facilitate future adoption of shared repositories)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 490
diff changeset
32 import org.tmatesoft.hg.internal.Internals;
480
f3fab7a20841 Refactor LineReader utility as stanalone class to facilitate reuse
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 475
diff changeset
33 import org.tmatesoft.hg.internal.LineReader;
471
7bcfbc255f48 Merge changes from smartgit3 branch into 1.1 stream
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 465
diff changeset
34 import org.tmatesoft.hg.repo.HgInvalidControlFileException;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
35 import org.tmatesoft.hg.util.LogFacility;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
36 import org.tmatesoft.hg.util.Path;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
37
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
38 /**
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
39 * Mercurial Queues Support.
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
40 * Access to MqExtension functionality.
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
41 *
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
42 * @since 1.1
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
43 * @author Artem Tikhomirov
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
44 * @author TMate Software Ltd.
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
45 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
46 public class MqManager {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
47
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
48 private static final String PATCHES_DIR = "patches";
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
49
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
50 private final Internals repo;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
51 private List<PatchRecord> applied = Collections.emptyList();
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
52 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: 463
diff changeset
53 private List<String> queueNames = Collections.emptyList();
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
54 private String activeQueue = PATCHES_DIR;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
55
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
56 /*package-local*/ MqManager(Internals internalRepo) {
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
57 repo = internalRepo;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
58 }
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
59
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 * Updates manager with up-to-date state of the mercurial queues.
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
62 * @return <code>this</code> for convenience
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
63 */
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
64 public MqManager refresh() throws HgInvalidControlFileException {
624
507602cb4fb3 FIXMEs and TODOs: pay some technical debt
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 501
diff changeset
65 // MQ doesn't seem to use any custom lock mechanism.
507602cb4fb3 FIXMEs and TODOs: pay some technical debt
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 501
diff changeset
66 // MQ uses Mercurial's wc/store lock when updating repository (strip/new queue)
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
67 applied = allKnown = Collections.emptyList();
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
68 queueNames = Collections.emptyList();
490
b3c16d1aede0 Refactoring: move HgRepository's implementation aspects to Internals (which is now its imlementation counterpart and primary repository class to be used by other parts of the library)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 480
diff changeset
69 final LogFacility log = repo.getSessionContext().getLog();
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
70 try {
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
71 File queues = repo.getFileFromRepoDir("patches.queues");
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
72 if (queues.isFile()) {
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
73 LineReader lr = new LineReader(queues, log).trimLines(true).skipEmpty(true);
480
f3fab7a20841 Refactor LineReader utility as stanalone class to facilitate reuse
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 475
diff changeset
74 lr.read(new LineReader.SimpleLineCollector(), queueNames = new LinkedList<String>());
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
75 }
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
76 final String queueLocation; // path under .hg to patch queue information (status, series and diff files)
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
77 File activeQueueFile = repo.getFileFromRepoDir("patches.queue");
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff 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: 463
diff changeset
79 if (activeQueueFile.isFile()) {
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
80 ArrayList<String> contents = new ArrayList<String>();
480
f3fab7a20841 Refactor LineReader utility as stanalone class to facilitate reuse
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 475
diff changeset
81 new LineReader(activeQueueFile, log).read(new LineReader.SimpleLineCollector(), contents);
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
82 if (contents.isEmpty()) {
471
7bcfbc255f48 Merge changes from smartgit3 branch into 1.1 stream
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 465
diff 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: 464
diff changeset
84 activeQueue = PATCHES_DIR;
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff 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: 463
diff changeset
86 } else {
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
87 activeQueue = contents.get(0);
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff 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: 463
diff changeset
89 }
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
90 } else {
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
91 activeQueue = PATCHES_DIR;
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff 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: 463
diff changeset
93 }
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff 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: 464
diff changeset
95
471
7bcfbc255f48 Merge changes from smartgit3 branch into 1.1 stream
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 465
diff changeset
96 public Path path(CharSequence p) {
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
97 StringBuilder sb = new StringBuilder(64);
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
98 sb.append(".hg/");
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
99 sb.append(queueLocation);
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
100 sb.append(p);
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
101 return Path.create(sb);
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
102 }
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
103 };
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
104 final File fileStatus = repo.getFileFromRepoDir(queueLocation + "status");
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
105 final File fileSeries = repo.getFileFromRepoDir(queueLocation + "series");
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
106 if (fileStatus.isFile()) {
480
f3fab7a20841 Refactor LineReader utility as stanalone class to facilitate reuse
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 475
diff changeset
107 new LineReader(fileStatus, log).read(new LineReader.LineConsumer<List<PatchRecord>>() {
463
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: 465
diff 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: 464
diff 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: 463
diff 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: 463
diff 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: 463
diff 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: 463
diff changeset
126 }
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
127 LinkedList<String> knownPatchNames = new LinkedList<String>();
480
f3fab7a20841 Refactor LineReader utility as stanalone class to facilitate reuse
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 475
diff changeset
128 new LineReader(fileSeries, log).read(new LineReader.SimpleLineCollector(), knownPatchNames);
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff 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: 463
diff 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: 463
diff 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: 463
diff 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: 463
diff changeset
133 if (pr == null) {
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff 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: 463
diff changeset
136 allKnown.add(pr);
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
137 }
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
138 }
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 624
diff changeset
139 } catch (HgIOException ex) {
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 624
diff changeset
140 throw new HgInvalidControlFileException(ex, true);
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
141 }
501
d2f6ab541330 Change the way extensions are accessed (with ExtensionsManager now), add preliminary Rebase extension support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 493
diff changeset
142 return this;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
143 }
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
144
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
145 /**
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
146 * 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: 463
diff changeset
147 * @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: 463
diff changeset
148 */
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
149 public int getQueueSize() {
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
150 return getAllKnownPatches().size() - getAppliedPatches().size();
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
151 }
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
152
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
153 /**
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
154 * 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: 463
diff changeset
155 * <p>Analog of 'hg qapplied'
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
156 *
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
157 * <p>Clients shall call {@link #refresh()} prior to first use
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
158 * @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
159 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
160 public List<PatchRecord> getAppliedPatches() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
161 return Collections.unmodifiableList(applied);
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
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
164 /**
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
165 * 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
166 *
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
167 * <p>Clients shall call {@link #refresh()} prior to first use
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
168 * @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
169 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
170 public List<PatchRecord> getAllKnownPatches() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
171 return Collections.unmodifiableList(allKnown);
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
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
174 /**
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
175 * 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: 463
diff changeset
176 * @return patch queue name
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
177 */
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
178 public String getActiveQueueName() {
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
179 return activeQueue;
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
180 }
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
181
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
182 /**
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
183 * 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: 463
diff changeset
184 * 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: 463
diff changeset
185 *
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
186 * @return names of patch queues
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
187 */
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
188 public List<String> getQueueNames() {
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
189 return Collections.unmodifiableList(queueNames);
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
190 }
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
191
475
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
192 public final class PatchRecord {
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
193 private final Nodeid nodeid;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
194 private final String name;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
195 private final Path location;
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
196
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
197 // hashCode/equals might be useful if cons becomes public
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
198
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
199 PatchRecord(Nodeid revision, String name, Path diffLocation) {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
200 nodeid = revision;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
201 this.name = name;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
202 this.location = diffLocation;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
203 }
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
204
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
205 /**
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
206 * 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
207 *
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
208 * @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
209 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
210 public Nodeid getRevision() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
211 return nodeid;
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 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
216 * 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
217 * Clients shall not rely on this naming scheme, though.
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 * @return never <code>null</code>
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
220 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
221 public String getName() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
222 return name;
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
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
225 /**
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
226 * 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
227 * @return path to the patch, never <code>null</code>
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
228 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
229 public Path getPatchLocation() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
230 return location;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
231 }
475
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
232
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
233 @Override
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
234 public String toString() {
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
235 String fmt = "mq.PatchRecord[name:%s; %spath:%s]";
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
236 String ni = nodeid != null ? String.format("applied as: %s; ", nodeid.shortNotation()) : "";
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
237 return String.format(fmt, name, ni, location);
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
238 }
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
239 }
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
240 }