Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgChangeset.java @ 445:d0e5dc3cae6e smartgit3
Support for phases functionality from Mercurial 2.1
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Tue, 05 Jun 2012 20:50:06 +0200 |
| parents | 9517df1ef7ec |
| children | 03fd8d079e9c |
comparison
equal
deleted
inserted
replaced
| 412:63c5a9d7ca3f | 445:d0e5dc3cae6e |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2011 TMate Software Ltd | 2 * Copyright (c) 2011-2012 TMate Software Ltd |
| 3 * | 3 * |
| 4 * This program is free software; you can redistribute it and/or modify | 4 * This program is free software; you can redistribute it and/or modify |
| 5 * it under the terms of the GNU General Public License as published by | 5 * it under the terms of the GNU General Public License as published by |
| 6 * the Free Software Foundation; version 2 of the License. | 6 * the Free Software Foundation; version 2 of the License. |
| 7 * | 7 * |
| 15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
| 16 */ | 16 */ |
| 17 package org.tmatesoft.hg.core; | 17 package org.tmatesoft.hg.core; |
| 18 | 18 |
| 19 import java.util.ArrayList; | 19 import java.util.ArrayList; |
| 20 import java.util.Arrays; | |
| 20 import java.util.Collections; | 21 import java.util.Collections; |
| 22 import java.util.HashSet; | |
| 21 import java.util.List; | 23 import java.util.List; |
| 22 import java.util.Map; | 24 import java.util.Map; |
| 23 | 25 |
| 26 import org.tmatesoft.hg.internal.PhasesHelper; | |
| 24 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 27 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; |
| 25 import org.tmatesoft.hg.repo.HgChangelog; | 28 import org.tmatesoft.hg.repo.HgChangelog; |
| 29 import org.tmatesoft.hg.repo.HgPhase; | |
| 26 import org.tmatesoft.hg.repo.HgRepository; | 30 import org.tmatesoft.hg.repo.HgRepository; |
| 27 import org.tmatesoft.hg.repo.HgStatusCollector; | 31 import org.tmatesoft.hg.repo.HgStatusCollector; |
| 28 import org.tmatesoft.hg.util.Path; | 32 import org.tmatesoft.hg.util.Path; |
| 29 | 33 |
| 30 | 34 |
| 49 // | 53 // |
| 50 private List<HgFileRevision> modifiedFiles, addedFiles; | 54 private List<HgFileRevision> modifiedFiles, addedFiles; |
| 51 private List<Path> deletedFiles; | 55 private List<Path> deletedFiles; |
| 52 private int revNumber; | 56 private int revNumber; |
| 53 private byte[] parent1, parent2; | 57 private byte[] parent1, parent2; |
| 58 private PhasesHelper phaseHelper; | |
| 54 | 59 |
| 55 // XXX consider CommandContext with StatusCollector, PathPool etc. Commands optionally get CC through a cons or create new | 60 // XXX consider CommandContext with StatusCollector, PathPool etc. Commands optionally get CC through a cons or create new |
| 56 // and pass it around | 61 // and pass it around |
| 57 /*package-local*/HgChangeset(HgStatusCollector statusCollector, Path.Source pathFactory) { | 62 /*package-local*/HgChangeset(HgStatusCollector statusCollector, Path.Source pathFactory) { |
| 58 statusHelper = statusCollector; | 63 statusHelper = statusCollector; |
| 152 } | 157 } |
| 153 // read once for both p1 and p2 | 158 // read once for both p1 and p2 |
| 154 if (parent1 == null) { | 159 if (parent1 == null) { |
| 155 parent1 = new byte[20]; | 160 parent1 = new byte[20]; |
| 156 parent2 = new byte[20]; | 161 parent2 = new byte[20]; |
| 157 statusHelper.getRepo().getChangelog().parents(revNumber, new int[2], parent1, parent2); | 162 getRepo().getChangelog().parents(revNumber, new int[2], parent1, parent2); |
| 158 } | 163 } |
| 159 return Nodeid.fromBinary(parent1, 0); | 164 return Nodeid.fromBinary(parent1, 0); |
| 160 } | 165 } |
| 161 | 166 |
| 162 /** | 167 /** |
| 168 return parentHelper.safeSecondParent(nodeid); | 173 return parentHelper.safeSecondParent(nodeid); |
| 169 } | 174 } |
| 170 if (parent2 == null) { | 175 if (parent2 == null) { |
| 171 parent1 = new byte[20]; | 176 parent1 = new byte[20]; |
| 172 parent2 = new byte[20]; | 177 parent2 = new byte[20]; |
| 173 statusHelper.getRepo().getChangelog().parents(revNumber, new int[2], parent1, parent2); | 178 getRepo().getChangelog().parents(revNumber, new int[2], parent1, parent2); |
| 174 } | 179 } |
| 175 return Nodeid.fromBinary(parent2, 0); | 180 return Nodeid.fromBinary(parent2, 0); |
| 181 } | |
| 182 | |
| 183 /** | |
| 184 * Tells the phase this changeset belongs to. | |
| 185 * @return one of {@link HgPhase} values | |
| 186 */ | |
| 187 public HgPhase getPhase() throws HgInvalidControlFileException { | |
| 188 if (phaseHelper == null) { | |
| 189 // XXX would be handy to obtain ProgressSupport (perhaps, from statusHelper?) | |
| 190 // and pass it to #init(), so that there could be indication of file being read and cache being built | |
| 191 phaseHelper = new PhasesHelper(getRepo(), parentHelper); | |
| 192 } | |
| 193 return phaseHelper.getPhase(this); | |
| 176 } | 194 } |
| 177 | 195 |
| 178 @Override | 196 @Override |
| 179 public HgChangeset clone() { | 197 public HgChangeset clone() { |
| 180 try { | 198 try { |
| 183 return copy; | 201 return copy; |
| 184 } catch (CloneNotSupportedException ex) { | 202 } catch (CloneNotSupportedException ex) { |
| 185 throw new InternalError(ex.toString()); | 203 throw new InternalError(ex.toString()); |
| 186 } | 204 } |
| 187 } | 205 } |
| 206 | |
| 207 private HgRepository getRepo() { | |
| 208 return statusHelper.getRepo(); | |
| 209 } | |
| 188 | 210 |
| 189 private /*synchronized*/ void initFileChanges() throws HgInvalidControlFileException { | 211 private /*synchronized*/ void initFileChanges() throws HgInvalidControlFileException { |
| 190 ArrayList<Path> deleted = new ArrayList<Path>(); | 212 ArrayList<Path> deleted = new ArrayList<Path>(); |
| 191 ArrayList<HgFileRevision> modified = new ArrayList<HgFileRevision>(); | 213 ArrayList<HgFileRevision> modified = new ArrayList<HgFileRevision>(); |
| 192 ArrayList<HgFileRevision> added = new ArrayList<HgFileRevision>(); | 214 ArrayList<HgFileRevision> added = new ArrayList<HgFileRevision>(); |
| 193 HgStatusCollector.Record r = new HgStatusCollector.Record(); | 215 HgStatusCollector.Record r = new HgStatusCollector.Record(); |
| 194 statusHelper.change(revNumber, r); | 216 statusHelper.change(revNumber, r); |
| 195 final HgRepository repo = statusHelper.getRepo(); | 217 final HgRepository repo = getRepo(); |
| 196 for (Path s : r.getModified()) { | 218 for (Path s : r.getModified()) { |
| 197 Nodeid nid = r.nodeidAfterChange(s); | 219 Nodeid nid = r.nodeidAfterChange(s); |
| 198 if (nid == null) { | 220 if (nid == null) { |
| 199 throw new HgBadStateException(); | 221 throw new HgBadStateException(); |
| 200 } | 222 } |
