comparison src/org/tmatesoft/hg/internal/SubrepoManager.java @ 348:a0864b2892cd

Expose errors reading mercurial control files with exception
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 24 Nov 2011 02:57:03 +0100
parents 981f9f50bb6c
children 9c9c442b5f2e
comparison
equal deleted inserted replaced
347:8da7ade36c57 348:a0864b2892cd
25 import java.util.HashMap; 25 import java.util.HashMap;
26 import java.util.LinkedList; 26 import java.util.LinkedList;
27 import java.util.List; 27 import java.util.List;
28 import java.util.Map; 28 import java.util.Map;
29 29
30 import org.tmatesoft.hg.repo.HgInternals; 30 import org.tmatesoft.hg.core.HgInvalidControlFileException;
31 import org.tmatesoft.hg.repo.HgRepository; 31 import org.tmatesoft.hg.repo.HgRepository;
32 import org.tmatesoft.hg.repo.HgSubrepoLocation; 32 import org.tmatesoft.hg.repo.HgSubrepoLocation;
33 33
34 /** 34 /**
35 * 35 *
44 public SubrepoManager(HgRepository hgRepo) { 44 public SubrepoManager(HgRepository hgRepo) {
45 assert hgRepo != null; 45 assert hgRepo != null;
46 repo = hgRepo; 46 repo = hgRepo;
47 } 47 }
48 48
49 private List<HgSubrepoLocation> readActualState() { 49 private List<HgSubrepoLocation> readActualState() throws HgInvalidControlFileException {
50 File hgsubFile = new File(repo.getWorkingDir(), ".hgsub"); 50 File hgsubFile = new File(repo.getWorkingDir(), ".hgsub");
51 if (!hgsubFile.canRead()) { 51 if (!hgsubFile.canRead()) {
52 return Collections.emptyList(); 52 return Collections.emptyList();
53 } 53 }
54 Map<String, String> state; // path -> revision
55 File hgstateFile = null;
54 try { 56 try {
55 Map<String, String> state; // path -> revision 57 hgstateFile = new File(repo.getWorkingDir(), ".hgsubstate");
56 File hgstateFile = new File(repo.getWorkingDir(), ".hgsubstate");
57 if (hgstateFile.canRead()) { 58 if (hgstateFile.canRead()) {
58 state = readState(new BufferedReader(new FileReader(hgstateFile))); 59 state = readState(new BufferedReader(new FileReader(hgstateFile)));
59 } else { 60 } else {
60 state = Collections.emptyMap(); 61 state = Collections.emptyMap();
61 } 62 }
63 } catch (IOException ex) {
64 throw new HgInvalidControlFileException("Subrepo state read failed", ex, hgstateFile);
65 }
66 try {
62 BufferedReader br = new BufferedReader(new FileReader(hgsubFile)); 67 BufferedReader br = new BufferedReader(new FileReader(hgsubFile));
63 return readConfig(br, state); 68 return readConfig(br, state);
64 } catch (IOException ex) { 69 } catch (IOException ex) {
65 HgInternals.getContext(repo).getLog().error(getClass(), ex, "Subrepo state read failed"); 70 throw new HgInvalidControlFileException("Subrepo state read failed", ex, hgsubFile);
66 } 71 }
67 return Collections.emptyList();
68 } 72 }
69 73
70 private List<HgSubrepoLocation> readConfig(BufferedReader br, Map<String, String> substate) throws IOException { 74 private List<HgSubrepoLocation> readConfig(BufferedReader br, Map<String, String> substate) throws IOException {
71 try { 75 try {
72 String line; 76 String line;
119 br.close(); 123 br.close();
120 } 124 }
121 return rv; 125 return rv;
122 } 126 }
123 127
128 /*public to allow access from HgRepository, otherwise package-local*/
129 public void read() throws HgInvalidControlFileException {
130 subRepos = readActualState();
131 }
132
124 public List<HgSubrepoLocation> all(/*int revision, or TIP|WC*/) { 133 public List<HgSubrepoLocation> all(/*int revision, or TIP|WC*/) {
125 if (subRepos == null) { 134 assert subRepos != null;
126 subRepos = readActualState();
127 }
128 return subRepos; 135 return subRepos;
129 } 136 }
130 } 137 }