Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgBookmarks.java @ 610:5c68567b3645
Refresh tags, branches, bookmarks and ignore when their files (or csets in the repo) are changed
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 09 May 2013 21:06:48 +0200 |
parents | c56edf42be64 |
children | f41dd9a3b8af |
comparison
equal
deleted
inserted
replaced
609:e4a71afd3c71 | 610:5c68567b3645 |
---|---|
29 | 29 |
30 import org.tmatesoft.hg.core.HgIOException; | 30 import org.tmatesoft.hg.core.HgIOException; |
31 import org.tmatesoft.hg.core.HgRepositoryLockException; | 31 import org.tmatesoft.hg.core.HgRepositoryLockException; |
32 import org.tmatesoft.hg.core.Nodeid; | 32 import org.tmatesoft.hg.core.Nodeid; |
33 import org.tmatesoft.hg.internal.Experimental; | 33 import org.tmatesoft.hg.internal.Experimental; |
34 import org.tmatesoft.hg.internal.FileChangeMonitor; | |
34 import org.tmatesoft.hg.internal.Internals; | 35 import org.tmatesoft.hg.internal.Internals; |
35 import org.tmatesoft.hg.internal.LineReader; | 36 import org.tmatesoft.hg.internal.LineReader; |
36 import org.tmatesoft.hg.util.LogFacility; | 37 import org.tmatesoft.hg.util.LogFacility; |
37 | 38 |
38 /** | 39 /** |
40 * Access to bookmarks state | |
39 * | 41 * |
40 * @see http://mercurial.selenic.com/wiki/Bookmarks | 42 * @see http://mercurial.selenic.com/wiki/Bookmarks |
41 * @author Artem Tikhomirov | 43 * @author Artem Tikhomirov |
42 * @author TMate Software Ltd. | 44 * @author TMate Software Ltd. |
43 */ | 45 */ |
44 public final class HgBookmarks { | 46 public final class HgBookmarks { |
45 private final Internals internalRepo; | 47 private final Internals repo; |
46 private Map<String, Nodeid> bookmarks = Collections.emptyMap(); | 48 private Map<String, Nodeid> bookmarks = Collections.emptyMap(); |
47 private String activeBookmark; | 49 private String activeBookmark; |
50 private FileChangeMonitor activeTracker, bmFileTracker; | |
48 | 51 |
49 HgBookmarks(Internals internals) { | 52 HgBookmarks(Internals internals) { |
50 internalRepo = internals; | 53 repo = internals; |
51 } | 54 } |
52 | 55 |
53 /*package-local*/ void read() throws HgInvalidControlFileException { | 56 /*package-local*/ void read() throws HgInvalidControlFileException { |
54 final LogFacility log = internalRepo.getSessionContext().getLog(); | 57 readBookmarks(); |
55 final HgRepository repo = internalRepo.getRepo(); | 58 readActiveBookmark(); |
56 File all = internalRepo.getFileFromRepoDir(HgRepositoryFiles.Bookmarks.getName()); | 59 } |
60 | |
61 private void readBookmarks() throws HgInvalidControlFileException { | |
62 final LogFacility log = repo.getLog(); | |
63 File all = repo.getRepositoryFile(HgRepositoryFiles.Bookmarks); | |
57 LinkedHashMap<String, Nodeid> bm = new LinkedHashMap<String, Nodeid>(); | 64 LinkedHashMap<String, Nodeid> bm = new LinkedHashMap<String, Nodeid>(); |
58 if (all.canRead()) { | 65 if (all.canRead() && all.isFile()) { |
59 LineReader lr1 = new LineReader(all, log); | 66 LineReader lr1 = new LineReader(all, log); |
60 ArrayList<String> c = new ArrayList<String>(); | 67 ArrayList<String> c = new ArrayList<String>(); |
61 lr1.read(new LineReader.SimpleLineCollector(), c); | 68 lr1.read(new LineReader.SimpleLineCollector(), c); |
62 for (String s : c) { | 69 for (String s : c) { |
63 int x = s.indexOf(' '); | 70 int x = s.indexOf(' '); |
64 try { | 71 try { |
65 if (x > 0) { | 72 if (x > 0) { |
66 Nodeid nid = Nodeid.fromAscii(s.substring(0, x)); | 73 Nodeid nid = Nodeid.fromAscii(s.substring(0, x)); |
67 String name = new String(s.substring(x+1)); | 74 String name = new String(s.substring(x+1)); |
68 if (repo.getChangelog().isKnown(nid)) { | 75 if (repo.getRepo().getChangelog().isKnown(nid)) { |
69 // copy name part not to drag complete line | 76 // copy name part not to drag complete line |
70 bm.put(name, nid); | 77 bm.put(name, nid); |
71 } else { | 78 } else { |
72 log.dump(getClass(), LogFacility.Severity.Info, "Bookmark %s points to non-existent revision %s, ignored.", name, nid); | 79 log.dump(getClass(), LogFacility.Severity.Info, "Bookmark %s points to non-existent revision %s, ignored.", name, nid); |
73 } | 80 } |
80 } | 87 } |
81 bookmarks = bm; | 88 bookmarks = bm; |
82 } else { | 89 } else { |
83 bookmarks = Collections.emptyMap(); | 90 bookmarks = Collections.emptyMap(); |
84 } | 91 } |
92 if (bmFileTracker == null) { | |
93 bmFileTracker = new FileChangeMonitor(all); | |
94 } | |
95 bmFileTracker.touch(this); | |
96 } | |
85 | 97 |
98 private void readActiveBookmark() throws HgInvalidControlFileException { | |
86 activeBookmark = null; | 99 activeBookmark = null; |
87 File active = internalRepo.getFileFromRepoDir(HgRepositoryFiles.BookmarksCurrent.getName()); | 100 File active = repo.getRepositoryFile(HgRepositoryFiles.BookmarksCurrent); |
88 if (active.canRead()) { | 101 if (active.canRead() && active.isFile()) { |
89 LineReader lr2 = new LineReader(active, log); | 102 LineReader lr2 = new LineReader(active, repo.getLog()); |
90 ArrayList<String> c = new ArrayList<String>(2); | 103 ArrayList<String> c = new ArrayList<String>(2); |
91 lr2.read(new LineReader.SimpleLineCollector(), c); | 104 lr2.read(new LineReader.SimpleLineCollector(), c); |
92 if (c.size() > 0) { | 105 if (c.size() > 0) { |
93 activeBookmark = c.get(0); | 106 activeBookmark = c.get(0); |
94 } | 107 } |
95 } | 108 } |
96 } | 109 if (activeTracker == null) { |
110 activeTracker = new FileChangeMonitor(active); | |
111 } | |
112 activeTracker.touch(this); | |
113 } | |
114 | |
115 /*package-local*/void reloadIfChanged() throws HgInvalidControlFileException { | |
116 assert activeTracker != null; | |
117 assert bmFileTracker != null; | |
118 if (bmFileTracker.changed(this)) { | |
119 readBookmarks(); | |
120 } | |
121 if (activeTracker.changed(this)) { | |
122 readActiveBookmark(); | |
123 } | |
124 } | |
125 | |
97 | 126 |
98 /** | 127 /** |
99 * Tell name of the active bookmark | 128 * Tell name of the active bookmark |
100 * @return <code>null</code> if none active | 129 * @return <code>null</code> if none active |
101 */ | 130 */ |
153 bookmarks = copy; | 182 bookmarks = copy; |
154 write(); | 183 write(); |
155 } | 184 } |
156 | 185 |
157 private void write() throws HgIOException, HgRepositoryLockException { | 186 private void write() throws HgIOException, HgRepositoryLockException { |
158 File bookmarksFile = internalRepo.getRepositoryFile(HgRepositoryFiles.Bookmarks); | 187 File bookmarksFile = repo.getRepositoryFile(HgRepositoryFiles.Bookmarks); |
159 HgRepositoryLock workingDirLock = internalRepo.getRepo().getWorkingDirLock(); | 188 HgRepositoryLock workingDirLock = repo.getRepo().getWorkingDirLock(); |
160 FileWriter fileWriter = null; | 189 FileWriter fileWriter = null; |
161 workingDirLock.acquire(); | 190 workingDirLock.acquire(); |
162 try { | 191 try { |
163 fileWriter = new FileWriter(bookmarksFile); | 192 fileWriter = new FileWriter(bookmarksFile); |
164 for (String bm : bookmarks.keySet()) { | 193 for (String bm : bookmarks.keySet()) { |
172 try { | 201 try { |
173 if (fileWriter != null) { | 202 if (fileWriter != null) { |
174 fileWriter.close(); | 203 fileWriter.close(); |
175 } | 204 } |
176 } catch (IOException ex) { | 205 } catch (IOException ex) { |
177 internalRepo.getSessionContext().getLog().dump(getClass(), Error, ex, null); | 206 repo.getLog().dump(getClass(), Error, ex, null); |
178 } | 207 } |
179 workingDirLock.release(); | 208 workingDirLock.release(); |
180 } | 209 } |
181 } | 210 } |
182 } | 211 } |