Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgChangeset.java @ 403:2747b0723867
FIXMEs: work on exceptions and javadoc
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Mon, 05 Mar 2012 14:50:51 +0100 | 
| parents | 9517df1ef7ec | 
| children | ee8264d80747 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 402:1fcc7f7b6d65 | 403:2747b0723867 | 
|---|---|
| 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 * | 
| 76 throw new IllegalArgumentException(); | 76 throw new IllegalArgumentException(); | 
| 77 } | 77 } | 
| 78 } | 78 } | 
| 79 } | 79 } | 
| 80 | 80 | 
| 81 /** | |
| 82 * Index of the changeset in local repository. Note, this number is relevant only for local repositories/operations, use | |
| 83 * {@link Nodeid nodeid} to uniquely identify a revision. | |
| 84 * | |
| 85 * @return index of the changeset revision | |
| 86 */ | |
| 87 public int getRevisionIndex() { | |
| 88 return revNumber; | |
| 89 } | |
| 90 | |
| 91 /** | |
| 92 * @deprecated use {@link #getRevisionIndex()} | |
| 93 */ | |
| 94 @Deprecated | |
| 81 public int getRevision() { | 95 public int getRevision() { | 
| 82 return revNumber; | 96 return revNumber; | 
| 83 } | 97 } | 
| 98 | |
| 99 /** | |
| 100 * Unique identity of this changeset revision | |
| 101 * @return revision identifier, never <code>null</code> | |
| 102 */ | |
| 84 public Nodeid getNodeid() { | 103 public Nodeid getNodeid() { | 
| 85 return nodeid; | 104 return nodeid; | 
| 86 } | 105 } | 
| 106 | |
| 107 /** | |
| 108 * Name of the user who made this commit | |
| 109 * @return author of the commit, never <code>null</code> | |
| 110 */ | |
| 87 public String getUser() { | 111 public String getUser() { | 
| 88 return changeset.user(); | 112 return changeset.user(); | 
| 89 } | 113 } | 
| 114 | |
| 115 /** | |
| 116 * Commit description | |
| 117 * @return content of the corresponding field in changeset record; empty string if none specified. | |
| 118 */ | |
| 90 public String getComment() { | 119 public String getComment() { | 
| 91 return changeset.comment(); | 120 return changeset.comment(); | 
| 92 } | 121 } | 
| 122 | |
| 123 /** | |
| 124 * Name of the branch this commit was made in. Returns "default" for main branch. | |
| 125 * @return name of the branch, non-empty string | |
| 126 */ | |
| 93 public String getBranch() { | 127 public String getBranch() { | 
| 94 return changeset.branch(); | 128 return changeset.branch(); | 
| 95 } | 129 } | 
| 96 | 130 | 
| 97 /** | 131 /** | 
| 98 * @return used to be String, now {@link HgDate}, use {@link HgDate#toString()} to get same result as before | 132 * @return used to be String, now {@link HgDate}, use {@link HgDate#toString()} to get same result as before | 
| 99 */ | 133 */ | 
| 100 public HgDate getDate() { | 134 public HgDate getDate() { | 
| 101 return new HgDate(changeset.date().getTime(), changeset.timezone()); | 135 return new HgDate(changeset.date().getTime(), changeset.timezone()); | 
| 102 } | 136 } | 
| 137 | |
| 138 /** | |
| 139 * Indicates revision of manifest that tracks state of repository at the moment of this commit. | |
| 140 * Note, may be {@link Nodeid#NULL} in certain scenarios (e.g. first changeset in an empty repository, usually by bogus tools) | |
| 141 * | |
| 142 * @return revision identifier, never <code>null</code> | |
| 143 */ | |
| 103 public Nodeid getManifestRevision() { | 144 public Nodeid getManifestRevision() { | 
| 104 return changeset.manifest(); | 145 return changeset.manifest(); | 
| 105 } | 146 } | 
| 106 | 147 | 
| 148 /** | |
| 149 * Lists names of files affected by this commit, as recorded in the changeset itself. Unlike {@link #getAddedFiles()}, | |
| 150 * {@link #getModifiedFiles()} and {@link #getRemovedFiles()}, this method doesn't analyze actual changes done | |
| 151 * in the commit, rather extracts value from the changeset record. | |
| 152 * | |
| 153 * List returned by this method may be empty, while aforementioned methods may produce non-empty result. | |
| 154 * | |
| 155 * @return list of filenames, never <code>null</code> | |
| 156 */ | |
| 107 public List<Path> getAffectedFiles() { | 157 public List<Path> getAffectedFiles() { | 
| 108 // reports files as recorded in changelog. Note, merge revisions may have no | 158 // reports files as recorded in changelog. Note, merge revisions may have no | 
| 109 // files listed, and thus this method would return empty list, while | 159 // files listed, and thus this method would return empty list, while | 
| 110 // #getModifiedFiles() would return list with merged file(s) (because it uses status to get 'em, not | 160 // #getModifiedFiles() would return list with merged file(s) (because it uses status to get 'em, not | 
| 111 // what #files() gives). | 161 // what #files() gives). | 
| 114 rv.add(pathHelper.path(name)); | 164 rv.add(pathHelper.path(name)); | 
| 115 } | 165 } | 
| 116 return rv; | 166 return rv; | 
| 117 } | 167 } | 
| 118 | 168 | 
| 119 public List<HgFileRevision> getModifiedFiles() throws HgInvalidControlFileException { | 169 /** | 
| 170 * Figures out files and specific revisions thereof that were modified in this commit | |
| 171 * | |
| 172 * @return revisions of files modified in this commit | |
| 173 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | |
| 174 * @throws HgException in case of some other library issue | |
| 175 */ | |
| 176 public List<HgFileRevision> getModifiedFiles() throws HgException { | |
| 120 if (modifiedFiles == null) { | 177 if (modifiedFiles == null) { | 
| 121 initFileChanges(); | 178 initFileChanges(); | 
| 122 } | 179 } | 
| 123 return modifiedFiles; | 180 return modifiedFiles; | 
| 124 } | 181 } | 
| 125 | 182 | 
| 126 public List<HgFileRevision> getAddedFiles() throws HgInvalidControlFileException { | 183 /** | 
| 184 * Figures out files added in this commit | |
| 185 * | |
| 186 * @return revisions of files added in this commit | |
| 187 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | |
| 188 * @throws HgException in case of some other library issue | |
| 189 */ | |
| 190 public List<HgFileRevision> getAddedFiles() throws HgException { | |
| 127 if (addedFiles == null) { | 191 if (addedFiles == null) { | 
| 128 initFileChanges(); | 192 initFileChanges(); | 
| 129 } | 193 } | 
| 130 return addedFiles; | 194 return addedFiles; | 
| 131 } | 195 } | 
| 132 | 196 | 
| 133 public List<Path> getRemovedFiles() throws HgInvalidControlFileException { | 197 /** | 
| 198 * Figures out files that were deleted as part of this commit | |
| 199 * | |
| 200 * @return revisions of files deleted in this commit | |
| 201 * @throws HgInvalidControlFileException if access to revlog index/data entry failed | |
| 202 * @throws HgException in case of some other library issue | |
| 203 */ | |
| 204 public List<Path> getRemovedFiles() throws HgException { | |
| 134 if (deletedFiles == null) { | 205 if (deletedFiles == null) { | 
| 135 initFileChanges(); | 206 initFileChanges(); | 
| 136 } | 207 } | 
| 137 return deletedFiles; | 208 return deletedFiles; | 
| 138 } | 209 } | 
| 173 statusHelper.getRepo().getChangelog().parents(revNumber, new int[2], parent1, parent2); | 244 statusHelper.getRepo().getChangelog().parents(revNumber, new int[2], parent1, parent2); | 
| 174 } | 245 } | 
| 175 return Nodeid.fromBinary(parent2, 0); | 246 return Nodeid.fromBinary(parent2, 0); | 
| 176 } | 247 } | 
| 177 | 248 | 
| 249 /** | |
| 250 * Create a copy of this changeset | |
| 251 */ | |
| 178 @Override | 252 @Override | 
| 179 public HgChangeset clone() { | 253 public HgChangeset clone() { | 
| 180 try { | 254 try { | 
| 181 HgChangeset copy = (HgChangeset) super.clone(); | 255 HgChangeset copy = (HgChangeset) super.clone(); | 
| 182 // copy.changeset references this.changeset, doesn't need own copy | 256 // copy.changeset references this.changeset, doesn't need own copy | 
| 184 } catch (CloneNotSupportedException ex) { | 258 } catch (CloneNotSupportedException ex) { | 
| 185 throw new InternalError(ex.toString()); | 259 throw new InternalError(ex.toString()); | 
| 186 } | 260 } | 
| 187 } | 261 } | 
| 188 | 262 | 
| 189 private /*synchronized*/ void initFileChanges() throws HgInvalidControlFileException { | 263 private /*synchronized*/ void initFileChanges() throws HgException { | 
| 190 ArrayList<Path> deleted = new ArrayList<Path>(); | 264 ArrayList<Path> deleted = new ArrayList<Path>(); | 
| 191 ArrayList<HgFileRevision> modified = new ArrayList<HgFileRevision>(); | 265 ArrayList<HgFileRevision> modified = new ArrayList<HgFileRevision>(); | 
| 192 ArrayList<HgFileRevision> added = new ArrayList<HgFileRevision>(); | 266 ArrayList<HgFileRevision> added = new ArrayList<HgFileRevision>(); | 
| 193 HgStatusCollector.Record r = new HgStatusCollector.Record(); | 267 HgStatusCollector.Record r = new HgStatusCollector.Record(); | 
| 194 statusHelper.change(revNumber, r); | 268 statusHelper.change(revNumber, r); | 
| 195 final HgRepository repo = statusHelper.getRepo(); | 269 final HgRepository repo = statusHelper.getRepo(); | 
| 196 for (Path s : r.getModified()) { | 270 for (Path s : r.getModified()) { | 
| 197 Nodeid nid = r.nodeidAfterChange(s); | 271 Nodeid nid = r.nodeidAfterChange(s); | 
| 198 if (nid == null) { | 272 if (nid == null) { | 
| 199 throw new HgBadStateException(); | 273 throw new HgException(String.format("For the file %s recorded as modified couldn't find revision after change", s)); | 
| 200 } | 274 } | 
| 201 modified.add(new HgFileRevision(repo, nid, s, null)); | 275 modified.add(new HgFileRevision(repo, nid, s, null)); | 
| 202 } | 276 } | 
| 203 final Map<Path, Path> copied = r.getCopied(); | 277 final Map<Path, Path> copied = r.getCopied(); | 
| 204 for (Path s : r.getAdded()) { | 278 for (Path s : r.getAdded()) { | 
| 205 Nodeid nid = r.nodeidAfterChange(s); | 279 Nodeid nid = r.nodeidAfterChange(s); | 
| 206 if (nid == null) { | 280 if (nid == null) { | 
| 207 throw new HgBadStateException(); | 281 throw new HgException(String.format("For the file %s recorded as added couldn't find revision after change", s)); | 
| 208 } | 282 } | 
| 209 added.add(new HgFileRevision(repo, nid, s, copied.get(s))); | 283 added.add(new HgFileRevision(repo, nid, s, copied.get(s))); | 
| 210 } | 284 } | 
| 211 for (Path s : r.getRemoved()) { | 285 for (Path s : r.getRemoved()) { | 
| 212 // with Path from getRemoved, may just copy | 286 // with Path from getRemoved, may just copy | 
