/* Copyright (c) 2012-2014 Boundless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/edl-v10.html
*
* Contributors:
* Johnathan Garrett (LMN Solutions) - initial implementation
*/
package org.locationtech.geogig.cli.porcelain;
import java.io.IOException;
import java.util.List;
import org.locationtech.geogig.api.porcelain.PushOp;
import org.locationtech.geogig.api.porcelain.SynchronizationException;
import org.locationtech.geogig.api.porcelain.TransferSummary;
import org.locationtech.geogig.cli.AbstractCommand;
import org.locationtech.geogig.cli.CLICommand;
import org.locationtech.geogig.cli.CommandFailedException;
import org.locationtech.geogig.cli.GeogigCLI;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
/**
* Updates remote refs using local refs, while sending objects necessary to complete the given refs.
* <p>
* CLI proxy for {@link PushOp}
* <p>
* Usage:
* <ul>
* <li> {@code geogig push [<options>] [<repository> [<refspec>...]]}
* </ul>
*
* @see PushOp
*/
@Parameters(commandNames = "push", commandDescription = "Update remote refs along with associated objects")
public class Push extends AbstractCommand implements CLICommand {
@Parameter(names = "--all", description = "Instead of naming each ref to push, specifies that all refs under refs/heads/ be pushed.")
private boolean all = false;
@Parameter(description = "[<repository> [<refspec>...]]")
private List<String> args;
/**
* Executes the push command using the provided options.
*/
@Override
public void runInternal(GeogigCLI cli) throws IOException {
PushOp push = cli.getGeogig().command(PushOp.class);
push.setProgressListener(cli.getProgressListener());
push.setAll(all);
if (args != null) {
if (args.size() > 0) {
push.setRemote(args.get(0));
}
for (int i = 1; i < args.size(); i++) {
push.addRefSpec(args.get(i));
}
}
try {
// TODO: listen on progress?
TransferSummary dataPushed = push.call();
if (dataPushed.isEmpty()) {
cli.getConsole().println("Nothing to push.");
}
} catch (SynchronizationException e) {
switch (e.statusCode) {
case REMOTE_HAS_CHANGES:
throw new CommandFailedException(
"Push failed: The remote repository has changes that would be lost in the event of a push.",
e);
case HISTORY_TOO_SHALLOW:
throw new CommandFailedException(
"Push failed: There is not enough local history to complete the push.", e);
case CANNOT_PUSH_TO_SYMBOLIC_REF:
throw new CommandFailedException(
"Push failed: Cannot push to a symbolic reference", e);
default:
break;
}
}
}
}