]> source.dussan.org Git - jgit.git/log
jgit.git
8 years agoReceivePack: simplify getPushOptions 56/79956/2
Shawn Pearce [Mon, 29 Aug 2016 19:12:23 +0000 (12:12 -0700)]
ReceivePack: simplify getPushOptions

Checking if the instance allows push options before returning the
collection or null is a bit overkill. Just return the collection
or return null.

Change-Id: Icdc3755194373966e5819284aeb9bfe8dd34de82

8 years agoReceivePack: allow push options to be set 55/79955/3
Shawn Pearce [Mon, 29 Aug 2016 18:54:15 +0000 (11:54 -0700)]
ReceivePack: allow push options to be set

Some embeddings of JGit require creating a ReceivePack instance in
another process from the one that handled the network socket with the
client.  Similar to the PushCertificate add a setter to allow the
option list to be supplied.

Change-Id: I303a30e54942ad067c79251eff8b53329c406628

8 years agoMake GC.RepoStatistics static 89/79889/1
Jonathan Nieder [Fri, 26 Aug 2016 23:28:43 +0000 (16:28 -0700)]
Make GC.RepoStatistics static

Noticed by error-prone (http://errorprone.info/bugpattern/ClassCanBeStatic).

Change-Id: Ie271e9e789a5bc764a287f7bd2a8c8af297d7d41

8 years agoReceivePack: refactor push option parsing 87/79887/4
Shawn Pearce [Fri, 26 Aug 2016 21:44:44 +0000 (14:44 -0700)]
ReceivePack: refactor push option parsing

Refactor all of the push option support code to allocate the list
immediately before parsing the options section off the stream.

Move option support down to ReceivePack instead of BaseReceivePack.
Push options are specific to the ReceivePack protocol and are not
likely to appear in the 4 year old subscription proposal.  These
changes are OK before JGit 4.5 ships as no consumer should be relying
on these new APIs.

Change-Id: Ib07d18c877628aba07da07cd91875f918d509c49

8 years agoFix push option initalization on HTTP 86/79886/2
Stefan Beller [Fri, 26 Aug 2016 21:10:06 +0000 (14:10 -0700)]
Fix push option initalization on HTTP

Initialize pushOptions when we decide to use them, instead of when we
advertise them.

In the case of HTTP the advertisement is in a different network
request, hence in a different instance of the BaseReceivePack.

Change-Id: I094c60942e04de82cb6d8433c9cd43a46ffae332
Signed-off-by: Stefan Beller <sbeller@google.com>
8 years agoMerge "DfsReader: check object type during open"
Shawn Pearce [Fri, 26 Aug 2016 02:45:31 +0000 (22:45 -0400)]
Merge "DfsReader: check object type during open"

8 years agoMerge "Fix HttpClientConnection leaking temporary buffer files"
Shawn Pearce [Fri, 26 Aug 2016 02:31:08 +0000 (22:31 -0400)]
Merge "Fix HttpClientConnection leaking temporary buffer files"

8 years agoDfsReader: check object type during open 86/79786/2
Shawn Pearce [Fri, 26 Aug 2016 01:59:15 +0000 (18:59 -0700)]
DfsReader: check object type during open

Do not open an OBJ_TREE if the caller is expecting an OBJ_BLOB or
OBJ_COMMIT; instead throw IncorrectObjectTypeException.  This better
matches behavior of WindowCursor, the ObjectReader implementation of
the local file based object store.

Change-Id: I3fb0e77f54895b123679a405e1b6ba5b95752ff0

8 years agoClarify the semantics of DfsRefDatabase#compareAndPut 33/77433/5
Masaya Suzuki [Fri, 26 Aug 2016 01:25:48 +0000 (18:25 -0700)]
Clarify the semantics of DfsRefDatabase#compareAndPut

DfsRefDatabase#compareAndPut had a vague semantics for reference
matching. Because of this, an operation to make a symbolic
reference had been broken for some DFS implementations even if they
followed the contract of compareAndPut. The clarified semantics
requires the implementations to satisfy the followings:

* Matching references should be both symbolic references or both
  object ID references.
* If both are symbolic references, both should have the same target
  name.
* If both are object ID references, both should have the same object
  ID.

This semantics is defined based on
https://git.eclipse.org/r/#/c/77416/. Before this commit,
DfsRefDatabase couldn't see the target of symbolic references.

InMemoryRepository is changed to comply with the new semantics. This
semantics change can affect the existing DFS implementations that only
checks object IDs. This commit adds two tests that the previous
InMemoryRepository couldn't pass.

Change-Id: I6c6b5d3cc8241a81f4a37782381c88e8a59fdf15
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
8 years agoMerge "Do not fake a SymbolicRef as an ObjectIdRef"
Shawn Pearce [Fri, 26 Aug 2016 00:57:39 +0000 (20:57 -0400)]
Merge "Do not fake a SymbolicRef as an ObjectIdRef"

8 years agoNoteMapTest: Add missing @Test annotations 03/53103/2
Dave Borowitz [Mon, 3 Aug 2015 20:58:39 +0000 (13:58 -0700)]
NoteMapTest: Add missing @Test annotations

The RepositoryTestCase hierarchy no longer comes from TestCase, so all
test methods must have @Test.

Fix one test that was broken but never run; fortunately this was just
a typo in the test code.

Change-Id: I3ac8ccdab5e2d5539c63d7b0a88d8bdb0c5ff66e
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoAdd a RepeatRule to help repeating flaky tests 31/79731/2
Matthias Sohn [Tue, 24 May 2016 23:07:18 +0000 (01:07 +0200)]
Add a RepeatRule to help repeating flaky tests

A JUnit TestRule which enables to run the same JUnit test repeatedly.
This may help to identify the root cause why a flaky tests which succeed
most often does fail sometimes.

Add the RepeatRule to the test class containing the test to be repeated:

public class MyTest {
@Rule
public RepeatRule repeatRule = new RepeatRule();
...
}

and annotate the test to be repeated with the @Repeat(n=<repetitions>)
annotation:

@Test
@Repeat(n = 100)
public void test() {
...
}

then this test will be repeated 100 times. If any test execution fails
test repetition will be stopped.

Change-Id: I7c49ccebe1cb00bcde6b002b522d95c13fd3a35e
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoDo not fake a SymbolicRef as an ObjectIdRef 16/77416/9
Masaya Suzuki [Wed, 13 Jul 2016 23:57:03 +0000 (16:57 -0700)]
Do not fake a SymbolicRef as an ObjectIdRef

When doing a detaching operation, JGit fakes a SymbolicRef as an
ObjectIdRef. This is because RefUpdate#updateImpl dereferences the
SymbolicRef when updating it. For example, assume that HEAD is
pointing to refs/heads/master. If I try to make a detached HEAD
pointing to a commit c0ffee, RefUpdate dereferences HEAD as
refs/heads/master first and changes refs/heads/master to c0ffee. The
detach argument of RefDatabase#newUpdate avoids this dereference by
faking HEAD as ObjectIdRef.

This faking is problematic for the linking operation of
DfsRefDatabase. It does a compare-and-swap operation on every
reference change because of its distributed systems nature. If a
SymbolicRef is faked as an ObjectRef, it thinks that there is a
racing change in the reference and rejects the update. Because of
this, DFS based repositories cannot change the link target of symbolic
refs. This has not been a problem for file-based repositories because
they have a file-lock based semantics instead of the CAS based one.
The reference implementation, InMemoryRepository, is not affected
because it only compares ObjectIds.

When [1] introduced this faking code, there was no way for RefUpdate
to distinguish the detaching operation. When [2] fixed the detaching
operation, it introduced a detachingSymbolicRef flag. This commit uses
this flag to control whether it needs to dereference the symbolic refs
by calling Ref#getLeaf. The same flag is used in the reflog update
operation.

This commit does not affect any operation that succeeds currently. In
some DFS repository implementations, this fixes a ref linking
operation, which is currently failing.

[1]: https://eclipse.googlesource.com/jgit/jgit/+/01b5392cdbc12ce2e21fd1d1afbd61fdf97e1c38
[2]: https://eclipse.googlesource.com/jgit/jgit/+/3a86868c0883d2a564db88bf9ae4a5fe235bb63f

Change-Id: I118f85f0414dbfad02250944e28d74dddd59469b
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
8 years agoLfsProtocolServlet: Add support for insufficient storage error 15/79315/4
David Pursehouse [Fri, 19 Aug 2016 02:29:00 +0000 (11:29 +0900)]
LfsProtocolServlet: Add support for insufficient storage error

Since [1], the git-lfs specification allows the server to return
HTTP 507 if there is insufficient storage for the uploaded object(s).

Add a new exception class, which implementations may throw from the
getRepository() method, causing HTTP 507 to be returned to the client.

[1] https://github.com/github/git-lfs/pull/1473

Change-Id: If5bc0a35fcf870d4216af6ca2f7c8924689ef9c5
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoPacket logging for JGit 72/79472/9
Dan Wang [Tue, 23 Aug 2016 02:16:51 +0000 (19:16 -0700)]
Packet logging for JGit

Imitate the packet tracing feature from C Git v1.7.5-rc0~58^2~1 (add
packet tracing debug code, 2011-02-24).  Unlike C Git, use the log4j
log level setting instead of the GIT_TRACE_PACKET environment variable
to enable tracing.

Tested as follows:

 1. Enable tracing by adding the lines

log4j.logger.org.eclipse.jgit.transport=DEBUG, stderr
log4j.additivity.org.eclipse.jgit.transport=false

    to org.eclipse.jgit.pgm/resources/log4j.properties.

 2. mvn package

 3. org.eclipse.jgit.pgm/target/jgit \
ls-remote git://git.kernel.org/pub/scm/git/git 2>&1 |less

Then the output provides a trace of packets sent and received over
the wire:

  2016-08-24 16:36:42 DEBUG PacketLineOut:145 - git> git-upload-pack /pub/scm/git/git^@host=git.kernel.org^@
  2016-08-24 16:36:42 DEBUG PacketLineIn:165 - git< 2632c897f74b1cc9b5533f467da459b9ec725538 HEAD^@multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed symref=HEAD:refs/heads/master agent=git/2.8.4
  2016-08-24 16:36:42 DEBUG PacketLineIn:165 - git< e0c1ceafc5bece92d35773a75fff59497e1d9bd5 refs/heads/maint

Change-Id: I5028c064f3ac090510386057cb4e6d30d4eae232
Signed-off-by: Dan Wang <dwwang@google.com>
8 years agopush: Do not use push options unless requested 53/79653/3
Stefan Beller [Wed, 24 Aug 2016 19:47:10 +0000 (12:47 -0700)]
push: Do not use push options unless requested

Unless the user passed --push-option, the client does not intend to
pass push options to the server.

Without this change, all pushes to servers without push option support
fail.

Not enabling the feature (instead of enabling it and sending an empty
list of options) in this case is more intuitive and matches the
behavior of C git push's --push-option parameter better.

Bug: 500149
Change-Id: Ia4f13840cc54d8ba54e99b1432108f1c43022c53
Signed-off-by: Stefan Beller <sbeller@google.com>
8 years agoFix HttpClientConnection leaking temporary buffer files 22/79622/1
Matthias Sohn [Wed, 24 Aug 2016 12:08:00 +0000 (14:08 +0200)]
Fix HttpClientConnection leaking temporary buffer files

HttpClientConnection uses a TemporaryBufferEntity which uses
TemporaryBuffer.LocalFile to buffer an HttpEntity. It was leaking
temporary files if the buffered entities were larger than 1MB since it
failed to destroy the TemporaryBuffer.LocalFile.

Bug: 500079
Change-Id: Ib963e04efc252bdd0420a5c69b1a19181e9e6169
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoUse FS#lastModified instead of File#lastModified 07/79407/5
Masaya Suzuki [Sun, 21 Aug 2016 22:27:30 +0000 (15:27 -0700)]
Use FS#lastModified instead of File#lastModified

This fixes the tests failed in JDK8.

FS uses java.nio API to get file attributes. The timestamps obtained
from that API are more precise than the ones from
java.io.File#lastModified() since Java8.

This difference accidentally makes JGit detect newly added files as
smudged. Use the precised timestamp to avoid this false positive.

Bug: 500058
Change-Id: I9e587583c85cb6efa7562ad6c5f26577869a2e7c
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
8 years agoDon't check lastModified, length on folders for submodules 86/78586/4
Christian Halstrick [Sun, 7 Aug 2016 17:59:49 +0000 (18:59 +0100)]
Don't check lastModified, length on folders for submodules

The metadata comparison of submodules is not reliable because of the
last modified timestamp and directory length.

Bug: 498759
Change-Id: If5db69ef3868e475ac477d3e8a7750b268799b0c

8 years agoAdded Java 7 launch config with LANG env. variable set 82/79582/1
Andrey Loskutov [Wed, 24 Aug 2016 07:05:22 +0000 (09:05 +0200)]
Added Java 7 launch config with LANG env. variable set

This avoids symlink test errors on Linux

Change-Id: Id8193524c40394a90b8315ab0b8256670d618cb5
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
8 years agoAdd HTTP status code to ServiceMayNotContinueException 37/79237/6
Masaya Suzuki [Wed, 24 Aug 2016 00:57:59 +0000 (17:57 -0700)]
Add HTTP status code to ServiceMayNotContinueException

The exception can be thrown in a various reason, and sometimes 403
Forbidden is not appropriate. Make the HTTP status code customizable.

Change-Id: If2ef6f454f7479158a4e28a12909837db483521c
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
8 years agoLfsProtocolServlet: Add support for rate limit and bandwidth limit errors 14/79314/2
David Pursehouse [Fri, 19 Aug 2016 01:58:06 +0000 (10:58 +0900)]
LfsProtocolServlet: Add support for rate limit and bandwidth limit errors

The git-lfs specification [1] describes the following optional status codes
that may be returned:

429 - The user has hit a rate limit with the server. Though the API does
      not specify any rate limits, implementors are encouraged to set some
      for availability reasons.

509 - Returned if the bandwidth limit for the user or repository has been
      exceeded. The API does not specify any bandwidth limit, but implementors
      may track usage.

Add two new exception classes to represent these cases. Implementations may
throw these from #getLargeFileRepository(), causing the corresponding HTTP
status codes to be returned to the client.

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

Change-Id: I7b93f3cf90f7344c90b1587e07927fdeb167097e
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoLfsProtocolServlet: Always include message in error response 14/79214/4
David Pursehouse [Wed, 17 Aug 2016 16:18:15 +0000 (01:18 +0900)]
LfsProtocolServlet: Always include message in error response

If the message is not sent, the client shows:

  Unable to parse HTTP response for POST http://admin@localhost:8080/test-project/info/lfs/objects/batch

Change-Id: I8b72d1aded2bcd41b7389676e2373034625a1379
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoLfsRepository{NotFound,ReadOnly}: Externalize message strings 46/79246/2
David Pursehouse [Thu, 18 Aug 2016 06:58:43 +0000 (15:58 +0900)]
LfsRepository{NotFound,ReadOnly}: Externalize message strings

Instead of hard-coding the message strings, define them in a properties
file. This will allow them to be translated.

Change-Id: I77556881579e66b2c13d187759c7efdddfee87ae
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoMerge "DownloadTest: Use enums from org.apache.http.HttpStatus"
Matthias Sohn [Fri, 19 Aug 2016 23:19:13 +0000 (19:19 -0400)]
Merge "DownloadTest: Use enums from org.apache.http.HttpStatus"

8 years agoMerge "Ignore IOException thrown from close"
Shawn Pearce [Fri, 19 Aug 2016 23:10:58 +0000 (19:10 -0400)]
Merge "Ignore IOException thrown from close"

8 years agoDownloadTest: Use enums from org.apache.http.HttpStatus 12/78912/7
David Pursehouse [Fri, 12 Aug 2016 03:47:34 +0000 (12:47 +0900)]
DownloadTest: Use enums from org.apache.http.HttpStatus

Instead of using hard-coded HTTP status codes, use the enums
which makes it a bit easier to see what's expected.

Change-Id: I2da5d25632f374b8625d64da4df70d1c9c406bb1
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoIgnore IOException thrown from close 86/79386/2
Masaya Suzuki [Fri, 19 Aug 2016 20:51:05 +0000 (13:51 -0700)]
Ignore IOException thrown from close

AddCommandTest is flaky because IOException is thrown sometimes.

Caused by: java.io.IOException: Stream closed
        at java.lang.ProcessBuilder$NullOutputStream.write(ProcessBuilder.java:433)
        at java.io.OutputStream.write(OutputStream.java:116)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at java.io.FilterOutputStream.close(FilterOutputStream.java:158)
        at org.eclipse.jgit.util.FS.runProcess(FS.java:993)
        at org.eclipse.jgit.util.FS.execute(FS.java:1102)
        at org.eclipse.jgit.treewalk.WorkingTreeIterator.filterClean(WorkingTreeIterator.java:470)
        ... 22 more

OpenJDK replaces the underlying OutputStream with NullOutputStream when
the process exits. This throws IOException for all write operation. When
it exits before JGit writes the input to the pipe buffer, the input
stays in BufferedOutputStream. The close method tries to write it again,
and IOException is thrown.

Since we ignore IOException in StreamGobbler, we also ignore it when
we close the stream.

Fixes Bug 499633.

Change-Id: I30c7ac78e05b00bd0152f697848f4d17d53efd17
Signed-off-by: Masaya Suzuki <draftcode@gmail.com>
8 years agoDfsObjDatabase: clear PackList dirty bit if no new packs 74/79374/2
Shawn Pearce [Fri, 19 Aug 2016 18:51:40 +0000 (11:51 -0700)]
DfsObjDatabase: clear PackList dirty bit if no new packs

If a reference was updated more recently than a pack was written
(typical) the PackList was perpetually dirty until the next GC
was completed for the repository.

Detect this condition by observing no changes to the PackList
membership and resetting the dirty bit.

Change-Id: Ie2133aca1f8083307c73b6a26358175864f100ef

8 years agoEnhance ResetCommand to allow disabling reflog update 62/77362/3
Matthias Sohn [Thu, 14 Jul 2016 22:13:01 +0000 (00:13 +0200)]
Enhance ResetCommand to allow disabling reflog update

This will be used by EGit for implementing commit amend in the staging
view (see Idcd1efeeee8b3065bae36e285bfc0af24ab1e88f).

Change-Id: Ice9ebbb1c0c3314c679f4db40cdd3664f61c27c3
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoLfsProtocolServlet: Always set the Content-Type header on response 09/79009/2
David Pursehouse [Sat, 13 Aug 2016 07:56:20 +0000 (16:56 +0900)]
LfsProtocolServlet: Always set the Content-Type header on response

If the Content-Type is not set on error responses, the git-lfs client
does not read the body which contains the error message, and instead
just displays a generic error message.

Also set the charset on the Content-Type header.

Change-Id: I88e6f07f20b622a670e7c5063145dffb8b630aee
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoLfsProtocolServlet: Don't set pretty printing on Gson 53/78953/2
David Pursehouse [Fri, 12 Aug 2016 13:26:26 +0000 (22:26 +0900)]
LfsProtocolServlet: Don't set pretty printing on Gson

Pretty printing is only used for outputting json content, which is
interpreted by the client and does not need to be pretty printed.

Change-Id: I48e0280241b6b0f5706300ae0f4c9bc461a89110
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoMerge "BaseReceivePack: null and IllegalStateException cases for getPushOptions"
Jonathan Nieder [Mon, 15 Aug 2016 19:40:49 +0000 (15:40 -0400)]
Merge "BaseReceivePack: null and IllegalStateException cases for getPushOptions"

8 years agoBaseReceivePack: null and IllegalStateException cases for getPushOptions 67/78367/5
Dan Wang [Wed, 3 Aug 2016 01:34:07 +0000 (18:34 -0700)]
BaseReceivePack: null and IllegalStateException cases for getPushOptions

Change-Id: I5c6790719991931d615d821c900bfd90a20e540b
Signed-off-by: Dan Wang <dwwang@google.com>
8 years agoUpdate .mailmap 59/78659/3
David Pursehouse [Tue, 9 Aug 2016 01:46:18 +0000 (10:46 +0900)]
Update .mailmap

Change-Id: I167f9e4746b8aa814b361e884c3c9a25e95b9d54
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoLfsProtocolServlet: Reuse existing Writer when sending error response 88/78588/4
David Pursehouse [Mon, 8 Aug 2016 00:40:34 +0000 (09:40 +0900)]
LfsProtocolServlet: Reuse existing Writer when sending error response

Trying to open a new writer on the response causes an illegal state
exception and the response is not sent.

Change-Id: Ic718d23cfb3e74f5691cc2aea7283003af7df207
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoRepoCommand: Avoid group lists shadowing groups strings 60/78660/1
Jonathan Nieder [Tue, 9 Aug 2016 01:50:01 +0000 (18:50 -0700)]
RepoCommand: Avoid group lists shadowing groups strings

Reported-by: David Pursehouse <david.pursehouse@gmail.com>
Change-Id: I9e9b021d335bda4d58b6bcc30f59b81ac5b37724
Signed-off-by: Jonathan Nieder <jrn@google.com>
8 years agoPackWriter: Fix Javadoc tag for thrown exception in preparePack 57/78657/1
David Pursehouse [Tue, 9 Aug 2016 01:26:34 +0000 (10:26 +0900)]
PackWriter: Fix Javadoc tag for thrown exception in preparePack

Use @throws instead of @param

Change-Id: Ic9419d254c617e60a9b10e49205b11069442eb27
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
8 years agoMerge "Document new PackWriter#preparePack variant's parameters and exceptions"
Jonathan Nieder [Mon, 8 Aug 2016 23:55:57 +0000 (19:55 -0400)]
Merge "Document new PackWriter#preparePack variant's parameters and exceptions"

8 years agoDocument new PackWriter#preparePack variant's parameters and exceptions 55/78655/1
Jonathan Nieder [Mon, 8 Aug 2016 23:38:21 +0000 (16:38 -0700)]
Document new PackWriter#preparePack variant's parameters and exceptions

Change-Id: Id4fa272c611a855bf4ef1bf5399f3e4305664103

8 years agoSilence API errors in LfsProtocolServlet 22/78622/2
Matthias Sohn [Mon, 8 Aug 2016 15:10:53 +0000 (17:10 +0200)]
Silence API errors in LfsProtocolServlet

bb9988c2 changed the signature of getLargeFileRepository() which is only
breaking implementors which is ok according to OSGi semantic versioning
rules.

Change-Id: I68bda7900b72e217571f74aee53705167f8100a2
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoAdd missing @since tags for new API 21/78621/2
Matthias Sohn [Mon, 8 Aug 2016 15:07:29 +0000 (17:07 +0200)]
Add missing @since tags for new API

Change-Id: I8db29a0313fbc476152cef47f2eaa76954f1e280
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoMerge "Require-Bundle com.jcraft.jsch replaced by Import-Package statement"
Matthias Sohn [Mon, 8 Aug 2016 22:43:54 +0000 (18:43 -0400)]
Merge "Require-Bundle com.jcraft.jsch replaced by Import-Package statement"

8 years agoRequire-Bundle com.jcraft.jsch replaced by Import-Package statement 78/78578/6
Jens Offenbach [Sat, 6 Aug 2016 15:30:42 +0000 (11:30 -0400)]
Require-Bundle com.jcraft.jsch replaced by Import-Package statement

Bug: 359288
Change-Id: Ifbbf953f5389c6bd3ba960b598c0e92656b522e3
Signed-off-by: Jens Offenbach <wolle5050@gmx.de>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoMerge changes Ib0d8c294,Idfb83482 44/78644/2
Jonathan Nieder [Mon, 8 Aug 2016 19:46:56 +0000 (12:46 -0700)]
Merge changes Ib0d8c294,Idfb83482

* changes:
  Shallow fetch: Pass along "shallow"s in unparsed-wants case, too
  Shallow fetch: Pass a DepthWalk to PackWriter

Change-Id: I7d1c3b4d0b7ebc254b53404d1618522b0174ac23

8 years agoShallow fetch: Pass along "shallow"s in unparsed-wants case, too 43/78643/3
Jonathan Nieder [Mon, 8 Aug 2016 19:35:36 +0000 (12:35 -0700)]
Shallow fetch: Pass along "shallow"s in unparsed-wants case, too

Since 84d2738ff21c (Don't skip want validation when the client sends no
haves, 2013-06-21), this branch is not taken.  Process the
"shallow"s anyway as a defensive measure in case the code path gets
revived.

Change-Id: Idfb834825d77f51e17191c1635c9d78c78738cfd
Signed-off-by: Jonathan Nieder <jrn@google.com>
8 years agoShallow fetch: Pass a DepthWalk to PackWriter 42/78642/2
Jonathan Nieder [Mon, 8 Aug 2016 19:31:39 +0000 (12:31 -0700)]
Shallow fetch: Pass a DepthWalk to PackWriter

d385a7a5e5ca (Shallow fetch: Respect "shallow" lines, 2016-08-03) forgot
that UploadPack wasn't passing a DepthWalk to PackWriter in the first
place.  As a result, shallow clones fail:

  java.lang.IllegalArgumentException: Shallow packs require a DepthWalk
        at org.eclipse.jgit.internal.storage.pack.PackWriter.preparePack(PackWriter.java:756)
        at org.eclipse.jgit.transport.UploadPack.sendPack(UploadPack.java:1497)
        at org.eclipse.jgit.transport.UploadPack.sendPack(UploadPack.java:1381)
        at org.eclipse.jgit.transport.UploadPack.service(UploadPack.java:774)
        at org.eclipse.jgit.transport.UploadPack.upload(UploadPack.java:667)
        at org.eclipse.jgit.http.server.UploadPackServlet.doPost(UploadPackServlet.java:191)

Change-Id: Ib0d8c2946eebfea910a2b767fb92e23da15d4749

8 years agoFix non-parameterized generic type warning 56/76556/3
Matthias Sohn [Mon, 4 Jul 2016 21:58:56 +0000 (23:58 +0200)]
Fix non-parameterized generic type warning

Change-Id: Ib857166f64420aebf7c31d72825cac44bd770dbd
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
8 years agoMerge "Add path src/ to source path in build.properties"
Matthias Sohn [Mon, 8 Aug 2016 06:42:20 +0000 (02:42 -0400)]
Merge "Add path src/ to source path in build.properties"

8 years agoMerge "Skip cleaning inner repositories by default in CleanCommand"
Christian Halstrick [Sun, 7 Aug 2016 13:37:47 +0000 (09:37 -0400)]
Merge "Skip cleaning inner repositories by default in CleanCommand"

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 agoAdd path src/ to source path in build.properties 76/77376/2
Matthias Sohn [Fri, 15 Jul 2016 06:41:23 +0000 (08:41 +0200)]
Add path src/ to source path in build.properties

This fixes the warning "src/ is missing from source.."

Change-Id: I166e3a6a3d5230e4110d3283ec4dbc7d1dfe6732
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
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 agoSkip cleaning inner repositories by default in CleanCommand 98/78198/5
Matthaus Owens [Fri, 29 Jul 2016 22:21:20 +0000 (15:21 -0700)]
Skip cleaning inner repositories by default in CleanCommand

Previously jgit would attempt to clean git repositories that had not
been committed by calling a non-recursive delete on them, which would
fail as they are directories. This commit addresses that issue in the
following ways.
Repositories are skipped in a default clean, similarly to cgit and only
cleaned when the force flag is applied. When the force flag is applied
repositories are deleted using a recursive delete call. The force flag
and setForce method are added here to CleanCommand to support this
change.

Bug: 498367
Change-Id: Ib6cfff65a033d0d0f76395060bf76719e13fc467
Signed-off-by: Matthaus Owens <matthaus@puppetlabs.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>