]> source.dussan.org Git - jgit.git/log
jgit.git
8 years agoMerge "Add testCleanDirsWithSubmodule test to CleanCommandTest"
Christian Halstrick [Sun, 7 Aug 2016 13:37:20 +0000 (09:37 -0400)]
Merge "Add testCleanDirsWithSubmodule test to CleanCommandTest"

8 years agoMerge changes I27961679,I91be6165,If0dbd562
Jonathan Nieder [Sat, 6 Aug 2016 00:36:08 +0000 (20:36 -0400)]
Merge changes I27961679,I91be6165,If0dbd562

* changes:
  LfsProtocolServlet: Allow access to objects in request
  LfsProtocolServlet: Allow getLargeFileRepository to raise exceptions
  Remove references to org.eclipse.jgit.java7

8 years agoShallow fetch/clone: Make --depth mean the total history depth 81/78481/5
Terry Parker [Thu, 4 Aug 2016 18:14:33 +0000 (11:14 -0700)]
Shallow fetch/clone: Make --depth mean the total history depth

cgit changed the --depth parameter to mean the total depth of history
rather than the depth of ancestors to be returned [1]. JGit still uses
the latter meaning, so update it to match cgit.

depth=0 still means a non-shallow clone. depth=1 now means only the
wants rather than the wants and their direct parents.

This is accomplished by changing the semantic meaning of "depth" in
UploadPack and PackWriter to mean the total depth of history desired,
while keeping "depth" in DepthWalk.{RevWalk,ObjectWalk} to mean
the depth of traversal. Thus UploadPack and PackWriter always
initialize their DepthWalks with "depth-1".

[1] upload-pack: fix off-by-one depth calculation in shallow clone
https://code.googlesource.com/git/+/682c7d2f1a2d1a5443777237450505738af2ff1a

Change-Id: I87ed3c0f56c37e3491e367a41f5e555c4207ff44
Signed-off-by: Terry Parker <tparker@google.com>
8 years agoShallow fetch: Respect "shallow" lines 98/78398/8
Terry Parker [Wed, 3 Aug 2016 16:01:22 +0000 (09:01 -0700)]
Shallow fetch: Respect "shallow" lines

When fetching from a shallow clone, the client sends "have" lines
to tell the server about objects it already has and "shallow" lines
to tell where its local history terminates. In some circumstances,
the server fails to honor the shallow lines and fails to return
objects that the client needs.

UploadPack passes the "have" lines to PackWriter so PackWriter can
omit them from the generated pack. UploadPack processes "shallow"
lines by calling RevWalk.assumeShallow() with the set of shallow
commits. RevWalk creates and caches RevCommits for these shallow
commits, clearing out their parents. That way, walks correctly
terminate at the shallow commits instead of assuming the client has
history going back behind them. UploadPack converts its RevWalk to an
ObjectWalk, maintaining the cached RevCommits, and passes it to
PackWriter.

Unfortunately, to support shallow fetches the PackWriter does the
following:

  if (shallowPack && !(walk instanceof DepthWalk.ObjectWalk))
    walk = new DepthWalk.ObjectWalk(reader, depth);

That is, when the client sends a "deepen" line (fetch --depth=<n>)
and the caller has not passed in a DepthWalk.ObjectWalk, PackWriter
throws away the RevWalk that was passed in and makes a new one. The
cleared parent lists prepared by RevWalk.assumeShallow() are lost.
Fortunately UploadPack intends to pass in a DepthWalk.ObjectWalk.
It tries to create it by calling toObjectWalkWithSameObjects() on
a DepthWalk.RevWalk. But it doesn't work: because DepthWalk.RevWalk
does not override the standard RevWalk#toObjectWalkWithSameObjects
implementation, the result is a plain ObjectWalk instead of an
instance of DepthWalk.ObjectWalk.

The result is that the "shallow" information is thrown away and
objects reachable from the shallow commits can be omitted from the
pack sent when fetching with --depth from a shallow clone.

Multiple factors collude to limit the circumstances under which this
bug can be observed:

1. Commits with depth != 0 don't enter DepthGenerator's pending queue.
   That means a "have" cannot have any effect on DepthGenerator unless
   it is also a "want".

2. DepthGenerator#next() doesn't call carryFlagsImpl(), so the
   uninteresting flag is not propagated to ancestors there even if a
   "have" is also a "want".

3. JGit treats a depth of 1 as "1 past the wants".

Because of (2), the only place the UNINTERESTING flag can leak to a
shallow commit's parents is in the carryFlags() call from
markUninteresting(). carryFlags() only traverses commits that have
already been parsed: commits yet to be parsed are supposed to inherit
correct flags from their parent in PendingGenerator#next (which
doesn't happen here --- that is (2)). So the list of commits that have
already been parsed becomes relevant.

When we hit the markUninteresting() call, all "want"s, "have"s, and
commits to be unshallowed have been parsed. carryFlags() only
affects the parsed commits. If the "want" is a direct parent of a
"have", then it carryFlags() marks it as uninteresting. If the "have"
was also a "shallow", then its parent pointer should have been null
and the "want" shouldn't have been marked, so we see the bug. If the
"want" is a more distant ancestor then (2) keeps the uninteresting
state from propagating to the "want" and we don't see the bug. If the
"shallow" is not also a "have" then the shallow commit isn't parsed
so (2) keeps the uninteresting state from propagating to the "want
so we don't see the bug.

Here is a reproduction case (time flowing left to right, arrows
pointing to parents). "C" must be a commit that the client
reports as a "have" during negotiation. That can only happen if the
server reports it as an existing branch or tag in the first round of
negotiation:

  A <-- B <-- C <-- D

First do

  git clone --depth 1 <repo>

which yields D as a "have" and C as a "shallow" commit. Then try

  git fetch --depth 1 <repo> B:refs/heads/B

Negotiation sets up: have D, shallow C, have C, want B.
But due to this bug B is marked as uninteresting and is not sent.

Change-Id: I6e14b57b2f85e52d28cdcf356df647870f475440
Signed-off-by: Terry Parker <tparker@google.com>
8 years agoLfsProtocolServlet: Allow access to objects in request 36/78236/3
David Pursehouse [Mon, 1 Aug 2016 00:50:09 +0000 (09:50 +0900)]
LfsProtocolServlet: Allow access to objects in request

Classes implementing the LFS servlet should be able to inspect the
objects given in the request.

Add a getObjects method. Make the LfsObject class public, and add
accessor methods.

Change-Id: I27961679f620eb3a89dc8521aadd4ea2f936c60e
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoLfsProtocolServlet: Allow getLargeFileRepository to raise exceptions 09/78109/3
David Pursehouse [Fri, 29 Jul 2016 03:37:48 +0000 (12:37 +0900)]
LfsProtocolServlet: Allow getLargeFileRepository to raise exceptions

According to the specification [1] the server may return the following
HTTP error responses:

- 403: The user has read, but not write access.
- 404: The repository does not exist for the user.
- 422: Validation error with one or more of the objects in the request.

In the current implementation, however, getLargeFileRepository can only
return null to indicate an error. This results in the error code:

- 503: Service Unavailable

being returned to the client regardless of what the actual reason was.

Add exception classes to cover these cases, derived from a common base
exception, and change the specification of getLargeFileRepository to throw
the base exception.

In LfsProtocolServlet#post, handle the new exceptions and send back the
appropriate HTTP responses as mentioned above.

The specification also mentions several other optional response codes (406,
429, 501, and 509) but these are not implemented in this commit. It should
be trivial to implement them in follow-up commits.

[1] https://github.com/github/git-lfs/blob/master/docs/api/v1/http-v1-batch.md#response-errors

Change-Id: I91be6165bcaf856d0cefc533882330962e2fc9b2
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoRemove references to org.eclipse.jgit.java7 13/78513/1
David Pursehouse [Fri, 5 Aug 2016 02:10:45 +0000 (11:10 +0900)]
Remove references to org.eclipse.jgit.java7

The bundle org.eclipse.jgit.java7 was removed in 4.0.

Remove references to it from the README.md.

Remove reference to it from org.eclipse.jgit.test/.project, which
causes an error message when opening the project in Eclipse:

  Resource '/org.eclipse.jgit.java7' does not exist.

Change-Id: If0dbd562dcd60550bec3c0f793289474b7624bce
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoMerge changes from topic 'shallowClone'
Jonathan Nieder [Fri, 5 Aug 2016 00:26:52 +0000 (20:26 -0400)]
Merge changes from topic 'shallowClone'

* changes:
  RevWalk: Make fields available to DepthWalk
  Shallow fetch: avoid sending unneeded blobs

8 years agoRevWalk: Make fields available to DepthWalk 97/78397/5
Terry Parker [Wed, 3 Aug 2016 15:36:55 +0000 (08:36 -0700)]
RevWalk: Make fields available to DepthWalk

DepthWalk needs to override toObjectWalkWithSameObjects() and thus
needs to be able to directly set the objects and freeFlags fields, so
make them package private.

Change-Id: I24561b82c54ba3d6522582ca25105b204d777074
Signed-off-by: Terry Parker <tparker@google.com>
8 years agoShallow fetch: avoid sending unneeded blobs 41/78341/5
Terry Parker [Tue, 2 Aug 2016 15:53:06 +0000 (08:53 -0700)]
Shallow fetch: avoid sending unneeded blobs

When doing an incremental fetch from JGit, "have" commits are marked
as "uninteresting". In a non-shallow fetch, when the RevWalk hits an
"uninteresting" commit it marks the commit's corresponding tree as
uninteresting. That has the effect of dropping those trees and all the
trees and blobs they reference out of the thin pack returned to the
client.

However, shallow fetches use a DepthWalk to limit the RevWalk, which
nearly always causes the RevWalk to terminate before encountering the
"have" commits. As a result the pack created for the incremental fetch
never encounters "uninteresting" tree objects and thus includes
duplicate objects that it knows the client already has.

Change-Id: I7b1f7c3b0d83e04d34cd2fa676f1ad4fec904c05
Signed-off-by: Terry Parker <tparker@google.com>
8 years agoMerge "PackWriterTest: Improve readability"
Terry Parker [Thu, 4 Aug 2016 23:19:06 +0000 (19:19 -0400)]
Merge "PackWriterTest: Improve readability"

8 years agoPackWriterTest: Improve readability 42/78342/4
Terry Parker [Tue, 2 Aug 2016 16:30:40 +0000 (09:30 -0700)]
PackWriterTest: Improve readability

Add wants() and haves() static utility functions to improve readability.

Change-Id: I4d44e17a9af97c0203e2ebe112eabb1f67d272a6
Signed-off-by: Terry Parker <tparker@google.com>
8 years agoAdd testCleanDirsWithSubmodule test to CleanCommandTest 98/78098/6
Matthaus Owens [Fri, 29 Jul 2016 16:52:04 +0000 (09:52 -0700)]
Add testCleanDirsWithSubmodule test to CleanCommandTest

This commit adds some test coverage to cleaning a repository with a
submodule, which did not previously exist.

Bug: 498367
Change-Id: Ia5c4e4cc53488800dd486f8556dc57656783f1c4
Signed-off-by: Matthaus Owens <matthaus@puppetlabs.com>
8 years agoDiffFormatter: Support setting a reader without a repo 09/78409/2
Dave Borowitz [Wed, 3 Aug 2016 20:19:05 +0000 (16:19 -0400)]
DiffFormatter: Support setting a reader without a repo

Change-Id: I575cdb9c0a9a341b79ef5e3c7a35e68cde142540

8 years agoMerge "RefSpec: Make WildcardMode public"
Jonathan Nieder [Thu, 28 Jul 2016 18:47:05 +0000 (14:47 -0400)]
Merge "RefSpec: Make WildcardMode public"

8 years agoRefSpec: Make WildcardMode public 83/78083/3
Stefan Beller [Thu, 28 Jul 2016 18:29:38 +0000 (11:29 -0700)]
RefSpec: Make WildcardMode public

We have to be able to access the enum from outside the package as part of
the API.

Change-Id: I4bdc6bd53a14237c5f4fb9397ae850f9a24c4cfb
Signed-off-by: Stefan Beller <sbeller@google.com>
8 years agoFix typo in email address in copyright headers 38/78038/1
David Pursehouse [Thu, 28 Jul 2016 07:04:55 +0000 (16:04 +0900)]
Fix typo in email address in copyright headers

Change-Id: Ib7b73d7d37574682bb58f969822c842e4e579233
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoLfsServerTest: Treat response body as UTF-8 when decoding error message 31/78031/1
David Pursehouse [Thu, 28 Jul 2016 03:16:24 +0000 (12:16 +0900)]
LfsServerTest: Treat response body as UTF-8 when decoding error message

Change-Id: I495f0b60b7128fff27502641e6a5d05f888d4e8a
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoLfsProtocolServlet: Pass request and path to getLargeFileRepository 52/77852/5
David Pursehouse [Mon, 25 Jul 2016 05:43:33 +0000 (14:43 +0900)]
LfsProtocolServlet: Pass request and path to getLargeFileRepository

Passing the request and path to the method will allow implementations
to have more control over determination of the backend, for example:

- return different backends for different requests
- accept or refuse requests based on request characteristics
- etc

Change-Id: I1ec6ec54c91a5f0601b620ed18846eb4a3f46783
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoFileLfsServlet: Include error message in response body 57/77757/6
David Pursehouse [Fri, 22 Jul 2016 05:35:18 +0000 (14:35 +0900)]
FileLfsServlet: Include error message in response body

According to the specification [1], the error response body must
include the error message in json format.

[1] https://github.com/github/git-lfs/blob/master/docs/api/v1/http-v1-batch.md#response-errors

Change-Id: I79e7a841d230fdedefa53b9c6d2d477e81e1f9e6
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoFileLfsServlet: Return HTTP 422 instead of 400 60/77760/4
David Pursehouse [Fri, 22 Jul 2016 08:21:20 +0000 (17:21 +0900)]
FileLfsServlet: Return HTTP 422 instead of 400

According to the specification [1], the error response status code
should be 422 when there is a validation error with one or more of
the objects in the request

[1] https://github.com/github/git-lfs/blob/master/docs/api/v1/http-v1-batch.md#response-errors

Change-Id: Id03fe00a2109b896d9a154228a14a33bce5accc3
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoRepository: Log negative useCnt message together with stack trace 43/77743/3
David Pursehouse [Fri, 22 Jul 2016 05:05:19 +0000 (14:05 +0900)]
Repository: Log negative useCnt message together with stack trace

The message "close() called when useCnt is already zero" is logged with
level warning, and then if debug logging is enabled, the stack trace is
logged separately with level debug.

Log the message and the stack trace in the same call, so that they always
appear together in the output rather than potentially interleaved with
other log statements.

Change-Id: I1b5c1557ddc2d19f3f5b29baec96e62bc467d88a
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoMergeFormatter: Suppress warning about unchecked conversion 73/77873/2
David Pursehouse [Tue, 26 Jul 2016 01:16:18 +0000 (10:16 +0900)]
MergeFormatter: Suppress warning about unchecked conversion

The warning can be fixed by adding a type to the argument, but doing so
breaks the API and previous attempts to fix it in that way [1, 2] were
reverted [3, 4].

[1] https://git.eclipse.org/r/#/c/45709/
[2] https://git.eclipse.org/r/#/c/66602/
[3] https://git.eclipse.org/r/#/c/49400/
[4] https://git.eclipse.org/r/#/c/66659/

Change-Id: I01dd52e09da24f70d408ffa96e21c129a79041ea
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoAnnotate Sets#of with @SafeVarArgs to prevent heap pollution warning 67/77667/3
David Pursehouse [Thu, 21 Jul 2016 09:45:27 +0000 (18:45 +0900)]
Annotate Sets#of with @SafeVarArgs to prevent heap pollution warning

This prevents the warning:

  Potential heap pollution via varargs parameter

The method doesn't do any casting of types that would cause the heap
pollution, so it should be safe to add @SafeVarArgs.

See [1] for information about this warning.

[1] http://stackoverflow.com/a/12462259/381622

Change-Id: Ic6d252915ea44b4f1c385afecb98906cd2c54382
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoArchive: Make project name consistent with other subprojects' 66/77666/3
David Pursehouse [Thu, 21 Jul 2016 08:37:32 +0000 (17:37 +0900)]
Archive: Make project name consistent with other subprojects'

Change-Id: I8341f3340d8129b4f966d541097269210fbf65d2
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoIgnore 'The value of exception parameter is not used' warning 05/77305/5
David Pursehouse [Thu, 14 Jul 2016 13:59:19 +0000 (22:59 +0900)]
Ignore 'The value of exception parameter is not used' warning

Change-Id: I50407e4a33e35b718ca40503fdd436f1f9f70fba
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoUpdate links to LFS API documentation 06/77306/6
David Pursehouse [Thu, 14 Jul 2016 14:14:54 +0000 (23:14 +0900)]
Update links to LFS API documentation

The location of the API v1 documentation has changed. Update the
links accordingly.

Change-Id: If0148a0b573c474bbe157fcb7e6674c0055fe8b4
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoMerge branch 'stable-4.4' 55/77655/2
David Pursehouse [Thu, 21 Jul 2016 07:07:04 +0000 (16:07 +0900)]
Merge branch 'stable-4.4'

* stable-4.4:
  JGit v4.4.1.201607150455-r
  RefDirectory: remove ref lock file for following ref dir removal

Change-Id: Ifc8a782efd7f2f991e70ad2a3691a8dba66c7554
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoRefSpecs: allow construction of weird wildcarded RefSpecs 38/77738/11
Stefan Beller [Fri, 22 Jul 2016 18:39:50 +0000 (11:39 -0700)]
RefSpecs: allow construction of weird wildcarded RefSpecs

Gerrit's superproject subscription feature uses RefSpecs to formalize
the ACLs of when the superproject subscription feature is allowed.

As this is a slightly different use case than describing a local/remote
pair of refs, we need to be more permissive. Specifically we want to allow:

    refs/heads/*
    refs/heads/*:refs/heads/master
    refs/heads/master:refs/heads/*

Introduce a new constructor, that allows constructing these RefSpecs.

Change-Id: I46c0bea9d876e61eb2c8d50f404b905792bc72b3
Signed-off-by: Stefan Beller <sbeller@google.com>
8 years agoRefSpec: reject refs ending in '/' 33/77733/5
Stefan Beller [Thu, 21 Jul 2016 21:21:57 +0000 (14:21 -0700)]
RefSpec: reject refs ending in '/'

We had a case in Gerrits superproject subscriptions where
'refs/heads/' was configured with the intention to mean 'refs/heads/*'.

The first expression lacks the '*', which is why it is not considered
a wildcard but it was considered valid and so was not found early to be
a typo.

Refs are not allowed to end with '/' anyway, so add a check for that.

Change-Id: I3ffdd9002146382acafb4fbc310a64af4cc1b7a9
Signed-off-by: Stefan Beller <sbeller@google.com>
8 years agoMerge "Push implementation of option strings"
Terry Parker [Fri, 22 Jul 2016 23:27:17 +0000 (19:27 -0400)]
Merge "Push implementation of option strings"

8 years agoPush implementation of option strings 70/74570/49
Dan Wang [Fri, 3 Jun 2016 23:39:45 +0000 (16:39 -0700)]
Push implementation of option strings

Example usage:
$ ./jgit push \
  --push-option "Reviewer=j.doe@example.org" \
  --push-option "<arbitrary string>" \
  origin HEAD:refs/for/master
Stefan Beller has also made an equivalent change to CGit:
http://thread.gmane.org/gmane.comp.version-control.git/299872

Change-Id: I6797e50681054dce3bd179e80b731aef5e200d77
Signed-off-by: Dan Wang <dwwang@google.com>
8 years agoDfsObjDatabase: Add lazy last modified method to PackList 43/77543/2
Dave Borowitz [Tue, 19 Jul 2016 17:05:27 +0000 (13:05 -0400)]
DfsObjDatabase: Add lazy last modified method to PackList

Change-Id: Id045f162fa584ea14da29a9df58a42c53a78dc15

8 years agoMerge changes I159e9154,I06c722b2
Dave Borowitz [Tue, 19 Jul 2016 14:51:51 +0000 (10:51 -0400)]
Merge changes I159e9154,I06c722b2

* changes:
  DfsObjectDatabase: Expose PackList and move markDirty there
  Invalidate DfsObjDatabase pack list when refs are updated

8 years agoDfsObjectDatabase: Expose PackList and move markDirty there 21/77321/5
Dave Borowitz [Thu, 14 Jul 2016 16:11:51 +0000 (12:11 -0400)]
DfsObjectDatabase: Expose PackList and move markDirty there

What's invalidated when an object database is "dirty" is not the whole
database, but rather a specific list of packs. If there is a race
between getting the pack list and setting the volatile dirty flag
where the packs are rescanned, we don't need to mark the new pack list
as dirty.

This is a fine point that only really applies if the decision of
whether or not to mark dirty actually requires introspecting the pack
list (say, its timestamps). The general operation of "take whatever
is the current pack list and mark it dirty" may still be inherently
racy, but the cost is not so high.

Change-Id: I159e9154bd8b2d348b4e383627a503e85462dcc6

8 years agoBatchRefUpdate: Remove unused namesToCheck variable 73/77373/5
Dan Wang [Fri, 15 Jul 2016 01:49:29 +0000 (18:49 -0700)]
BatchRefUpdate: Remove unused namesToCheck variable

This variable has been populated and never used since it was
introduced in commit 5cf53fdacf28d5cabe7ad1ed154fe7f4971225a9
(Speed up clone/fetch with large number of refs, 2013-02-18).
Noted by FindBugs:
"BatchRefUpdate.java:359, UC_USELESS_OBJECT, Priority: Normal"

Change-Id: I7aacb49540aaee4a83db3d38b15633bb6c4773d0
Signed-off-by: Dan Wang <dwwang@google.com>
8 years agoJGit v4.4.1.201607150455-r 78/77378/1 v4.4.1.201607150455-r
Matthias Sohn [Fri, 15 Jul 2016 08:54:36 +0000 (10:54 +0200)]
JGit v4.4.1.201607150455-r

Change-Id: I61dbc29a962c8185fb356fe1ca30a1e673166d47
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoMerge "RefDirectory: remove ref lock file for following ref dir removal" into stable-4.4
Christian Halstrick [Fri, 15 Jul 2016 08:43:50 +0000 (04:43 -0400)]
Merge "RefDirectory: remove ref lock file for following ref dir removal" into stable-4.4

8 years agoFix AppServer build errors in Eclipse with <4.6 target platforms 51/77351/1
Matthias Sohn [Thu, 14 Jul 2016 20:59:14 +0000 (22:59 +0200)]
Fix AppServer build errors in Eclipse with <4.6 target platforms

9aa3748 added dummy implementations for loadRoleInfo() and
loadUserInfo() to class MappedLoginService to fix compile errors in
Eclipse when using 4.6 target platform which brings Jetty 9.3 adding
these two methods. Unfortunately this causes errors when using non 4.6
target platform coming with an older Jetty version. Fix this by
extracting the anonymous subclass of MappedLoginService which allows to
suppress the unused private method errors in Eclipse.

Change-Id: I75baeea7ff4502ce9ef2b541b3c0555da5535d79
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoInvalidate DfsObjDatabase pack list when refs are updated 19/77319/4
Dave Borowitz [Thu, 14 Jul 2016 15:40:55 +0000 (11:40 -0400)]
Invalidate DfsObjDatabase pack list when refs are updated

Currently, there is a race where a user of a DfsRepository in a single
thread may get unexpected MissingObjectExceptions trying to look up an
object that appears as the current value of a ref:

1. Thread A scans packs before scanning refs, for example by reading
   an object by SHA-1.
2. Thread B flushes an object and updates a ref to point to that
   object.
3. Thread A looks up the ref updated in (2). Since it is scanning refs
   for the first time, it sees the new object SHA-1.
4. Thread A tries to read the object it found in (3), using the cached
   pack list it got from (1). The object appears missing.

Allow implementations to work around this by marking the object
database's current pack list as "dirty." A dirty pack list means that
DfsReader will rescan packs and try again if a requested object is
missing. Implementations should mark objects as dirty any time the ref
database reads or scans refs that might be newer than a previously
cached pack list.

Change-Id: I06c722b20c859ed1475628ec6a2f6d3d6d580700

8 years agoMerge branch 'stable-4.4' 46/77146/1
Matthias Sohn [Tue, 12 Jul 2016 15:12:41 +0000 (17:12 +0200)]
Merge branch 'stable-4.4'

* stable-4.4:
  Log if Repository.useCnt becomes negative
  Time based eviction strategy for repository cache
  Add method to read time unit from config
  Align include.path max depth with native git
  Config load should not fail on unsupported or nonexistent include path
  Allow using JDK 7 bootclasspath when compiling JGit using Java 8
  Extract work queue to allow reusing it

Change-Id: I6aeedb1cb8b0c3068af344a719c80a03ae68fc23
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoLog if Repository.useCnt becomes negative 65/76865/3
Matthias Sohn [Thu, 7 Jul 2016 14:57:49 +0000 (16:57 +0200)]
Log if Repository.useCnt becomes negative

We observe in Gerrit 2.12 that useCnt can become negative in rare cases.
Log this to help finding the bug.

Change-Id: Ie91c7f9d190a5d7cf4733d4bf84124d119ca20f7
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoTime based eviction strategy for repository cache 04/74904/9
Christian Halstrick [Mon, 30 May 2016 14:09:58 +0000 (16:09 +0200)]
Time based eviction strategy for repository cache

When Repository.close() decrements the useCount to 0 currently the cache
immediately evicts the repository from WindowCache and RepositoryCache.
This leads to I/O overhead on busy repositories because pack files and
references are inserted and deleted from the cache frequently.

This commit defers the eviction of a repository from the caches until
last use of the repository is older than time to live. The eviction is
handled by a background task running periodically.

Add two new configuration parameters:
* core.repositoryCacheExpireAfter: cache entries are evicted if the
cache entry wasn't accessed longer than this time in milliseconds
* core.repositoryCacheCleanupDelay: defines the interval in milliseconds
for running a background task evicting expired cache entries. If set to
-1 the delay is set to min(repositoryCacheExpireAfter, 10 minutes). If
set to 0 the time based eviction is switched off and no background task
is started. If time based eviction is switched off the JVM can still
evict cache entries if heap memory is running low.

Change-Id: I4a0214ad8b4a193985dda6a0ade63b70bdb948d7
Also-by: Matthias Sohn <matthias.sohn@sap.com>
Also-by: Hugo Arès <hugo.ares@ericsson.com>
Also-by: Sasa Zivkov <sasa.zivkov@sap.com>
8 years agoAdd method to read time unit from config 64/76864/3
Hugo Arès [Fri, 3 Jun 2016 13:11:58 +0000 (09:11 -0400)]
Add method to read time unit from config

Time units supported:

-milliseconds (1 ms, 2 milliseconds)
-seconds (1 s, 1 sec, 1 second, 2 seconds)
-minutes (1 m, 1 min, 1 minute, 2 minutes)
-hours (1 h, 1 hr, 1 hour, 2 hours)
-days (1 d, 1 day, 2 days)
-weeks (1 w, 1 week, 2 weeks)
-months (1 mon, 1 month, 2 months)
-years (1 y, 1 year, 2 years)

This functionality is implemented in Gerrit ConfigUtil class. Add it to
JGit so it can eventually be remove from Gerrit.

Change-Id: I2d6564ff656b6ab9424a9360624061c94fd5f413
Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoImplement new abstract MappedLoginService methods added in Jetty 9.3 03/77003/2
Matthias Sohn [Sun, 10 Jul 2016 22:27:56 +0000 (00:27 +0200)]
Implement new abstract MappedLoginService methods added in Jetty 9.3

Eclipse Neon comes with Jetty 9.3 which is causing unimplemented
abstract method errors in test class AppServer when using the JGit or
EGit Neon target platform. Fix this by adding dummy implementations.

Change-Id: Ie49107d814a846997de95f149e91fe1ec2fbe4d8
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoDfsGarbageCollector: avoid closing idx and bitmap streams twice 16/76916/1
Jonathan Nieder [Thu, 7 Jul 2016 23:08:02 +0000 (16:08 -0700)]
DfsGarbageCollector: avoid closing idx and bitmap streams twice

These try-with-resources blocks close the underlying output stream
twice: once when closing the CountingOutputStream wrapper, then again
when closing the DfsOutputStream out.

Simplify by only closing the CountingOutputStream.

In practice this shouldn't matter because the close() method of a
Closable is required to be idempotent, but avoiding the redundant
extra close makes the code simpler to read and understand.

Change-Id: I1778c4fc8ba075a2c6cd2129528bb272cb3a1af7

8 years agoFix unclosed resource warnings in FileTreeIteratorTest 55/76555/2
Matthias Sohn [Mon, 4 Jul 2016 21:36:33 +0000 (23:36 +0200)]
Fix unclosed resource warnings in FileTreeIteratorTest

Change-Id: I75ea7deca64a707cd6b5c61c3c83062f20041684
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoFix assertion in SmartClientSmartServerTest.testPush_CreateBranch() 84/76484/2
Matthias Sohn [Sun, 3 Jul 2016 23:02:26 +0000 (01:02 +0200)]
Fix assertion in SmartClientSmartServerTest.testPush_CreateBranch()

This assertion only defined a message but didn't assert anything.

Change-Id: I0914642b64b69dc4e3ec24acbf8052f9171613d8
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoReceivePack: report protocol parsing failures on channel 3 27/76627/3
Shawn Pearce [Tue, 5 Jul 2016 20:05:04 +0000 (13:05 -0700)]
ReceivePack: report protocol parsing failures on channel 3

If the client sent a well-formed enough request to see it wants to use
side-band-64k for status reporting (meaning its a modern client), but
any other command record was somehow invalid (e.g. corrupt SHA-1)
report the parsing exception using channel 3.  This allows clients to
see the failure and know the server will not be continuing.

git-core and JGit clients send all commands and then start a sideband
demux before sending the pack. By consuming all commands first we get
the client into a state where it can see and respond to the channel 3
server failure.

This behavior is useful on HTTPS connections when the client is buggy
and sent a corrupt command, but still managed to request side-band-64k
in the first line.

Change-Id: If385b91ceb9f024ccae2d1645caf15bc6b206130

8 years agoReceivePack: catch InvalidObjectIdException while parsing shallow 52/76652/2
Shawn Pearce [Tue, 5 Jul 2016 20:00:02 +0000 (13:00 -0700)]
ReceivePack: catch InvalidObjectIdException while parsing shallow

The "shallow $id" parsing can also throw InvalidObjectIdException,
just like parseCommand. Move it into its own method with a proper
try-catch block to convert to the checked PackProtocolException.

Change-Id: I6839b95f0bc4fbf4d2c213331ebb9bd24ab2af65

8 years agoReceivePack: remove unnecessary try-catch around parseCommand 51/76651/1
Shawn Pearce [Tue, 5 Jul 2016 19:57:58 +0000 (12:57 -0700)]
ReceivePack: remove unnecessary try-catch around parseCommand

This exception is already handled in the outer catch block.

Change-Id: Ifc04b8e138732a97b9c0ee323af923b8e52a7f8e

8 years agoReceivePack: enable capabilities immediately on first line 50/76650/1
Shawn Pearce [Tue, 5 Jul 2016 19:37:26 +0000 (12:37 -0700)]
ReceivePack: enable capabilities immediately on first line

Instead of deferring until after command parsing, enable the
capabilities after the first pkt-line has been read from the client.
This allows the server to setup the side-band-64k channel immediately.

Change-Id: I141b7fc92e983a41d3a58da8e1464a6917422b6c

8 years agoReceivePack: Use Java 7 multi-catch for unpackError 49/76649/1
Shawn Pearce [Tue, 5 Jul 2016 19:35:26 +0000 (12:35 -0700)]
ReceivePack: Use Java 7 multi-catch for unpackError

Change-Id: I328f5952f23185a7d8f81a144979b4f8a095bd60

8 years agoPushConnectionTest: Use Java 7 try-with-resources 48/76648/1
Shawn Pearce [Tue, 5 Jul 2016 19:32:24 +0000 (12:32 -0700)]
PushConnectionTest: Use Java 7 try-with-resources

Change-Id: I429066d2af9c5fb8bf8bc038b99ebe5a7dc09170

8 years agopush: Report fatal server errors during pack writing 65/76565/2
Shawn Pearce [Tue, 5 Jul 2016 05:10:55 +0000 (22:10 -0700)]
push: Report fatal server errors during pack writing

If the push client has requested side-band support the server can
signal a fatal error parsing the pack using the error channel (3)
and then hang up. This may cause the PackWriter to fail to write to
data onto the network socket, which throws a misleading error back
up to the application and the user.

During a write failure poll the input to see if the side band system
can parse out an error message off channel 3. This should be fast as
there will either be an error present in the buffer, or the remote will
also have hung-up on the side band channel. In the case of a hang-up
just rethrow the original IOException as its a network error.

This roughly matches what C git does; once commands are sent and the
packer is started a new thread runs in the background to decode any
possible server error during unpacking on the remote peer

Change-Id: Idb37a4a122a565ec4b59130e08c27d963ba09395

8 years agoReceivePack: Catch InvalidObjectIdException instead of IAE 62/76562/2
Shawn Pearce [Tue, 5 Jul 2016 01:26:53 +0000 (18:26 -0700)]
ReceivePack: Catch InvalidObjectIdException instead of IAE

The more specific type InvalidObjectIdException is thrown by
ObjectId.fromString().  Use it here in ReceivePack as the more
generic IAE is never thrown by the body of the try-catch block.

Change-Id: I53fc13c561c7d429a50b5eb82773f1a670431c54

8 years agoUploadPack: Include peeled ObjectId as advertised 60/76560/2
Shawn Pearce [Tue, 5 Jul 2016 00:23:47 +0000 (17:23 -0700)]
UploadPack: Include peeled ObjectId as advertised

A RefAdvertiser writing to the network includes both the reference's
ObjectId and its peeled ObjectId in the advertised set.  In smart HTTP
negotiation requests may bypass the RefAdvertiser and quickly build
the set based on current refs; include the peeled ObjectIds to match
behavior with the normal bidirectional protocols on git:// and SSH.

Change-Id: I5371bed60da36e8d12c4ad9a5c1d91a0f0ad486b

8 years agoMerge "UploadPack: Remove duplicate sentReady assignment"
Christian Halstrick [Tue, 5 Jul 2016 06:28:56 +0000 (02:28 -0400)]
Merge "UploadPack: Remove duplicate sentReady assignment"

8 years agoUploadPack: Remove duplicate sentReady assignment 59/76559/1
Shawn Pearce [Tue, 5 Jul 2016 00:19:06 +0000 (17:19 -0700)]
UploadPack: Remove duplicate sentReady assignment

This field was being set twice within the block.  Setting it just once
is sufficient.  writeString() does not examine the field so it is fine
to set it after the call.

Change-Id: Ib4c74df4f1304e9df3015885bf360bf0d7bc6ca2

8 years agoMerge "Remove duplicate LFS feature from P2 repository"
Matthias Sohn [Mon, 4 Jul 2016 22:45:37 +0000 (18:45 -0400)]
Merge "Remove duplicate LFS feature from P2 repository"

8 years agoMerge "UploadPack: Correct typo of negotiation in Javadoc"
Matthias Sohn [Mon, 4 Jul 2016 22:23:52 +0000 (18:23 -0400)]
Merge "UploadPack: Correct typo of negotiation in Javadoc"

8 years agoRemove duplicate LFS feature from P2 repository 96/76496/2
Christian Halstrick [Mon, 4 Jul 2016 09:35:22 +0000 (11:35 +0200)]
Remove duplicate LFS feature from P2 repository

Change-Id: I1887e7f5c8b34b38fa1d6d699bf637c93bc36e7c

8 years agoUploadPack: Correct typo of negotiation in Javadoc 53/76553/1
Shawn Pearce [Mon, 4 Jul 2016 21:35:40 +0000 (14:35 -0700)]
UploadPack: Correct typo of negotiation in Javadoc

Change-Id: Ibab89fddda7ccfe3390348aa129ab2e5e3b7f538

8 years agoRemove no longer needed API problem filters 83/76483/1
Matthias Sohn [Sun, 3 Jul 2016 22:49:24 +0000 (00:49 +0200)]
Remove no longer needed API problem filters

Change-Id: I2332ce2f29e105b60b62a9a6fc7d4656a0c89343
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoEnhance test coverage when core.filemode is false 41/69841/3
Christian Halstrick [Mon, 4 Apr 2016 13:14:10 +0000 (15:14 +0200)]
Enhance test coverage when core.filemode is false

Some branches in WorkingTreeIterator.getIndexFileMode() have not been
covered by tests. Enhance the tests to increase test coverage.

Change-Id: I400a221048f0f6cbaa987350eaf998b0ebb50a4e

8 years agoFix typo in system config error message 64/75964/2
Michael Keppler [Sat, 25 Jun 2016 13:30:56 +0000 (15:30 +0200)]
Fix typo in system config error message

Change-Id: I14daca6c81b003123e5862b384718fe06fb3ebd0
Signed-off-by: Michael Keppler <michael.keppler@gmx.de>
8 years agoAdd configureJSch method to allow configuration of JSch objects 07/75607/5
markdingram [Tue, 21 Jun 2016 16:31:20 +0000 (17:31 +0100)]
Add configureJSch method to allow configuration of JSch objects

Example use case is to set a different IdentityRepository, for example,
a RemoteIdentityRepository to allow SSH Agent supplied credentials.

Change-Id: Id4a4afd64464e452ffe6d6ad49036f9e283b4655
Signed-off-by: markdingram <markdingram@gmail.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoRemove duplicated single quotes in text not handled by MessageFormat 31/76231/2
Markus Keller [Wed, 29 Jun 2016 17:28:54 +0000 (19:28 +0200)]
Remove duplicated single quotes in text not handled by MessageFormat

Change-Id: I4b803b34d30a86105d111be417d4a4e6bfb1057b
Signed-off-by: Markus Keller <markus_keller@ch.ibm.com>
8 years agoMerge changes from topic 'dfs-gc'
Shawn Pearce [Mon, 27 Jun 2016 15:52:00 +0000 (11:52 -0400)]
Merge changes from topic 'dfs-gc'

* changes:
  Prune UNREACHABLE_GARBAGE packs when they expire
  Use try-with-resources in DfsGarbageCollector.writePack
  Fix lastModified to be consistent in DfsGarbageCollector
  Add GC_REST PackSource to better order DFS packs

8 years agoPrune UNREACHABLE_GARBAGE packs when they expire 18/76018/1
Mike Williams [Fri, 17 Jun 2016 15:34:36 +0000 (11:34 -0400)]
Prune UNREACHABLE_GARBAGE packs when they expire

DfsGarbageCollector will now enforce a maximum time to live (TTL) for
UNREACHABLE_GARBAGE packs.  The default TTL is 1 day, which should be
enough time to avoid races with other processes that are inserting
data into the repository.

Change-Id: Id719e6e2a03cfc9a0c0aef8ed71d261dda14bd0c
Signed-off-by: Mike Williams <miwilliams@google.com>
8 years agoAlign include.path max depth with native git 47/75347/3
Hugo Arès [Wed, 15 Jun 2016 19:14:06 +0000 (15:14 -0400)]
Align include.path max depth with native git

Change-Id: I52f059816e1d94b2d60d096e3013bf4095cd0fc4
Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>
8 years agoConfig load should not fail on unsupported or nonexistent include path 46/75346/4
Hugo Arès [Wed, 15 Jun 2016 18:40:05 +0000 (14:40 -0400)]
Config load should not fail on unsupported or nonexistent include path

1f86350 added initial support for include.path. Relative path and path
with tilde are not yet supported but config load was failing if one of
those 2 unsupported options was encountered. Another problem was that
config load was failing if the include.path file did not exist.

Change the behavior to be consistent with native git. Ignore unsupported
or nonexistent include.path.

Bug: 495505
Bug: 496732
Change-Id: I7285d0e7abb6389ba6983e9c46021bea4344af68
Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>
8 years agoUse try-with-resources in DfsGarbageCollector.writePack 82/75982/1
Shawn Pearce [Sun, 26 Jun 2016 18:28:29 +0000 (11:28 -0700)]
Use try-with-resources in DfsGarbageCollector.writePack

Change-Id: I9a73125581b4d760b733fd045c3436c2aaaab730

8 years agoFix lastModified to be consistent in DfsGarbageCollector 81/75981/1
Shawn Pearce [Sun, 26 Jun 2016 18:18:59 +0000 (11:18 -0700)]
Fix lastModified to be consistent in DfsGarbageCollector

Set all packs written by the DfsGarbageCollector to use the same
starting timestamp as lastModified. This makes it easier to see
which packs came from the same DfsGarbageCollector run, as they
share the same timestamp.

Change-Id: Id633573fbc3f0f360887b4745cacf33d6fc09320

8 years agoAdd GC_REST PackSource to better order DFS packs 80/75980/2
Shawn Pearce [Sun, 26 Jun 2016 17:58:38 +0000 (10:58 -0700)]
Add GC_REST PackSource to better order DFS packs

Force reads to use a search ordering of:

  INSERT / RECEIVE
  COMPACT
  GC (heads)
  GC_REST (non-heads)
  GC_TXN (refs/txn)
  UNREACHABLE_GARBAGE

This has provided decent performance for object lookups.  Starting
from an arbitrary reference may find the content in a newer pack
created by DfsObjectInserter or a ReceivePack server.  Compaction of
recent packs also contains newer content, and then most interesting
data is in the "main" GC pack.  As the GC pack is self-contained (has
no edges leading outside) readers typically do not need to go further.

Adding a new GC_REST PackSource allows the DfsGarbageCollector to
identify to the pack ordering code which pack is which, so the
non-heads are scanned second during reads.  This removes a hack that
was unique to Google's implementation that enforced this behavior by
fixing up the lastModified timestamp.

Renumber the PackSource's categories to reflect this search ordering.

Change-Id: I19fdaab8a8d6687cbe8c88488e6daa0630bf189a

8 years agoFix TreeWalk to reset attributes cache for each entry 57/75857/1
Christian Halstrick [Thu, 23 Jun 2016 15:08:45 +0000 (17:08 +0200)]
Fix TreeWalk to reset attributes cache for each entry

Treewalk has a member 'attr' which caches the attributes for the current
entry. We did not reset the cache always when moving to next entry. The
effect was that when there are no attributes for an entry 'a' but 'a'
was skipped by a Treewalk filter then Treewalk stopped looking for
attributes until TreeWalk.next() was called again.

Change-Id: Ied39b7fb5f56afe7a237da17801003d0abe6b1c7

8 years agoFix DirCacheCheckout to return CheckoutConflictException 43/75443/6
Christian Halstrick [Fri, 17 Jun 2016 14:41:14 +0000 (16:41 +0200)]
Fix DirCacheCheckout to return CheckoutConflictException

Problem occurs when the checkout wants to create a file 'd/f' but
the workingtree contains a dirty file 'd'. In order to create d/f the
file 'd' would have to be deleted and since the file is dirty that
content would be lost. This should lead to a CheckoutConflictException
for d/f when failOnConflict was set to true.

This fix also changes jgit checkout semantics to be more like native
gits checkout semantics. If during a checkout jgit wants to delete a
folder but finds that the working tree contains a dirty file at this
path then JGit will now throw an exception instead of silently keeping
the dirty file. Like in this example:

git init
touch b
git add b
git commit -m addB
mkdir a
touch a/c
git add a/c
git commit -m addAC
rm -fr a
touch a
git checkout HEAD~

Change-Id: I9089123179e09dd565285d50b0caa308d290cccd
Signed-off-by: Rüdiger Herrmann <ruediger.herrmann@gmx.de>
Also-by: Rüdiger Herrmann <ruediger.herrmann@gmx.de>
8 years agoMerge "Extract work queue to allow reusing it" into stable-4.4
Matthias Sohn [Tue, 21 Jun 2016 15:59:15 +0000 (11:59 -0400)]
Merge "Extract work queue to allow reusing it" into stable-4.4

8 years agoAllow using JDK 7 bootclasspath when compiling JGit using Java 8 29/75529/3
Matthias Sohn [Sun, 19 Jun 2016 10:45:37 +0000 (12:45 +0200)]
Allow using JDK 7 bootclasspath when compiling JGit using Java 8

When compiling jgit using Java 8 set system property JDK_HOME to
JAVA_HOME path of JDK7 installation to compile against JDK 7 class
libraries. Otherwise jgit may hit runtime exceptions when running on
Java 7 (e.g. return type of ConcurrentHashMap.keySet() in JDK 8 class
library doesn't exist in JDK 7).

Example:
$ mvn clean install -DJDK_HOME=/.../jdk1.7.0_80.jdk/Contents/Home

Bug: 496262
Change-Id: Ib6abe5e544e0492e08b342e1a34b182caf25f94f
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoOptimize RefAdvertiser for wire protocol 24/75524/1
Shawn Pearce [Sun, 19 Jun 2016 04:40:35 +0000 (21:40 -0700)]
Optimize RefAdvertiser for wire protocol

The native wire protocol sends ref advertisements in the pkt-line
format, which requires encoding the ObjectId and ref name onto a byte
sequence.  Busy servers show this is a very high source of garbage,
which pushes the garbage collector harder when there are many refs in
the repository (e.g.  70k, in a Gerrit managed repository).

Optimize the side band advertiser by retaining the CharsetEncoder,
minimizing the amount of temporary garbage built during encoding.

Change-Id: I406c654bf82c1eb94b38862da2425e98396134cb

8 years agoMerge branch 'stable-4.4' 98/75198/1
Matthias Sohn [Mon, 13 Jun 2016 22:11:37 +0000 (00:11 +0200)]
Merge branch 'stable-4.4'

* stable-4.4:
  Prepare 4.4.1-SNAPSHOT builds
  JGit v4.4.0.201606070830-r
  Prepare 4.4.0-SNAPSHOT builds
  JGit v4.4.0.201606011500-rc2
  Prepare 4.4.0-SNAPSHOT builds
  JGit v4.4.0.201605250940-rc1
  Update Orbit repository for Neon to R20160520211859
  Fix computation of id in WorkingTreeIterator with autocrlf and
    smudging
  Prepare 4.3.2-SNAPSHOT builds
  JGit v4.3.1.201605051710-r
  Prepare 4.4.0-SNAPSHOT builds
  JGit v4.4.0.201605041135-m1
  Run Maven build in release.sh concurrently to speedup release

Change-Id: I25ef0497a4455b8229b453e1023abb4631d4b6d3
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoRefDirectory: remove ref lock file for following ref dir removal 45/73745/4
Marco Miller [Wed, 25 May 2016 20:45:13 +0000 (16:45 -0400)]
RefDirectory: remove ref lock file for following ref dir removal

Before this fix, ref directory removal did not work. That was because
the ref lock file was still in the leaf directory at deletion time.
Hence no deep ref directories were ever deleted, which negatively
impacted performance under large directory structure circumstances.

This fix removes the ref lock file before attempting to delete the ref
directory (which includes it). The other deep parent directories are
therefore now successfully deleted in turn, since leaf's content
(lock file) gets removed first.

So, given a structure such as refs/any/directory[/**], this fix now
deletes all empty directories up to -and including- 'directory'. The
'any' directory (e.g.) does not get deleted even if empty, as before.

The ref lock file is still also removed in the calling block's finally
clause, just in case, as before. Such double-unlock brought by this
fix is harmless (a no-op).

A new (private) RefDirectory#delete method is introduced to support
this #pack-specific case; other RefDirectory#delete callers remain
untouched.

Change-Id: I47ba1eeb9bcf0cb93d2ed105d84fea2dac756a5a
Signed-off-by: Marco Miller <marco.miller@ericsson.com>
8 years agoUpdate Neon orbit repository to final release R20160520211859 51/75051/1
Matthias Sohn [Fri, 10 Jun 2016 10:20:24 +0000 (12:20 +0200)]
Update Neon orbit repository to final release R20160520211859

Change-Id: I7c439ab7679472217426453bd0a7c443ebd4b009
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoMerge "Add method to read time unit from config"
Shawn Pearce [Fri, 10 Jun 2016 04:26:45 +0000 (00:26 -0400)]
Merge "Add method to read time unit from config"

8 years agoExtract work queue to allow reusing it 03/74903/1
Matthias Sohn [Thu, 2 Jun 2016 23:04:51 +0000 (01:04 +0200)]
Extract work queue to allow reusing it

Change-Id: I28f7800030a3b9db48e315061509af0746feffcc
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoPrepare 4.4.1-SNAPSHOT builds 00/74800/1
Matthias Sohn [Tue, 7 Jun 2016 15:30:33 +0000 (17:30 +0200)]
Prepare 4.4.1-SNAPSHOT builds

Change-Id: I4fe1c84b1418126f5b245b8a4f72bb7e37f48eae
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoJGit v4.4.0.201606070830-r 64/74764/1 v4.4.0.201606070830-r
Matthias Sohn [Tue, 7 Jun 2016 11:51:02 +0000 (13:51 +0200)]
JGit v4.4.0.201606070830-r

Change-Id: I5c771a62ac0420424a655a4025c62a4bc28dc44e
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agohttp transport does not use authentication fallback 28/71028/10
Christian Pontesegger [Wed, 20 Apr 2016 06:31:18 +0000 (08:31 +0200)]
http transport does not use authentication fallback

Git servers supporting HTTP transport can send multiple WWW-Authenticate
challenges [1] for different authentication schemes the server supports.
If authentication fails now retry all authentication types proposed by
the server.

[1] https://tools.ietf.org/html/rfc2617#page-3

Bug: 492057
Change-Id: I01d438a5896f9b1008bd6b751ad9c7cbf780af1a
Signed-off-by: Christian Pontesegger <christian.pontesegger@web.de>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoAdd method to read time unit from config 28/74528/2
Hugo Arès [Fri, 3 Jun 2016 13:11:58 +0000 (09:11 -0400)]
Add method to read time unit from config

Time units supported:

-milliseconds (1 ms, 2 milliseconds)
-seconds (1 s, 1 sec, 1 second, 2 seconds)
-minutes (1 m, 1 min, 1 minute, 2 minutes)
-hours (1 h, 1 hr, 1 hour, 2 hours)
-days (1 d, 1 day, 2 days)
-weeks (1 w, 1 week, 2 weeks)
-months (1 mon, 1 month, 2 months)
-years (1 y, 1 year, 2 years)

This functionality is implemented in Gerrit ConfigUtil class. Add it to
JGit so it can eventually be remove from Gerrit.

Change-Id: I2d6564ff656b6ab9424a9360624061c94fd5f413
Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>
8 years agoAdd $NON-NLS to suppress "Non-externalized string literal" warnings 61/74561/1
Hugo Arès [Fri, 3 Jun 2016 19:57:12 +0000 (15:57 -0400)]
Add $NON-NLS to suppress "Non-externalized string literal" warnings

Change-Id: I1643775c6b200a5963ac1a6ca9b4d6e807e0b45a
Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>
8 years agoBatchRefUpdate: Include command message in toString() 30/74430/1
Dave Borowitz [Thu, 2 Jun 2016 17:24:59 +0000 (13:24 -0400)]
BatchRefUpdate: Include command message in toString()

Change-Id: I359f33af5aa84af77c3628e6cd9a5ee3f7f38d49

8 years agoMerge "DfsBlock: throw DataFormatException on 0 bytes"
Shawn Pearce [Thu, 2 Jun 2016 14:58:11 +0000 (10:58 -0400)]
Merge "DfsBlock: throw DataFormatException on 0 bytes"

8 years agoMerge "Add missing @Test annotation in RepositoryCacheTest"
Christian Halstrick [Thu, 2 Jun 2016 07:30:03 +0000 (03:30 -0400)]
Merge "Add missing @Test annotation in RepositoryCacheTest"

8 years agoMerge "Add missing @Test annotations"
Christian Halstrick [Thu, 2 Jun 2016 07:28:00 +0000 (03:28 -0400)]
Merge "Add missing @Test annotations"

8 years agoDfsBlock: throw DataFormatException on 0 bytes 42/74342/1
Shawn Pearce [Thu, 2 Jun 2016 04:48:21 +0000 (21:48 -0700)]
DfsBlock: throw DataFormatException on 0 bytes

setInput should always push at least 1 byte into the Inflater.  If 0
bytes (or negative!) are being sent the DfsBlock is inconsistent with
the position passed in.  This indicates a severe programming problem
in the caller, and may cause an infinite loop in DfsReader.

Today we saw a handful of live examples of this but don't know what
the cause is.  Guard against this error condition and throw with a
more verbose failure, which may prevent an infinite loop.  Callers
will eventually catch DataFormatException and rethrow with more detail
about the object that cannot be inflated, with the DFE in the chain.

Change-Id: I64ed2a471520e48283675c6210c6db8a60634635

8 years agoMerge "Prepare 4.5.0-SNAPSHOT builds"
Matthias Sohn [Wed, 1 Jun 2016 22:13:33 +0000 (18:13 -0400)]
Merge "Prepare 4.5.0-SNAPSHOT builds"

8 years agoDfsInserter: Optionally disable existing object check 23/74323/2
Dave Borowitz [Wed, 1 Jun 2016 21:07:19 +0000 (17:07 -0400)]
DfsInserter: Optionally disable existing object check

When using a DfsInserter for high-throughput insertion of many
objects (analogous to git-fast-import), we don't necessarily want to
do a random object lookup for each. It'll be faster from the
inserter's perspective to insert the duplicate objects and let a later
GC handle the deduplication.

Change-Id: Ic97f5f01657b4525f157e6df66023f1f07fc1851

8 years agoPrepare 4.5.0-SNAPSHOT builds 32/74332/1
Matthias Sohn [Wed, 1 Jun 2016 20:49:55 +0000 (22:49 +0200)]
Prepare 4.5.0-SNAPSHOT builds

Change-Id: I572fe9fea0e5ca0bec4648c916ae95a5b1ccf125
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoPrepare 4.4.0-SNAPSHOT builds 15/74315/1
Matthias Sohn [Wed, 1 Jun 2016 20:36:21 +0000 (22:36 +0200)]
Prepare 4.4.0-SNAPSHOT builds

Change-Id: Ib41dfe4103f013ba87a1ce62ee24bc9e10300eff
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoAdd missing @Test annotations 09/74309/2
Hugo Arès [Wed, 1 Jun 2016 19:56:18 +0000 (15:56 -0400)]
Add missing @Test annotations

Change-Id: Ie5ffcbf18233dc9b3eb232f714b5b58b6b93f4e0
Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>