/*
 * Copyright (C) 2009, Google Inc.
 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
 * and other copyright owners as documented in the project's IP log.
 *
 * This program and the accompanying materials are made available
 * under the terms of the Eclipse Distribution License v1.0 which
 * accompanies this distribution, is reproduced below, and is
 * available at http://www.eclipse.org/org/documents/edl-v10.php
 *
 * 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.
 *
 * - Neither the name of the Eclipse Foundation, Inc. nor the
 *   names of its contributors may 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 org.eclipse.jgit.pgm;

/**
 * Indicates a {@link org.eclipse.jgit.pgm.TextBuiltin} implementation has
 * failed during execution.
 * <p>
 * Typically the stack trace for a Die exception is not shown to the user as it
 * may indicate a simple error condition that the end-user can fix on their own,
 * without needing a screen of Java stack frames.
 */
public class Die extends RuntimeException {
	private static final long serialVersionUID = 1L;

	private boolean aborted;

	/**
	 * Construct a new message explaining what has gone wrong.
	 *
	 * @param why
	 *            the message to show to the end-user.
	 */
	public Die(String why) {
		super(why);
	}

	/**
	 * Construct a new message explaining what has gone wrong.
	 *
	 * @param why
	 *            the message to show to the end-user.
	 * @param cause
	 *            why the command has failed.
	 */
	public Die(String why, Throwable cause) {
		super(why, cause);
	}

	/**
	 * Construct a new exception reflecting the fact that the
	 * command execution has been aborted before running.
	 *
	 * @param aborted boolean indicating the fact the execution has been aborted
	 * @since 3.4
	 */
	public Die(boolean aborted) {
		this(aborted, null);
	}

	/**
	 * Construct a new exception reflecting the fact that the command execution
	 * has been aborted before running.
	 *
	 * @param aborted
	 *            boolean indicating the fact the execution has been aborted
	 * @param cause
	 *            can be null
	 * @since 4.2
	 */
	public Die(boolean aborted, Throwable cause) {
		super(cause != null ? cause.getMessage() : null, cause);
		this.aborted = aborted;
	}

	/**
	 * Check if this exception should cause the execution to be aborted.
	 *
	 * @return boolean indicating that the execution should be aborted
	 * @since 3.4
	 */
	public boolean isAborted() {
		return aborted;
	}
}
