Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgChangeset.java @ 129:645829962785
core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 16 Feb 2011 20:32:29 +0100 |
| parents | src/org/tmatesoft/hg/core/Cset.java@26ad21b250e4 |
| children | aa1629f36482 |
comparison
equal
deleted
inserted
replaced
| 128:44b97930570c | 129:645829962785 |
|---|---|
| 1 /* | |
| 2 * Copyright (c) 2011 TMate Software Ltd | |
| 3 * | |
| 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 | |
| 6 * the Free Software Foundation; version 2 of the License. | |
| 7 * | |
| 8 * This program is distributed in the hope that it will be useful, | |
| 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 * GNU General Public License for more details. | |
| 12 * | |
| 13 * For information on how to redistribute this software under | |
| 14 * the terms of a license other than GNU General Public License | |
| 15 * contact TMate Software at support@hg4j.com | |
| 16 */ | |
| 17 package org.tmatesoft.hg.core; | |
| 18 | |
| 19 import java.util.ArrayList; | |
| 20 import java.util.Collections; | |
| 21 import java.util.List; | |
| 22 | |
| 23 import org.tmatesoft.hg.core.LogCommand.FileRevision; | |
| 24 import org.tmatesoft.hg.repo.HgChangelog.Changeset; | |
| 25 import org.tmatesoft.hg.repo.HgRepository; | |
| 26 import org.tmatesoft.hg.repo.HgStatusCollector; | |
| 27 import org.tmatesoft.hg.util.PathPool; | |
| 28 | |
| 29 | |
| 30 /** | |
| 31 * TODO rename to Changeset along with original Changeset moved to .repo and renamed to HgChangeset? | |
| 32 * Not thread-safe, don't try to read from different threads | |
| 33 * | |
| 34 * @author Artem Tikhomirov | |
| 35 * @author TMate Software Ltd. | |
| 36 */ | |
| 37 public class HgChangeset implements Cloneable { | |
| 38 private final HgStatusCollector statusHelper; | |
| 39 private final PathPool pathHelper; | |
| 40 | |
| 41 // | |
| 42 private Changeset changeset; | |
| 43 private Nodeid nodeid; | |
| 44 | |
| 45 // | |
| 46 private List<FileRevision> modifiedFiles, addedFiles; | |
| 47 private List<Path> deletedFiles; | |
| 48 private int revNumber; | |
| 49 | |
| 50 // XXX consider CommandContext with StatusCollector, PathPool etc. Commands optionally get CC through a cons or create new | |
| 51 // and pass it around | |
| 52 /*package-local*/HgChangeset(HgStatusCollector statusCollector, PathPool pathPool) { | |
| 53 statusHelper = statusCollector; | |
| 54 pathHelper = pathPool; | |
| 55 } | |
| 56 | |
| 57 /*package-local*/ | |
| 58 void init(int localRevNumber, Nodeid nid, Changeset rawChangeset) { | |
| 59 revNumber = localRevNumber; | |
| 60 nodeid = nid; | |
| 61 changeset = rawChangeset; | |
| 62 modifiedFiles = addedFiles = null; | |
| 63 deletedFiles = null; | |
| 64 } | |
| 65 public int getRevision() { | |
| 66 return revNumber; | |
| 67 } | |
| 68 public Nodeid getNodeid() { | |
| 69 return nodeid; | |
| 70 } | |
| 71 public String getUser() { | |
| 72 return changeset.user(); | |
| 73 } | |
| 74 public String getComment() { | |
| 75 return changeset.comment(); | |
| 76 } | |
| 77 public String getBranch() { | |
| 78 return changeset.branch(); | |
| 79 } | |
| 80 public String getDate() { | |
| 81 return changeset.dateString(); | |
| 82 } | |
| 83 public Nodeid getManifestRevision() { | |
| 84 return changeset.manifest(); | |
| 85 } | |
| 86 | |
| 87 public List<Path> getAffectedFiles() { | |
| 88 // reports files as recorded in changelog. Note, merge revisions may have no | |
| 89 // files listed, and thus this method would return empty list, while | |
| 90 // #getModifiedFiles() would return list with merged file(s) (because it uses status to get 'em, not | |
| 91 // what #files() gives). | |
| 92 ArrayList<Path> rv = new ArrayList<Path>(changeset.files().size()); | |
| 93 for (String name : changeset.files()) { | |
| 94 rv.add(pathHelper.path(name)); | |
| 95 } | |
| 96 return rv; | |
| 97 } | |
| 98 | |
| 99 public List<FileRevision> getModifiedFiles() { | |
| 100 if (modifiedFiles == null) { | |
| 101 initFileChanges(); | |
| 102 } | |
| 103 return modifiedFiles; | |
| 104 } | |
| 105 | |
| 106 public List<FileRevision> getAddedFiles() { | |
| 107 if (addedFiles == null) { | |
| 108 initFileChanges(); | |
| 109 } | |
| 110 return addedFiles; | |
| 111 } | |
| 112 | |
| 113 public List<Path> getRemovedFiles() { | |
| 114 if (deletedFiles == null) { | |
| 115 initFileChanges(); | |
| 116 } | |
| 117 return deletedFiles; | |
| 118 } | |
| 119 | |
| 120 public boolean isMerge() { | |
| 121 return !Nodeid.NULL.equals(getSecondParentRevision()); | |
| 122 } | |
| 123 | |
| 124 public Nodeid getFirstParentRevision() { | |
| 125 // XXX may read once for both p1 and p2 | |
| 126 // or use ParentWalker to minimize reads even more. | |
| 127 byte[] p1 = new byte[20]; | |
| 128 statusHelper.getRepo().getChangelog().parents(revNumber, new int[2], p1, null); | |
| 129 return Nodeid.fromBinary(p1, 0); | |
| 130 } | |
| 131 | |
| 132 public Nodeid getSecondParentRevision() { | |
| 133 byte[] p2 = new byte[20]; | |
| 134 statusHelper.getRepo().getChangelog().parents(revNumber, new int[2], null, p2); | |
| 135 return Nodeid.fromBinary(p2, 0); | |
| 136 } | |
| 137 | |
| 138 @Override | |
| 139 public HgChangeset clone() { | |
| 140 try { | |
| 141 HgChangeset copy = (HgChangeset) super.clone(); | |
| 142 copy.changeset = changeset.clone(); | |
| 143 return copy; | |
| 144 } catch (CloneNotSupportedException ex) { | |
| 145 throw new InternalError(ex.toString()); | |
| 146 } | |
| 147 } | |
| 148 | |
| 149 private /*synchronized*/ void initFileChanges() { | |
| 150 ArrayList<Path> deleted = new ArrayList<Path>(); | |
| 151 ArrayList<FileRevision> modified = new ArrayList<FileRevision>(); | |
| 152 ArrayList<FileRevision> added = new ArrayList<FileRevision>(); | |
| 153 HgStatusCollector.Record r = new HgStatusCollector.Record(); | |
| 154 statusHelper.change(revNumber, r); | |
| 155 final HgRepository repo = statusHelper.getRepo(); | |
| 156 for (Path s : r.getModified()) { | |
| 157 Nodeid nid = r.nodeidAfterChange(s); | |
| 158 if (nid == null) { | |
| 159 throw new IllegalArgumentException(); | |
| 160 } | |
| 161 modified.add(new FileRevision(repo, nid, s)); | |
| 162 } | |
| 163 for (Path s : r.getAdded()) { | |
| 164 Nodeid nid = r.nodeidAfterChange(s); | |
| 165 if (nid == null) { | |
| 166 throw new IllegalArgumentException(); | |
| 167 } | |
| 168 added.add(new FileRevision(repo, nid, s)); | |
| 169 } | |
| 170 for (Path s : r.getRemoved()) { | |
| 171 // with Path from getRemoved, may just copy | |
| 172 deleted.add(s); | |
| 173 } | |
| 174 modified.trimToSize(); | |
| 175 added.trimToSize(); | |
| 176 deleted.trimToSize(); | |
| 177 modifiedFiles = Collections.unmodifiableList(modified); | |
| 178 addedFiles = Collections.unmodifiableList(added); | |
| 179 deletedFiles = Collections.unmodifiableList(deleted); | |
| 180 } | |
| 181 } |
