Add support for remote --in-jar URLs
You can now provide an HTTP URL to --in-jar and it will be downloaded to a temporary file before remapping. Example: java -jar target/SpecialSource-1.3-SNAPSHOT-shaded.jar --in-jar http://assets.minecraft.net/1_4_7/minecraft_server.jar --out-jar /tmp/net.jar --srg-in ../MinecraftForge/mcp/conf/
This commit is contained in:
parent
262ec1b82e
commit
1000ba60cf
@ -29,11 +29,8 @@
|
|||||||
package net.md_5.specialsource;
|
package net.md_5.specialsource;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.google.common.base.Joiner;
|
|
||||||
import com.google.common.collect.BiMap;
|
import com.google.common.collect.BiMap;
|
||||||
import com.google.common.collect.HashBiMap;
|
import com.google.common.collect.HashBiMap;
|
||||||
import joptsimple.OptionException;
|
import joptsimple.OptionException;
|
||||||
@ -83,7 +80,7 @@ public class SpecialSource {
|
|||||||
|
|
||||||
acceptsAll(asList("i", "in-jar"), "Input jar to remap")
|
acceptsAll(asList("i", "in-jar"), "Input jar to remap")
|
||||||
.withRequiredArg()
|
.withRequiredArg()
|
||||||
.ofType(File.class);
|
.ofType(String.class);
|
||||||
|
|
||||||
acceptsAll(asList("o", "out-jar"), "Output jar to write")
|
acceptsAll(asList("o", "out-jar"), "Output jar to write")
|
||||||
.withRequiredArg()
|
.withRequiredArg()
|
||||||
@ -211,11 +208,12 @@ public class SpecialSource {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
log("Remapping final jar");
|
URLDownloader.verbose = !options.has("quiet");
|
||||||
Jar jar3 = Jar.init((File) options.valueOf("in-jar"));
|
Jar jar3 = Jar.init(URLDownloader.getLocalFile((String) options.valueOf("in-jar")));
|
||||||
|
|
||||||
inheritanceProviders.add(new JarInheritanceProvider(jar3));
|
inheritanceProviders.add(new JarInheritanceProvider(jar3));
|
||||||
|
|
||||||
|
log("Remapping final jar");
|
||||||
JarRemapper jarRemapper = new JarRemapper(jarMapping);
|
JarRemapper jarRemapper = new JarRemapper(jarMapping);
|
||||||
jarRemapper.remapJar(jar3, (File) options.valueOf("out-jar"));
|
jarRemapper.remapJar(jar3, (File) options.valueOf("out-jar"));
|
||||||
}
|
}
|
||||||
|
106
src/main/java/net/md_5/specialsource/URLDownloader.java
Normal file
106
src/main/java/net/md_5/specialsource/URLDownloader.java
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2012, md_5. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* The name of the author may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package net.md_5.specialsource;
|
||||||
|
|
||||||
|
import com.google.common.io.Files;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
public class URLDownloader {
|
||||||
|
|
||||||
|
private URL url;
|
||||||
|
public static boolean verbose = true;
|
||||||
|
|
||||||
|
public URLDownloader(String urlString) throws MalformedURLException {
|
||||||
|
this.url = new URL(urlString);
|
||||||
|
}
|
||||||
|
|
||||||
|
public File download() throws IOException {
|
||||||
|
if (verbose) {
|
||||||
|
System.out.println("Downloading "+url);
|
||||||
|
}
|
||||||
|
|
||||||
|
url.openConnection();
|
||||||
|
InputStream inputStream = url.openStream();
|
||||||
|
|
||||||
|
String path = url.getPath();
|
||||||
|
String baseName = URLDownloader.getNameWithoutExtension(path);
|
||||||
|
String extension = Files.getFileExtension(path);
|
||||||
|
|
||||||
|
File tempFile = File.createTempFile(baseName, "." + extension);
|
||||||
|
FileOutputStream outputStream = new FileOutputStream(tempFile);
|
||||||
|
|
||||||
|
byte[] buffer = new byte[4096];
|
||||||
|
int n = 0;
|
||||||
|
while ((n = inputStream.read(buffer)) != -1) {
|
||||||
|
outputStream.write(buffer, 0, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
inputStream.close();
|
||||||
|
outputStream.close();
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
|
System.out.println("Downloaded to "+tempFile.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
return tempFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getLocalFile(String string) throws IOException {
|
||||||
|
if (new File(string).exists()) {
|
||||||
|
return new File(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.startsWith("http://") || string.startsWith("https://")) {
|
||||||
|
URLDownloader downloader = new URLDownloader(string);
|
||||||
|
return downloader.download();
|
||||||
|
} else {
|
||||||
|
throw new FileNotFoundException(string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Borrowed from Guava 13 (since we're on Guava 12) - TODO: remove and use Guava after https://github.com/MinecraftForge/FML/commit/937e9a016936195e4dc51f33ab9e8dde52621684
|
||||||
|
/**
|
||||||
|
* Returns the file name without its
|
||||||
|
* <a href="http://en.wikipedia.org/wiki/Filename_extension">file extension</a> or path. This is
|
||||||
|
* similar to the {@code basename} unix command. The result does not include the '{@code .}'.
|
||||||
|
*
|
||||||
|
* @param file The name of the file to trim the extension from. This can be either a fully
|
||||||
|
* qualified file name (including a path) or just a file name.
|
||||||
|
* @return The file name without its path or extension.
|
||||||
|
* @since 14.0
|
||||||
|
*/
|
||||||
|
public static String getNameWithoutExtension(String file) {
|
||||||
|
String fileName = new File(file).getName();
|
||||||
|
int dotIndex = fileName.lastIndexOf('.');
|
||||||
|
return (dotIndex == -1) ? fileName : fileName.substring(0, dotIndex);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user