Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgLookup.java @ 295:981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 16 Sep 2011 05:35:32 +0200 |
| parents | 41a778e3fd31 |
| children | dfb8405d996f |
comparison
equal
deleted
inserted
replaced
| 294:32890bab7209 | 295:981f9f50bb6c |
|---|---|
| 20 import java.io.IOException; | 20 import java.io.IOException; |
| 21 import java.net.MalformedURLException; | 21 import java.net.MalformedURLException; |
| 22 import java.net.URL; | 22 import java.net.URL; |
| 23 | 23 |
| 24 import org.tmatesoft.hg.core.HgBadArgumentException; | 24 import org.tmatesoft.hg.core.HgBadArgumentException; |
| 25 import org.tmatesoft.hg.core.HgException; | 25 import org.tmatesoft.hg.core.HgInvalidFileException; |
| 26 import org.tmatesoft.hg.core.SessionContext; | |
| 27 import org.tmatesoft.hg.internal.BasicSessionContext; | |
| 26 import org.tmatesoft.hg.internal.ConfigFile; | 28 import org.tmatesoft.hg.internal.ConfigFile; |
| 27 import org.tmatesoft.hg.internal.DataAccessProvider; | 29 import org.tmatesoft.hg.internal.DataAccessProvider; |
| 28 import org.tmatesoft.hg.internal.Internals; | |
| 29 | 30 |
| 30 /** | 31 /** |
| 31 * Utility methods to find Mercurial repository at a given location | 32 * Utility methods to find Mercurial repository at a given location |
| 32 * | 33 * |
| 33 * @author Artem Tikhomirov | 34 * @author Artem Tikhomirov |
| 34 * @author TMate Software Ltd. | 35 * @author TMate Software Ltd. |
| 35 */ | 36 */ |
| 36 public class HgLookup { | 37 public class HgLookup { |
| 37 | 38 |
| 38 private ConfigFile globalCfg; | 39 private ConfigFile globalCfg; |
| 40 private SessionContext sessionContext; | |
| 41 | |
| 42 public HgLookup() { | |
| 43 } | |
| 44 | |
| 45 public HgLookup(SessionContext ctx) { | |
| 46 sessionContext = ctx; | |
| 47 } | |
| 39 | 48 |
| 40 public HgRepository detectFromWorkingDir() throws HgException { | 49 public HgRepository detectFromWorkingDir() throws HgInvalidFileException { |
| 41 return detect(System.getProperty("user.dir")); | 50 return detect(System.getProperty("user.dir")); |
| 42 } | 51 } |
| 43 | 52 |
| 44 public HgRepository detect(String location) throws HgException { | 53 public HgRepository detect(String location) throws HgInvalidFileException { |
| 45 return detect(new File(location)); | 54 return detect(new File(location)); |
| 46 } | 55 } |
| 47 | 56 |
| 48 // look up in specified location and above | 57 // look up in specified location and above |
| 49 public HgRepository detect(File location) throws HgException { | 58 public HgRepository detect(File location) throws HgInvalidFileException { |
| 50 File dir = location.getAbsoluteFile(); | 59 File dir = location.getAbsoluteFile(); |
| 51 File repository; | 60 File repository; |
| 52 do { | 61 do { |
| 53 repository = new File(dir, ".hg"); | 62 repository = new File(dir, ".hg"); |
| 54 if (repository.exists() && repository.isDirectory()) { | 63 if (repository.exists() && repository.isDirectory()) { |
| 62 // return invalid repository | 71 // return invalid repository |
| 63 return new HgRepository(location.getPath()); | 72 return new HgRepository(location.getPath()); |
| 64 } | 73 } |
| 65 try { | 74 try { |
| 66 String repoPath = repository.getParentFile().getCanonicalPath(); | 75 String repoPath = repository.getParentFile().getCanonicalPath(); |
| 67 return new HgRepository(repoPath, repository); | 76 return new HgRepository(getContext(), repoPath, repository); |
| 68 } catch (IOException ex) { | 77 } catch (IOException ex) { |
| 69 throw new HgException(location.toString(), ex); | 78 throw new HgInvalidFileException(location.toString(), ex, location); |
| 70 } | 79 } |
| 71 } | 80 } |
| 72 | 81 |
| 73 public HgBundle loadBundle(File location) /*XXX perhaps, HgDataStreamException or anything like HgMalformedDataException? Or RuntimeEx is better?*/{ | 82 public HgBundle loadBundle(File location) throws HgInvalidFileException { |
| 74 if (location == null || !location.canRead()) { | 83 if (location == null || !location.canRead()) { |
| 75 throw new IllegalArgumentException(); | 84 throw new HgInvalidFileException(String.format("Can't read file %s", location == null ? null : location.getPath()), null, location); |
| 76 } | 85 } |
| 77 return new HgBundle(new DataAccessProvider(), location).link(); | 86 return new HgBundle(new DataAccessProvider(getContext()), location).link(); |
| 78 } | 87 } |
| 79 | 88 |
| 80 /** | 89 /** |
| 81 * Try to instantiate remote server. | 90 * Try to instantiate remote server. |
| 82 * @param key either URL or a key from configuration file that points to remote server | 91 * @param key either URL or a key from configuration file that points to remote server |
| 103 url = new URL(server); | 112 url = new URL(server); |
| 104 } catch (MalformedURLException ex) { | 113 } catch (MalformedURLException ex) { |
| 105 throw new HgBadArgumentException(String.format("Found %s server spec in the config, but failed to initialize with it", key), ex); | 114 throw new HgBadArgumentException(String.format("Found %s server spec in the config, but failed to initialize with it", key), ex); |
| 106 } | 115 } |
| 107 } | 116 } |
| 108 return new HgRemoteRepository(url); | 117 return new HgRemoteRepository(getContext(), url); |
| 109 } | 118 } |
| 110 | 119 |
| 111 public HgRemoteRepository detect(URL url) throws HgException { | 120 public HgRemoteRepository detect(URL url) throws HgBadArgumentException { |
| 112 if (url == null) { | 121 if (url == null) { |
| 113 throw new IllegalArgumentException(); | 122 throw new IllegalArgumentException(); |
| 114 } | 123 } |
| 115 if (Boolean.FALSE.booleanValue()) { | 124 if (Boolean.FALSE.booleanValue()) { |
| 116 throw HgRepository.notImplemented(); | 125 throw HgRepository.notImplemented(); |
| 117 } | 126 } |
| 118 return new HgRemoteRepository(url); | 127 return new HgRemoteRepository(getContext(), url); |
| 119 } | 128 } |
| 120 | 129 |
| 121 private ConfigFile getGlobalConfig() { | 130 private ConfigFile getGlobalConfig() { |
| 122 if (globalCfg == null) { | 131 if (globalCfg == null) { |
| 123 globalCfg = new Internals().newConfigFile(); | 132 globalCfg = new ConfigFile(); |
| 124 globalCfg.addLocation(new File(System.getProperty("user.home"), ".hgrc")); | 133 try { |
| 134 globalCfg.addLocation(new File(System.getProperty("user.home"), ".hgrc")); | |
| 135 } catch (IOException ex) { | |
| 136 // XXX perhaps, makes sense to let caller/client know that we've failed to read global config? | |
| 137 getContext().getLog().warn(getClass(), ex, null); | |
| 138 } | |
| 125 } | 139 } |
| 126 return globalCfg; | 140 return globalCfg; |
| 127 } | 141 } |
| 142 | |
| 143 private SessionContext getContext() { | |
| 144 if (sessionContext == null) { | |
| 145 sessionContext = new BasicSessionContext(null, null); | |
| 146 } | |
| 147 return sessionContext; | |
| 148 } | |
| 128 } | 149 } |
