Browse Source

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.
maint
Junio C Hamano 17 years ago
parent
commit
9f4c4eb0e1
  1. 76
      Documentation/git-rev-parse.txt
  2. 128
      builtin-rev-parse.c
  3. 94
      git-am.sh
  4. 1
      git-bisect.sh
  5. 99
      git-checkout.sh
  6. 36
      git-clean.sh
  7. 101
      git-clone.sh
  8. 1
      git-commit.sh
  9. 1
      git-filter-branch.sh
  10. 74
      git-instaweb.sh
  11. 1
      git-lost-found.sh
  12. 126
      git-merge.sh
  13. 1
      git-mergetool.sh
  14. 1
      git-pull.sh
  15. 39
      git-quiltimport.sh
  16. 1
      git-rebase--interactive.sh
  17. 1
      git-rebase.sh
  18. 24
      git-repack.sh
  19. 1
      git-request-pull.sh
  20. 52
      git-sh-setup.sh
  21. 1
      git-stash.sh
  22. 1
      git-submodule.sh
  23. 2
      git.c

76
Documentation/git-rev-parse.txt

@ -23,6 +23,13 @@ distinguish between them. @@ -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: @@ -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
--------------

128
builtin-rev-parse.c

@ -8,6 +8,7 @@ @@ -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) @@ -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

@ -2,11 +2,26 @@ @@ -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= @@ -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

1
git-bisect.sh

@ -22,6 +22,7 @@ git bisect log @@ -22,6 +22,7 @@ git bisect log
git bisect run <cmd>...
use <cmd>... to automatically bisect.'

OPTIONS_SPEC=
. git-sh-setup
require_work_tree


99
git-checkout.sh

@ -1,6 +1,16 @@ @@ -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= @@ -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 @@ -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?" @@ -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 @@ -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

@ -3,16 +3,22 @@ @@ -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 @@ -56,11 +62,9 @@ do
shift
break
;;
-*)
usage
;;
*)
break
usage # should not happen
;;
esac
shift
done
@ -77,9 +81,9 @@ case "$disabled" in @@ -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

@ -8,15 +8,36 @@ @@ -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= @@ -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


1
git-commit.sh

@ -5,6 +5,7 @@ @@ -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


1
git-filter-branch.sh

@ -92,6 +92,7 @@ USAGE="[--env-filter <command>] [--tree-filter <command>] \ @@ -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 &&

74
git-instaweb.sh

@ -2,9 +2,21 @@ @@ -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 @@ -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)
shift
browser="$1"
;;
-b|--browser|--browser=*)
case "$#,$1" in
*,*=*)
browser=`expr "$1" : '-[^=]*=\(.*\)'` ;;
1,*)
usage ;;
*)
browser="$2"
shift ;;
esac
-p|--port)
shift
port="$1"
;;
-p|--port|--port=*)
case "$#,$1" in
*,*=*)
port=`expr "$1" : '-[^=]*=\(.*\)'` ;;
1,*)
usage ;;
*)
port="$2"
shift ;;
esac
-m|--module-path)
shift
module_path="$1"
;;
-m|--module-path=*|--module-path)
case "$#,$1" in
*,*=*)
module_path=`expr "$1" : '-[^=]*=\(.*\)'` ;;
1,*)
usage ;;
*)
module_path="$2"
shift ;;
esac
--)
;;
*)
usage

1
git-lost-found.sh

@ -2,6 +2,7 @@ @@ -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

@ -3,7 +3,19 @@ @@ -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 () { @@ -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
case " $all_strategies " in
*" $1 "*)
use_strategies="$use_strategies$1 " ;;
*)
die "available strategies are: $all_strategies" ;;
esac
;;
-m|--message)
shift
done
merge_msg="$1"
have_message=t
;;
--)
shift
break ;;
*) usage ;;
esac
shift
done
args_left=$#
}

test $# != 0 || usage
@ -209,17 +196,12 @@ then @@ -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

1
git-mergetool.sh

@ -10,6 +10,7 @@ @@ -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)

1
git-pull.sh

@ -7,6 +7,7 @@ @@ -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

39
git-quiltimport.sh

@ -1,5 +1,12 @@ @@ -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="" @@ -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

1
git-rebase--interactive.sh

@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
USAGE='(--continue | --abort | --skip | [--preserve-merges] [--verbose]
[--onto <branch>] <upstream> [<branch>])'

OPTIONS_SPEC=
. git-sh-setup
require_work_tree


1
git-rebase.sh

@ -29,6 +29,7 @@ Example: git-rebase master~1 topic @@ -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

24
git-repack.sh

@ -3,7 +3,22 @@ @@ -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 @@ -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

1
git-request-pull.sh

@ -8,6 +8,7 @@ USAGE='<commit> <url> [<head>]' @@ -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


52
git-sh-setup.sh

@ -16,9 +16,40 @@ die() { @@ -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 () { @@ -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

1
git-stash.sh

@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
USAGE='[ | list | show | apply | clear]'

SUBDIRECTORY_OK=Yes
OPTIONS_SPEC=
. git-sh-setup
require_work_tree
cd_to_toplevel

1
git-submodule.sh

@ -5,6 +5,7 @@ @@ -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

@ -338,7 +338,7 @@ static void handle_internal_command(int argc, const char **argv) @@ -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…
Cancel
Save