From acd7ed52692bb7155333efea6dead712b7156ab9 Mon Sep 17 00:00:00 2001 From: Yuxuan 'fishy' Wang Date: Thu, 5 Jun 2014 13:53:28 -0700 Subject: [PATCH] Added setInputStream to RepoCommand. Sometimes an input stream is more useful than the filename of the xml manifest. Change-Id: Icb09ac751b3d8d7eb14427ad1aac8cee0c371c5f Signed-off-by: Yuxuan 'fishy' Wang --- .../jgit/gitrepo/internal/RepoText.properties | 5 +- .../org/eclipse/jgit/gitrepo/RepoCommand.java | 99 +++++++++++++------ .../jgit/gitrepo/internal/RepoText.java | 1 + 3 files changed, 74 insertions(+), 31 deletions(-) diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/gitrepo/internal/RepoText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/gitrepo/internal/RepoText.properties index 33fdc2e15..256dd7f08 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/gitrepo/internal/RepoText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/gitrepo/internal/RepoText.properties @@ -1,6 +1,7 @@ copyFileFailed=Error occurred during execution of copyfile rule. -errorNoDefault=Error: no default remote in file {0}. -errorParsingManifestFile=Error occurred during parsing manifest file {0}. +errorNoDefault=Error: no default remote in manifest file. +errorNoDefaultFilename=Error: no default remote in manifest file {0}. +errorParsingManifestFile=Error occurred during parsing manifest file. errorRemoteUnavailable=Error remote {0} is unavailable. invalidManifest=Invalid manifest. repoCommitMessage=Added repo manifest. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java index 22ff066fc..b127697fb 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java @@ -46,6 +46,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.nio.channels.FileChannel; @@ -114,6 +115,7 @@ public class RepoCommand extends GitCommand { private String branch; private PersonIdent author; private RemoteReader callback; + private InputStream inputStream; private List bareProjects; private Git git; @@ -249,6 +251,7 @@ void addCopyFile(CopyFile copyfile) { private static class XmlManifest extends DefaultHandler { private final RepoCommand command; + private final InputStream inputStream; private final String filename; private final String baseUrl; private final Map remotes; @@ -259,8 +262,10 @@ private static class XmlManifest extends DefaultHandler { private String defaultRevision; private Project currentProject; - XmlManifest(RepoCommand command, String filename, String baseUrl, String groups) { + XmlManifest(RepoCommand command, InputStream inputStream, + String filename, String baseUrl, String groups) { this.command = command; + this.inputStream = inputStream; this.filename = filename; this.baseUrl = baseUrl; remotes = new HashMap(); @@ -288,16 +293,13 @@ void read() throws IOException { throw new IOException(JGitText.get().noXMLParserAvailable); } xr.setContentHandler(this); - final FileInputStream in = new FileInputStream(filename); try { - xr.parse(new InputSource(in)); + xr.parse(new InputSource(inputStream)); } catch (SAXException e) { - IOException error = new IOException(MessageFormat.format( - RepoText.get().errorParsingManifestFile, filename)); + IOException error = new IOException( + RepoText.get().errorParsingManifestFile); error.initCause(e); throw error; - } finally { - in.close(); } } @@ -346,8 +348,11 @@ public void endElement( @Override public void endDocument() throws SAXException { if (defaultRemote == null) { - throw new SAXException(MessageFormat.format( - RepoText.get().errorNoDefault, filename)); + if (filename != null) + throw new SAXException(MessageFormat.format( + RepoText.get().errorNoDefaultFilename, filename)); + else + throw new SAXException(RepoText.get().errorNoDefault); } final String remoteUrl; try { @@ -406,7 +411,9 @@ public RepoCommand(final Repository repo) { } /** - * Set path to the manifest XML file + * Set path to the manifest XML file. + * + * Calling {@link #setInputStream} will ignore the path set here. * * @param path * (with / as separator) @@ -417,6 +424,20 @@ public RepoCommand setPath(final String path) { return this; } + /** + * Set the input stream to the manifest XML. + * + * Setting inputStream will ignore the path set. + * It will be closed in {@link #call}. + * + * @param inputStream + * @return this command + */ + public RepoCommand setInputStream(final InputStream inputStream) { + this.inputStream = inputStream; + return this; + } + /** * Set base URI of the pathes inside the XML * @@ -496,26 +517,46 @@ public RepoCommand setRemoteReader(final RemoteReader callback) { @Override public RevCommit call() throws GitAPIException { - checkCallable(); - if (path == null || path.length() == 0) - throw new IllegalArgumentException(JGitText.get().pathNotConfigured); - if (uri == null || uri.length() == 0) - throw new IllegalArgumentException(JGitText.get().uriNotConfigured); - - if (repo.isBare()) { - bareProjects = new ArrayList(); - if (author == null) - author = new PersonIdent(repo); - if (callback == null) - callback = new DefaultRemoteReader(); - } else - git = new Git(repo); - - XmlManifest manifest = new XmlManifest(this, path, uri, groups); try { - manifest.read(); - } catch (IOException e) { - throw new ManifestErrorException(e); + checkCallable(); + if (uri == null || uri.length() == 0) + throw new IllegalArgumentException( + JGitText.get().uriNotConfigured); + if (inputStream == null) { + if (path == null || path.length() == 0) + throw new IllegalArgumentException( + JGitText.get().pathNotConfigured); + try { + inputStream = new FileInputStream(path); + } catch (IOException e) { + throw new IllegalArgumentException( + JGitText.get().pathNotConfigured); + } + } + + if (repo.isBare()) { + bareProjects = new ArrayList(); + if (author == null) + author = new PersonIdent(repo); + if (callback == null) + callback = new DefaultRemoteReader(); + } else + git = new Git(repo); + + XmlManifest manifest = new XmlManifest( + this, inputStream, path, uri, groups); + try { + manifest.read(); + } catch (IOException e) { + throw new ManifestErrorException(e); + } + } finally { + try { + if (inputStream != null) + inputStream.close(); + } catch (IOException e) { + // Just ignore it, it's not important. + } } if (repo.isBare()) { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/internal/RepoText.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/internal/RepoText.java index 34db723b6..1f9d5d863 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/internal/RepoText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/internal/RepoText.java @@ -61,6 +61,7 @@ public static RepoText get() { // @formatter:off /***/ public String copyFileFailed; /***/ public String errorNoDefault; + /***/ public String errorNoDefaultFilename; /***/ public String errorParsingManifestFile; /***/ public String errorRemoteUnavailable; /***/ public String invalidManifest;