aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Improve JavaDoc for LfsProtocolServlet.getLargeFileRepositoryMatthias Sohn2016-09-011-0/+23
| | | | | | Guide implementors which exception to throw in case of errors. Change-Id: I74fb76cdf6b7cdef513f3fe8c144572e869cc533 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* CLI: implement option -d for deleting tagsNed Twigg2016-08-314-11/+49
| | | | | Change-Id: I438456b76aefd361384729686271288186d3be3b Signed-off-by: Ned Twigg <ned.twigg@diffplug.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Added a clean command.Ned Twigg2016-08-305-0/+230
| | | | | Change-Id: I05d5392789b5b64e6ee44f678556cf25dc30d7ba Signed-off-by: Ned Twigg <ned.twigg@diffplug.com>
* Add specific exception for LFS unavailableDavid Pursehouse2016-08-304-11/+79
| | | | | | | | | | | | Instead of returning null, LfsProtocolServlet#getLargeFileRepository should throw LfsUnavailable. If null is returned, throw a generic LfsException. Handle LfsException as an internal server error and return HTTP 500. Change-Id: I33e2a19fcc0fde8aaf0f703860c8fa8ce2de2db5 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Add Javadoc for LFS exception messagesDavid Pursehouse2016-08-307-0/+7
| | | | | Change-Id: I4967b5f7a9a7e9488d20f60aaa949efe97442429 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* ReceivePack: integrate push option parsing into recvCommandsShawn Pearce2016-08-292-11/+23
| | | | | | | | This allows the same try/catch to handle parsing the command list, push certificate and push options. Any errors will be caught and handled by the same catch block, as the client is in the same state. Change-Id: I13a66f9100e2dc8ca8f72cd701a5bd44d093ec84
* ReceivePack: simplify getPushOptionsShawn Pearce2016-08-291-13/+7
| | | | | | | | 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
* ReceivePack: allow push options to be setShawn Pearce2016-08-291-6/+18
| | | | | | | | | 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
* Make GC.RepoStatistics staticJonathan Nieder2016-08-261-1/+1
| | | | | | Noticed by error-prone (http://errorprone.info/bugpattern/ClassCanBeStatic). Change-Id: Ie271e9e789a5bc764a287f7bd2a8c8af297d7d41
* ReceivePack: refactor push option parsingShawn Pearce2016-08-263-85/+66
| | | | | | | | | | | | | 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
* Fix push option initalization on HTTPStefan Beller2016-08-262-2/+4
| | | | | | | | | | | 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>
* Merge "DfsReader: check object type during open"Shawn Pearce2016-08-252-4/+17
|\
| * DfsReader: check object type during openShawn Pearce2016-08-252-4/+17
| | | | | | | | | | | | | | | | | | 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
* | Merge "Fix HttpClientConnection leaking temporary buffer files"Shawn Pearce2016-08-252-12/+33
|\ \
| * | Fix HttpClientConnection leaking temporary buffer filesMatthias Sohn2016-08-242-12/+33
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | Clarify the semantics of DfsRefDatabase#compareAndPutMasaya Suzuki2016-08-253-26/+56
| |/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | Merge "Do not fake a SymbolicRef as an ObjectIdRef"Shawn Pearce2016-08-254-11/+12
|\ \
| * | Do not fake a SymbolicRef as an ObjectIdRefMasaya Suzuki2016-08-254-11/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | NoteMapTest: Add missing @Test annotationsDave Borowitz2016-08-261-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | Add a RepeatRule to help repeating flaky testsMatthias Sohn2016-08-253-1/+188
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | LfsProtocolServlet: Add support for insufficient storage errorDavid Pursehouse2016-08-242-0/+65
| | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | Packet logging for JGitDan Wang2016-08-242-5/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | push: Do not use push options unless requestedStefan Beller2016-08-241-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | Use FS#lastModified instead of File#lastModifiedMasaya Suzuki2016-08-247-23/+40
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | Don't check lastModified, length on folders for submodulesChristian Halstrick2016-08-241-3/+13
|/ | | | | | | | The metadata comparison of submodules is not reliable because of the last modified timestamp and directory length. Bug: 498759 Change-Id: If5db69ef3868e475ac477d3e8a7750b268799b0c
* Added Java 7 launch config with LANG env. variable setAndrey Loskutov2016-08-241-0/+30
| | | | | | | This avoids symlink test errors on Linux Change-Id: Id8193524c40394a90b8315ab0b8256670d618cb5 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* Add HTTP status code to ServiceMayNotContinueExceptionMasaya Suzuki2016-08-237-5/+54
| | | | | | | | 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>
* LfsProtocolServlet: Add support for rate limit and bandwidth limit errorsDavid Pursehouse2016-08-203-0/+132
| | | | | | | | | | | | | | | | | | | | | | 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>
* LfsProtocolServlet: Always include message in error responseDavid Pursehouse2016-08-201-1/+2
| | | | | | | | | 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>
* LfsRepository{NotFound,ReadOnly}: Externalize message stringsDavid Pursehouse2016-08-204-3/+15
| | | | | | | | 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>
* Merge "DownloadTest: Use enums from org.apache.http.HttpStatus"Matthias Sohn2016-08-191-3/+8
|\
| * DownloadTest: Use enums from org.apache.http.HttpStatusDavid Pursehouse2016-08-201-3/+8
| | | | | | | | | | | | | | | | 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>
* | Merge "Ignore IOException thrown from close"Shawn Pearce2016-08-191-1/+10
|\ \ | |/ |/|
| * Ignore IOException thrown from closeMasaya Suzuki2016-08-191-1/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | DfsObjDatabase: clear PackList dirty bit if no new packsShawn Pearce2016-08-191-1/+14
|/ | | | | | | | | | | 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
* Enhance ResetCommand to allow disabling reflog updateMatthias Sohn2016-08-172-2/+68
| | | | | | | 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>
* LfsProtocolServlet: Always set the Content-Type header on responseDavid Pursehouse2016-08-161-2/+3
| | | | | | | | | | | 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>
* LfsProtocolServlet: Don't set pretty printing on GsonDavid Pursehouse2016-08-161-5/+4
| | | | | | | | 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>
* Merge "BaseReceivePack: null and IllegalStateException cases for getPushOptions"Jonathan Nieder2016-08-151-3/+19
|\
| * BaseReceivePack: null and IllegalStateException cases for getPushOptionsDan Wang2016-08-101-3/+19
| | | | | | | | | | Change-Id: I5c6790719991931d615d821c900bfd90a20e540b Signed-off-by: Dan Wang <dwwang@google.com>
* | Update .mailmapDavid Pursehouse2016-08-091-0/+1
| | | | | | | | | | Change-Id: I167f9e4746b8aa814b361e884c3c9a25e95b9d54 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* | LfsProtocolServlet: Reuse existing Writer when sending error responseDavid Pursehouse2016-08-091-27/+19
| | | | | | | | | | | | | | | | 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>
* | RepoCommand: Avoid group lists shadowing groups stringsJonathan Nieder2016-08-082-10/+10
| | | | | | | | | | | | Reported-by: David Pursehouse <david.pursehouse@gmail.com> Change-Id: I9e9b021d335bda4d58b6bcc30f59b81ac5b37724 Signed-off-by: Jonathan Nieder <jrn@google.com>
* | PackWriter: Fix Javadoc tag for thrown exception in preparePackDavid Pursehouse2016-08-091-1/+1
| | | | | | | | | | | | | | Use @throws instead of @param Change-Id: Ic9419d254c617e60a9b10e49205b11069442eb27 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* | Merge "Document new PackWriter#preparePack variant's parameters and exceptions"Jonathan Nieder2016-08-081-0/+20
|\ \
| * | Document new PackWriter#preparePack variant's parameters and exceptionsJonathan Nieder2016-08-081-0/+20
| | | | | | | | | | | | Change-Id: Id4fa272c611a855bf4ef1bf5399f3e4305664103
* | | Silence API errors in LfsProtocolServletMatthias Sohn2016-08-091-0/+17
| | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | Add missing @since tags for new APIMatthias Sohn2016-08-093-1/+10
| | | | | | | | | | | | Change-Id: I8db29a0313fbc476152cef47f2eaa76954f1e280 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | | Merge "Require-Bundle com.jcraft.jsch replaced by Import-Package statement"Matthias Sohn2016-08-081-1/+1
|\ \ \ | |/ / |/| |
| * | Require-Bundle com.jcraft.jsch replaced by Import-Package statementJens Offenbach2016-08-091-1/+1
| | | | | | | | | | | | | | | | | | Bug: 359288 Change-Id: Ifbbf953f5389c6bd3ba960b598c0e92656b522e3 Signed-off-by: Jens Offenbach <wolle5050@gmx.de> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>