Mercurial > hg4j
annotate src/org/tmatesoft/hg/core/HgStatus.java @ 354:5f9073eabf06
Propagate errors with exceptions up to a end client
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 01 Dec 2011 05:21:40 +0100 | 
| parents | f052f40839ec | 
| children | 528b6780a8bd | 
| rev | line source | 
|---|---|
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 2 * Copyright (c) 2011 TMate Software Ltd | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 3 * | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 4 * This program is free software; you can redistribute it and/or modify | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 5 * it under the terms of the GNU General Public License as published by | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 7 * | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 8 * This program is distributed in the hope that it will be useful, | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 11 * GNU General Public License for more details. | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 12 * | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 13 * For information on how to redistribute this software under | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 14 * the terms of a license other than GNU General Public License | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 15 * contact TMate Software at support@hg4j.com | 
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 17 package org.tmatesoft.hg.core; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 247 
f052f40839ec
Issue 9: NPE in getModificationDate for files with status 'Unknown'
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
154diff
changeset | 19 import java.io.File; | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 20 import java.util.Date; | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 21 | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 22 import org.tmatesoft.hg.internal.ChangelogHelper; | 
| 154 
ba2bf656f00f
Changeset => RawChangeset
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
143diff
changeset | 23 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; | 
| 133 
4a948ec83980
core.Path to util.Path as it's not Hg repo dependant
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
131diff
changeset | 24 import org.tmatesoft.hg.util.Path; | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 25 | 
| 131 
aa1629f36482
Renamed .core classes to start with Hg prefix
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
129diff
changeset | 26 /** | 
| 
aa1629f36482
Renamed .core classes to start with Hg prefix
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
129diff
changeset | 27 * Repository file status and extra handy information. | 
| 
aa1629f36482
Renamed .core classes to start with Hg prefix
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
129diff
changeset | 28 * | 
| 
aa1629f36482
Renamed .core classes to start with Hg prefix
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
129diff
changeset | 29 * @author Artem Tikhomirov | 
| 
aa1629f36482
Renamed .core classes to start with Hg prefix
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
129diff
changeset | 30 * @author TMate Software Ltd. | 
| 
aa1629f36482
Renamed .core classes to start with Hg prefix
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
129diff
changeset | 31 */ | 
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 32 public class HgStatus { | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 33 | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 34 public enum Kind { | 
| 143 
b9700740553a
Command line tools parse and respect most of command-line arguments
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
140diff
changeset | 35 Modified, Added, Removed, Missing, Unknown, Clean, Ignored | 
| 
b9700740553a
Command line tools parse and respect most of command-line arguments
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
140diff
changeset | 36 // I'd refrain from changing order of these constants, just in case someone (erroneously, of course ;), uses .ordinal() | 
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 37 }; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 38 | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 39 private final HgStatus.Kind kind; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 40 private final Path path; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 41 private final Path origin; | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 42 private final ChangelogHelper logHelper; | 
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 44 HgStatus(HgStatus.Kind kind, Path path, ChangelogHelper changelogHelper) { | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 45 this(kind, path, null, changelogHelper); | 
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 46 } | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 47 | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 48 HgStatus(HgStatus.Kind kind, Path path, Path copyOrigin, ChangelogHelper changelogHelper) { | 
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 49 this.kind = kind; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 50 this.path = path; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 51 origin = copyOrigin; | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 52 logHelper = changelogHelper; | 
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 53 } | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 54 | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 55 public HgStatus.Kind getKind() { | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 56 return kind; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 57 } | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 58 | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 59 public Path getPath() { | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 60 return path; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 61 } | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 62 | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 63 public Path getOriginalPath() { | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 64 return origin; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 65 } | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 66 | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 67 public boolean isCopy() { | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 68 return origin != null; | 
| 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 69 } | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 70 | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 71 /** | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 72 * @return <code>null</code> if author for the change can't be deduced (e.g. for clean files it's senseless) | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 73 */ | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
247diff
changeset | 74 public String getModificationAuthor() throws HgInvalidControlFileException { | 
| 154 
ba2bf656f00f
Changeset => RawChangeset
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
143diff
changeset | 75 RawChangeset cset = logHelper.findLatestChangeWith(path); | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 76 if (cset == null) { | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 77 if (kind == Kind.Modified || kind == Kind.Added || kind == Kind.Removed /*&& RightBoundary is TIP*/) { | 
| 140 
1c1891ad1c73
Slight optimization
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
133diff
changeset | 78 // perhaps, also for Kind.Missing? | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 79 return logHelper.getNextCommitUsername(); | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 80 } | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 81 } else { | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 82 return cset.user(); | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 83 } | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 84 return null; | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 85 } | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 86 | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
247diff
changeset | 87 public Date getModificationDate() throws HgInvalidControlFileException { | 
| 154 
ba2bf656f00f
Changeset => RawChangeset
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
143diff
changeset | 88 RawChangeset cset = logHelper.findLatestChangeWith(path); | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 89 if (cset == null) { | 
| 247 
f052f40839ec
Issue 9: NPE in getModificationDate for files with status 'Unknown'
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
154diff
changeset | 90 File localFile = new File(logHelper.getRepo().getWorkingDir(), path.toString()); | 
| 
f052f40839ec
Issue 9: NPE in getModificationDate for files with status 'Unknown'
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
154diff
changeset | 91 if (localFile.canRead()) { | 
| 
f052f40839ec
Issue 9: NPE in getModificationDate for files with status 'Unknown'
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
154diff
changeset | 92 return new Date(localFile.lastModified()); | 
| 
f052f40839ec
Issue 9: NPE in getModificationDate for files with status 'Unknown'
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
154diff
changeset | 93 } | 
| 128 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 94 // FIXME check dirstate and/or local file for tstamp | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 95 return new Date(); // what's correct | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 96 } else { | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 97 return cset.date(); | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 98 } | 
| 
44b97930570c
Introduced ChangelogHelper to look up changesets files were modified in
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
127diff
changeset | 99 } | 
| 127 
2e395db595e2
Moved HgStatus to toplevel
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 100 } | 
