annotate src/org/tmatesoft/hg/repo/ext/MqManager.java @ 574:88afffd39899

Improve memory consumption of HgManifest#getFileRevision(): avoid extra byte[] instances
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Tue, 16 Apr 2013 14:44:57 +0200
parents d2f6ab541330
children 507602cb4fb3
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
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
30 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
31 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
32 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
33 import org.tmatesoft.hg.repo.HgInvalidControlFileException;
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.HgInvalidFileException;
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 * FIXME check we don't hold any mq files for too long, close them, use
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
43 * the same lock mechanism as mq does (if any). Check if MQ uses Mercurial's store lock
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
44 *
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
45 * @since 1.1
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
46 * @author Artem Tikhomirov
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
47 * @author TMate Software Ltd.
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
48 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
49 public class MqManager {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
50
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
51 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
52
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
53 private final Internals repo;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
54 private List<PatchRecord> applied = Collections.emptyList();
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
55 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
56 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
57 private String activeQueue = PATCHES_DIR;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
58
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
59 /*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
60 repo = internalRepo;
463
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 /**
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
64 * 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
65 * @return <code>this</code> for convenience
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
66 */
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
67 public MqManager refresh() throws HgInvalidControlFileException {
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
68 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
69 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
70 final LogFacility log = repo.getSessionContext().getLog();
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
71 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
72 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
73 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
74 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
75 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
76 }
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
77 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
78 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
79 // 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
80 if (activeQueueFile.isFile()) {
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
81 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
82 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
83 if (contents.isEmpty()) {
471
7bcfbc255f48 Merge changes from smartgit3 branch into 1.1 stream
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 465
diff changeset
84 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
85 activeQueue = PATCHES_DIR;
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
86 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
87 } else {
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
88 activeQueue = contents.get(0);
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
89 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
90 }
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
91 } else {
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
92 activeQueue = PATCHES_DIR;
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
93 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
94 }
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
95 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
96
471
7bcfbc255f48 Merge changes from smartgit3 branch into 1.1 stream
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 465
diff changeset
97 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
98 StringBuilder sb = new StringBuilder(64);
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
99 sb.append(".hg/");
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
100 sb.append(queueLocation);
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
101 sb.append(p);
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
102 return Path.create(sb);
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
103 }
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
104 };
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
105 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
106 final File fileSeries = repo.getFileFromRepoDir(queueLocation + "series");
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
107 if (fileStatus.isFile()) {
480
f3fab7a20841 Refactor LineReader utility as stanalone class to facilitate reuse
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 475
diff changeset
108 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
109
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
110 public boolean consume(String line, List<PatchRecord> result) throws IOException {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
111 int sep = line.indexOf(':');
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
112 if (sep == -1) {
471
7bcfbc255f48 Merge changes from smartgit3 branch into 1.1 stream
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 465
diff changeset
113 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
114 return true;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
115 }
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
116 Nodeid nid = Nodeid.fromAscii(line.substring(0, sep));
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
117 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
118 result.add(new PatchRecord(nid, name, patchLocation.path(name)));
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
119 return true;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
120 }
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
121 }, applied = new LinkedList<PatchRecord>());
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
122 }
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
123 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
124 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
125 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
126 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
127 }
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
128 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
129 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
130 // 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
131 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
132 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
133 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
134 if (pr == null) {
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
135 pr = new PatchRecord(null, name, patchLocation.path(name));
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
136 }
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
137 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
138 }
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
139 }
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
140 } catch (HgInvalidFileException ex) {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
141 HgInvalidControlFileException th = new HgInvalidControlFileException(ex.getMessage(), ex.getCause(), ex.getFile());
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
142 th.setStackTrace(ex.getStackTrace());
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
143 throw th;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
144 }
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
145 return this;
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
146 }
464
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
147
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 * 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
150 * @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
151 */
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
152 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
153 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
154 }
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
155
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 * 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
158 * <p>Analog of 'hg qapplied'
463
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 * <p>Clients shall call {@link #refresh()} prior to first use
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
161 * @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
162 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
163 public List<PatchRecord> getAppliedPatches() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
164 return Collections.unmodifiableList(applied);
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
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
167 /**
465
2078692eeb58 MqManager: read status/series of the active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 464
diff changeset
168 * 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
169 *
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
170 * <p>Clients shall call {@link #refresh()} prior to first use
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
171 * @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
172 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
173 public List<PatchRecord> getAllKnownPatches() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
174 return Collections.unmodifiableList(allKnown);
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
464
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 * 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
179 * @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
180 */
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
181 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
182 return activeQueue;
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
183 }
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
184
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 * 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
187 * 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
188 *
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
189 * @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
190 */
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
191 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
192 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
193 }
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
194
475
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
195 public final class PatchRecord {
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
196 private final Nodeid nodeid;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
197 private final String name;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
198 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
199
1a3c18d57a8e MqManager evolution: same PatchRecord instances, list patch queues, detect active queue
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 463
diff changeset
200 // hashCode/equals might be useful if cons becomes public
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
201
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
202 PatchRecord(Nodeid revision, String name, Path diffLocation) {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
203 nodeid = revision;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
204 this.name = name;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
205 this.location = diffLocation;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
206 }
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 /**
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
209 * 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
210 *
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
211 * @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
212 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
213 public Nodeid getRevision() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
214 return nodeid;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
215 }
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 /**
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
218 * 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
219 * 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
220 * Clients shall not rely on this naming scheme, though.
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 * @return never <code>null</code>
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 public String getName() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
225 return name;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
226 }
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 /**
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
229 * 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
230 * @return path to the patch, never <code>null</code>
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
231 */
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
232 public Path getPatchLocation() {
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
233 return location;
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
234 }
475
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
235
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
236 @Override
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
237 public String toString() {
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
238 String fmt = "mq.PatchRecord[name:%s; %spath:%s]";
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
239 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
240 return String.format(fmt, name, ni, location);
0e34b8f3946a Tests for MqManager
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 471
diff changeset
241 }
463
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
242 }
a0507a9f3da0 Initial support for MqExtension
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
243 }