Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/PhasesHelper.java @ 649:e79cf9a8130b
Push: phase4 - update local and remote phase information
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 26 Jun 2013 20:52:38 +0200 |
| parents | 690e71d29bf6 |
| children | 3b275cc2d2aa |
comparison
equal
deleted
inserted
replaced
| 648:690e71d29bf6 | 649:e79cf9a8130b |
|---|---|
| 17 package org.tmatesoft.hg.internal; | 17 package org.tmatesoft.hg.internal; |
| 18 | 18 |
| 19 import static org.tmatesoft.hg.repo.HgPhase.Draft; | 19 import static org.tmatesoft.hg.repo.HgPhase.Draft; |
| 20 import static org.tmatesoft.hg.repo.HgPhase.Secret; | 20 import static org.tmatesoft.hg.repo.HgPhase.Secret; |
| 21 import static org.tmatesoft.hg.repo.HgRepositoryFiles.Phaseroots; | 21 import static org.tmatesoft.hg.repo.HgRepositoryFiles.Phaseroots; |
| 22 import static org.tmatesoft.hg.util.LogFacility.Severity.Info; | |
| 23 import static org.tmatesoft.hg.util.LogFacility.Severity.Warn; | 22 import static org.tmatesoft.hg.util.LogFacility.Severity.Warn; |
| 24 | 23 |
| 25 import java.io.BufferedReader; | |
| 26 import java.io.File; | 24 import java.io.File; |
| 27 import java.io.FileReader; | 25 import java.io.FileWriter; |
| 28 import java.io.IOException; | 26 import java.io.IOException; |
| 27 import java.util.ArrayList; | |
| 28 import java.util.Collection; | |
| 29 import java.util.Collections; | 29 import java.util.Collections; |
| 30 import java.util.HashMap; | 30 import java.util.HashMap; |
| 31 import java.util.LinkedList; | 31 import java.util.LinkedList; |
| 32 import java.util.List; | 32 import java.util.List; |
| 33 | 33 |
| 34 import org.tmatesoft.hg.core.HgChangeset; | 34 import org.tmatesoft.hg.core.HgChangeset; |
| 35 import org.tmatesoft.hg.core.HgIOException; | |
| 35 import org.tmatesoft.hg.core.Nodeid; | 36 import org.tmatesoft.hg.core.Nodeid; |
| 36 import org.tmatesoft.hg.repo.HgChangelog; | 37 import org.tmatesoft.hg.repo.HgChangelog; |
| 37 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 38 import org.tmatesoft.hg.repo.HgInvalidControlFileException; |
| 38 import org.tmatesoft.hg.repo.HgParentChildMap; | 39 import org.tmatesoft.hg.repo.HgParentChildMap; |
| 39 import org.tmatesoft.hg.repo.HgPhase; | 40 import org.tmatesoft.hg.repo.HgPhase; |
| 139 */ | 140 */ |
| 140 public RevisionSet allSecret() { | 141 public RevisionSet allSecret() { |
| 141 return allOf(HgPhase.Secret); | 142 return allOf(HgPhase.Secret); |
| 142 } | 143 } |
| 143 | 144 |
| 145 /** | |
| 146 * @return all revisions with draft phase | |
| 147 */ | |
| 144 public RevisionSet allDraft() { | 148 public RevisionSet allDraft() { |
| 145 return allOf(HgPhase.Draft).subtract(allOf(HgPhase.Secret)); | 149 return allOf(HgPhase.Draft).subtract(allOf(HgPhase.Secret)); |
| 150 } | |
| 151 | |
| 152 public void updateRoots(Collection<Nodeid> draftRoots, Collection<Nodeid> secretRoots) throws HgInvalidControlFileException { | |
| 153 draftPhaseRoots = draftRoots.isEmpty() ? Collections.<Nodeid>emptyList() : new ArrayList<Nodeid>(draftRoots); | |
| 154 secretPhaseRoots = secretRoots.isEmpty() ? Collections.<Nodeid>emptyList() : new ArrayList<Nodeid>(secretRoots); | |
| 155 String fmt = "%d %s\n"; | |
| 156 File phaseroots = repo.getRepositoryFile(Phaseroots); | |
| 157 FileWriter fw = null; | |
| 158 try { | |
| 159 fw = new FileWriter(phaseroots); | |
| 160 for (Nodeid n : secretPhaseRoots) { | |
| 161 fw.write(String.format(fmt, HgPhase.Secret.mercurialOrdinal(), n.toString())); | |
| 162 } | |
| 163 for (Nodeid n : draftPhaseRoots) { | |
| 164 fw.write(String.format(fmt, HgPhase.Draft.mercurialOrdinal(), n.toString())); | |
| 165 } | |
| 166 fw.flush(); | |
| 167 } catch (IOException ex) { | |
| 168 throw new HgInvalidControlFileException(ex.getMessage(), ex, phaseroots); | |
| 169 } finally { | |
| 170 new FileUtils(repo.getLog()).closeQuietly(fw); | |
| 171 } | |
| 146 } | 172 } |
| 147 | 173 |
| 148 /** | 174 /** |
| 149 * For a given phase, collect all revisions with phase that is the same or more private (i.e. for Draft, returns Draft+Secret) | 175 * For a given phase, collect all revisions with phase that is the same or more private (i.e. for Draft, returns Draft+Secret) |
| 150 * The reason is not a nice API intention (which is awful, indeed), but an ease of implementation | 176 * The reason is not a nice API intention (which is awful, indeed), but an ease of implementation |
| 166 } | 192 } |
| 167 } | 193 } |
| 168 | 194 |
| 169 private Boolean readRoots() throws HgRuntimeException { | 195 private Boolean readRoots() throws HgRuntimeException { |
| 170 File phaseroots = repo.getRepositoryFile(Phaseroots); | 196 File phaseroots = repo.getRepositoryFile(Phaseroots); |
| 171 BufferedReader br = null; | |
| 172 try { | 197 try { |
| 173 if (!phaseroots.exists()) { | 198 if (!phaseroots.exists()) { |
| 174 return Boolean.FALSE; | 199 return Boolean.FALSE; |
| 175 } | 200 } |
| 201 LineReader lr = new LineReader(phaseroots, repo.getLog()); | |
| 202 final Collection<String> lines = lr.read(new LineReader.SimpleLineCollector(), new LinkedList<String>()); | |
| 176 HashMap<HgPhase, List<Nodeid>> phase2roots = new HashMap<HgPhase, List<Nodeid>>(); | 203 HashMap<HgPhase, List<Nodeid>> phase2roots = new HashMap<HgPhase, List<Nodeid>>(); |
| 177 br = new BufferedReader(new FileReader(phaseroots)); | 204 for (String line : lines) { |
| 178 String line; | 205 String[] lc = line.split("\\s+"); |
| 179 while ((line = br.readLine()) != null) { | |
| 180 String[] lc = line.trim().split("\\s+"); | |
| 181 if (lc.length == 0) { | 206 if (lc.length == 0) { |
| 182 continue; | 207 continue; |
| 183 } | 208 } |
| 184 if (lc.length != 2) { | 209 if (lc.length != 2) { |
| 185 repo.getSessionContext().getLog().dump(getClass(), Warn, "Bad line in phaseroots:%s", line); | 210 repo.getSessionContext().getLog().dump(getClass(), Warn, "Bad line in phaseroots:%s", line); |
| 198 } | 223 } |
| 199 roots.add(rootRev); | 224 roots.add(rootRev); |
| 200 } | 225 } |
| 201 draftPhaseRoots = phase2roots.containsKey(Draft) ? phase2roots.get(Draft) : Collections.<Nodeid>emptyList(); | 226 draftPhaseRoots = phase2roots.containsKey(Draft) ? phase2roots.get(Draft) : Collections.<Nodeid>emptyList(); |
| 202 secretPhaseRoots = phase2roots.containsKey(Secret) ? phase2roots.get(Secret) : Collections.<Nodeid>emptyList(); | 227 secretPhaseRoots = phase2roots.containsKey(Secret) ? phase2roots.get(Secret) : Collections.<Nodeid>emptyList(); |
| 203 } catch (IOException ex) { | 228 } catch (HgIOException ex) { |
| 204 throw new HgInvalidControlFileException(ex.toString(), ex, phaseroots); | 229 throw new HgInvalidControlFileException(ex, true); |
| 205 } finally { | |
| 206 if (br != null) { | |
| 207 try { | |
| 208 br.close(); | |
| 209 } catch (IOException ex) { | |
| 210 repo.getSessionContext().getLog().dump(getClass(), Info, ex, null); | |
| 211 // ignore the exception otherwise | |
| 212 } | |
| 213 } | |
| 214 } | 230 } |
| 215 return Boolean.TRUE; | 231 return Boolean.TRUE; |
| 216 } | 232 } |
| 217 | 233 |
| 218 private List<Nodeid> getPhaseRoots(HgPhase phase) { | 234 private List<Nodeid> getPhaseRoots(HgPhase phase) { |
