]> source.dussan.org Git - jgit.git/log
jgit.git
11 years agoDetect and handle a checkout conflict during merge nicely 00/11700/2
Robin Rosenberg [Sat, 6 Apr 2013 12:03:24 +0000 (14:03 +0200)]
Detect and handle a checkout conflict during merge nicely

Report the conflicting files nicely and inform the user.

Change-Id: I75d464d4156d10c6cc6c7ce5a321e2c9fb0df375

11 years agoSupport cutting existing delta chains longer than the max depth 85/11685/1
Shawn Pearce [Fri, 5 Apr 2013 17:02:01 +0000 (10:02 -0700)]
Support cutting existing delta chains longer than the max depth

Some packs built by JGit have incredibly long delta chains due to a
long standing bug in PackWriter. Google has packs created by JGit's
DfsGarbageCollector with chains of 6000 objects long, or more.

Inflating objects at the end of this 6000 long chain is impossible
to complete within a reasonable time bound. It could take a beefy
system hours to perform even using the heavily optimized native C
implementation of Git, let alone with JGit.

Enable pack.cutDeltaChains to be set in a configuration file to
permit the PackWriter to determine the length of each delta chain
and clip the chain at arbitrary points to fit within pack.depth.

Delta chain cycles are still possible, but no attempt is made to
detect them. A trivial chain of A->B->A will iterate for the full
pack.depth configured limit (e.g. 50) and then pick an object to
store as non-delta.

When cutting chains the object list is walked in reverse to try
and take advantage of existing chain computations. The assumption
here is most deltas are near the end of the list, and their bases
are near the front of the list. Going up from the tail attempts to
reuse chainLength computations by relying on the memoized value in
the delta base.

The chainLength field in ObjectToPack is overloaded into the depth
field normally used by DeltaWindow. This is acceptable because the
chain cut happens before delta search, and the chainLength is reset
to 0 if delta search will follow.

Change-Id: Ida4fde9558f3abbbb77ade398d2af3941de9c812

11 years agoMicro-optimize reuseDeltaFor in PackWriter 84/11684/1
Shawn Pearce [Fri, 5 Apr 2013 16:42:29 +0000 (09:42 -0700)]
Micro-optimize reuseDeltaFor in PackWriter

This switch is called mostly for OBJ_TREE and OBJ_BLOB types, which
typically make up 66% of the objects in a repository. Simplify the
test for these common types by testing for the one bit they have in
common and returning early.

Object type 5 is currently undefined. In the old code it would hit
the default and return true. In the new code it will match the early
case and also return true. In either implementation 5 should never show
up as it is not a valid type known to Git.

Object type 6 OFS_DELTA is not permitted to be supplied here.
Object type 7 REF_DELTA is not permitted to be supplied here.

Change-Id: I0ede8acee928bb3e73c744450863942064864e9c

11 years agoStatic import OBJ_* constants into PackWriter 83/11683/1
Shawn Pearce [Fri, 5 Apr 2013 16:38:04 +0000 (09:38 -0700)]
Static import OBJ_* constants into PackWriter

Shortens most of the code that touches the objectLists.

Change-Id: Ib14d366dd311e544e7ba50e9ce07a6f3ce0cf254

11 years agoRenumber internal ObjectToPack flags 69/11669/1
Shawn Pearce [Fri, 5 Apr 2013 02:43:12 +0000 (19:43 -0700)]
Renumber internal ObjectToPack flags

Now that WANT_WRITE is gone renumber the flags to move the unused
bit next to the type. Recluster AS_IS and DELTA_ATTEMPTED to be
next to each other since these bits are tested as a pair.

Change-Id: I42994b5ff1f67435e15c3f06d02e3b82141e8f08

11 years agoMove wantWrite flag to be special offset 1 68/11668/1
Shawn Pearce [Fri, 5 Apr 2013 00:50:32 +0000 (17:50 -0700)]
Move wantWrite flag to be special offset 1

Free up the WANT_WRITE flag in ObjectToPack by switching the test
to use the special offset value of 1. The Git pack file format
calls for the first 4 bytes to be 'PACK', which means any object
must start at an offset >= 4. Current versions require another 8
bytes in the header, placing the first object at offset = 12.

So offset = 1 is an invalid location for an object, and can be
used as a marker signal to indicate the writing loop has tried
to write the object, but recursed into the base first. When an
object is visited with offset == 1 it means there is a cycle in
the delta base path, and the cycle must be broken.

Change-Id: I2d05b9017c5f9bd9464b91d43e8d4b4a085e55bc

11 years agoDon't delta compress garbage objects 65/11665/1
Shawn Pearce [Thu, 4 Apr 2013 22:23:08 +0000 (15:23 -0700)]
Don't delta compress garbage objects

Garbage is randomly ordered and unlikely to delta compress against
other garbage. Disable delta compression allowing objects to switch
to whole form when moving to the garbage pack.

Because the garbage is not well compressed assume deltas were not
attempted during a normal GC cycle.

Override the reuse settings, garbage that can be reused should be
reused as-is into the garbage pack rather than switching something
like the compression level during a GC. It is intended that garbage
will eventually be removed from the repository so expending CPU
time on a compression switch is not worthwhile.

Change-Id: I0e8e58ee99e5011d375d3d89c94f2957de8402b9

11 years agoDelete broken DFS read-ahead support 64/11664/1
Shawn Pearce [Thu, 4 Apr 2013 22:06:57 +0000 (15:06 -0700)]
Delete broken DFS read-ahead support

This implementation has been proven to deadlock in production server
loads. Google has been running with it disabled for a quite a while,
as the bugs have been difficult to identify and fix.

Instead of suggesting it works and is useful, drop the code. JGit
should not advertise support for functionality that is known to
be broken.

In a few of the places where read-ahead was enabled by DfsReader
there is more information about what blocks should be loaded when.
During object representation selection, or size lookup, or sending
object as-is to a PackWriter, or sending an entire pack as-is the
reader knows exactly which blocks are required in the cache, and it
also can compute when those will be needed. The broken read-ahead
code was stupid and just read a fixed amount ahead of the current
offset, which can waste IOs if more precise data was available.

DFS systems are usually slow to respond so read-ahead is still
a desired feature, but it needs to be rebuilt from scratch and
make better use of the offset information.

Change-Id: Ibaed8288ec3340cf93eb269dc0f1f23ab5ab1aea

11 years agoOptimize DFS object reuse selection code 55/11655/4
Shawn Pearce [Thu, 4 Apr 2013 19:18:22 +0000 (12:18 -0700)]
Optimize DFS object reuse selection code

Rewrite this complicated logic to examine each pack file exactly
once. This reduces thrashing when there are many large pack files
present and the reader needs to locate each object's header.

The intermediate temporary list is now smaller, it is bounded to
the same length as the input object list. In the prior version of
this code the list contained one entry for every representation of
every object being packed.

Only one representation object is allocated, reducing the overall
memory footprint to be approximately one reference per object found
in the current pack file (the pointer in the BlockList). This saves
considerable working set memory compared to the prior version that
made and held onto a new representation for every ObjectToPack.

Change-Id: I2c1f18cd6755643ac4c2cf1f23b5464ca9d91b22

11 years agoSimplify size test in PackWriter 54/11654/1
Shawn Pearce [Thu, 4 Apr 2013 18:23:16 +0000 (11:23 -0700)]
Simplify size test in PackWriter

Clip the configured limit to Integer.MAX_VALUE at the top of the
loop, saving a compare branch per object considered. This can cut
2M branches out of a repacking of the Linux kernel.

Rewrite the logic so the primary path is to match the conditional;
most objects are larger than BLKSZ (16 bytes) and less than limit.
This may help branch prediction on CPUs if the CPU tries to assume
execution takes the side of the branch and not the second.

Change-Id: I5133d1651640939afe9fbcfd8cfdb59965c57d5a

11 years agoDeclare critical exposed methods of ObjectToPack final 53/11653/1
Shawn Pearce [Thu, 4 Apr 2013 18:17:07 +0000 (11:17 -0700)]
Declare critical exposed methods of ObjectToPack final

There is no reasonable way for a subclass to correctly override and
implement these methods. They depend on internal state that cannot
otherwise be managed.

Most of these methods are also in critical paths of PackWriter.
Declare them final so subclasses do not try to replace them,
and so the JIT knows the smaller ones can be safely inlined.

Change-Id: I9026938e5833ac0b94246d21c69a143a9224626c

11 years agoDeclare internal flag accessors of ObjectToPack final 52/11652/1
Shawn Pearce [Thu, 4 Apr 2013 18:14:38 +0000 (11:14 -0700)]
Declare internal flag accessors of ObjectToPack final

None of these methods should ever be overridden at runtime by an
extension class. Given how small they are the JIT should perform
inlining where reasonable. Hint this is possible by marking all
methods final so its clear no replacement can be loaded later on.

Change-Id: Ia75a5d36c6bd25b24169e2bdfa360c8f52b669cd

11 years agoRemove unused method isDeltaAttempted() 51/11651/1
Shawn Pearce [Thu, 4 Apr 2013 18:03:30 +0000 (11:03 -0700)]
Remove unused method isDeltaAttempted()

This flag is never checked on its own. It is only checked as part
of a pair through the doNotAttemptDelta() method. Delete the method
so there is less confusion about the flag being used on its own.

Change-Id: Id7088caa649599f4f11d633412c2a2af0fd45dd8

11 years agoSimplify setDoNotDelta() to always set the flag 50/11650/1
Shawn Pearce [Thu, 4 Apr 2013 17:53:22 +0000 (10:53 -0700)]
Simplify setDoNotDelta() to always set the flag

This method is only invoked with true as the argument.
Remove the unnecessary parameter and branch, making
the code easier for the JIT to optimize.

Change-Id: I68a9cd82f197b7d00a524ea3354260a0828083c6

11 years agoAdd the no-commit option to MergeCommand 45/4945/6
Tomasz Zarna [Thu, 12 Jan 2012 17:32:53 +0000 (18:32 +0100)]
Add the no-commit option to MergeCommand

Added also tests and the associated option for the command line Merge
command.

Bug: 335091
Change-Id: Ie321c572284a6f64765a81674089fc408a10d059
Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoMerge "Fix PathFilterGroup not to throw StopWalkException too early"
Christian Halstrick [Thu, 4 Apr 2013 07:42:25 +0000 (03:42 -0400)]
Merge "Fix PathFilterGroup not to throw StopWalkException too early"

11 years agoMerge "Indicate initial commit on a branch in the reflog"
Christian Halstrick [Thu, 4 Apr 2013 07:41:56 +0000 (03:41 -0400)]
Merge "Indicate initial commit on a branch in the reflog"

11 years agoFix PathFilterGroup not to throw StopWalkException too early 97/11597/3
Robin Rosenberg [Tue, 2 Apr 2013 07:00:58 +0000 (09:00 +0200)]
Fix PathFilterGroup not to throw StopWalkException too early

Due to the Git internal sort order a directory is sorted as if it ended
with a '/', this means that the path filter didn't set the last possible
matching entry to the correct value. In the reported issue we had the
following filters.

org.eclipse.jgit.console
org.eclipse.jgit

As an optimization we throw a StopWalkException when the walked tree
passes the last possible filter, which was this:
org.eclipse.jgit.console

Due to the git sorting order, the tree was processed in this order:
org.eclipse.jgit.console
org.eclipse.jgit.test
org.eclipse.jgit

At org.eclipse.jgit.test we threw the StopWalkException preventing the
walk from completing successfully.

A correct last possible match should be:
org.eclipse.jgit/

For simplicit we define it as:
org/eclipse/jgit/

This filter would be the maximum if we also had e.g. org and org.eclipse
in the filter, but that would require more work so we simply replace all
characters lower than '/' by a slash.

We believe the possible extra walking does not not warrant the extra
analysis.

Bug: 362430
Change-Id: I4869019ea57ca07d4dff6bfa8e81725f56596d9f

11 years agoIndicate initial commit on a branch in the reflog 65/11565/4
Robin Rosenberg [Fri, 29 Mar 2013 22:59:21 +0000 (23:59 +0100)]
Indicate initial commit on a branch in the reflog

Bug: 393463
Change-Id: I4733d6f719bc0dc694e7a6a6ad2092de6364898c

11 years agoSpeed up clone/fetch with large number of refs 48/10448/4
Robin Rosenberg [Mon, 18 Feb 2013 19:25:00 +0000 (20:25 +0100)]
Speed up clone/fetch with large number of refs

Instead of re-reading all refs after each update, execute
the deletes first, then read all refs once and perform
the check for conflicting ref names in memory.

Change-Id: I17d0b3ccc27f868c8497607d8e57bf7082e65ba3

11 years agoMerge "When renaming the lock file succeeds the lock isn't held anymore"
Robin Rosenberg [Thu, 28 Mar 2013 19:57:38 +0000 (15:57 -0400)]
Merge "When renaming the lock file succeeds the lock isn't held anymore"

11 years agoFix CommitCommand amend mode to preserve parent order 53/11553/1
Shawn Pearce [Thu, 28 Mar 2013 17:58:21 +0000 (13:58 -0400)]
Fix CommitCommand amend mode to preserve parent order

Change-Id: I476921ff8dfa6a357932d42ee59340873502b582

11 years agoFixed parsing of URI with a IPv6-address 28/9228/2
Andreas König [Thu, 13 Dec 2012 16:43:59 +0000 (17:43 +0100)]
Fixed parsing of URI with a IPv6-address

Allowed ipv6-address in a uri like:
  http://[::1]:8080/repo.git

Change-Id: Ia00a20f694b2e9314892df77f9b11f551bb1d34e
Signed-off-by: Chris Aniszczyk <zx@twitter.com>
11 years agoNew functions to facilitate the writing of CLI test cases 63/5963/6
François Rey [Thu, 13 Sep 2012 22:11:18 +0000 (00:11 +0200)]
New functions to facilitate the writing of CLI test cases

Writing CLI test cases is tedious because of all the formatting and
escaping subtleties needed when comparing actual output with what's
expected. While creating a test case the two new functions are to be
used instead of the existing execute() in order to prepare the correct
command and expected output and to generate the corresponding test code
that can be pasted into the test case function.

Change-Id: Ia66dc449d3f6fb861c300fef8b56fba83a56c94c
Signed-off-by: Chris Aniszczyk <zx@twitter.com>
11 years agoMerge "File.renameTo behaves differently on Unix and Windows"
Matthias Sohn [Wed, 27 Mar 2013 13:09:04 +0000 (09:09 -0400)]
Merge "File.renameTo behaves differently on Unix and Windows"

11 years agoMerge "Extend FileUtils.rename to common git semantics"
Matthias Sohn [Wed, 27 Mar 2013 13:03:23 +0000 (09:03 -0400)]
Merge "Extend FileUtils.rename to common git semantics"

11 years agoWhen renaming the lock file succeeds the lock isn't held anymore 98/11498/1
Matthias Sohn [Tue, 26 Mar 2013 20:20:19 +0000 (21:20 +0100)]
When renaming the lock file succeeds the lock isn't held anymore

This wrong book-keeping caused IOExceptions to be thrown because
LockFile.unlock() erroneously tried to delete the non-existing lock
file. These IOExeptions were hidden since they were silently caught.

Change-Id: If42b6192d92c5a2d8f2bf904b16567ef08c32e89
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoAlways add FileExt to DfsPackDescription 82/11482/1
Shawn Pearce [Tue, 26 Mar 2013 17:57:19 +0000 (13:57 -0400)]
Always add FileExt to DfsPackDescription

Instead of forcing the implementation of the DFS backend to handle
making sure the extension bits are set correctly, have the common
callers in JGit set the extension at the same time they supply the
file sizes to the pack description. This simplifies assumptions for
an implementation of the DFS backend.

Change-Id: I55142ad8ea08a3e2e8349f72b3714578eba9c342

11 years agoFile.renameTo behaves differently on Unix and Windows 21/11321/4
Robin Rosenberg [Tue, 19 Mar 2013 13:19:28 +0000 (14:19 +0100)]
File.renameTo behaves differently on Unix and Windows

On Windows renameTo will not overwrite a file, so it must be deleted
first. The fix for Bug 402834 did not account for that.

Bug: 403685
Change-Id: I3453342c17e064dcb50906a540172978941a10a6

11 years agoExtend FileUtils.rename to common git semantics 14/11414/3
Robin Rosenberg [Sun, 24 Mar 2013 00:06:29 +0000 (01:06 +0100)]
Extend FileUtils.rename to common git semantics

Unlike the OS or Java rename this method will (on *nix) try (on Windows)
replace the target with the source provided the target does not exist,
the target does exist and is a file, or if it is a directory which only
contains directories. In the latter case the directory hierarchy will be
deleted.
If the initial rename fails and the target is an existing file the the
target file will be deleted first and then the rename is retried.

Change-Id: Iae75c49c85445ada7795246a02ce02f7c248d956
Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
11 years agoMerge "Add tests for FileUtils.delete and EMPTY_DIREECTORIES_ONLY"
Christian Halstrick [Sun, 24 Mar 2013 22:59:31 +0000 (18:59 -0400)]
Merge "Add tests for FileUtils.delete and EMPTY_DIREECTORIES_ONLY"

11 years agoUpdate build to Tycho 0.17 16/11416/1
Matthias Sohn [Sun, 24 Mar 2013 03:31:23 +0000 (04:31 +0100)]
Update build to Tycho 0.17

Change-Id: I92c9757a37644ec48ed1d785f4dacd6c44276632
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoAdd tests for FileUtils.delete and EMPTY_DIREECTORIES_ONLY 12/11412/3
Robin Rosenberg [Sat, 23 Mar 2013 23:49:23 +0000 (00:49 +0100)]
Add tests for FileUtils.delete and EMPTY_DIREECTORIES_ONLY

Change-Id: I54a46c29df5eafc7739a6ef29e5dc80fa2f6d9ba

11 years agoSimpleHttpServer API shouldn't expose internals 01/11401/1
Matthias Sohn [Fri, 22 Mar 2013 20:36:10 +0000 (21:36 +0100)]
SimpleHttpServer API shouldn't expose internals

Change-Id: I5963ae720f33cb148de08b4c64d02c81d6791139
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoGrant access to jgit internals to junit and http.server bundles 00/11400/1
Matthias Sohn [Fri, 22 Mar 2013 20:35:16 +0000 (21:35 +0100)]
Grant access to jgit internals to junit and http.server bundles

Change-Id: Ib34f9635b4d060f5d17a6c823ec91af1d934a180
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoAdd missing @since tags 99/11399/1
Matthias Sohn [Fri, 22 Mar 2013 20:15:48 +0000 (21:15 +0100)]
Add missing @since tags

Change-Id: I6b20d78e6bd1f245fdca331554c106f8bae44b9c
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoFix @since tags in JGit, version 2.4 never existed 53/11353/4
Tomasz Zarna [Wed, 20 Mar 2013 22:48:34 +0000 (23:48 +0100)]
Fix @since tags in JGit, version 2.4 never existed

Change-Id: Iaca88ec28b412e6b58e7b39a0762ba54b25f9471
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoMerge changes If98b0b97,I7c9c09b4
Shawn Pearce [Thu, 21 Mar 2013 07:52:33 +0000 (03:52 -0400)]
Merge changes If98b0b97,I7c9c09b4

* changes:
  Add convenience factory method for most used builder pattern
  Don't use internal type FileRepository in public API

11 years agoAllow users to show server messages while pushing 32/9732/10
André Dietisheim [Fri, 1 Feb 2013 14:58:44 +0000 (15:58 +0100)]
Allow users to show server messages while pushing

Allow users to provide their OutputStream (via Transport#
push(monitor, refUpdates, out)) so that server messages can be written
to it (in SideBandInputStream) while they're coming in.

CQ: 7065
Bug: 398404
Change-Id: I670782784b38702d52bca98203909aca0496d1c0
Signed-off-by: Andre Dietisheim <andre.dietisheim@gmail.com>
Signed-off-by: Chris Aniszczyk <zx@twitter.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoDon't verify host name when sslVerify is false 09/10809/2
Matthias Sohn [Sun, 3 Mar 2013 20:54:48 +0000 (21:54 +0100)]
Don't verify host name when sslVerify is false

Native git also doesn't verify host names when http.sslVerify=false.
See native git's commit a5ccc597.

See: http://dev.eclipse.org/mhonarc/lists/jgit-dev/msg02047.html
Change-Id: I42f509fea8e4ac89fad646aec3dfbf1753ae7e3d
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoFix line endings and whitespace errors in jgit feature 96/11096/4
Matthias Sohn [Tue, 12 Mar 2013 21:59:20 +0000 (22:59 +0100)]
Fix line endings and whitespace errors in jgit feature

Change-Id: I9fc69fccedf362453f74f1e09d2b50ac705a9cac
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoFix formatting of PackConfig.toString() & GC.RepoStatistics.toString() 95/11295/4
Edwin Kempin [Tue, 19 Mar 2013 05:59:52 +0000 (06:59 +0100)]
Fix formatting of PackConfig.toString() & GC.RepoStatistics.toString()

Change-Id: I7e0c74ecfd0e0615d10fb582b2897d33be23440a
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoAllow to get repo statistics from GarbageCollectionCommand before gc 96/11296/6
Edwin Kempin [Tue, 19 Mar 2013 06:28:36 +0000 (07:28 +0100)]
Allow to get repo statistics from GarbageCollectionCommand before gc

When running the garbage collection for a repository it is often
interesting to compare the repository statistics from before and after
the garbage collection to understand the effect of the garbage
collection. This is why it makes sense that the
GarbageCollectionCommand provides a method to retrieve the repository
statistics before running the garbage collection.

So far without running the garbage collection the repository statistics
can only be retrieved by using JGit internal classes. This is what EGit
and Gerrit do at the moment, but it would be better to have an API for
this.

Change-Id: Id7e579157e9fbef5cfd1fc9f97ada45f0ca8c379
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoAdd convenience factory method for most used builder pattern 25/11325/3
Matthias Sohn [Tue, 19 Mar 2013 22:26:17 +0000 (23:26 +0100)]
Add convenience factory method for most used builder pattern

This will simplify to adapt EGit to the removal of FileRepository from
jgit's public API in change I2ab1327c202ef2003565e1b0770a583970e432e9.

Change-Id: If98b0b97e8f13a94d4ea7ba1be0f90d82b0fba4b
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoDon't use internal type FileRepository in public API 24/11324/3
Matthias Sohn [Tue, 19 Mar 2013 22:23:59 +0000 (23:23 +0100)]
Don't use internal type FileRepository in public API

Change-Id: I7c9c09b4f190fa7cb830563bcdf2071407ee2ce0
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoMerge "Fix GC for FileRepo in case packfile renames fail"
Matthias Sohn [Tue, 19 Mar 2013 17:07:47 +0000 (13:07 -0400)]
Merge "Fix GC for FileRepo in case packfile renames fail"

11 years agoFix location of DfsText.properties 07/11307/1
Shawn Pearce [Tue, 19 Mar 2013 14:16:48 +0000 (07:16 -0700)]
Fix location of DfsText.properties

The file was not moved when the package was renamed to internal.

Change-Id: I29a078d6316daa4e4407db9ecedc8b7ed05535cd

11 years agoFix GC for FileRepo in case packfile renames fail 88/11188/3
Christian Halstrick [Fri, 15 Mar 2013 10:08:17 +0000 (11:08 +0100)]
Fix GC for FileRepo in case packfile renames fail

Only on Windows the rename operation which renames temporary Packfiles
(and index-files and bitmap-files) sometime fails. This happens only
when renaming a temporary Packfile to a Packfile which already exists.
Such situations occur if you run GC twice on a repo without modifying
the repo inbetween.

In such situations there was bug in GC which led to a corrupted repo
whithout any packfiles anymore. This commit fixes the problem by
introducing a utility method which renames a file and throws an
IOException if it fails. This method also takes care to repeat a
failing rename if our FS class has found out we are running on a
platform with a unreliable File.renameTo() method.

I am searching for a better solution because even with this utility
method in hand a GC on a already GC'ed repo will fail on Windows. But
at least with this fix we will not produce corrupted repos anymore.

Bug: 389305
Change-Id: Iac1ab3e0b8c419c90404f2e2f3559672eb8f6d28
Signed-off-by: Christian Halstrick <christian.halstrick@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoMake GC more robust against corrupt reflogs 65/11265/3
Christian Halstrick [Mon, 18 Mar 2013 12:20:11 +0000 (13:20 +0100)]
Make GC more robust against corrupt reflogs

With JGit it is possible to write reflog entries where new objectid and
old objectid is null. Such reflogs cause FileRepository GC to crash
because it doesn't expect the new objectid to be null. One case where
this happened is in Gerrit's allProjects repo. In the same way as we
expect the old objectid to be potentially null we should also ignore
null values in the new objectid column.

Change-Id: Icf666c7ef803179b84306ca8deb602369b8df16e

11 years agoJGit 3.0: move internal classes into an internal subpackage 73/11273/2
Shawn Pearce [Mon, 18 Mar 2013 14:44:48 +0000 (07:44 -0700)]
JGit 3.0: move internal classes into an internal subpackage

This breaks all existing callers once. Applications are not supposed
to build against the internal storage API unless they can accept API
churn and make necessary updates as versions change.

Change-Id: I2ab1327c202ef2003565e1b0770a583970e432e9

11 years agoMerge changes I2645d482,Ic81fefb1,Id64ab38d
Shawn Pearce [Mon, 18 Mar 2013 14:35:31 +0000 (10:35 -0400)]
Merge changes I2645d482,Ic81fefb1,Id64ab38d

* changes:
  Remove cached_packs support in favor of bitmaps
  Remove objects before optimization from DfsGarbageCollector
  Simplfy caching of DfsPackDescription from PackWriter.Statistics

11 years agoUse RawParseUtils.prevLF in RebaseCommand 22/11022/2
Robin Stocker [Sat, 9 Mar 2013 15:35:14 +0000 (16:35 +0100)]
Use RawParseUtils.prevLF in RebaseCommand

As noticed by Robin Rosenberg in review of
I4eb87c850078ca187b38b81cc91c92afb1176945.

Change-Id: If96d66b6c025ad8f2f47829c933f3c65ab6cbeef
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoSupport aborting non-interactive rebase started from C Git 17/11017/2
Robin Stocker [Sat, 9 Mar 2013 13:09:01 +0000 (14:09 +0100)]
Support aborting non-interactive rebase started from C Git

Continuing is trickier, as .git/rebase-apply contains no message file
and no git-rebase-todo.

Bug: 336820
Change-Id: I4eb87c850078ca187b38b81cc91c92afb1176945
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoNameRevCommand: Don't use merge cost for first parent 02/11202/3
Dave Borowitz [Fri, 15 Mar 2013 15:10:59 +0000 (08:10 -0700)]
NameRevCommand: Don't use merge cost for first parent

Treat first parent traversals as 1 and higher parents as MERGE_COST,
to match git name-rev. Allow overriding the merge cost during tests to
avoid creating 2^16 commits on the fly.

Change-Id: I0175e0c3ab1abe6722e4241abe2f106d1fe92a69

11 years agoMerge "A folder does not constitute a dirty work tree"
Robin Rosenberg [Fri, 15 Mar 2013 15:33:08 +0000 (11:33 -0400)]
Merge "A folder does not constitute a dirty work tree"

11 years agoMerge "Add toString() for PackConfig"
Christian Halstrick [Fri, 15 Mar 2013 11:23:52 +0000 (07:23 -0400)]
Merge "Add toString() for PackConfig"

11 years agoAdd toString() for PackConfig 87/11187/1
Edwin Kempin [Fri, 15 Mar 2013 09:24:58 +0000 (10:24 +0100)]
Add toString() for PackConfig

This is helpful for writing the pack configuration into a log file.

Change-Id: I5e7f5ff7e01c9538ca12a1860844ba9b467bdf05
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
11 years agoAdd toString() for RepoStatistics 86/11186/1
Edwin Kempin [Fri, 15 Mar 2013 08:39:18 +0000 (09:39 +0100)]
Add toString() for RepoStatistics

This is helpful for writing the repository statistics into a log file.

Change-Id: I0e8cd9ad05f123ab3851960890a50213f353a373
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
11 years agoRemove cached_packs support in favor of bitmaps 83/11183/1
Shawn Pearce [Thu, 14 Mar 2013 23:27:53 +0000 (16:27 -0700)]
Remove cached_packs support in favor of bitmaps

The bitmap code in PackWriter knows exactly when to use a pack as
a "cached pack". It enables cached pack usage only when the pack
has a bitmap and its entire closure of objects needs to be sent.
This is a much simpler code path to maintain, and JGit actually
has a way to write the necessary index.

Change-Id: I2645d482f8733fdf0c4120cc59ba9aa4d4ba6881

11 years agoRemove objects before optimization from DfsGarbageCollector 79/11179/2
Shawn Pearce [Thu, 14 Mar 2013 23:14:04 +0000 (16:14 -0700)]
Remove objects before optimization from DfsGarbageCollector

Just counting objects is not sufficient. There are some race
conditions with receive packs and delta base completion that
may confuse such a simple algorithm.

Instead always do the larger set computations, and rely on the
PackWriter having no objects pending as the way to avoid creating
an empty pack file.

Change-Id: Ic81fefb158ed6ef8d6522062f2be0338a49f6bc4

11 years agoSimplfy caching of DfsPackDescription from PackWriter.Statistics 78/11178/2
Shawn Pearce [Thu, 14 Mar 2013 23:10:44 +0000 (16:10 -0700)]
Simplfy caching of DfsPackDescription from PackWriter.Statistics

Let the pack description copy the relevant stats values. This
moves it out of the garbage collector and compactor algorithms,
co-locating with something that might care.

Remove some unnecessary code from the DfsPackCompactor, the stats
tracks the same information and can supply it.

Change-Id: Id64ab38d507c0ed19ae0d106862d175b7364eba3

11 years agoNameRevCommand: Use ~ notation for first parents of merges 59/11159/1
Dave Borowitz [Thu, 14 Mar 2013 16:35:00 +0000 (09:35 -0700)]
NameRevCommand: Use ~ notation for first parents of merges

Prefer ~(N+1) to ^1~N. Although both are correct, the former is
cleaner and matches "git name-rev".

Change-Id: I772001a219e5eb346f5552c92e6d98c70b2cfa98

11 years agoAllow adding single refs or all tags to NameRevCommand 27/11127/2
Dave Borowitz [Wed, 13 Mar 2013 18:05:19 +0000 (11:05 -0700)]
Allow adding single refs or all tags to NameRevCommand

Change-Id: I90e85bc835d11278631afd0e801425a292578bba

11 years agoMerge "Cluster UNREACHABLE_GARBAGE packs at the end of the search list"
Shawn Pearce [Tue, 12 Mar 2013 21:56:48 +0000 (17:56 -0400)]
Merge "Cluster UNREACHABLE_GARBAGE packs at the end of the search list"

11 years agoMerge "Avoid repacking unreachable garbage in DfsGarbageCollector"
Shawn Pearce [Tue, 12 Mar 2013 21:55:47 +0000 (17:55 -0400)]
Merge "Avoid repacking unreachable garbage in DfsGarbageCollector"

11 years agoMerge changes Icd550359,If7aad533
Shawn Pearce [Tue, 12 Mar 2013 21:45:31 +0000 (17:45 -0400)]
Merge changes Icd550359,If7aad533

* changes:
  Avoid looking at UNREACHABLE_GARBAGE for client have lines
  Simplify UploadPack by parsing wants separately from haves

11 years agoMerge "Add a NameRevCommand for describing IDs in terms of refnames"
Shawn Pearce [Mon, 11 Mar 2013 22:33:55 +0000 (18:33 -0400)]
Merge "Add a NameRevCommand for describing IDs in terms of refnames"

11 years agoAdd a NameRevCommand for describing IDs in terms of refnames 45/10945/5
Dave Borowitz [Thu, 7 Mar 2013 17:41:05 +0000 (09:41 -0800)]
Add a NameRevCommand for describing IDs in terms of refnames

The walk logic does not use RevWalk because it needs to walk all paths
to each of the requested commits, keeping track of each path along which
the commit was found in the RevCommit subclass. From these paths, a
single "best" path is chosen based on the total path length, with a
penalty applied for paths that traverse merges.

This functionality parallels "git name-rev".

Change-Id: I92bfb47dd16c898313d2ee525395609c3bf72ebe

11 years agoA folder does not constitute a dirty work tree 61/10461/2
Robin Rosenberg [Mon, 18 Feb 2013 22:59:20 +0000 (23:59 +0100)]
A folder does not constitute a dirty work tree

This fixes two cases:
- A folder without tracked content exist both in the workdir and merged
commit, as long as there names within that folder does not conflict.
- An empty folder structure exists with the same name as a file in the
merged commit.

Bug: 402834
Change-Id: I4c5b9f11313dd1665fcbdae2d0755fdb64deb3ef

11 years agoAdd isRebasing to RepositoryState 21/11021/1
Robin Stocker [Sat, 9 Mar 2013 15:20:57 +0000 (16:20 +0100)]
Add isRebasing to RepositoryState

See EGit change Ic69f5c952a49f023c0949f04b3e976be1b267fbe where this
could be used.

Change-Id: I9ec8568fa1100d2e9c8d4ca0e347bf77ec6d8734

11 years agoAvoid looking at UNREACHABLE_GARBAGE for client have lines 05/11005/1
Shawn Pearce [Fri, 8 Mar 2013 20:45:28 +0000 (12:45 -0800)]
Avoid looking at UNREACHABLE_GARBAGE for client have lines

Clients send a bunch of unknown objects to UploadPack on each round
of negotiation. Many of these are not known to the server, which
leads the implementation to be looking at indexes for garbage packs.

Disable examining the index of a garbage pack, allowing servers to
avoid reading them from disk during negotiation.

The effect of this change is the server will only ACK a have line
if the object was reachable during the last garbage collection,
or was recently added to the repository. For most repositories
there is no impact in this behavior change.

If a repository rewinds a branch, runs GC, and then resets the
branch back to where it was before, the now current tip is going to
be skipped by this change. A client that has the commit may wind up
getting a slightly larger data transfer from the server as an older
common ancestor will be chosen during negotiation. This is fixable
on the server side by running GC again to correct the layout of
objects in pack files.

Change-Id: Icd550359ef70fc7b701980f9b13d923fd13c744b

11 years agoSimplify UploadPack by parsing wants separately from haves 04/11004/1
Shawn Pearce [Fri, 8 Mar 2013 20:25:12 +0000 (12:25 -0800)]
Simplify UploadPack by parsing wants separately from haves

The DHT backend was very slow at parsing objects. To work around
that performance limitation I obfuscated UploadPack by folding both
the want and have sets together in a single parse queue. Since DHT
was removed the complexity is no longer constructive to JGit.

Doing this refactoring prepares the code for a slightly future
change where the have lines need to be handled specially from the
want lines. Splitting the parsing up into two phases makes such
a modification trivial.

Change-Id: If7aad533b82448bbb688278e21f709282e5ccf4b

11 years agoCluster UNREACHABLE_GARBAGE packs at the end of the search list 99/10999/1
Shawn Pearce [Fri, 8 Mar 2013 19:19:44 +0000 (11:19 -0800)]
Cluster UNREACHABLE_GARBAGE packs at the end of the search list

Garbage is unlikely to be used by a reader. Ensure they always
cluster at the end of the search list, no matter what timestamp
was used on the pack files.

Change-Id: I3bed89e9569ee3363c36bb3f73fcd34057a3883f

11 years agoAvoid repacking unreachable garbage in DfsGarbageCollector 96/10996/1
Shawn Pearce [Fri, 8 Mar 2013 19:02:04 +0000 (11:02 -0800)]
Avoid repacking unreachable garbage in DfsGarbageCollector

If a repository has significant amounts of unreachable garbage the
final phase to coalesce it can take longer than any other part of the
garbage collection phase. Provide a setting for applications to tweak
the threshold where coalescing ends and files just remain on disk.

Change-Id: I5f11a998a7185c75ece3271d8bc6181bb83f54c1

11 years agoInclude the number of ms in timeout error message 83/10983/1
Robin Stocker [Fri, 8 Mar 2013 17:00:19 +0000 (18:00 +0100)]
Include the number of ms in timeout error message

Noticed that while analyzing bug 402131.

Change-Id: If3fd40b64d5088c4579946271a67346cbd9e6556

11 years agoDo not cherry-pick merge commits during rebase 48/10548/5
Robin Rosenberg [Wed, 20 Feb 2013 23:07:33 +0000 (00:07 +0100)]
Do not cherry-pick merge commits during rebase

Rebase computes the list of commits that are included in
the merges, just like Git does, so do not try to include
the merge commits. Re-recreating merges during rebase is
a bit more complicated and might be a useful future extension,
but for now just linearize during rebase.

Change-Id: I61239d265f395e5ead580df2528e46393dc6bdbd
Signed-off-by: Robin Stocker <robin@nibor.org>
11 years agoExtend FileUtils.delete with option to delete empty directories only 43/10543/3
Robin Rosenberg [Wed, 20 Feb 2013 21:54:59 +0000 (22:54 +0100)]
Extend FileUtils.delete with option to delete empty directories only

The new option EMPTY_DIRECTORIES_ONLY will make delete() only delete
empty directories. Any attempt to delete files will fail. Can be
combined with RECURSIVE to wipe out entire tree structures and
IGNORE_ERRORS to silently ignore any files or non-empty directories.

Change-Id: Icaa9a30e5302ee5c0ba23daad11c7b93e26b7445
Signed-off-by: Robin Stocker <robin@nibor.org>
11 years agoAdd javaewah bundle to features using it 21/10921/1
Matthias Sohn [Thu, 7 Mar 2013 07:51:06 +0000 (08:51 +0100)]
Add javaewah bundle to features using it

This ensures that OSGi consumers can retrieve this dependency from the
JGit or EGit p2 repository.

Change-Id: I6f88a4914a19e4e18aa60d59b0cc8a33b61f7fc2
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 years agoDo not attempt to read bitmap from invalid pack 13/10913/1
Shawn Pearce [Wed, 6 Mar 2013 20:48:25 +0000 (12:48 -0800)]
Do not attempt to read bitmap from invalid pack

If a pack file has been marked invalid due to a prior IOException
accessing its contents, do not offer its bitmap index to callers.
The pack cannot be used so its bitmap should be off limits from
any reader trying to work from a bitmap.

Change-Id: Ia44e46558abdddee560bb184158b1e0af9437eee

11 years agoRename DfsPackFile getBitmap method to match PackFile 12/10912/1
Shawn Pearce [Wed, 6 Mar 2013 20:47:37 +0000 (12:47 -0800)]
Rename DfsPackFile getBitmap method to match PackFile

There is no reason for these to differ in name. Match the
shorter name used by PackFile.

Change-Id: I2d3a299069acc5ce276b1b5439ff2258903c6ff3

11 years agoWrite the bitmap index correctly in DFS GC. 10/10910/1
Colby Ranger [Wed, 6 Mar 2013 20:33:05 +0000 (12:33 -0800)]
Write the bitmap index correctly in DFS GC.

A bug caused the .bitmap to actually have the .idx contents.

Change-Id: I428bb27d419e8b1b69b6f3e2fd07cd29703669ad

11 years agoEnable writing bitmaps during GC by default. 18/10018/10
Colby Ranger [Wed, 30 Jan 2013 19:48:19 +0000 (11:48 -0800)]
Enable writing bitmaps during GC by default.

Bitmaps provide a huge performance boost for counting objects and they
play nice with the cgit implementation.

Change-Id: I33b05a6c8f1ee2df7770f0b9fdc50d0b4bbf1029

11 years agoEnable writing pack indexes with bitmaps in the GC. 42/7942/21
Colby Ranger [Wed, 26 Sep 2012 18:50:05 +0000 (11:50 -0700)]
Enable writing pack indexes with bitmaps in the GC.

Update the dfs and file GC implementations to prepare and write
bitmaps on the packs that contain the full closure of the object
graph. Update the DfsPackDescription to include the index version.

Change-Id: I3f1421e9cd90fe93e7e2ef2b8179ae2f1ba819ed

11 years agoEnable serving upload requests using bitmaps. 41/7941/18
Colby Ranger [Wed, 26 Sep 2012 18:57:15 +0000 (11:57 -0700)]
Enable serving upload requests using bitmaps.

If the pack index has bitmaps, allow the PackWriter to use the bitmaps
for upload requests.

Change-Id: Iefa995fe927a11e4fd78afb34530995614221fc0

11 years agoSupport creating pack bitmap indexes in PackWriter. 40/7940/18
Colby Ranger [Mon, 6 Aug 2012 18:09:53 +0000 (11:09 -0700)]
Support creating pack bitmap indexes in PackWriter.

Update the PackWriter to support writing out pack bitmap indexes,
a parallel ".bitmap" file to the ".pack" file.
Bitmaps are selected at commits every 1 to 5,000 commits for
each unique path from the start. The most recent 100 commits are
all bitmapped. The next 19,000 commits have a bitmaps every 100
commits. The remaining commits have a bitmap every 5,000 commits.
Commits with more than 1 parent are prefered over ones
with 1 or less. Furthermore, previously computed bitmaps are reused,
if the previous entry had the reuse flag set, which is set when the
bitmap was placed at the max allowed distance.

Bitmaps are used to speed up the counting phase when packing, for
requests that are not shallow. The PackWriterBitmapWalker uses
a RevFilter to proactively mark commits with RevFlag.SEEN, when
they appear in a bitmap. The walker produces the full closure
of reachable ObjectIds, given the collection of starting ObjectIds.

For fetch request, two ObjectWalks are executed to compute the
ObjectIds reachable from the haves and from the wants. The
ObjectIds needed to be written are determined by taking all the
resulting wants AND NOT the haves.

For clone requests, we get cached pack support for "free" since
it is possible to determine if all of the ObjectIds in a pack file
are included in the resulting list of ObjectIds to write.

On my machine, the best times for clones and fetches of the linux
kernel repository (with about 2.6M objects and 300K commits) are
tabulated below:

Operation                   Index V2               Index VE003
Clone                       37530ms (524.06 MiB)     82ms (524.06 MiB)
Fetch (1 commit back)          75ms                 107ms
Fetch (10 commits back)       456ms (269.51 KiB)    341ms (265.19 KiB)
Fetch (100 commits back)      449ms (269.91 KiB)    337ms (267.28 KiB)
Fetch (1000 commits back)    2229ms ( 14.75 MiB)    189ms ( 14.42 MiB)
Fetch (10000 commits back)   2177ms ( 16.30 MiB)    254ms ( 15.88 MiB)
Fetch (100000 commits back) 14340ms (185.83 MiB)   1655ms (189.39 MiB)

Change-Id: Icdb0cdd66ff168917fb9ef17b96093990cc6a98d

11 years agoAdded read/write support for pack bitmap index. 39/7939/17
Colby Ranger [Tue, 28 Aug 2012 16:08:20 +0000 (09:08 -0700)]
Added read/write support for pack bitmap index.

A pack bitmap index is an additional index of compressed
bitmaps of the object graph. Furthermore, a logical API of the index
functionality is included, as it is expected to be used by the
PackWriter.

Compressed bitmaps are created using the javaewah library, which is a
word-aligned compressed variant of the Java bitset class based on
run-length encoding. The library only works with positive integer
values. Thus, the maximum number of ObjectIds in a pack file that
this index can currently support is limited to Integer.MAX_VALUE.

Every ObjectId is given an integer mapping. The integer is the
position of the ObjectId in the complete ObjectId list, sorted
by offset, for the pack file. That integer is what the bitmaps
use to reference the ObjectId. Currently, the new index format can
only be used with pack files that contain a complete closure of the
object graph e.g. the result of a garbage collection.

The index file includes four bitmaps for the Git object types i.e.
commits, trees, blobs, and tags. In addition, a collection of
bitmaps keyed by an ObjectId is also included. The bitmap for each entry
in the collection represents the full closure of ObjectIds reachable
from the keyed ObjectId (including the keyed ObjectId itself). The
bitmaps are further compressed by XORing the current bitmaps against
prior bitmaps in the index, and selecting the smallest representation.
The XOR'd bitmap and offset from the current entry to the position
of the bitmap to XOR against is the actual representation of the entry
in the index file. Each entry contains one byte, which is currently
used to note whether the bitmap should be blindly reused.

Change-Id: Id328724bf6b4c8366a088233098c18643edcf40f

11 years agoMerge "Break the dependency on RevObject when creating a newObjectToPack()."
Shawn Pearce [Tue, 5 Mar 2013 01:12:35 +0000 (20:12 -0500)]
Merge "Break the dependency on RevObject when creating a newObjectToPack()."

11 years agoMerge "Fix RefUpdate performance for existing Refs"
Shawn Pearce [Tue, 5 Mar 2013 00:11:08 +0000 (19:11 -0500)]
Merge "Fix RefUpdate performance for existing Refs"

11 years agoMerge "Fix corrupted CloneCommand bare-repo fetch-refspec (#402031)"
Shawn Pearce [Mon, 4 Mar 2013 22:53:02 +0000 (17:53 -0500)]
Merge "Fix corrupted CloneCommand bare-repo fetch-refspec (#402031)"

11 years agoBreak the dependency on RevObject when creating a newObjectToPack(). 38/7938/10
Colby Ranger [Mon, 27 Aug 2012 23:08:42 +0000 (16:08 -0700)]
Break the dependency on RevObject when creating a newObjectToPack().

Update the ObjectReuseAsIs API to support creating new
ObjectToPack with only the AnyObjectId and Git object type. This is
needed to support the future pack index bitmaps, which only contain
this information and do not want the overhead of creating a temporary
object for every ObjectId.

Change-Id: I906360b471412688bf429ecef74fd988f47875dc

11 years agoMerge "Remove the unused method PackFile.hasExt()."
Colby Ranger [Mon, 4 Mar 2013 22:30:27 +0000 (17:30 -0500)]
Merge "Remove the unused method PackFile.hasExt()."

11 years agoRemove the unused method PackFile.hasExt(). 32/10832/1
Colby Ranger [Mon, 4 Mar 2013 22:16:36 +0000 (14:16 -0800)]
Remove the unused method PackFile.hasExt().

It will be used in a future change, so just include it with that change.

Change-Id: I7db28d86f8e8b282a403acd9a4c4defaae828f94

11 years agoFix corrupted CloneCommand bare-repo fetch-refspec (#402031) 10/10810/3
Roberto Tyley [Mon, 4 Mar 2013 00:03:20 +0000 (00:03 +0000)]
Fix corrupted CloneCommand bare-repo fetch-refspec (#402031)

CloneCommand has been creating fetch refspecs like this on bare clones:

[remote "origin"]
        url = ssh://example.com/my-repo.git
        fetch = +refs/heads/*:refs/heads//*

As you can see, the destination ref pattern has a superfluous slash.

It looks like this behaviour has always been the case for CloneCommand,
at least since cc2197ed when code catering to bare-clone fetch refspecs
was added. That was released with JGit v1.0 almost 2 years ago, so
there will probably be some bare repos in the wild which will have been
cloned with JGit and have these corrupted refspecs.

The effect of the corrupted fetch refspec is quite interesting. Up to
and including JGit 2.0, the corrupt refspec was tolerated and fetches
would work as intended with no indication to the user that anything was
amiss. With JGit 2.1, a change was introduced which made JGit less
tolerant, and fetches now attempt to update the non-existing ref
"refs/heads//master". No exception is raised, but the real ref -
"refs/heads/master" - is not updated.

This behaviour was noticed by a user of Agit (which does bare clones by
default and recently updated from JGit v2.0 to v2.2), reported here:

https://github.com/rtyley/agit/issues/92

If you run C-Git fetch on a bare-repo cloned by JGit, it flat-out
rejects the refspec (checked against v1.7.10.4):

fatal: Invalid refspec '+refs/heads/*:refs/heads//*'

Incidentally, C-Git does not create an explicit fetch refspec at all
when performing a bare clone - the full remote config generated by C-Git
looks like this:

[remote "origin"]
        url = ssh://example.com/my-repo.git

Using JGit on such a repository works fine, so omitting the fetch
refspec entirely is also an option.

Change-Id: I14b0d359dc69b8908f68e02cea7a756ac34bf881

11 years agoFix RefUpdate performance for existing Refs 92/10792/1
Roberto Tyley [Fri, 1 Mar 2013 21:49:58 +0000 (21:49 +0000)]
Fix RefUpdate performance for existing Refs

No longer invoke the expensive RefDatabase.isNameConflicting() check on
updating existing refs, reducing batch ref update time by ~97%.

The RefDirectory implementation of isNameConflicting() is quite
slow (it has to do an expensive loose-ref scan) but it's only necessary
to perform this check on ref update if the ref is being *created* - if
the ref already exists, we can already guarantee that it does not
conflict with any other refs.

C-Git seems to use a similar condition before making the
is_refname_available() check:

https://github.com/git/git/blob/v1.8.1.4/refs.c#L1660-L1670

As an example of the effects on performance, here's a simple timing
experiment using The BFG to remove one file from the JGit repo:

---
$ wget http://repo1.maven.org/maven2/com/madgag/bfg-repo-cleaner/1.0.1/bfg-1.0.1.jar
$ git clone --mirror https://git.eclipse.org/r/p/jgit/jgit.git
$ java -jar bfg-1.0.1.jar -D make_jgit.sh jgit.git
....
Updating references:    100% (5760/5760)
...Ref update completed in 148,949 ms.

BFG run is complete!
---

The execution time for the run is completely dominated by the batch ref
update at the end. Repeating the experiment with BFG v1.0.2 (using JGit
patched with this change), the refs update is dramatically reduced:

---
Updating references:    100% (5760/5760)
...Ref update completed in 4,327 ms.
---

Change-Id: I9057bc4ee22f9cc269b1cc00c493841c71527cd6

11 years agoMerge "Improve the documentation of the ByteArraySet used by PathFilterGroup"
Shawn Pearce [Fri, 1 Mar 2013 00:21:59 +0000 (19:21 -0500)]
Merge "Improve the documentation of the ByteArraySet used by PathFilterGroup"

11 years agoInclude supported extensions in PackFile constructor. 80/9980/7
Colby Ranger [Mon, 28 Jan 2013 19:49:01 +0000 (11:49 -0800)]
Include supported extensions in PackFile constructor.

Previously a PackFile class was assumed to only support a .pack and .idx
file. Update the constructor to enumerate the supported extensions for
the pack file. This will allow the bitmap code to only be executed if
the bitmap extension file is known to exist.

Change-Id: Ie59041dffec5f60d7ea2771026ffd945106bd4bf

11 years agoFix while boundries in DateRevQueue.add() 26/10626/1
Gustaf Lundh [Mon, 25 Feb 2013 17:24:16 +0000 (18:24 +0100)]
Fix while boundries in DateRevQueue.add()

In add(), "low" will never equals "first". This fact
should be reflected in the code.

Change-Id: I5cab51374e67bd2d3301e5d9dac47c4259b5e562

11 years agoMerge "Performance fixes in DateRevQueue"
Shawn Pearce [Mon, 25 Feb 2013 16:50:21 +0000 (11:50 -0500)]
Merge "Performance fixes in DateRevQueue"

11 years agoPerformance fixes in DateRevQueue 07/10307/8
Gustaf Lundh [Fri, 1 Feb 2013 12:20:31 +0000 (13:20 +0100)]
Performance fixes in DateRevQueue

When a lot of commits are added to DateRevQueue, the
sort-on-insertion approach is very heavy on CPU cycles.

One approach to fix this was made by Dave Borowitz:
https://git.eclipse.org/r/#/c/5491/

But using Java's PriorityQueue seems to have brought some
extra overhead, and the desired performance could not be
reached.

This fix takes another approach to the insertion problem,
without changing the expected behaviour or bringing extra
memory overhead:

If we detect over 1000 commits in the DateRevQueue, a
"seek-index" is rebuilt every 1000th added commit.

The index keeps track of every 100th commit in the
DateRevQueue. During insertions, it will be used for a
preliminary scanning (binary search) of the queue, with
the intention of helping add() find a good starting point
to start walking from. After finding this starting point,
add() will step commit-by-commit until the correct
insertion place in the queue is found (today, the queue
is expected to be sorted at all times).

When applied to repositories with many refs, this approach
has proven to bring huge performance gains and scales quite
well.

For instance, in a repository with close to 80000 refs,
we could cut down the time a typical Gerrit replication
of 1 commit would take (just a push from JGit's point of
view) from 32sec down to 3.5sec.

Below you see some typical times to add a specific amount
of commits (with random commit times) to the DateRevQueue
and the difference the preliminary seek-index makes:

Commits | Index | No Index
   1024     8ms        8ms
   2048    13ms        9ms
   4096     5ms       59ms
   8192    11ms      595ms
  16384    22ms     3058ms
  32768    64ms    13811ms
  65536   201ms    62677ms
 131072   783ms   331585ms

Only one extra reference is needed for every 100 inserted
commits (and only when we see more than 1000 commits in
the queue), so the memory overhead should be negligible.

Various index-stepping values were tested, and 100 seemed to
scale very well and be effective from start.

In the future, it should probably be dynamic and based on
the number of refs in the queue, but this should serve well
as a starting point.

Note: While other fundamentally different data structures may
be more suitable, the DateRevQueue is extremely central to
many of the Git core operations. This approach was chosen,
since the effect of the patch is easy to predict in conjuction
with the current implementation. A totally new data structure
will make it harder to predict behaviour in many common and
uncommon cases (in terms of breaking ties, memory usage, cost
when using few elements, object creation/disposing overhead,
etc).

Change-Id: Ie7b99f40eacf6324bfb4716d82073adeda64d10f

11 years agoUpdate last release version to 2.3.1.201302201838-r 08/10608/1
Matthias Sohn [Sat, 23 Feb 2013 23:11:21 +0000 (00:11 +0100)]
Update last release version to 2.3.1.201302201838-r

Change-Id: I9c6d774526028e56707e15e80370460d964de76e
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>