Commit Graph

60552 Commits

Author SHA1 Message Date
Paul Wagland
d7d4ca87a9 completion: update completion arguments for stash
Add --all and --include-untracked to the git stash save completions.
Add --quiet to the git stash drop completions.
Update git stash branch so that the first argument expands out to the
possible branch names, and the other arguments expand to the stash
names.

Signed-off-by: Paul Wagland <paul@kungfoocoder.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 10:37:11 -08:00
Johannes Schindelin
7dc7e735e6 Merge branch 'js/msys2' into next
Beginning of the upstreaming process of Git for Windows effort.

* js/msys2:
  mingw: uglify (a, 0) definitions to shut up warnings
  mingw: squash another warning about a cast
  mingw: avoid warnings when casting HANDLEs to int
  mingw: avoid redefining S_* constants
  compat/winansi: support compiling with MSys2
  compat/mingw: support MSys2-based MinGW build
  nedmalloc: allow compiling with MSys2's compiler
  config.mak.uname: supporting 64-bit MSys2
  config.mak.uname: support MSys2
2016-01-26 18:38:24 +01:00
Johannes Schindelin
57a44cbe75 mingw: uglify (a, 0) definitions to shut up warnings
When the result of a (a, 0) expression is not used, MSys2's GCC version
finds it necessary to complain with a warning:

	right-hand operand of comma expression has no effect

Let's just pretend to use the 0 value and have a peaceful and quiet life
again.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:23 +01:00
Johannes Schindelin
8e1fe06cd9 mingw: squash another warning about a cast
MSys2's compiler is correct that casting a "void *" to a "DWORD" loses
precision, but in the case of pthread_exit() we know that the value
fits into a DWORD.

Just like casting handles to DWORDs, let's work around this issue by
casting to "intrptr_t" first, and immediately cast to the final type.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:21 +01:00
Johannes Schindelin
f2a16a29ca mingw: avoid warnings when casting HANDLEs to int
HANDLE is defined internally as a void *, but in many cases it is
actually guaranteed to be a 32-bit integer. In these cases, GCC should
not warn about a cast of a pointer to an integer of a different type
because we know exactly what we are doing.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:19 +01:00
Johannes Schindelin
43eccde89f mingw: avoid redefining S_* constants
When compiling with MSys2's compiler, these constants are already defined.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:18 +01:00
Johannes Schindelin
6ba4a5ba67 compat/winansi: support compiling with MSys2
MSys2 already defines the _CONSOLE_FONT_INFOEX structure.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:16 +01:00
Johannes Schindelin
b1299c2692 compat/mingw: support MSys2-based MinGW build
The excellent MSys2 project brings a substantially updated MinGW
environment including newer GCC versions and new headers. To support
compiling Git, let's special-case the new MinGW (tell-tale: the
_MINGW64_VERSION_MAJOR constant is defined).

Note: this commit only addresses compile failures, not compile warnings
(that task is left for a future patch).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:15 +01:00
Johannes Schindelin
542adba47a nedmalloc: allow compiling with MSys2's compiler
With MSys2's GCC, `ReadWriteBarrier` is already defined, and FORCEINLINE
unfortunately gets defined incorrectly.

Let's work around both problems, using the MSys2-specific
__MINGW64_VERSION_MAJOR constant to guard the FORCEINLINE definition so
as not to affect other platforms.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:14 +01:00
Johannes Schindelin
a89f5d918d config.mak.uname: supporting 64-bit MSys2
This just makes things compile, the test suite needs extra tender loving
care in addition to this change. We will address these issues in later
commits.

While at it, also allow building MSys2 Git (i.e. a Git that uses MSys2's
POSIX emulation layer).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:12 +01:00
Johannes Schindelin
c063bf79f6 config.mak.uname: support MSys2
For a long time, Git for Windows lagged behind Git's 2.x releases because
the Git for Windows developers wanted to let that big jump coincide with
a well-needed jump away from MSys to MSys2.

To understand why this is such a big issue, it needs to be noted that
many parts of Git are not written in portable C, but instead Git relies
on a POSIX shell and Perl to be available.

To support the scripts, Git for Windows has to ship a minimal POSIX
emulation layer with Bash and Perl thrown in, and when the Git for
Windows effort started in August 2007, this developer settled on using
MSys, a stripped down version of Cygwin. Consequently, the original name
of the project was "msysGit" (which, sadly, caused a *lot* of confusion
because few Windows users know about MSys, and even less care).

To compile the C code of Git for Windows, MSys was used, too: it sports
two versions of the GNU C Compiler: one that links implicitly to the
POSIX emulation layer, and another one that targets the plain Win32 API
(with a few convenience functions thrown in).  Git for Windows'
executables are built using the latter, and therefore they are really
just Win32 programs. To discern executables requiring the POSIX
emulation layer from the ones that do not, the latter are called MinGW
(Minimal GNU for Windows) when the former are called MSys executables.

This reliance on MSys incurred challenges, too, though: some of our
changes to the MSys runtime -- necessary to support Git for Windows
better -- were not accepted upstream, so we had to maintain our own
fork. Also, the MSys runtime was not developed further to support e.g.
UTF-8 or 64-bit, and apart from lacking a package management system
until much later (when mingw-get was introduced), many packages provided
by the MSys/MinGW project lag behind the respective source code
versions, in particular Bash and OpenSSL. For a while, the Git for
Windows project tried to remedy the situation by trying to build newer
versions of those packages, but the situation quickly became untenable,
especially with problems like the Heartbleed bug requiring swift action
that has nothing to do with developing Git for Windows further.

Happily, in the meantime the MSys2 project (https://msys2.github.io/)
emerged, and was chosen to be the base of the Git for Windows 2.x. Just
like MSys, MSys2 is a stripped down version of Cygwin, but it is
actively kept up-to-date with Cygwin's source code.  Thereby, it already
supports Unicode internally, and it also offers the 64-bit support that
we yearned for since the beginning of the Git for Windows project.

MSys2 also ported the Pacman package management system from Arch Linux
and uses it heavily. This brings the same convenience to which Linux
users are used to from `yum` or `apt-get`, and to which MacOSX users are
used to from Homebrew or MacPorts, or BSD users from the Ports system,
to MSys2: a simple `pacman -Syu` will update all installed packages to
the newest versions currently available.

MSys2 is also *very* active, typically providing package updates
multiple times per week.

It still required a two-month effort to bring everything to a state
where Git's test suite passes, many more months until the first official
Git for Windows 2.x was released, and a couple of patches still await
their submission to the respective upstream projects. Yet without MSys2,
the modernization of Git for Windows would simply not have happened.

This commit lays the ground work to supporting MSys2-based Git builds.

Assisted-by: Waldek Maleska <weakcamel@users.github.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-26 18:38:11 +01:00
Johannes Schindelin
2dad48b02d Start the merging-rebase to v2.7.0
Unlike the most recent merging-bases, the purpose of *this* merging
rebase is to clean up the branch structure a bit, including an early
merge-back of the Git for Windows patches we contributed upstream
in the past weeks. This should make it much easier to prepare the
next batches of patches to beam upstream.

In particular, we drop these commits:

- criss cross rename failure workaround

	It was merged in a different form upstream and we carried
	a bogus patch for a long time

- Special-case the MSYS2_TZ environment variable

	In the meantime, Git for Windows' fork of the MSYS2 runtime
	learned to pass on valid TZ values. So this work-around is
	no longer needed.

- am: Use cat instead of echo to avoid DOS line-endings (fixes t4150)

	`am` became a builtin last year, hence this patch is no longer
	necessary.

- Teach 'git pull' to handle --rebase=interactive
- Handle the branch.<name>.rebase value 'interactive'
- Teach 'git remote' that the config var branch.*.rebase can be 'interactive'

	The --rebase=interactive code we carried in Git for Windows for
	such a long time patched the shell version of `git pull`, but
	in the meantime upstream has a builtin version, so these changes
	were bogus. Even better: this developer ported the changes to
	the builtin `pull` and they were already accepted upstream.

- t9100: don't use symlinks with SVN on MINGW
- t0200: disable more tests with MSys2 that rely on locale.exe
- Skip t0204 for MinGW Git

	Turns out that these are actually no longer needed to pass the
	test suite.

- mingw: do not special-case .exe files anymore

	When submitting the batch of patches that fixes the test
	failures in Git for Windows' SDK, this patch was made obsolete
	by the patch that provided a putty.exe for testing that is
	*actually* a .exe (and no shell script).

- mingw: Prepare the TMP environment variable for shell scripts

	This patch was actually forward-ported to apply *after*
	Karsten's environment refactoring.

- mingw: Fix CVS-related tests
- t7800: configure $(pwd) for posix-paths on MINGW

	These patches were redone using the $PWD variable instead of
	re-overriding `pwd`.

- mingw (MSys1): enable support for perl regular expressions

	msysGit is dead. No need to carry a patch for it anymore.

This commit starts the rebase of abf3368 to fb59a3e

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 18:29:29 +01:00
Johannes Schindelin
8673bdbeeb fixup! mingw (MSys1): enable support for perl regular expressions
It is absolutely unnecessary to carry any msysGit-specific patches
in our fork. msysGit is dead, long live Git for Windows.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:31:36 +01:00
Johannes Schindelin
9e71342d58 fixup! mingw (MSys1): enable support for perl regular expressions
It is absolutely unnecessary to carry any msysGit-specific patches
in our fork. msysGit is dead, long live Git for Windows.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:31:00 +01:00
Johannes Schindelin
1b3740ae32 fixup! t7800: configure $(pwd) for posix-paths on MINGW
We just did this differently, using the $PWD variable.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:15:10 +01:00
Johannes Schindelin
0204f9162e fixup! mingw: Fix CVS-related tests
We did it differently: see "mingw: work around pwd issues in the tests".

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:14:04 +01:00
Johannes Schindelin
25f81cb55c mingw: work around pwd issues in the tests
In Git for Windows' SDK, the tests are run using a Bash that relies on
the POSIX emulation layer MSYS2 (itself a friendly fork of Cygwin). As
such, paths in tests can be POSIX paths. As soon as those paths are
passed to git.exe (which does *not* use the POSIX emulation layer),
those paths are converted into Windows paths, though. This happens
for command-line parameters, but not when reading, say, config variables.

To help with that, the `pwd` command is overridden to return the Windows
path of the current working directory when testing Git on Windows.

However, when talking to anything using the POSIX emulation layer, it is
really much better to use POSIX paths because Windows paths contain a
colon after the drive letter that will easily be mistaken for the common
separator in path lists.

So let's just use the $PWD variable when the POSIX path is needed.

This lets t7800-difftool.sh, t9400-git-cvsserver-server.sh,
t9402-git-cvsserver-refs.sh and t9401-git-cvsserver-crlf.sh pass in Git
for Windows' SDK.

Note: the cvsserver tests require not only the `cvs` package (install
it into Git for Windows' SDK via `pacman -S cvs`) but also the Perl
SQLite bindings (install them into Git for Windows' SDK via
`cpan DBD::SQLite`).

This patch is based on earlier work by 마누엘 and Karsten Blees.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:13:42 +01:00
Johannes Schindelin
f45805d7b7 fixup! mingw: Prepare the TMP environment variable for shell scripts
This change is not actually needed any longer to pass the test suite.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:12:48 +01:00
Johannes Schindelin
6329eaac89 fixup! mingw: Prepare the TMP environment variable for shell scripts
This change is not actually needed any longer to pass the test suite.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:12:47 +01:00
Johannes Schindelin
4f38e72da0 fixup! mingw: do not special-case .exe files anymore
We did it differently, after all, before contributing the patches
upstream that make the test suite pass on Windows (see "mingw: fix
t5601-clone.sh").

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:12:33 +01:00
Johannes Schindelin
c894f09248 mingw: fix t5601-clone.sh
Since baaf233 (connect: improve check for plink to reduce false
positives, 2015-04-26), t5601 writes out a `plink.exe` for testing that
is actually a shell script. So the assumption that the `.exe` extension
implies that the file is *not* a shell script is now wrong.

Since there was no love for the idea of allowing `.exe` files to be
shell scripts on Windows, let's go the other way round: *make*
`plink.exe` a real `.exe`.

This fixes t5601-clone.sh in Git for Windows' SDK.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:12:32 +01:00
Johannes Schindelin
0166dabcdf fixup! Skip t0204 for MinGW Git
It would appear that this patch is unnecessary for the test suite
to pass on Windows.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:06:30 +01:00
Johannes Schindelin
6c8fc0c618 fixup! t0200: disable more tests with MSys2 that rely on locale.exe
When contributing the minimal set of patches to make the test suite
pass on Windows, it turned out that this patch is not at all needed.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:05:28 +01:00
Johannes Schindelin
28368e7474 fixup! t9100: don't use symlinks with SVN on MINGW
Turns out that this patch is not needed at all (this came up when
contributing the third batch of Windows-specific patches to upstream).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:03:14 +01:00
Johannes Schindelin
57aa24a183 fixup! Teach 'git remote' that the config var branch.*.rebase can be 'interactive'
This commit was redone in upstream Git and is therefore obsolete.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:01:35 +01:00
Johannes Schindelin
2ae7e33e0a fixup! Handle the branch.<name>.rebase value 'interactive'
This commit became obsolete when 'pull' became a builtin, and was
redone in a patch series to teach the builtin pull about
--rebase=interactive that has landed in upstream Git already.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:01:34 +01:00
Johannes Schindelin
692cbd4758 fixup! Teach 'git pull' to handle --rebase=interactive
This commit became obsolete when 'pull' became a builtin.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:01:34 +01:00
Johannes Schindelin
fc48cb44e8 fixup! am: Use cat instead of echo to avoid DOS line-endings (fixes t4150)
This is no longer necessary since 'am' is a builtin.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:01:33 +01:00
Johannes Schindelin
68d6667ac1 fixup! mingw: move MSys2 specific environment tweaks to setup_windows_environment
The TZ handling has become obsolete, so let's not refactor it into
setup_windows_environment at all.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 17:00:11 +01:00
Johannes Schindelin
344c09a0b5 fixup! Special-case the MSYS2_TZ environment variable
It is no longer necessary, as Git for Windows' fork of the MSYS2
runtime knows to pass on POSIX-compliant timezones.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 16:59:59 +01:00
Johannes Schindelin
32d09cfdac fixup! Special-case the MSYS2_TZ environment variable
It is no longer necessary, as Git for Windows' fork of the MSYS2
runtime knows to pass on POSIX-compliant timezones.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 16:59:58 +01:00
Johannes Schindelin
e82d9c7bed fixup! criss cross rename failure workaround
This patch has been merged in a slightly different form, and the
left-over patch is bogus (and has not been caught for a long time
by this maintainer).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-26 16:59:58 +01:00
Paul Wagland
f7c2e1a042 completion: complete show-branch "--date-order"
Signed-off-by: Paul Wagland <paul@kungfoocoder.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 15:15:26 -08:00
John Keeping
fa4b5e3a35 completion: add missing git-rebase options
This adds the --no-* variants where those are documented in
git-rebase(1).

Signed-off-by: John Keeping <john@keeping.me.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 15:13:54 -08:00
Johannes Sixt
e7d5ce8165 mingw: avoid linking to the C library's isalpha()
The implementation of mingw_skip_dos_drive_prefix() calls isalpha() via
has_dos_drive_prefix(). Since the definition occurs long before isalpha()
is defined in git-compat-util.h, my build environment reports:

    CC alloc.o
In file included from git-compat-util.h:186,
                 from cache.h:4,
                 from alloc.c:12:
compat/mingw.h: In function 'mingw_skip_dos_drive_prefix':
compat/mingw.h:365: warning: implicit declaration of function 'isalpha'

Dscho does not see a similar warning in his build and suspects that
ctype.h is included somehow behind the scenes. This implies that his build
links to the C library's isalpha() and does not use git's isalpha().

To fix both the warning in my build and the inconsistency in Dscho's
build, move the function definition to mingw.c. Then it picks up git's
isalpha() because git-compat-util.h is included at the top of the file.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 14:04:14 -08:00
Christian Couder
0e0f761842 dir: simplify untracked cache "ident" field
It is not a good idea to compare kernel versions and disable
the untracked cache if it changes, as people may upgrade and
still want the untracked cache to work. So let's just
compare work tree locations and kernel name to decide if we
should disable it.

Also storing many locations in the ident field and comparing
to any of them can be dangerous if GIT_WORK_TREE is used with
different values. So let's just store one location, the
location of the current work tree.

The downside is that untracked cache can only be used by one
type of OS for now. Exporting a git repo to different clients
via a network to e.g. Linux and Windows means that only one
can use the untracked cache.

If the location changed in the ident field and we still want
an untracked cache, let's delete the cache and recreate it.

Note that if an untracked cache has been created by a
previous Git version, then the kernel version is stored in
the ident field. As we now compare with just the kernel
name the comparison will fail and the untracked cache will
be disabled until it's recreated.

Helped-by: Torsten Bögershausen <tboegi@web.de>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 12:40:17 -08:00
Christian Couder
07b29bfd8d dir: add remove_untracked_cache()
Factor out code into remove_untracked_cache(), which will be used
in a later commit.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 12:40:11 -08:00
Christian Couder
4a4ca4796d dir: add {new,add}_untracked_cache()
Factor out code into new_untracked_cache() and
add_untracked_cache(), which will be used
in later commits.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 12:39:58 -08:00
Christian Couder
e7c0c5354b update-index: move 'uc' var declaration
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 12:39:46 -08:00
Christian Couder
6d19db1491 update-index: add untracked cache notifications
Attempting to flip the untracked-cache feature on for a random index
file with

    cd /random/unrelated/place
    git --git-dir=/somewhere/else/.git update-index --untracked-cache

would not work as you might expect. Because flipping the feature on
in the index also records the location of the corresponding working
tree (/random/unrelated/place in the above example), when the index
is subsequently used to keep track of files in the working tree in
/somewhere/else, the feature is disabled.

With this patch "git update-index --[test-]untracked-cache" tells the
user in which directory tests are performed. This makes it easy to
spot any problem.

Also in verbose mode, let's tell the user when the cache is enabled
or disabled.

Helped-by: Duy Nguyen <pclouds@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 12:39:34 -08:00
Christian Couder
eaab83d0e5 update-index: add --test-untracked-cache
It is nice to just be able to test if untracked cache is
supported without enabling it.

Helped-by: David Turner <dturner@twopensource.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 12:39:22 -08:00
Christian Couder
113e641318 update-index: use enum for untracked cache options
Helped-by: Duy Nguyen <pclouds@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 12:39:13 -08:00
Jeff King
1d094db936 t6300: use test_atom for some un-modern tests
Because this script has to test so many formatters, we have
the nice "test_atom" helper, but we don't use it
consistently. Let's do so. This is shorter, gets rid of some
tests that have their "expected" setup outside of a
test_expect_success block, and lets us organize the changes
better (e.g., putting "refname:short" near "refname").

We also expand the "%(push)" tests a little to match the
"%(upstream)" ones.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 12:33:45 -08:00
Jeff King
a2d5156c2b resolve_gitlink_ref: ignore non-repository paths
When we want to look up a submodule ref, we use
get_ref_cache(path) to find or auto-create its ref cache.
But if we feed a path that isn't actually a git repository,
we blindly create the ref cache, and then may die deeper in
the code when we try to access it. This is a problem because
many callers speculatively feed us a path that looks vaguely
like a repository, and expect us to tell them when it is
not.

This patch teaches resolve_gitlink_ref to reject
non-repository paths without creating a ref_cache. This
avoids the die(), and also performs better if you have a
large number of these faux-submodule directories (because
the ref_cache lookup is linear, under the assumption that
there won't be a large number of submodules).

To accomplish this, we also break get_ref_cache into two
pieces: the lookup and auto-creation (the latter is lumped
into create_ref_cache). This lets us first cheaply ask our
cache "is it a submodule we know about?" If so, we can avoid
repeating our filesystem lookup. So lookups of real
submodules are not penalized; they examine the submodule's
.git directory only once.

The test in t3000 demonstrates a case where this improves
correctness (we used to just die). The new perf case in
p7300 shows off the speed improvement in an admittedly
pathological repository:

Test                  HEAD^               HEAD
----------------------------------------------------------------
7300.4: ls-files -o   66.97(66.15+0.87)   0.33(0.08+0.24) -99.5%

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 11:42:13 -08:00
Jeff King
ffd036b128 clean: make is_git_repository a public function
We have always had is_git_directory(), for looking at a
specific directory to see if it contains a git repo. In
0179ca7 (clean: improve performance when removing lots of
directories, 2015-06-15), we added is_git_repository() which
checks for a non-bare repository by looking at its ".git"
entry.

However, the fix in 0179ca7 needs to be applied other
places, too. Let's make this new helper globally available.
We need to give it a better name, though, to avoid confusion
with is_git_directory(). This patch does that, documents
both functions with a comment to reduce confusion, and
removes the clean-specific references in the comments.

Based-on-a-patch-by: Andreas Krey <a.krey@gmx.de>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-25 11:41:53 -08:00
Johannes Schindelin
06d0ace55c squash! Enable support for perl regular expressions (LIBPCRE)
Replace commit message by:

mingw (MSys1): enable support for perl regular expressions

In msysGit, we do have libpcre.

Signed-off-by: Thomas Braun <thomas.braun@byte-physics.de>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2016-01-23 09:32:46 +01:00
Nguyễn Thái Ngọc Duy
618244e160 worktree: stop supporting moving worktrees manually
The current update_linked_gitdir() has a bug that can create "gitdir"
file in non-multi-worktree setup. Worse, sometimes it can write relative
path to "gitdir" file, which will not work (e.g. "git worktree list"
will display the worktree's location incorrectly)

Instead of fixing this, we step back a bit. The original design was
probably not well thought out. For now, if the user manually moves a
worktree, they have to fix up "gitdir" file manually or the worktree
will get pruned.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-22 14:28:42 -08:00
Junio C Hamano
e572fef9d4 Merge branch 'ep/shell-command-substitution-style'
A shell script style update to change `command substitution` into
$(command substitution).  Coverts contrib/ and much of the t/
directory contents.

* ep/shell-command-substitution-style: (92 commits)
  t9901-git-web--browse.sh: use the $( ... ) construct for command substitution
  t9501-gitweb-standalone-http-status.sh: use the $( ... ) construct for command substitution
  t9350-fast-export.sh: use the $( ... ) construct for command substitution
  t9300-fast-import.sh: use the $( ... ) construct for command substitution
  t9150-svk-mergetickets.sh: use the $( ... ) construct for command substitution
  t9145-git-svn-master-branch.sh: use the $( ... ) construct for command substitution
  t9138-git-svn-authors-prog.sh: use the $( ... ) construct for command substitution
  t9137-git-svn-dcommit-clobber-series.sh: use the $( ... ) construct for command substitution
  t9132-git-svn-broken-symlink.sh: use the $( ... ) construct for command substitution
  t9130-git-svn-authors-file.sh: use the $( ... ) construct for command substitution
  t9129-git-svn-i18n-commitencoding.sh: use the $( ... ) construct for command substitution
  t9119-git-svn-info.sh: use the $( ... ) construct for command substitution
  t9118-git-svn-funky-branch-names.sh: use the $( ... ) construct for command substitution
  t9114-git-svn-dcommit-merge.sh: use the $( ... ) construct for command substitution
  t9110-git-svn-use-svm-props.sh: use the $( ... ) construct for command substitution
  t9109-git-svn-multi-glob.sh: use the $( ... ) construct for command substitution
  t9108-git-svn-glob.sh: use the $( ... ) construct for command substitution
  t9107-git-svn-migrate.sh: use the $( ... ) construct for command substitution
  t9105-git-svn-commit-diff.sh: use the $( ... ) construct for command substitution
  t9104-git-svn-follow-parent.sh: use the $( ... ) construct for command substitution
  ...
2016-01-22 13:08:46 -08:00
Junio C Hamano
a039a79e9d Merge branch 'rm/subtree-unwrap-tags'
"git subtree" (in contrib/) records the tag object name in the
commit log message when a subtree is added using a tag, without
peeling it down to the underlying commit.  The tag needs to be
peeled when "git subtree split" wants to work on the commit, but
the command forgot to do so.

* rm/subtree-unwrap-tags:
  contrib/subtree: unwrap tag refs
2016-01-22 13:08:45 -08:00
David Turner
a6720955f1 unpack-trees: fix accidentally quadratic behavior
While unpacking trees (e.g. during git checkout), when we hit a cache
entry that's past and outside our path, we cut off iteration.

This provides about a 45% speedup on git checkout between master and
master^20000 on Twitter's monorepo.  Speedup in general will depend on
repostitory structure, number of changes, and packfile packing
decisions.

Signed-off-by: David Turner <dturner@twopensource.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-22 13:03:10 -08:00