package aQute.bnd.repository.maven.provider; import java.io.Console; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import aQute.bnd.http.HttpClient; import aQute.bnd.osgi.Processor; import aQute.lib.getopt.Arguments; import aQute.lib.getopt.Options; import aQute.lib.io.IO; import aQute.maven.nexus.provider.Nexus; import aQute.maven.nexus.provider.Signer; public class NexusCommand extends Processor { private final static Logger logger = LoggerFactory.getLogger(NexusCommand.class); private NexusOptions options; private Nexus nexus; public interface NexusOptions extends Options { URI url(); } public NexusCommand(Processor parent, NexusOptions options) throws Exception { super(parent); this.options = options; if (this.options == null) { error("No -u/--url set"); return; } HttpClient client = new HttpClient(); client.readSettings(parent); this.nexus = new Nexus(options.url(), client); } @Arguments(arg = { "path..." }) interface SignOptions extends Options { String command(String s); boolean show(); String password(); String key(); } public void _sign(SignOptions options) throws Exception { String password = null; if (options.password() == null) { Console console = System.console(); if (console == null) { error("No -p/--password set for PGP key and no console to ask"); } else { char[] pw = console.readPassword("Passsword: "); if (pw == null || pw.length == 0) { error("Password not entered"); } password = new String(pw); } } else password = options.password(); Signer signer = new Signer(new String(password), options.command(getProperty("gpg", System.getenv("GPG")))); if (signer == null || password == null || !isOk()) return; List<String> args = options._arguments(); if (args.isEmpty()) { List<URI> files = nexus.files(); for (URI uri : files) { try { logger.debug("signing {}", relative(uri)); File f = nexus.download(uri); byte[] signature = signer.sign(f); if (options.show()) show(signature); else nexus.upload(new URI(uri + ".asc"), signature); } catch (Exception e) { exception(e, "could not download/sign/upload %s", relative(uri)); } } } else { for (String arg : args) { File f = getFile(arg); if (!f.isFile()) { error("Can't find file %s", f); } else { byte[] signature = signer.sign(f); if (options.show()) show(signature); else { File out = new File(f.getParentFile(), f.getName() + ".asc"); IO.store(signature, out); } } } } } private void show(byte[] signature) throws IOException { System.out.write(signature); } public URI relative(URI uri) { return this.options.url().relativize(uri); } @Arguments(arg = {}) interface FilesOption extends Options { } public void _files(FilesOption options) throws Exception { URI base = this.options.url(); for (URI uri : nexus.files()) { System.out.printf("%s%n", base.relativize(uri)); } } }