Merge branch 'mz/rebase'
authorJunio C Hamano <gitster@pobox.com>
Thu, 28 Apr 2011 21:11:39 +0000 (14:11 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 28 Apr 2011 21:11:39 +0000 (14:11 -0700)
* mz/rebase: (34 commits)
rebase: define options in OPTIONS_SPEC
Makefile: do not install sourced rebase scripts
rebase: use @{upstream} if no upstream specified
rebase -i: remove unnecessary state rebase-root
rebase -i: don't read unused variable preserve_merges
git-rebase--am: remove unnecessary --3way option
rebase -m: don't print exit code 2 when merge fails
rebase -m: remember allow_rerere_autoupdate option
rebase: remember strategy and strategy options
rebase: remember verbose option
rebase: extract code for writing basic state
rebase: factor out sub command handling
rebase: make -v a tiny bit more verbose
rebase -i: align variable names
rebase: show consistent conflict resolution hint
rebase: extract am code to new source file
rebase: extract merge code to new source file
rebase: remove $branch as synonym for $orig_head
rebase -i: support --stat
rebase: factor out call to pre-rebase hook
...

1  2 
.gitignore
Documentation/config.txt
Documentation/git-rebase.txt
Makefile
git-parse-remote.sh
git-pull.sh
diff --combined .gitignore
index 2cf3ca5808b51be3921a0f25b5871f806ce447e1,7aaf5c7383bd421131d72b0371dad52176ada66e..711fce7e08beea95d1870047452131e3bf5278dd
@@@ -43,6 -43,7 +43,6 @@@
  /git-fast-export
  /git-fast-import
  /git-fetch
 -/git-fetch--tool
  /git-fetch-pack
  /git-filter-branch
  /git-fmt-merge-msg
  /git-quiltimport
  /git-read-tree
  /git-rebase
+ /git-rebase--am
  /git-rebase--interactive
+ /git-rebase--merge
  /git-receive-pack
  /git-reflog
  /git-relink
  /git-remote
 -/git-remote-curl
  /git-remote-http
  /git-remote-https
  /git-remote-ftp
  /test-index-version
  /test-line-buffer
  /test-match-trees
 +/test-mktemp
  /test-obj-pool
  /test-parse-options
  /test-path-utils
diff --combined Documentation/config.txt
index ce17805509801d812511418a026e4733c05a8968,b4e65b8151bb7dc8c3e9c5e75c75256ad540c2b9..480dd0a8617ced1f7bf24cda0bf23b7fc2c6c4f3
@@@ -62,7 -62,7 +62,7 @@@ Internal whitespace within a variable v
  
  The values following the equals sign in variable assign are all either
  a string, an integer, or a boolean.  Boolean values may be given as yes/no,
 -0/1, true/false or on/off.  Case is not significant in boolean values, when
 +1/0, true/false or on/off.  Case is not significant in boolean values, when
  converting value to the canonical form using '--bool' type specifier;
  'git config' will ensure that the output is "true" or "false".
  
@@@ -320,7 -320,7 +320,7 @@@ core.worktree:
        Set the path to the root of the working tree.
        This can be overridden by the GIT_WORK_TREE environment
        variable and the '--work-tree' command line option.
 -      The value can an absolute path or relative to the path to
 +      The value can be an absolute path or relative to the path to
        the .git directory, which is either specified by --git-dir
        or GIT_DIR, or automatically discovered.
        If --git-dir or GIT_DIR is specified but none of
@@@ -376,6 -376,15 +376,6 @@@ core.warnAmbiguousRefs:
        If true, git will warn you if the ref name you passed it is ambiguous
        and might match multiple refs in the .git/refs/ tree. True by default.
  
 -core.abbrevguard::
 -      Even though git makes sure that it uses enough hexdigits to show
 -      an abbreviated object name unambiguously, as more objects are
 -      added to the repository over time, a short name that used to be
 -      unique will stop being unique.  Git uses this many extra hexdigits
 -      that are more than necessary to make the object name currently
 -      unique, in the hope that its output will stay unique a bit longer.
 -      Defaults to 0.
 -
  core.compression::
        An integer -1..9, indicating a default compression level.
        -1 is the zlib default. 0 means no compression,
@@@ -442,6 -451,8 +442,6 @@@ for most projects as source code and ot
  be delta compressed, but larger binary media files won't be.
  +
  Common unit suffixes of 'k', 'm', or 'g' are supported.
 -+
 -Currently only linkgit:git-fast-import[1] honors this setting.
  
  core.excludesfile::
        In addition to '.gitignore' (per-directory) and
@@@ -556,12 -567,6 +556,12 @@@ core.sparseCheckout:
        Enable "sparse checkout" feature. See section "Sparse checkout" in
        linkgit:git-read-tree[1] for more information.
  
 +core.abbrev::
 +      Set the length object names are abbreviated to.  If unspecified,
 +      many commands abbreviate to 7 hexdigits, which may not be enough
 +      for abbreviated object names to stay unique for sufficiently long
 +      time.
 +
  add.ignore-errors::
  add.ignoreErrors::
        Tells 'git add' to continue adding files when some files cannot be
@@@ -641,7 -646,7 +641,7 @@@ branch.<name>.remote:
  
  branch.<name>.merge::
        Defines, together with branch.<name>.remote, the upstream branch
-       for the given branch. It tells 'git fetch'/'git pull' which
+       for the given branch. It tells 'git fetch'/'git pull'/'git rebase' which
        branch to merge and can also affect 'git push' (see push.default).
        When in branch <name>, it tells 'git fetch' the default
        refspec to be marked for merging in FETCH_HEAD. The value is
@@@ -810,7 -815,68 +810,7 @@@ commit.template:
        "{tilde}/" is expanded to the value of `$HOME` and "{tilde}user/" to the
        specified user's home directory.
  
 -diff.autorefreshindex::
 -      When using 'git diff' to compare with work tree
 -      files, do not consider stat-only change as changed.
 -      Instead, silently run `git update-index --refresh` to
 -      update the cached stat information for paths whose
 -      contents in the work tree match the contents in the
 -      index.  This option defaults to true.  Note that this
 -      affects only 'git diff' Porcelain, and not lower level
 -      'diff' commands such as 'git diff-files'.
 -
 -diff.external::
 -      If this config variable is set, diff generation is not
 -      performed using the internal diff machinery, but using the
 -      given command.  Can be overridden with the `GIT_EXTERNAL_DIFF'
 -      environment variable.  The command is called with parameters
 -      as described under "git Diffs" in linkgit:git[1].  Note: if
 -      you want to use an external diff program only on a subset of
 -      your files, you might want to use linkgit:gitattributes[5] instead.
 -
 -diff.mnemonicprefix::
 -      If set, 'git diff' uses a prefix pair that is different from the
 -      standard "a/" and "b/" depending on what is being compared.  When
 -      this configuration is in effect, reverse diff output also swaps
 -      the order of the prefixes:
 -`git diff`;;
 -      compares the (i)ndex and the (w)ork tree;
 -`git diff HEAD`;;
 -       compares a (c)ommit and the (w)ork tree;
 -`git diff --cached`;;
 -      compares a (c)ommit and the (i)ndex;
 -`git diff HEAD:file1 file2`;;
 -      compares an (o)bject and a (w)ork tree entity;
 -`git diff --no-index a b`;;
 -      compares two non-git things (1) and (2).
 -
 -diff.noprefix::
 -      If set, 'git diff' does not show any source or destination prefix.
 -
 -diff.renameLimit::
 -      The number of files to consider when performing the copy/rename
 -      detection; equivalent to the 'git diff' option '-l'.
 -
 -diff.renames::
 -      Tells git to detect renames.  If set to any boolean value, it
 -      will enable basic rename detection.  If set to "copies" or
 -      "copy", it will detect copies, as well.
 -
 -diff.ignoreSubmodules::
 -      Sets the default value of --ignore-submodules. Note that this
 -      affects only 'git diff' Porcelain, and not lower level 'diff'
 -      commands such as 'git diff-files'. 'git checkout' also honors
 -      this setting when reporting uncommitted changes.
 -
 -diff.suppressBlankEmpty::
 -      A boolean to inhibit the standard behavior of printing a space
 -      before each empty output line. Defaults to false.
 -
 -diff.tool::
 -      Controls which diff tool is used.  `diff.tool` overrides
 -      `merge.tool` when used by linkgit:git-difftool[1] and has
 -      the same valid values as `merge.tool` minus "tortoisemerge"
 -      and plus "kompare".
 +include::diff-config.txt[]
  
  difftool.<tool>.path::
        Override the path for the given tool.  This is useful in case
@@@ -834,13 -900,9 +834,13 @@@ diff.wordRegex:
        characters are *ignorable* whitespace.
  
  fetch.recurseSubmodules::
 -      A boolean value which changes the behavior for fetch and pull, the
 -      default is to not recursively fetch populated submodules unless
 -      configured otherwise.
 +      This option can be either set to a boolean value or to 'on-demand'.
 +      Setting it to a boolean changes the behavior of fetch and pull to
 +      unconditionally recurse into submodules when set to true or to not
 +      recurse at all when set to false. When set to 'on-demand' (the default
 +      value), fetch and pull will only recurse into a populated submodule
 +      when its superproject retrieves a commit that updates the submodule's
 +      reference.
  
  fetch.unpackLimit::
        If the number of objects fetched over the git native
@@@ -914,16 -976,6 +914,16 @@@ format.signoff:
      the rights to submit this work under the same open source license.
      Please see the 'SubmittingPatches' document for further discussion.
  
 +filter.<driver>.clean::
 +      The command which is used to convert the content of a worktree
 +      file to a blob upon checkin.  See linkgit:gitattributes[5] for
 +      details.
 +
 +filter.<driver>.smudge::
 +      The command which is used to convert the content of a blob
 +      object to a worktree file upon checkout.  See
 +      linkgit:gitattributes[5] for details.
 +
  gc.aggressiveWindow::
        The window size parameter used in the delta compression
        algorithm used by 'git gc --aggressive'.  This defaults
@@@ -1049,12 -1101,6 +1049,12 @@@ All gitcvs variables except for 'gitcvs
  is one of "ext" and "pserver") to make them apply only for the given
  access method.
  
 +grep.lineNumber::
 +      If set to true, enable '-n' option by default.
 +
 +grep.extendedRegexp::
 +      If set to true, enable '--extended-regexp' option by default.
 +
  gui.commitmsgwidth::
        Defines how wide the commit message window is in the
        linkgit:git-gui[1]. "75" is the default.
@@@ -1545,8 -1591,7 +1545,8 @@@ push.default:
  * `matching` - push all matching branches.
    All branches having the same name in both ends are considered to be
    matching. This is the default.
 -* `tracking` - push the current branch to its upstream branch.
 +* `upstream` - push the current branch to its upstream branch.
 +* `tracking` - deprecated synonym for `upstream`.
  * `current` - push the current branch to a branch of the same name.
  
  rebase.stat::
@@@ -1774,7 -1819,7 +1774,7 @@@ submodule.<name>.update:
        linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
  
  submodule.<name>.fetchRecurseSubmodules::
 -      This option can be used to enable/disable recursive fetching of this
 +      This option can be used to control recursive fetching of this
        submodule. It can be overridden by using the --[no-]recurse-submodules
        command line option to "git fetch" and "git pull".
        This setting will override that from in the linkgit:gitmodules[5]
index 620d50e71f1a04f587079180ff2d987521d38786,d3e998df46eadfacc3a959f58baa80f85154a0a4..9a075bc4d24d59c7b585e204e6feb50326c762f3
@@@ -9,7 -9,7 +9,7 @@@ SYNOPSI
  --------
  [verse]
  'git rebase' [-i | --interactive] [options] [--onto <newbase>]
-       <upstream> [<branch>]
+       [<upstream>] [<branch>]
  'git rebase' [-i | --interactive] [options] --onto <newbase>
        --root [<branch>]
  
@@@ -21,6 -21,12 +21,12 @@@ If <branch> is specified, 'git rebase' 
  `git checkout <branch>` before doing anything else.  Otherwise
  it remains on the current branch.
  
+ If <upstream> is not specified, the upstream configured in
+ branch.<name>.remote and branch.<name>.merge options will be used; see
+ linkgit:git-config[1] for details.  If you are currently not on any
+ branch or if the current branch does not have a configured upstream,
+ the rebase will abort.
  All changes made by commits in the current branch but that are not
  in <upstream> are saved to a temporary area.  This is the same set
  of commits that would be shown by `git log <upstream>..HEAD` (or
@@@ -66,9 -72,8 +72,9 @@@ would be
      D---E---F---G master
  ------------
  
 -The latter form is just a short-hand of `git checkout topic`
 -followed by `git rebase master`.
 +*NOTE:* The latter form is just a short-hand of `git checkout topic`
 +followed by `git rebase master`. When rebase exits `topic` will
 +remain the checked-out branch.
  
  If the upstream branch already contains a change you have made (e.g.,
  because you mailed a patch which was applied upstream), then that commit
@@@ -217,7 -222,8 +223,8 @@@ leave out at most one of A and B, in wh
  
  <upstream>::
        Upstream branch to compare against.  May be any valid commit,
-       not just an existing branch name.
+       not just an existing branch name. Defaults to the configured
+       upstream for the current branch.
  
  <branch>::
        Working branch; defaults to HEAD.
@@@ -659,6 -665,7 +666,6 @@@ The ripple effect of a "hard case" reco
  'everyone' downstream from 'topic' will now have to perform a "hard
  case" recovery too!
  
 -
  BUGS
  ----
  The todo list presented by `--preserve-merges --interactive` does not
@@@ -681,6 -688,15 +688,6 @@@ by moving the "pick 4" line will resul
  1 --- 2 --- 4 --- 5
  ------------
  
 -Authors
 -------
 -Written by Junio C Hamano <gitster@pobox.com> and
 -Johannes E. Schindelin <johannes.schindelin@gmx.de>
 -
 -Documentation
 ---------------
 -Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
 -
  GIT
  ---
  Part of the linkgit:git[1] suite
diff --combined Makefile
index c7c1530b896e837b0755f8ced2c5593ed2d5a02f,acde60aaba06af7196a0c3c897800188ffe4800f..3a1fe20ff2219efc778d1d7c415c2ca9e8263ccd
+++ b/Makefile
@@@ -45,6 -45,11 +45,6 @@@ all:
  # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
  # d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
  #
 -# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
 -# do not support the 'size specifiers' introduced by C99, namely ll, hh,
 -# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
 -# some C compilers supported these specifiers prior to C99 as an extension.
 -#
  # Define NO_STRCASESTR if you don't have strcasestr.
  #
  # Define NO_MEMMEM if you don't have memmem.
  #
  # Define NO_REGEX if you have no or inferior regex support in your C library.
  #
 +# Define GETTEXT_POISON if you are debugging the choice of strings marked
 +# for translation.  In a GETTEXT_POISON build, you can turn all strings marked
 +# for translation into gibberish by setting the GIT_GETTEXT_POISON variable
 +# (to any value) in your environment.
 +#
  # Define JSMIN to point to JavaScript minifier that functions as
  # a filter to have gitweb.js minified.
  #
@@@ -316,14 -316,15 +316,14 @@@ INSTALL = instal
  RPMBUILD = rpmbuild
  TCL_PATH = tclsh
  TCLTK_PATH = wish
 +XGETTEXT = xgettext
  PTHREAD_LIBS = -lpthread
  PTHREAD_CFLAGS =
  GCOV = gcov
  
  export TCL_PATH TCLTK_PATH
  
 -# sparse is architecture-neutral, which means that we need to tell it
 -# explicitly what architecture to check for. Fix this up for yours..
 -SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
 +SPARSE_FLAGS =
  
  
  
@@@ -368,7 -369,6 +368,6 @@@ SCRIPT_SH += git-merge-resolve.s
  SCRIPT_SH += git-mergetool.sh
  SCRIPT_SH += git-pull.sh
  SCRIPT_SH += git-quiltimport.sh
- SCRIPT_SH += git-rebase--interactive.sh
  SCRIPT_SH += git-rebase.sh
  SCRIPT_SH += git-repack.sh
  SCRIPT_SH += git-request-pull.sh
@@@ -378,6 -378,9 +377,9 @@@ SCRIPT_SH += git-web--browse.s
  
  SCRIPT_LIB += git-mergetool--lib
  SCRIPT_LIB += git-parse-remote
+ SCRIPT_LIB += git-rebase--am
+ SCRIPT_LIB += git-rebase--interactive
+ SCRIPT_LIB += git-rebase--merge
  SCRIPT_LIB += git-sh-setup
  
  SCRIPT_PERL += git-add--interactive.perl
@@@ -514,7 -517,6 +516,7 @@@ LIB_H += diff.
  LIB_H += dir.h
  LIB_H += exec_cmd.h
  LIB_H += fsck.h
 +LIB_H += gettext.h
  LIB_H += git-compat-util.h
  LIB_H += graph.h
  LIB_H += grep.h
@@@ -525,7 -527,6 +527,7 @@@ LIB_H += list-objects.
  LIB_H += ll-merge.h
  LIB_H += log-tree.h
  LIB_H += mailmap.h
 +LIB_H += merge-file.h
  LIB_H += merge-recursive.h
  LIB_H += notes.h
  LIB_H += notes-cache.h
@@@ -872,6 -873,7 +874,6 @@@ ifeq ($(uname_S),SunOS
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
                NO_STRLCPY = YesPlease
 -              NO_C99_FORMAT = YesPlease
                NO_STRTOUMAX = YesPlease
                GIT_TEST_CMP = cmp
        endif
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
                NO_STRLCPY = YesPlease
 -              NO_C99_FORMAT = YesPlease
                NO_STRTOUMAX = YesPlease
                GIT_TEST_CMP = cmp
        endif
        ifeq ($(uname_R),5.8)
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
 -              NO_C99_FORMAT = YesPlease
                NO_STRTOUMAX = YesPlease
                GIT_TEST_CMP = cmp
        endif
        ifeq ($(uname_R),5.9)
                NO_UNSETENV = YesPlease
                NO_SETENV = YesPlease
 -              NO_C99_FORMAT = YesPlease
                NO_STRTOUMAX = YesPlease
                GIT_TEST_CMP = cmp
        endif
@@@ -923,7 -928,6 +925,7 @@@ ifeq ($(uname_O),Cygwin
        X = .exe
        COMPAT_OBJS += compat/cygwin.o
        UNRELIABLE_FSTAT = UnfortunatelyYes
 +      SPARSE_FLAGS = -isystem /usr/include/w32api -Wno-one-bit-signed-bitfield
  endif
  ifeq ($(uname_S),FreeBSD)
        NEEDS_LIBICONV = YesPlease
@@@ -1040,7 -1044,6 +1042,7 @@@ ifeq ($(uname_S),HP-UX
        NO_UNSETENV = YesPlease
        NO_HSTRERROR = YesPlease
        NO_SYS_SELECT_H = YesPlease
 +      NO_FNMATCH_CASEFOLD = YesPlease
        SNPRINTF_RETURNS_BOGUS = YesPlease
        NO_NSEC = YesPlease
        ifeq ($(uname_R),B.11.00)
@@@ -1074,6 -1077,7 +1076,6 @@@ ifeq ($(uname_S),Windows
        NO_MEMMEM = YesPlease
        # NEEDS_LIBICONV = YesPlease
        NO_ICONV = YesPlease
 -      NO_C99_FORMAT = YesPlease
        NO_STRTOUMAX = YesPlease
        NO_STRTOULL = YesPlease
        NO_MKDTEMP = YesPlease
@@@ -1150,6 -1154,7 +1152,6 @@@ ifneq (,$(findstring MINGW,$(uname_S))
        NO_MEMMEM = YesPlease
        NEEDS_LIBICONV = YesPlease
        OLD_ICONV = YesPlease
 -      NO_C99_FORMAT = YesPlease
        NO_STRTOUMAX = YesPlease
        NO_MKDTEMP = YesPlease
        NO_MKSTEMPS = YesPlease
        EXTLIBS += -lws2_32
        PTHREAD_LIBS =
        X = .exe
 +      SPARSE_FLAGS = -Wno-one-bit-signed-bitfield
  ifneq (,$(wildcard ../THIS_IS_MSYSGIT))
        htmldir=doc/git/html/
        prefix =
@@@ -1353,6 -1357,9 +1355,6 @@@ endi
  ifdef NO_NSEC
        BASIC_CFLAGS += -DNO_NSEC
  endif
 -ifdef NO_C99_FORMAT
 -      BASIC_CFLAGS += -DNO_C99_FORMAT
 -endif
  ifdef SNPRINTF_RETURNS_BOGUS
        COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS
        COMPAT_OBJS += compat/snprintf.o
@@@ -1364,10 -1371,6 +1366,10 @@@ endi
  ifdef NO_SYMLINK_HEAD
        BASIC_CFLAGS += -DNO_SYMLINK_HEAD
  endif
 +ifdef GETTEXT_POISON
 +      LIB_OBJS += gettext.o
 +      BASIC_CFLAGS += -DGETTEXT_POISON
 +endif
  ifdef NO_STRCASESTR
        COMPAT_CFLAGS += -DNO_STRCASESTR
        COMPAT_OBJS += compat/strcasestr.o
@@@ -1579,9 -1582,7 +1581,9 @@@ ifndef 
        QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
        QUIET_GEN      = @echo '   ' GEN $@;
        QUIET_LNCP     = @echo '   ' LN/CP $@;
 +      QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
        QUIET_GCOV     = @echo '   ' GCOV $@;
 +      QUIET_SP       = @echo '   ' SP $<;
        QUIET_SUBDIR0  = +@subdir=
        QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
                         $(MAKE) $(PRINT_DIR) -C $$subdir
@@@ -1677,17 -1678,17 +1679,17 @@@ strip: $(PROGRAMS) git$
        $(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X
  
  git.o: common-cmds.h
 -git.s git.o: EXTRA_CPPFLAGS = -DGIT_VERSION='"$(GIT_VERSION)"' \
 +git.sp git.s git.o: EXTRA_CPPFLAGS = -DGIT_VERSION='"$(GIT_VERSION)"' \
        '-DGIT_HTML_PATH="$(htmldir_SQ)"'
  
  git$X: git.o $(BUILTIN_OBJS) $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
                $(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
  
 -help.o: common-cmds.h
 +help.sp help.o: common-cmds.h
  
 -builtin/help.o: common-cmds.h
 -builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
 +builtin/help.sp builtin/help.o: common-cmds.h
 +builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
        '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
        '-DGIT_MAN_PATH="$(mandir_SQ)"' \
        '-DGIT_INFO_PATH="$(infodir_SQ)"'
@@@ -1973,34 -1974,30 +1975,34 @@@ $(VCSSVN_OBJS) $(VCSSVN_TEST_OBJS): $(L
  test-svn-fe.o: vcs-svn/svndump.h
  endif
  
 -exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
 +exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
        '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
        '-DBINDIR="$(bindir_relative_SQ)"' \
        '-DPREFIX="$(prefix_SQ)"'
  
 -builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
 +builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
        -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
  
 -config.s config.o: EXTRA_CPPFLAGS = -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
 +config.sp config.s config.o: EXTRA_CPPFLAGS = \
 +      -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
  
 -attr.s attr.o: EXTRA_CPPFLAGS = -DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
 +attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
 +      -DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
  
 -http.s http.o: EXTRA_CPPFLAGS = -DGIT_HTTP_USER_AGENT='"git/$(GIT_VERSION)"'
 +http.sp http.s http.o: EXTRA_CPPFLAGS = \
 +      -DGIT_HTTP_USER_AGENT='"git/$(GIT_VERSION)"'
  
  ifdef NO_EXPAT
 -http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
 +http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
  endif
  
  ifdef NO_REGEX
 -compat/regex/regex.o: EXTRA_CPPFLAGS = -DGAWK -DNO_MBSUPPORT
 +compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
 +      -DGAWK -DNO_MBSUPPORT
  endif
  
  ifdef USE_NED_ALLOCATOR
 -compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
 +compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
        -DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR
  endif
  
@@@ -2052,21 -2049,6 +2054,21 @@@ info
  pdf:
        $(MAKE) -C Documentation pdf
  
 +XGETTEXT_FLAGS = \
 +      --force-po \
 +      --add-comments \
 +      --msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
 +      --from-code=UTF-8
 +XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 +      --keyword=_ --keyword=N_ --keyword="Q_:1,2"
 +LOCALIZED_C := $(C_OBJ:o=c)
 +
 +po/git.pot: $(LOCALIZED_C)
 +      $(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C) && \
 +      mv $@+ $@
 +
 +pot: po/git.pot
 +
  $(ETAGS_TARGET): FORCE
        $(RM) $(ETAGS_TARGET)
        $(FIND) . -name '*.[hcS]' -print | xargs etags -a -o $(ETAGS_TARGET)
@@@ -2108,7 -2090,6 +2110,7 @@@ endi
  ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
        @echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@
  endif
 +      @echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@
  
  ### Detect Tck/Tk interpreter path changes
  ifndef NO_TCLTK
@@@ -2166,20 -2147,13 +2168,20 @@@ test-%$X: test-%.o $(GITLIBS
  check-sha1:: test-sha1$X
        ./test-sha1.sh
  
 +SP_OBJ = $(patsubst %.o,%.sp,$(C_OBJ))
 +
 +$(SP_OBJ): %.sp: %.c GIT-CFLAGS FORCE
 +      $(QUIET_SP)cgcc -no-compile $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) \
 +              $(SPARSE_FLAGS) $<
 +
 +.PHONY: sparse $(SP_OBJ)
 +sparse: $(SP_OBJ)
 +
  check: common-cmds.h
 -      if sparse; \
 +      @if sparse; \
        then \
 -              for i in *.c; \
 -              do \
 -                      sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; \
 -              done; \
 +              echo 2>&1 "Use 'make sparse' instead"; \
 +              $(MAKE) --no-print-directory sparse; \
        else \
                echo 2>&1 "Did you mean 'make test'?"; \
                exit 1; \
@@@ -2341,7 -2315,6 +2343,7 @@@ dist-doc
  
  distclean: clean
        $(RM) configure
 +      $(RM) po/git.pot
  
  clean:
        $(RM) *.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \
diff --combined git-parse-remote.sh
index ea093d251d98af6a3d4df19e900d56df34d51572,be17ecbd1ec87d013c76f1485a9716b1615ee83a..b24119d69c092e3bd345cff1b6bafd48f5fd1e1b
@@@ -4,9 -4,58 +4,9 @@@
  # this would fail in that case and would issue an error message.
  GIT_DIR=$(git rev-parse -q --git-dir) || :;
  
 -get_data_source () {
 -      case "$1" in
 -      */*)
 -              echo ''
 -              ;;
 -      .)
 -              echo self
 -              ;;
 -      *)
 -              if test "$(git config --get "remote.$1.url")"
 -              then
 -                      echo config
 -              elif test -f "$GIT_DIR/remotes/$1"
 -              then
 -                      echo remotes
 -              elif test -f "$GIT_DIR/branches/$1"
 -              then
 -                      echo branches
 -              else
 -                      echo ''
 -              fi ;;
 -      esac
 -}
 -
 -get_remote_url () {
 -      data_source=$(get_data_source "$1")
 -      case "$data_source" in
 -      '')
 -              echo "$1"
 -              ;;
 -      self)
 -              echo "$1"
 -              ;;
 -      config)
 -              git config --get "remote.$1.url"
 -              ;;
 -      remotes)
 -              sed -ne '/^URL: */{
 -                      s///p
 -                      q
 -              }' "$GIT_DIR/remotes/$1"
 -              ;;
 -      branches)
 -              sed -e 's/#.*//' "$GIT_DIR/branches/$1"
 -              ;;
 -      *)
 -              die "internal error: get-remote-url $1" ;;
 -      esac
 -}
 -
  get_default_remote () {
 -      curr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')
 +      curr_branch=$(git symbolic-ref -q HEAD)
 +      curr_branch="${curr_branch#refs/heads/}"
        origin=$(git config --get "branch.$curr_branch.remote")
        echo ${origin:-origin}
  }
@@@ -50,3 -99,41 +50,41 @@@ get_remote_merge_branch () 
            esac
        esac
  }
+ error_on_missing_default_upstream () {
+       cmd="$1"
+       op_type="$2"
+       op_prep="$3"
+       example="$4"
+       branch_name=$(git symbolic-ref -q HEAD)
+       if test -z "$branch_name"
+       then
+               echo "You are not currently on a branch, so I cannot use any
+ 'branch.<branchname>.merge' in your configuration file.
+ Please specify which branch you want to $op_type $op_prep on the command
+ line and try again (e.g. '$example').
+ See git-${cmd}(1) for details."
+       else
+               echo "You asked me to $cmd without telling me which branch you
+ want to $op_type $op_prep, and 'branch.${branch_name#refs/heads/}.merge' in
+ your configuration file does not tell me, either. Please
+ specify which branch you want to use on the command line and
+ try again (e.g. '$example').
+ See git-${cmd}(1) for details.
+ If you often $op_type $op_prep the same branch, you may want to
+ use something like the following in your configuration file:
+     [branch \"${branch_name#refs/heads/}\"]
+     remote = <nickname>
+     merge = <remote-ref>"
+               test rebase = "$op_type" &&
+               echo "    rebase = true"
+               echo "
+     [remote \"<nickname>\"]
+     url = <url>
+     fetch = <refspec>
+ See git-config(1) for details."
+       fi
+       exit 1
+ }
diff --combined git-pull.sh
index 4e9e0e49ecf2532ac8af1bfd46033e68c6f1042d,2cdea2626595dc237f99e215a7150b4648560664..fb9e2df9312e96ecf8ad5ab2bde4b74b979fe02e
@@@ -53,8 -53,6 +53,8 @@@ d
                verbosity="$verbosity -v" ;;
        --progress)
                progress=--progress ;;
 +      --no-progress)
 +              progress=--no-progress ;;
        -n|--no-stat|--no-summary)
                diffstat=--no-stat ;;
        --stat|--summary)
        --recurse-submodules)
                recurse_submodules=--recurse-submodules
                ;;
 +      --recurse-submodules=*)
 +              recurse_submodules="$1"
 +              ;;
        --no-recurse-submodules)
                recurse_submodules=--no-recurse-submodules
                ;;
        --d|--dr|--dry|--dry-|--dry-r|--dry-ru|--dry-run)
                dry_run=--dry-run
                ;;
 -      -h|--h|--he|--hel|--help)
 +      -h|--h|--he|--hel|--help|--help-|--help-a|--help-al|--help-all)
                usage
                ;;
        *)
@@@ -168,34 -163,10 +168,10 @@@ error_on_no_merge_candidates () 
                echo "You asked to pull from the remote '$1', but did not specify"
                echo "a branch. Because this is not the default configured remote"
                echo "for your current branch, you must specify a branch on the command line."
-       elif [ -z "$curr_branch" ]; then
-               echo "You are not currently on a branch, so I cannot use any"
-               echo "'branch.<branchname>.merge' in your configuration file."
-               echo "Please specify which remote branch you want to use on the command"
-               echo "line and try again (e.g. 'git pull <repository> <refspec>')."
-               echo "See git-pull(1) for details."
-       elif [ -z "$upstream" ]; then
-               echo "You asked me to pull without telling me which branch you"
-               echo "want to $op_type $op_prep, and 'branch.${curr_branch}.merge' in"
-               echo "your configuration file does not tell me, either. Please"
-               echo "specify which branch you want to use on the command line and"
-               echo "try again (e.g. 'git pull <repository> <refspec>')."
-               echo "See git-pull(1) for details."
-               echo
-               echo "If you often $op_type $op_prep the same branch, you may want to"
-               echo "use something like the following in your configuration file:"
-               echo
-               echo "    [branch \"${curr_branch}\"]"
-               echo "    remote = <nickname>"
-               echo "    merge = <remote-ref>"
-               test rebase = "$op_type" &&
-                       echo "    rebase = true"
-               echo
-               echo "    [remote \"<nickname>\"]"
-               echo "    url = <url>"
-               echo "    fetch = <refspec>"
-               echo
-               echo "See git-config(1) for details."
+       elif [ -z "$curr_branch" -o -z "$upstream" ]; then
+               . git-parse-remote
+               error_on_missing_default_upstream "pull" $op_type $op_prep \
+                       "git pull <repository> <refspec>"
        else
                echo "Your configuration specifies to $op_type $op_prep the ref '${upstream#refs/heads/}'"
                echo "from the remote, but no such ref was fetched."
@@@ -277,7 -248,7 +253,7 @@@ esa
  if test -z "$orig_head"
  then
        git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
 -      git read-tree --reset -u HEAD || exit 1
 +      git read-tree -m -u HEAD || exit 1
        exit
  fi
  
@@@ -298,8 -269,8 +274,8 @@@ true
        ;;
  *)
        eval="git-merge $diffstat $no_commit $squash $no_ff $ff_only"
 -      eval="$eval  $log_arg $strategy_args $merge_args"
 -      eval="$eval \"\$merge_name\" HEAD $merge_head $verbosity"
 +      eval="$eval  $log_arg $strategy_args $merge_args $verbosity $progress"
 +      eval="$eval \"\$merge_name\" HEAD $merge_head"
        ;;
  esac
  eval "exec $eval"