Merge branch 'ph/parseopt-sh'
* ph/parseopt-sh: git-quiltimport.sh fix --patches handling git-am: -i does not take a string parameter. sh-setup: don't let eval output to be shell-expanded. git-sh-setup: fix parseopt `eval` string underquoting Give git-am back the ability to add Signed-off-by lines. git-rev-parse --parseopt scripts: Add placeholders for OPTIONS_SPEC Migrate git-repack.sh to use git-rev-parse --parseopt Migrate git-quiltimport.sh to use git-rev-parse --parseopt Migrate git-checkout.sh to use git-rev-parse --parseopt --keep-dashdash Migrate git-instaweb.sh to use git-rev-parse --parseopt Migrate git-merge.sh to use git-rev-parse --parseopt Migrate git-am.sh to use git-rev-parse --parseopt Migrate git-clone to use git-rev-parse --parseopt Migrate git-clean.sh to use git-rev-parse --parseopt. Update git-sh-setup(1) to allow transparent use of git-rev-parse --parseopt Add a parseopt mode to git-rev-parse to bring parse-options to shell scripts.
This commit is contained in:
commit
9f4c4eb0e1
@ -23,6 +23,13 @@ distinguish between them.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
--parseopt::
|
||||
Use `git-rev-parse` in option parsing mode (see PARSEOPT section below).
|
||||
|
||||
--keep-dash-dash::
|
||||
Only meaningful in `--parseopt` mode. Tells the option parser to echo
|
||||
out the first `--` met instead of skipping it.
|
||||
|
||||
--revs-only::
|
||||
Do not output flags and parameters not meant for
|
||||
`git-rev-list` command.
|
||||
@ -288,10 +295,75 @@ Here are a handful examples:
|
||||
C^@ I J F
|
||||
F^! D G H D F
|
||||
|
||||
PARSEOPT
|
||||
--------
|
||||
|
||||
In `--parseopt` mode, `git-rev-parse` helps massaging options to bring to shell
|
||||
scripts the same facilities C builtins have. It works as an option normalizer
|
||||
(e.g. splits single switches aggregate values), a bit like `getopt(1)` does.
|
||||
|
||||
It takes on the standard input the specification of the options to parse and
|
||||
understand, and echoes on the standard output a line suitable for `sh(1)` `eval`
|
||||
to replace the arguments with normalized ones. In case of error, it outputs
|
||||
usage on the standard error stream, and exits with code 129.
|
||||
|
||||
Input Format
|
||||
~~~~~~~~~~~~
|
||||
|
||||
`git-rev-parse --parseopt` input format is fully text based. It has two parts,
|
||||
separated by a line that contains only `--`. The lines before the separator
|
||||
(should be more than one) are used for the usage.
|
||||
The lines after the separator describe the options.
|
||||
|
||||
Each line of options has this format:
|
||||
|
||||
------------
|
||||
<opt_spec><arg_spec>? SP+ help LF
|
||||
------------
|
||||
|
||||
`<opt_spec>`::
|
||||
its format is the short option character, then the long option name
|
||||
separated by a comma. Both parts are not required, though at least one
|
||||
is necessary. `h,help`, `dry-run` and `f` are all three correct
|
||||
`<opt_spec>`.
|
||||
|
||||
`<arg_spec>`::
|
||||
an `<arg_spec>` tells the option parser if the option has an argument
|
||||
(`=`), an optional one (`?` though its use is discouraged) or none
|
||||
(no `<arg_spec>` in that case).
|
||||
|
||||
The remainder of the line, after stripping the spaces, is used
|
||||
as the help associated to the option.
|
||||
|
||||
Blank lines are ignored, and lines that don't match this specification are used
|
||||
as option group headers (start the line with a space to create such
|
||||
lines on purpose).
|
||||
|
||||
Example
|
||||
~~~~~~~
|
||||
|
||||
------------
|
||||
OPTS_SPEC="\
|
||||
some-command [options] <args>...
|
||||
|
||||
some-command does foo and bar!
|
||||
--
|
||||
h,help show the help
|
||||
|
||||
foo some nifty option --foo
|
||||
bar= some cool option --bar with an argument
|
||||
|
||||
An option group Header
|
||||
C? option C with an optional argument"
|
||||
|
||||
eval `echo "$OPTS_SPEC" | git-rev-parse --parseopt -- "$@" || echo exit $?`
|
||||
------------
|
||||
|
||||
|
||||
Author
|
||||
------
|
||||
Written by Linus Torvalds <torvalds@osdl.org> and
|
||||
Junio C Hamano <junkio@cox.net>
|
||||
Written by Linus Torvalds <torvalds@osdl.org> .
|
||||
Junio C Hamano <junkio@cox.net> and Pierre Habouzit <madcoder@debian.org>
|
||||
|
||||
Documentation
|
||||
--------------
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "refs.h"
|
||||
#include "quote.h"
|
||||
#include "builtin.h"
|
||||
#include "parse-options.h"
|
||||
|
||||
#define DO_REVS 1
|
||||
#define DO_NOREV 2
|
||||
@ -209,13 +210,138 @@ static int try_difference(const char *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parseopt_dump(const struct option *o, const char *arg, int unset)
|
||||
{
|
||||
struct strbuf *parsed = o->value;
|
||||
if (unset)
|
||||
strbuf_addf(parsed, " --no-%s", o->long_name);
|
||||
else if (o->short_name)
|
||||
strbuf_addf(parsed, " -%c", o->short_name);
|
||||
else
|
||||
strbuf_addf(parsed, " --%s", o->long_name);
|
||||
if (arg) {
|
||||
strbuf_addch(parsed, ' ');
|
||||
sq_quote_buf(parsed, arg);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *skipspaces(const char *s)
|
||||
{
|
||||
while (isspace(*s))
|
||||
s++;
|
||||
return s;
|
||||
}
|
||||
|
||||
static int cmd_parseopt(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
static int keep_dashdash = 0;
|
||||
static char const * const parseopt_usage[] = {
|
||||
"git-rev-parse --parseopt [options] -- [<args>...]",
|
||||
NULL
|
||||
};
|
||||
static struct option parseopt_opts[] = {
|
||||
OPT_BOOLEAN(0, "keep-dashdash", &keep_dashdash,
|
||||
"keep the `--` passed as an arg"),
|
||||
OPT_END(),
|
||||
};
|
||||
|
||||
struct strbuf sb, parsed;
|
||||
const char **usage = NULL;
|
||||
struct option *opts = NULL;
|
||||
int onb = 0, osz = 0, unb = 0, usz = 0;
|
||||
|
||||
strbuf_init(&parsed, 0);
|
||||
strbuf_addstr(&parsed, "set --");
|
||||
argc = parse_options(argc, argv, parseopt_opts, parseopt_usage,
|
||||
PARSE_OPT_KEEP_DASHDASH);
|
||||
if (argc < 1 || strcmp(argv[0], "--"))
|
||||
usage_with_options(parseopt_usage, parseopt_opts);
|
||||
|
||||
strbuf_init(&sb, 0);
|
||||
/* get the usage up to the first line with a -- on it */
|
||||
for (;;) {
|
||||
if (strbuf_getline(&sb, stdin, '\n') == EOF)
|
||||
die("premature end of input");
|
||||
ALLOC_GROW(usage, unb + 1, usz);
|
||||
if (!strcmp("--", sb.buf)) {
|
||||
if (unb < 1)
|
||||
die("no usage string given before the `--' separator");
|
||||
usage[unb] = NULL;
|
||||
break;
|
||||
}
|
||||
usage[unb++] = strbuf_detach(&sb, NULL);
|
||||
}
|
||||
|
||||
/* parse: (<short>|<short>,<long>|<long>)[=?]? SP+ <help> */
|
||||
while (strbuf_getline(&sb, stdin, '\n') != EOF) {
|
||||
const char *s;
|
||||
struct option *o;
|
||||
|
||||
if (!sb.len)
|
||||
continue;
|
||||
|
||||
ALLOC_GROW(opts, onb + 1, osz);
|
||||
memset(opts + onb, 0, sizeof(opts[onb]));
|
||||
|
||||
o = &opts[onb++];
|
||||
s = strchr(sb.buf, ' ');
|
||||
if (!s || *sb.buf == ' ') {
|
||||
o->type = OPTION_GROUP;
|
||||
o->help = xstrdup(skipspaces(s));
|
||||
continue;
|
||||
}
|
||||
|
||||
o->type = OPTION_CALLBACK;
|
||||
o->help = xstrdup(skipspaces(s));
|
||||
o->value = &parsed;
|
||||
o->callback = &parseopt_dump;
|
||||
switch (s[-1]) {
|
||||
case '=':
|
||||
s--;
|
||||
break;
|
||||
case '?':
|
||||
o->flags = PARSE_OPT_OPTARG;
|
||||
s--;
|
||||
break;
|
||||
default:
|
||||
o->flags = PARSE_OPT_NOARG;
|
||||
break;
|
||||
}
|
||||
|
||||
if (s - sb.buf == 1) /* short option only */
|
||||
o->short_name = *sb.buf;
|
||||
else if (sb.buf[1] != ',') /* long option only */
|
||||
o->long_name = xmemdupz(sb.buf, s - sb.buf);
|
||||
else {
|
||||
o->short_name = *sb.buf;
|
||||
o->long_name = xmemdupz(sb.buf + 2, s - sb.buf - 2);
|
||||
}
|
||||
}
|
||||
strbuf_release(&sb);
|
||||
|
||||
/* put an OPT_END() */
|
||||
ALLOC_GROW(opts, onb + 1, osz);
|
||||
memset(opts + onb, 0, sizeof(opts[onb]));
|
||||
argc = parse_options(argc, argv, opts, usage,
|
||||
keep_dashdash ? PARSE_OPT_KEEP_DASHDASH : 0);
|
||||
|
||||
strbuf_addf(&parsed, " --");
|
||||
sq_quote_argv(&parsed, argv, argc, 0);
|
||||
puts(parsed.buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
int i, as_is = 0, verify = 0;
|
||||
unsigned char sha1[20];
|
||||
|
||||
git_config(git_default_config);
|
||||
if (argc > 1 && !strcmp("--parseopt", argv[1]))
|
||||
return cmd_parseopt(argc - 1, argv + 1, prefix);
|
||||
|
||||
prefix = setup_git_directory();
|
||||
git_config(git_default_config);
|
||||
for (i = 1; i < argc; i++) {
|
||||
const char *arg = argv[i];
|
||||
|
||||
|
94
git-am.sh
94
git-am.sh
@ -2,11 +2,26 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2006 Junio C Hamano
|
||||
|
||||
USAGE='[--signoff] [--dotest=<dir>] [--keep] [--utf8 | --no-utf8]
|
||||
[--3way] [--interactive] [--binary]
|
||||
[--whitespace=<option>] [-C<n>] [-p<n>]
|
||||
<mbox>|<Maildir>...
|
||||
or, when resuming [--skip | --resolved]'
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_SPEC="\
|
||||
git-am [options] <mbox>|<Maildir>...
|
||||
git-am [options] --resolved
|
||||
git-am [options] --skip
|
||||
--
|
||||
d,dotest= use <dir> and not .dotest
|
||||
i,interactive run interactively
|
||||
b,binary pass --allo-binary-replacement to git-apply
|
||||
3,3way allow fall back on 3way merging if needed
|
||||
s,signoff add a Signed-off-by line to the commit message
|
||||
u,utf8 recode into utf8 (default)
|
||||
k,keep pass -k flagg to git-mailinfo
|
||||
whitespace= pass it through git-apply
|
||||
C= pass it through git-apply
|
||||
p= pass it through git-apply
|
||||
resolvemsg= override error message when patch failure occurs
|
||||
r,resolved to be used after a patch failure
|
||||
skip skip the current patch"
|
||||
|
||||
. git-sh-setup
|
||||
set_reflog_action am
|
||||
require_work_tree
|
||||
@ -110,49 +125,38 @@ git_apply_opt=
|
||||
while test $# != 0
|
||||
do
|
||||
case "$1" in
|
||||
-d=*|--d=*|--do=*|--dot=*|--dote=*|--dotes=*|--dotest=*)
|
||||
dotest=`expr "z$1" : 'z-[^=]*=\(.*\)'`; shift ;;
|
||||
-d|--d|--do|--dot|--dote|--dotes|--dotest)
|
||||
case "$#" in 1) usage ;; esac; shift
|
||||
dotest="$1"; shift;;
|
||||
|
||||
-i|--i|--in|--int|--inte|--inter|--intera|--interac|--interact|\
|
||||
--interacti|--interactiv|--interactive)
|
||||
interactive=t; shift ;;
|
||||
|
||||
-b|--b|--bi|--bin|--bina|--binar|--binary)
|
||||
binary=t; shift ;;
|
||||
|
||||
-3|--3|--3w|--3wa|--3way)
|
||||
threeway=t; shift ;;
|
||||
-s|--s|--si|--sig|--sign|--signo|--signof|--signoff)
|
||||
sign=t; shift ;;
|
||||
-u|--u|--ut|--utf|--utf8)
|
||||
utf8=t; shift ;; # this is now default
|
||||
--no-u|--no-ut|--no-utf|--no-utf8)
|
||||
utf8=; shift ;;
|
||||
-k|--k|--ke|--kee|--keep)
|
||||
keep=t; shift ;;
|
||||
|
||||
-r|--r|--re|--res|--reso|--resol|--resolv|--resolve|--resolved)
|
||||
resolved=t; shift ;;
|
||||
|
||||
--sk|--ski|--skip)
|
||||
skip=t; shift ;;
|
||||
|
||||
--whitespace=*|-C*|-p*)
|
||||
git_apply_opt="$git_apply_opt $1"; shift ;;
|
||||
|
||||
--resolvemsg=*)
|
||||
resolvemsg=${1#--resolvemsg=}; shift ;;
|
||||
|
||||
-i|--interactive)
|
||||
interactive=t ;;
|
||||
-b|--binary)
|
||||
binary=t ;;
|
||||
-3|--3way)
|
||||
threeway=t ;;
|
||||
-s|--signoff)
|
||||
sign=t ;;
|
||||
-u|--utf8)
|
||||
utf8=t ;; # this is now default
|
||||
--no-utf8)
|
||||
utf8= ;;
|
||||
-k|--keep)
|
||||
keep=t ;;
|
||||
-r|--resolved)
|
||||
resolved=t ;;
|
||||
--skip)
|
||||
skip=t ;;
|
||||
-d|--dotest)
|
||||
shift; dotest=$1;;
|
||||
--resolvemsg)
|
||||
shift; resolvemsg=$1 ;;
|
||||
--whitespace)
|
||||
git_apply_opt="$git_apply_opt $1=$2"; shift ;;
|
||||
-C|-p)
|
||||
git_apply_opt="$git_apply_opt $1$2"; shift ;;
|
||||
--)
|
||||
shift; break ;;
|
||||
-*)
|
||||
usage ;;
|
||||
shift; break ;;
|
||||
*)
|
||||
break ;;
|
||||
usage ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# If the dotest directory exists, but we have finished applying all the
|
||||
|
@ -22,6 +22,7 @@ git bisect log
|
||||
git bisect run <cmd>...
|
||||
use <cmd>... to automatically bisect.'
|
||||
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
|
||||
|
@ -1,6 +1,16 @@
|
||||
#!/bin/sh
|
||||
|
||||
USAGE='[-q] [-f] [-b <new_branch>] [-m] [<branch>] [<paths>...]'
|
||||
OPTIONS_KEEPDASHDASH=t
|
||||
OPTIONS_SPEC="\
|
||||
git-branch [options] [<branch>] [<paths>...]
|
||||
--
|
||||
b= create a new branch started at <branch>
|
||||
l create the new branchs reflog
|
||||
track tells if the new branch should track the remote branch
|
||||
f proceed even if the index or working tree is not HEAD
|
||||
m performa three-way merge on local modifications if needed
|
||||
q,quiet be quiet
|
||||
"
|
||||
SUBDIRECTORY_OK=Sometimes
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
@ -20,13 +30,12 @@ quiet=
|
||||
v=-v
|
||||
LF='
|
||||
'
|
||||
while [ "$#" != "0" ]; do
|
||||
arg="$1"
|
||||
shift
|
||||
case "$arg" in
|
||||
"-b")
|
||||
newbranch="$1"
|
||||
|
||||
while test $# != 0; do
|
||||
case "$1" in
|
||||
-b)
|
||||
shift
|
||||
newbranch="$1"
|
||||
[ -z "$newbranch" ] &&
|
||||
die "git checkout: -b needs a branch name"
|
||||
git show-ref --verify --quiet -- "refs/heads/$newbranch" &&
|
||||
@ -34,64 +43,54 @@ while [ "$#" != "0" ]; do
|
||||
git check-ref-format "heads/$newbranch" ||
|
||||
die "git checkout: we do not like '$newbranch' as a branch name."
|
||||
;;
|
||||
"-l")
|
||||
-l)
|
||||
newbranch_log=-l
|
||||
;;
|
||||
"--track"|"--no-track")
|
||||
track="$arg"
|
||||
--track|--no-track)
|
||||
track="$1"
|
||||
;;
|
||||
"-f")
|
||||
-f)
|
||||
force=1
|
||||
;;
|
||||
-m)
|
||||
merge=1
|
||||
;;
|
||||
"-q")
|
||||
-q|--quiet)
|
||||
quiet=1
|
||||
v=
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
if rev=$(git rev-parse --verify "$arg^0" 2>/dev/null)
|
||||
then
|
||||
if [ -z "$rev" ]; then
|
||||
echo "unknown flag $arg"
|
||||
exit 1
|
||||
fi
|
||||
new_name="$arg"
|
||||
if git show-ref --verify --quiet -- "refs/heads/$arg"
|
||||
then
|
||||
rev=$(git rev-parse --verify "refs/heads/$arg^0")
|
||||
branch="$arg"
|
||||
fi
|
||||
new="$rev"
|
||||
elif rev=$(git rev-parse --verify "$arg^{tree}" 2>/dev/null)
|
||||
then
|
||||
# checking out selected paths from a tree-ish.
|
||||
new="$rev"
|
||||
new_name="$arg^{tree}"
|
||||
branch=
|
||||
else
|
||||
new=
|
||||
new_name=
|
||||
branch=
|
||||
set x "$arg" "$@"
|
||||
shift
|
||||
fi
|
||||
case "$1" in
|
||||
--)
|
||||
shift ;;
|
||||
esac
|
||||
break
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
arg="$1"
|
||||
if rev=$(git rev-parse --verify "$arg^0" 2>/dev/null)
|
||||
then
|
||||
[ -z "$rev" ] && die "unknown flag $arg"
|
||||
new_name="$arg"
|
||||
if git show-ref --verify --quiet -- "refs/heads/$arg"
|
||||
then
|
||||
rev=$(git rev-parse --verify "refs/heads/$arg^0")
|
||||
branch="$arg"
|
||||
fi
|
||||
new="$rev"
|
||||
shift
|
||||
elif rev=$(git rev-parse --verify "$arg^{tree}" 2>/dev/null)
|
||||
then
|
||||
# checking out selected paths from a tree-ish.
|
||||
new="$rev"
|
||||
new_name="$arg^{tree}"
|
||||
shift
|
||||
fi
|
||||
[ "$1" = "--" ] && shift
|
||||
|
||||
case "$newbranch,$track" in
|
||||
,--*)
|
||||
die "git checkout: --track and --no-track require -b"
|
||||
@ -138,8 +137,8 @@ Did you intend to checkout '$@' which can not be resolved as commit?"
|
||||
git ls-files -- "$@" |
|
||||
git checkout-index -f -u --stdin
|
||||
|
||||
# Run a post-checkout hook -- the HEAD does not change so the
|
||||
# current HEAD is passed in for both args
|
||||
# Run a post-checkout hook -- the HEAD does not change so the
|
||||
# current HEAD is passed in for both args
|
||||
if test -x "$GIT_DIR"/hooks/post-checkout; then
|
||||
"$GIT_DIR"/hooks/post-checkout $old $old 0
|
||||
fi
|
||||
@ -294,5 +293,5 @@ fi
|
||||
|
||||
# Run a post-checkout hook
|
||||
if test -x "$GIT_DIR"/hooks/post-checkout; then
|
||||
"$GIT_DIR"/hooks/post-checkout $old $new 1
|
||||
"$GIT_DIR"/hooks/post-checkout $old $new 1
|
||||
fi
|
||||
|
36
git-clean.sh
36
git-clean.sh
@ -3,16 +3,22 @@
|
||||
# Copyright (c) 2005-2006 Pavel Roskin
|
||||
#
|
||||
|
||||
USAGE="[-d] [-f] [-n] [-q] [-x | -X] [--] <paths>..."
|
||||
LONG_USAGE='Clean untracked files from the working directory
|
||||
-d remove directories as well
|
||||
-f override clean.requireForce and clean anyway
|
||||
-n don'\''t remove anything, just show what would be done
|
||||
-q be quiet, only report errors
|
||||
-x remove ignored files as well
|
||||
-X remove only ignored files
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_SPEC="\
|
||||
git-clean [options] <paths>...
|
||||
|
||||
Clean untracked files from the working directory
|
||||
|
||||
When optional <paths>... arguments are given, the paths
|
||||
affected are further limited to those that match them.'
|
||||
affected are further limited to those that match them.
|
||||
--
|
||||
d remove directories as well
|
||||
f override clean.requireForce and clean anyway
|
||||
n don't remove anything, just show what would be done
|
||||
q be quiet, only report errors
|
||||
x remove ignored files as well
|
||||
X remove only ignored files"
|
||||
|
||||
SUBDIRECTORY_OK=Yes
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
@ -56,11 +62,9 @@ do
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
usage # should not happen
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
@ -77,9 +81,9 @@ case "$disabled" in
|
||||
;;
|
||||
esac
|
||||
|
||||
case "$ignored,$ignoredonly" in
|
||||
1,1) usage;;
|
||||
esac
|
||||
if [ "$ignored,$ignoredonly" = "1,1" ]; then
|
||||
die "-x and -X cannot be set together"
|
||||
fi
|
||||
|
||||
if [ -z "$ignored" ]; then
|
||||
excl="--exclude-per-directory=.gitignore"
|
||||
|
101
git-clone.sh
101
git-clone.sh
@ -8,15 +8,36 @@
|
||||
# See git-sh-setup why.
|
||||
unset CDPATH
|
||||
|
||||
OPTIONS_SPEC="\
|
||||
git-clone [options] [--] <repo> [<dir>]
|
||||
--
|
||||
n,no-checkout don't create a checkout
|
||||
bare create a bare repository
|
||||
naked create a bare repository
|
||||
l,local to clone from a local repository
|
||||
no-hardlinks don't use local hardlinks, always copy
|
||||
s,shared setup as a shared repository
|
||||
template= path to the template directory
|
||||
q,quiet be quiet
|
||||
reference= reference repository
|
||||
o,origin= use <name> instead of 'origin' to track upstream
|
||||
u,upload-pack= path to git-upload-pack on the remote
|
||||
depth= create a shallow clone of that depth
|
||||
|
||||
use-separate-remote compatibility, do not use
|
||||
no-separate-remote compatibility, do not use"
|
||||
|
||||
die() {
|
||||
echo >&2 "$@"
|
||||
exit 1
|
||||
}
|
||||
|
||||
usage() {
|
||||
die "Usage: $0 [--template=<template_directory>] [--reference <reference-repo>] [--bare] [-l [-s]] [-q] [-u <upload-pack>] [--origin <name>] [--depth <n>] [-n] [--] <repo> [<dir>]"
|
||||
exec "$0" -h
|
||||
}
|
||||
|
||||
eval "$(echo "$OPTIONS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)"
|
||||
|
||||
get_repo_base() {
|
||||
(
|
||||
cd "`/bin/pwd`" &&
|
||||
@ -106,67 +127,57 @@ depth=
|
||||
no_progress=
|
||||
local_explicitly_asked_for=
|
||||
test -t 1 || no_progress=--no-progress
|
||||
while
|
||||
case "$#,$1" in
|
||||
0,*) break ;;
|
||||
*,-n|*,--no|*,--no-|*,--no-c|*,--no-ch|*,--no-che|*,--no-chec|\
|
||||
*,--no-check|*,--no-checko|*,--no-checkou|*,--no-checkout)
|
||||
no_checkout=yes ;;
|
||||
*,--na|*,--nak|*,--nake|*,--naked|\
|
||||
*,-b|*,--b|*,--ba|*,--bar|*,--bare) bare=yes ;;
|
||||
*,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local)
|
||||
local_explicitly_asked_for=yes
|
||||
use_local_hardlink=yes ;;
|
||||
*,--no-h|*,--no-ha|*,--no-har|*,--no-hard|*,--no-hardl|\
|
||||
*,--no-hardli|*,--no-hardlin|*,--no-hardlink|*,--no-hardlinks)
|
||||
use_local_hardlink=no ;;
|
||||
*,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared)
|
||||
local_shared=yes; ;;
|
||||
1,--template) usage ;;
|
||||
*,--template)
|
||||
|
||||
while test $# != 0
|
||||
do
|
||||
case "$1" in
|
||||
-n|--no-checkout)
|
||||
no_checkout=yes ;;
|
||||
--naked|--bare)
|
||||
bare=yes ;;
|
||||
-l|--local)
|
||||
local_explicitly_asked_for=yes
|
||||
use_local_hardlink=yes
|
||||
;;
|
||||
--no-hardlinks)
|
||||
use_local_hardlink=no ;;
|
||||
-s|--shared)
|
||||
local_shared=yes ;;
|
||||
--template)
|
||||
shift; template="--template=$1" ;;
|
||||
*,--template=*)
|
||||
template="$1" ;;
|
||||
*,-q|*,--quiet) quiet=-q ;;
|
||||
*,--use-separate-remote) ;;
|
||||
*,--no-separate-remote)
|
||||
-q|--quiet)
|
||||
quiet=-q ;;
|
||||
--use-separate-remote|--no-separate-remote)
|
||||
die "clones are always made with separate-remote layout" ;;
|
||||
1,--reference) usage ;;
|
||||
*,--reference)
|
||||
--reference)
|
||||
shift; reference="$1" ;;
|
||||
*,--reference=*)
|
||||
reference=`expr "z$1" : 'z--reference=\(.*\)'` ;;
|
||||
*,-o|*,--or|*,--ori|*,--orig|*,--origi|*,--origin)
|
||||
case "$2" in
|
||||
-o,--origin)
|
||||
shift;
|
||||
case "$1" in
|
||||
'')
|
||||
usage ;;
|
||||
*/*)
|
||||
die "'$2' is not suitable for an origin name"
|
||||
die "'$1' is not suitable for an origin name"
|
||||
esac
|
||||
git check-ref-format "heads/$2" ||
|
||||
die "'$2' is not suitable for a branch name"
|
||||
git check-ref-format "heads/$1" ||
|
||||
die "'$1' is not suitable for a branch name"
|
||||
test -z "$origin_override" ||
|
||||
die "Do not give more than one --origin options."
|
||||
origin_override=yes
|
||||
origin="$2"; shift
|
||||
origin="$1"
|
||||
;;
|
||||
1,-u|1,--upload-pack) usage ;;
|
||||
*,-u|*,--upload-pack)
|
||||
-u|--upload-pack)
|
||||
shift
|
||||
upload_pack="--upload-pack=$1" ;;
|
||||
*,--upload-pack=*)
|
||||
upload_pack=--upload-pack=$(expr "z$1" : 'z-[^=]*=\(.*\)') ;;
|
||||
1,--depth) usage;;
|
||||
*,--depth)
|
||||
--depth)
|
||||
shift
|
||||
depth="--depth=$1";;
|
||||
*,--)
|
||||
depth="--depth=$1" ;;
|
||||
--)
|
||||
shift
|
||||
break ;;
|
||||
*,-*) usage ;;
|
||||
*) break ;;
|
||||
*)
|
||||
usage ;;
|
||||
esac
|
||||
do
|
||||
shift
|
||||
done
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
USAGE='[-a | --interactive] [-s] [-v] [--no-verify] [-m <message> | -F <logfile> | (-C|-c) <commit> | --amend] [-u] [-e] [--author <author>] [--template <file>] [[-i | -o] <path>...]'
|
||||
SUBDIRECTORY_OK=Yes
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
|
||||
|
@ -92,6 +92,7 @@ USAGE="[--env-filter <command>] [--tree-filter <command>] \
|
||||
[--original <namespace>] [-d <directory>] [-f | --force] \
|
||||
[<rev-list options>...]"
|
||||
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
|
||||
git diff-files --quiet &&
|
||||
|
@ -2,9 +2,21 @@
|
||||
#
|
||||
# Copyright (c) 2006 Eric Wong
|
||||
#
|
||||
USAGE='[--start] [--stop] [--restart]
|
||||
[--local] [--httpd=<httpd>] [--port=<port>] [--browser=<browser>]
|
||||
[--module-path=<path> (for Apache2 only)]'
|
||||
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_SPEC="\
|
||||
git-instaweb [options] (--start | --stop | --restart)
|
||||
--
|
||||
l,local only bind on 127.0.0.1
|
||||
p,port= the port to bind to
|
||||
d,httpd= the command to launch
|
||||
b,browser= the browser to launch
|
||||
m,module-path= the module path (only needed for apache2)
|
||||
Action
|
||||
stop stop the web server
|
||||
start start the web server
|
||||
restart restart the web server
|
||||
"
|
||||
|
||||
. git-sh-setup
|
||||
|
||||
@ -78,52 +90,26 @@ do
|
||||
start_httpd
|
||||
exit 0
|
||||
;;
|
||||
--local|-l)
|
||||
-l|--local)
|
||||
local=true
|
||||
;;
|
||||
-d|--httpd|--httpd=*)
|
||||
case "$#,$1" in
|
||||
*,*=*)
|
||||
httpd=`expr "$1" : '-[^=]*=\(.*\)'` ;;
|
||||
1,*)
|
||||
usage ;;
|
||||
*)
|
||||
httpd="$2"
|
||||
shift ;;
|
||||
esac
|
||||
-d|--httpd)
|
||||
shift
|
||||
httpd="$1"
|
||||
;;
|
||||
-b|--browser|--browser=*)
|
||||
case "$#,$1" in
|
||||
*,*=*)
|
||||
browser=`expr "$1" : '-[^=]*=\(.*\)'` ;;
|
||||
1,*)
|
||||
usage ;;
|
||||
*)
|
||||
browser="$2"
|
||||
shift ;;
|
||||
esac
|
||||
-b|--browser)
|
||||
shift
|
||||
browser="$1"
|
||||
;;
|
||||
-p|--port|--port=*)
|
||||
case "$#,$1" in
|
||||
*,*=*)
|
||||
port=`expr "$1" : '-[^=]*=\(.*\)'` ;;
|
||||
1,*)
|
||||
usage ;;
|
||||
*)
|
||||
port="$2"
|
||||
shift ;;
|
||||
esac
|
||||
-p|--port)
|
||||
shift
|
||||
port="$1"
|
||||
;;
|
||||
-m|--module-path=*|--module-path)
|
||||
case "$#,$1" in
|
||||
*,*=*)
|
||||
module_path=`expr "$1" : '-[^=]*=\(.*\)'` ;;
|
||||
1,*)
|
||||
usage ;;
|
||||
*)
|
||||
module_path="$2"
|
||||
shift ;;
|
||||
esac
|
||||
-m|--module-path)
|
||||
shift
|
||||
module_path="$1"
|
||||
;;
|
||||
--)
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
USAGE=''
|
||||
SUBDIRECTORY_OK='Yes'
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
|
||||
echo "WARNING: '$0' is deprecated in favor of 'git fsck --lost-found'" >&2
|
||||
|
126
git-merge.sh
126
git-merge.sh
@ -3,7 +3,19 @@
|
||||
# Copyright (c) 2005 Junio C Hamano
|
||||
#
|
||||
|
||||
USAGE='[-n] [--summary] [--[no-]commit] [--[no-]squash] [--[no-]ff] [-s <strategy>] [-m=<merge-message>] <commit>+'
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_SPEC="\
|
||||
git-merge [options] <remote>...
|
||||
git-merge [options] <msg> HEAD <remote>
|
||||
--
|
||||
summary show a diffstat at the end of the merge
|
||||
n,no-summary don't show a diffstat at the end of the merge
|
||||
squash create a single commit instead of doing a merge
|
||||
commit perform a commit if the merge sucesses (default)
|
||||
ff allow fast forward (default)
|
||||
s,strategy= merge strategy to use
|
||||
m,message= message to be used for the merge commit (if any)
|
||||
"
|
||||
|
||||
SUBDIRECTORY_OK=Yes
|
||||
. git-sh-setup
|
||||
@ -132,72 +144,47 @@ merge_name () {
|
||||
fi
|
||||
}
|
||||
|
||||
parse_option () {
|
||||
case "$1" in
|
||||
-n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\
|
||||
--no-summa|--no-summar|--no-summary)
|
||||
show_diffstat=false ;;
|
||||
--summary)
|
||||
show_diffstat=t ;;
|
||||
--sq|--squ|--squa|--squas|--squash)
|
||||
allow_fast_forward=t squash=t no_commit=t ;;
|
||||
--no-sq|--no-squ|--no-squa|--no-squas|--no-squash)
|
||||
allow_fast_forward=t squash= no_commit= ;;
|
||||
--c|--co|--com|--comm|--commi|--commit)
|
||||
allow_fast_forward=t squash= no_commit= ;;
|
||||
--no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit)
|
||||
allow_fast_forward=t squash= no_commit=t ;;
|
||||
--ff)
|
||||
allow_fast_forward=t squash= no_commit= ;;
|
||||
--no-ff)
|
||||
allow_fast_forward=false squash= no_commit= ;;
|
||||
-s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\
|
||||
--strateg=*|--strategy=*|\
|
||||
-s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
|
||||
case "$#,$1" in
|
||||
*,*=*)
|
||||
strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
|
||||
1,*)
|
||||
usage ;;
|
||||
*)
|
||||
strategy="$2"
|
||||
shift ;;
|
||||
esac
|
||||
case " $all_strategies " in
|
||||
*" $strategy "*)
|
||||
use_strategies="$use_strategies$strategy " ;;
|
||||
*)
|
||||
die "available strategies are: $all_strategies" ;;
|
||||
esac
|
||||
;;
|
||||
-m=*|--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*)
|
||||
merge_msg=`expr "z$1" : 'z-[^=]*=\(.*\)'`
|
||||
have_message=t
|
||||
;;
|
||||
-m|--m|--me|--mes|--mess|--messa|--messag|--message)
|
||||
shift
|
||||
case "$#" in
|
||||
1) usage ;;
|
||||
esac
|
||||
merge_msg="$1"
|
||||
have_message=t
|
||||
;;
|
||||
-*) usage ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
shift
|
||||
args_left=$#
|
||||
}
|
||||
|
||||
parse_config () {
|
||||
while test $# -gt 0
|
||||
do
|
||||
parse_option "$@" || usage
|
||||
while test $args_left -lt $#
|
||||
do
|
||||
while test $# != 0; do
|
||||
case "$1" in
|
||||
-n|--no-summary)
|
||||
show_diffstat=false ;;
|
||||
--summary)
|
||||
show_diffstat=t ;;
|
||||
--squash)
|
||||
allow_fast_forward=t squash=t no_commit=t ;;
|
||||
--no-squash)
|
||||
allow_fast_forward=t squash= no_commit= ;;
|
||||
--commit)
|
||||
allow_fast_forward=t squash= no_commit= ;;
|
||||
--no-commit)
|
||||
allow_fast_forward=t squash= no_commit=t ;;
|
||||
--ff)
|
||||
allow_fast_forward=t squash= no_commit= ;;
|
||||
--no-ff)
|
||||
allow_fast_forward=false squash= no_commit= ;;
|
||||
-s|--strategy)
|
||||
shift
|
||||
done
|
||||
case " $all_strategies " in
|
||||
*" $1 "*)
|
||||
use_strategies="$use_strategies$1 " ;;
|
||||
*)
|
||||
die "available strategies are: $all_strategies" ;;
|
||||
esac
|
||||
;;
|
||||
-m|--message)
|
||||
shift
|
||||
merge_msg="$1"
|
||||
have_message=t
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
args_left=$#
|
||||
}
|
||||
|
||||
test $# != 0 || usage
|
||||
@ -209,17 +196,12 @@ then
|
||||
mergeopts=$(git config "branch.${branch#refs/heads/}.mergeoptions")
|
||||
if test -n "$mergeopts"
|
||||
then
|
||||
parse_config $mergeopts
|
||||
parse_config $mergeopts --
|
||||
fi
|
||||
fi
|
||||
|
||||
while parse_option "$@"
|
||||
do
|
||||
while test $args_left -lt $#
|
||||
do
|
||||
shift
|
||||
done
|
||||
done
|
||||
parse_config "$@"
|
||||
while test $args_left -lt $#; do shift; done
|
||||
|
||||
if test -z "$show_diffstat"; then
|
||||
test "$(git config --bool merge.diffstat)" = false && show_diffstat=false
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
USAGE='[--tool=tool] [file to merge] ...'
|
||||
SUBDIRECTORY_OK=Yes
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
prefix=$(git rev-parse --show-prefix)
|
||||
|
@ -7,6 +7,7 @@
|
||||
USAGE='[-n | --no-summary] [--[no-]commit] [--[no-]squash] [--[no-]ff] [-s strategy]... [<fetch-options>] <repo> <head>...'
|
||||
LONG_USAGE='Fetch one or more remote refs and merge it/them into the current HEAD.'
|
||||
SUBDIRECTORY_OK=Yes
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
set_reflog_action "pull $*"
|
||||
require_work_tree
|
||||
|
@ -1,5 +1,12 @@
|
||||
#!/bin/sh
|
||||
USAGE='--dry-run --author <author> --patches </path/to/quilt/patch/directory>'
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_SPEC="\
|
||||
git-quiltimport [options]
|
||||
--
|
||||
n,dry-run dry run
|
||||
author= author name and email address for patches without any
|
||||
patches= path to the quilt series and patches
|
||||
"
|
||||
SUBDIRECTORY_ON=Yes
|
||||
. git-sh-setup
|
||||
|
||||
@ -8,39 +15,25 @@ quilt_author=""
|
||||
while test $# != 0
|
||||
do
|
||||
case "$1" in
|
||||
--au=*|--aut=*|--auth=*|--autho=*|--author=*)
|
||||
quilt_author=$(expr "z$1" : 'z-[^=]*\(.*\)')
|
||||
shift
|
||||
;;
|
||||
|
||||
--au|--aut|--auth|--autho|--author)
|
||||
case "$#" in 1) usage ;; esac
|
||||
--author)
|
||||
shift
|
||||
quilt_author="$1"
|
||||
shift
|
||||
;;
|
||||
|
||||
--dry-run)
|
||||
shift
|
||||
-n|--dry-run)
|
||||
dry_run=1
|
||||
;;
|
||||
|
||||
--pa=*|--pat=*|--patc=*|--patch=*|--patche=*|--patches=*)
|
||||
QUILT_PATCHES=$(expr "z$1" : 'z-[^=]*\(.*\)')
|
||||
shift
|
||||
;;
|
||||
|
||||
--pa|--pat|--patc|--patch|--patche|--patches)
|
||||
case "$#" in 1) usage ;; esac
|
||||
--patches)
|
||||
shift
|
||||
QUILT_PATCHES="$1"
|
||||
shift
|
||||
;;
|
||||
|
||||
--)
|
||||
shift
|
||||
break;;
|
||||
*)
|
||||
break
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# Quilt Author
|
||||
|
@ -13,6 +13,7 @@
|
||||
USAGE='(--continue | --abort | --skip | [--preserve-merges] [--verbose]
|
||||
[--onto <branch>] <upstream> [<branch>])'
|
||||
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
|
||||
|
@ -29,6 +29,7 @@ Example: git-rebase master~1 topic
|
||||
'
|
||||
|
||||
SUBDIRECTORY_OK=Yes
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
set_reflog_action rebase
|
||||
require_work_tree
|
||||
|
@ -3,7 +3,22 @@
|
||||
# Copyright (c) 2005 Linus Torvalds
|
||||
#
|
||||
|
||||
USAGE='[-a|-A] [-d] [-f] [-l] [-n] [-q] [--max-pack-size=N] [--window=N] [--window-memory=N] [--depth=N]'
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_SPEC="\
|
||||
git-repack [options]
|
||||
--
|
||||
a pack everything in a single pack
|
||||
A same as -a, and keep unreachable objects too
|
||||
d remove redundant packs, and run git-prune-packed
|
||||
f pass --no-reuse-delta to git-pack-objects
|
||||
q,quiet be quiet
|
||||
l pass --local to git-pack-objects
|
||||
Packing constraints
|
||||
window= size of the window used for delta compression
|
||||
window-memory= same as the above, but limit memory size instead of entries count
|
||||
depth= limits the maximum delta depth
|
||||
max-pack-size= maximum size of each packfile
|
||||
"
|
||||
SUBDIRECTORY_OK='Yes'
|
||||
. git-sh-setup
|
||||
|
||||
@ -20,10 +35,9 @@ do
|
||||
-q) quiet=-q ;;
|
||||
-f) no_reuse=--no-reuse-object ;;
|
||||
-l) local=--local ;;
|
||||
--max-pack-size=*) extra="$extra $1" ;;
|
||||
--window=*) extra="$extra $1" ;;
|
||||
--window-memory=*) extra="$extra $1" ;;
|
||||
--depth=*) extra="$extra $1" ;;
|
||||
--max-pack-size|--window|--window-memory|--depth)
|
||||
extra="$extra $1=$2"; shift ;;
|
||||
--) shift; break;;
|
||||
*) usage ;;
|
||||
esac
|
||||
shift
|
||||
|
@ -8,6 +8,7 @@ USAGE='<commit> <url> [<head>]'
|
||||
LONG_USAGE='Summarizes the changes since <commit> to the standard output,
|
||||
and includes <url> in the message generated.'
|
||||
SUBDIRECTORY_OK='Yes'
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
. git-parse-remote
|
||||
|
||||
|
@ -16,9 +16,40 @@ die() {
|
||||
exit 1
|
||||
}
|
||||
|
||||
usage() {
|
||||
die "Usage: $0 $USAGE"
|
||||
}
|
||||
if test -n "$OPTIONS_SPEC"; then
|
||||
usage() {
|
||||
exec "$0" -h
|
||||
}
|
||||
|
||||
parseopt_extra=
|
||||
[ -n "$OPTIONS_KEEPDASHDASH" ] &&
|
||||
parseopt_extra="--keep-dashdash"
|
||||
|
||||
eval "$(
|
||||
echo "$OPTIONS_SPEC" |
|
||||
git rev-parse --parseopt $parseopt_extra -- "$@" ||
|
||||
echo exit $?
|
||||
)"
|
||||
else
|
||||
usage() {
|
||||
die "Usage: $0 $USAGE"
|
||||
}
|
||||
|
||||
if [ -z "$LONG_USAGE" ]
|
||||
then
|
||||
LONG_USAGE="Usage: $0 $USAGE"
|
||||
else
|
||||
LONG_USAGE="Usage: $0 $USAGE
|
||||
|
||||
$LONG_USAGE"
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
-h|--h|--he|--hel|--help)
|
||||
echo "$LONG_USAGE"
|
||||
exit
|
||||
esac
|
||||
fi
|
||||
|
||||
set_reflog_action() {
|
||||
if [ -z "${GIT_REFLOG_ACTION:+set}" ]
|
||||
@ -91,21 +122,6 @@ get_author_ident_from_commit () {
|
||||
LANG=C LC_ALL=C sed -ne "$pick_author_script"
|
||||
}
|
||||
|
||||
if [ -z "$LONG_USAGE" ]
|
||||
then
|
||||
LONG_USAGE="Usage: $0 $USAGE"
|
||||
else
|
||||
LONG_USAGE="Usage: $0 $USAGE
|
||||
|
||||
$LONG_USAGE"
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
-h|--h|--he|--hel|--help)
|
||||
echo "$LONG_USAGE"
|
||||
exit
|
||||
esac
|
||||
|
||||
# Make sure we are in a valid repository of a vintage we understand.
|
||||
if [ -z "$SUBDIRECTORY_OK" ]
|
||||
then
|
||||
|
@ -4,6 +4,7 @@
|
||||
USAGE='[ | list | show | apply | clear]'
|
||||
|
||||
SUBDIRECTORY_OK=Yes
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
cd_to_toplevel
|
||||
|
@ -5,6 +5,7 @@
|
||||
# Copyright (c) 2007 Lars Hjemli
|
||||
|
||||
USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]'
|
||||
OPTIONS_SPEC=
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
|
||||
|
2
git.c
2
git.c
@ -338,7 +338,7 @@ static void handle_internal_command(int argc, const char **argv)
|
||||
{ "rerere", cmd_rerere, RUN_SETUP },
|
||||
{ "reset", cmd_reset, RUN_SETUP },
|
||||
{ "rev-list", cmd_rev_list, RUN_SETUP },
|
||||
{ "rev-parse", cmd_rev_parse, RUN_SETUP },
|
||||
{ "rev-parse", cmd_rev_parse },
|
||||
{ "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
|
||||
{ "rm", cmd_rm, RUN_SETUP },
|
||||
{ "runstatus", cmd_runstatus, RUN_SETUP | NEED_WORK_TREE },
|
||||
|
Loading…
Reference in New Issue
Block a user