#!/bin/sh
# ------------------------------------------------------------------------------
#
# git-qpush: Implements the "git qpush" extension command.
#
# This is derived from git-qgoto.shar, which provides each of the qit-qgoto,
# git-qpush, and git-qpop extension commands, for manipulation of the applied
# patch sequence, and unapplied patch queue.
#
# $Id$
# ------------------------------------------------------------------------------
#
# I'd have liked to call this a "SYNOPSIS", (which is what it is), but git's
# git-sh-setup script requires the much less appropriate name "OPTIONS_SPEC",
# (which describes only a small subset of its actual content).
#
OPTIONS_SPEC="\
git qpush [[-f | --force [--no-backup]] | --keep-changes] [<patch>]
git qpush [[-f | --force [--no-backup]] | --keep-changes] [<index>]
git qpush [[-f | --force [--no-backup]] | --keep-changes] [-a | --all]
git qpush [[-f | --force [--no-backup]] | --keep-changes] --move <patch>
git qpush [[-f | --force [--no-backup]] | --keep-changes] --move <index>

With no nominated patch, push the next unapplied, unguarded patch;
with one nominated patch, and without "--move", push as many unapplied,
unguarded patches as necessary, until the nominated patch becomes the
topmost applied patch; with "--move", reorder the sequence, and push
the nominated patch
--
a,all!         push all available unapplied, unguarded patches
f,force!       backup locally modified files, and discard changes
no-backup!     do not save any backup files from this invocation
keep-changes!  tolerate non-conflicting local changes
move!          reorder sequence, and push the nominated patch"
#
# ------------------------------------------------------------------------------
#
# $Id$
#
# Written by Keith Marshall <keith@users.osdn.me>
# Copyright (C) 2018-2020, 2022, Keith Marshall
#
#
# This file is part of the Git-MQ program suite.
#
# The Git-MQ program suite is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public Licence
# as published by the Free Software Foundation, either version 3 of
# the Licence, or (at your option) any later version.
#
# The Git-MQ program suite is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public Licence for more details.
#
# You should have received a copy of the GNU General Public Licence
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#
# ------------------------------------------------------------------------------
#
# Although they may not always have any effect, all Git-MQ commands, like
# their hg counterparts, are expected to accept the global verbosity, and
# colour control options; ensure that they are declared:
#
OPTIONS_SPEC="$OPTIONS_SPEC
colour?*     generic output colour control -- may have no effect"
${OPTION_VERBOSE_DEFINED-false} || OPTIONS_SPEC="$OPTIONS_SPEC
v,verbose!*  generic verbosity selector -- may have no effect"

# For Git-MQ options, such as "--colour", we prefer a spelling convention
# which conforms to "World English" standards; however, git itself adopts
# "US English" convention.  Thus, we must also accommodate users who will
# specify "--color" instead of "--colour", without creating any ambiguity
# in the possible abbreviations; to achieve this, we check for "--color",
# among the command-line arguments, replacing it with "--colour", BEFORE
# we allow git to parse them.
#
for mq_argv
do case "$mq_argv" in
     --color*) mq_argv=`echo $mq_argv | sed 's/^--colo/&u/'` ;;
     --no-color) mq_argv="--no-colour" ;;
   esac
   ${mq_argv_init-true} && { set -- "$mq_argv"; mq_argv_init=false
   } || set -- "$@" "$mq_argv"
done

# Now, we may let git parse the command line, and set up its shell script
# processing environment, for use within a git working directory tree.
#
SUBDIRECTORY_OK=true . "`git --exec-path`/git-sh-setup" && require_work_tree

libexecdir=`dirname "$0"`
test `basename "$libexecdir"` = bin && libexecdir=`dirname "$libexecdir"`
libexecdir="$libexecdir/libexec/git-mq/${VERSION=1.0}"

mq_require(){ test -f "$1" || die "fatal: '$1' not found."; . "$1"; }
mq_require "$libexecdir/git-mq-setup.sh"

mq_facility='git qpush'
. $libexecdir/git-qgoto-init.sh

# When "git qpush" is invoked in the "git qpush --move <ref>" form,
# then we must first check that <ref> represents an existing patch,
# which is both unapplied, and unguarded, and furthermore, has been
# placed later in the series than all currently applied patches (if
# any).  When these prerequisite conditions are satisfied, then we
# must reorder the patch series, such that the <ref> patch will be
# applied as the default (single) patch, when the "qpush" backend
# is subsequently invoked with no arguments; all requisite checks,
# and reordering of the patch series, are handled by...
#
${mq_push_reorder-false} && . $libexecdir/mq-push-reordered.sh

# ...which ultimately discards the <ref> argument, before falling
# through, to invoke the "git qpush" backend without arguments.
# Final processing for the "git qpush" operation is delegated to the
# "git-qpush-backend.sh" handler, inheriting any residual arguments of
# the "git qpush" command itself.
#
. $libexecdir/git-qpush-backend.sh
#
# ------------------------------------------------------------------------------
# $RCSfile$: end of file
