/* 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.api.porcelain; import java.util.List; import org.locationtech.geogig.api.AbstractGeoGigOp; import org.locationtech.geogig.api.Ref; import org.locationtech.geogig.api.Remote; import org.locationtech.geogig.api.plumbing.LsRemote; import org.locationtech.geogig.api.plumbing.UpdateRef; import org.locationtech.geogig.api.porcelain.RemoteException.StatusCode; import org.locationtech.geogig.storage.ConfigDatabase; import com.google.common.base.Optional; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableSet; /** * Removes a remote from the local config database. * * @see ConfigDatabase */ public class RemoteRemoveOp extends AbstractGeoGigOp<Remote> { private String name; /** * Executes the remote-remove operation. * * @return the {@link Remote} that was removed, or {@link Optional#absent()} if the remote * didn't exist. */ @Override protected Remote _call() { if (name == null || name.isEmpty()) { throw new RemoteException(StatusCode.MISSING_NAME); } ConfigDatabase config = configDatabase(); List<String> allRemotes = config.getAllSubsections("remote"); if (!allRemotes.contains(name)) { throw new RemoteException(StatusCode.REMOTE_NOT_FOUND); } Remote remote = null; String remoteSection = "remote." + name; Optional<String> remoteFetchURL = config.get(remoteSection + ".url"); Optional<String> remoteFetch = config.get(remoteSection + ".fetch"); Optional<String> remotePushURL = Optional.absent(); Optional<String> remoteMapped = config.get(remoteSection + ".mapped"); Optional<String> remoteMappedBranch = config.get(remoteSection + ".mappedBranch"); Optional<String> remoteUserName = config.get(remoteSection + ".username"); Optional<String> remotePassword = config.get(remoteSection + ".password"); if (remoteFetchURL.isPresent() && remoteFetch.isPresent()) { remotePushURL = config.get(remoteSection + ".pushurl"); } remote = new Remote(name, remoteFetchURL.or(""), remotePushURL.or(remoteFetchURL.or("")), remoteFetch.or(""), remoteMapped.or("false").equals("true"), remoteMappedBranch.orNull(), remoteUserName.orNull(), remotePassword.orNull()); config.removeSection(remoteSection); // Remove refs final ImmutableSet<Ref> localRemoteRefs = command(LsRemote.class).retrieveLocalRefs(true) .setRemote(Suppliers.ofInstance(Optional.of(remote))).call(); for (Ref localRef : localRemoteRefs) { command(UpdateRef.class).setDelete(true).setName(localRef.getName()).call(); } return remote; } /** * @param name the name of the remote to remove * @return {@code this} */ public RemoteRemoveOp setName(String name) { this.name = name; return this; } public String getName() { return name; } }