An IO timeout can be useful if the remote peer stops responding, and the user wants the application to abort rather than block indefinitely waiting for more input. This is a JGit specific extension to the standard remote format. Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> --- .../spearce/jgit/transport/RemoteConfigTest.java | 26 ++++++++++++++++ .../org/spearce/jgit/transport/RemoteConfig.java | 31 ++++++++++++++++++++ 2 files changed, 57 insertions(+), 0 deletions(-) diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/transport/RemoteConfigTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/transport/RemoteConfigTest.java index 6b72b64..3965bdb 100644 --- a/org.spearce.jgit.test/tst/org/spearce/jgit/transport/RemoteConfigTest.java +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/transport/RemoteConfigTest.java @@ -78,6 +78,7 @@ writeConfig("[remote \"spearce\"]\n" assertNotNull(rc.getFetchRefSpecs()); assertNotNull(rc.getPushRefSpecs()); assertNotNull(rc.getTagOpt()); + assertEquals(0, rc.getTimeout()); assertSame(TagOpt.AUTO_FOLLOW, rc.getTagOpt()); assertEquals(1, allURIs.size()); @@ -423,4 +424,29 @@ checkFile(new File(db.getDirectory(), "config"), "[core]\n" + "\tfetch = +refs/heads/*:refs/remotes/origin/*\n" + "\ttagopt = --tags\n"); } + + public void testSimpleTimeout() throws Exception { + writeConfig("[remote \"spearce\"]\n" + + "url = http://www.spearce.org/egit.git\n" + + "fetch = +refs/heads/*:refs/remotes/spearce/*\n" + + "timeout = 12\n"); + final RemoteConfig rc = new RemoteConfig(db.getConfig(), "spearce"); + assertEquals(12, rc.getTimeout()); + } + + public void testSaveTimeout() throws Exception { + final RemoteConfig rc = new RemoteConfig(db.getConfig(), "origin"); + rc.addURI(new URIish("/some/dir")); + rc.addFetchRefSpec(new RefSpec("+refs/heads/*:refs/remotes/" + + rc.getName() + "/*")); + rc.setTimeout(60); + rc.update(db.getConfig()); + db.getConfig().save(); + + checkFile(new File(db.getDirectory(), "config"), "[core]\n" + + "\trepositoryformatversion = 0\n" + "\tfilemode = true\n" + + "[remote \"origin\"]\n" + "\turl = /some/dir\n" + + "\tfetch = +refs/heads/*:refs/remotes/origin/*\n" + + "\ttimeout = 60\n"); + } } diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/RemoteConfig.java b/org.spearce.jgit/src/org/spearce/jgit/transport/RemoteConfig.java index 519a8a5..a621dc4 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/RemoteConfig.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/RemoteConfig.java @@ -70,6 +70,8 @@ private static final String KEY_MIRROR = "mirror"; + private static final String KEY_TIMEOUT = "timeout"; + private static final boolean DEFAULT_MIRROR = false; /** Default value for {@link #getUploadPack()} if not specified. */ @@ -120,6 +122,8 @@ private boolean mirror; + private int timeout; + /** * Parse a remote block from an existing configuration file. * <p> @@ -170,6 +174,7 @@ public RemoteConfig(final RepositoryConfig rc, final String remoteName) val = rc.getString(SECTION, name, KEY_TAGOPT); tagopt = TagOpt.fromOption(val); mirror = rc.getBoolean(SECTION, name, KEY_MIRROR, DEFAULT_MIRROR); + timeout = rc.getInt(SECTION, name, KEY_TIMEOUT, 0); } /** @@ -200,6 +205,7 @@ public void update(final RepositoryConfig rc) { set(rc, KEY_RECEIVEPACK, getReceivePack(), DEFAULT_RECEIVE_PACK); set(rc, KEY_TAGOPT, getTagOpt().option(), TagOpt.AUTO_FOLLOW.option()); set(rc, KEY_MIRROR, mirror, DEFAULT_MIRROR); + set(rc, KEY_TIMEOUT, timeout, 0); } private void set(final RepositoryConfig rc, final String key, @@ -218,6 +224,14 @@ private void set(final RepositoryConfig rc, final String key, rc.setBoolean(SECTION, getName(), key, currentValue); } + private void set(final RepositoryConfig rc, final String key, + final int currentValue, final int defaultValue) { + if (defaultValue == currentValue) + unset(rc, key); + else + rc.setInt(SECTION, getName(), key, currentValue); + } + private void unset(final RepositoryConfig rc, final String key) { rc.unsetString(SECTION, getName(), key); } @@ -420,4 +434,21 @@ public boolean isMirror() { public void setMirror(final boolean m) { mirror = m; } + + /** @return timeout (in seconds) before aborting an IO operation. */ + public int getTimeout() { + return timeout; + } + + /** + * Set the timeout before willing to abort an IO call. + * + * @param seconds + * number of seconds to wait (with no data transfer occurring) + * before aborting an IO read or write operation with this + * remote. A timeout of 0 will block indefinitely. + */ + public void setTimeout(final int seconds) { + timeout = seconds; + } } -- 1.6.3.2.416.g04d0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html