aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Shallow fetch/clone: Make --depth mean the total history depthTerry Parker2016-08-055-13/+67
| | | | | | | | | | | | | | | | | | | | | 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>
* Shallow fetch: Respect "shallow" linesTerry Parker2016-08-055-24/+88
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* Merge changes from topic 'shallowClone'Jonathan Nieder2016-08-043-6/+88
|\ | | | | | | | | | | * changes: RevWalk: Make fields available to DepthWalk Shallow fetch: avoid sending unneeded blobs
| * RevWalk: Make fields available to DepthWalkTerry Parker2016-08-041-1/+1
| | | | | | | | | | | | | | | | | | 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>
| * Shallow fetch: avoid sending unneeded blobsTerry Parker2016-08-042-5/+87
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | Merge "PackWriterTest: Improve readability"Terry Parker2016-08-041-10/+17
|\|
| * PackWriterTest: Improve readabilityTerry Parker2016-08-041-10/+17
| | | | | | | | | | | | | | | | Add wants() and haves() static utility functions to improve readability. Change-Id: I4d44e17a9af97c0203e2ebe112eabb1f67d272a6 Signed-off-by: Terry Parker <tparker@google.com>
* | DiffFormatter: Support setting a reader without a repoDave Borowitz2016-08-033-25/+42
|/ | | | Change-Id: I575cdb9c0a9a341b79ef5e3c7a35e68cde142540
* Merge "RefSpec: Make WildcardMode public"Jonathan Nieder2016-07-281-2/+20
|\
| * RefSpec: Make WildcardMode publicStefan Beller2016-07-281-2/+20
| | | | | | | | | | | | | | | | 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>
* | Fix typo in email address in copyright headersDavid Pursehouse2016-07-285-5/+5
| | | | | | | | | | Change-Id: Ib7b73d7d37574682bb58f969822c842e4e579233 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* | LfsServerTest: Treat response body as UTF-8 when decoding error messageDavid Pursehouse2016-07-281-9/+12
| | | | | | | | | | Change-Id: I495f0b60b7128fff27502641e6a5d05f888d4e8a Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* | LfsProtocolServlet: Pass request and path to getLargeFileRepositoryDavid Pursehouse2016-07-272-14/+31
| | | | | | | | | | | | | | | | | | | | | | | | 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>
* | FileLfsServlet: Include error message in response bodyDavid Pursehouse2016-07-273-15/+62
| | | | | | | | | | | | | | | | | | | | 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>
* | FileLfsServlet: Return HTTP 422 instead of 400David Pursehouse2016-07-272-4/+4
| | | | | | | | | | | | | | | | | | | | | | 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>
* | MergeFormatter: Suppress warning about unchecked conversionDavid Pursehouse2016-07-261-0/+1
|/ | | | | | | | | | | | | | 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>
* Repository: Log negative useCnt message together with stack traceDavid Pursehouse2016-07-261-2/+3
| | | | | | | | | | | | | 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>
* Annotate Sets#of with @SafeVarArgs to prevent heap pollution warningDavid Pursehouse2016-07-261-0/+1
| | | | | | | | | | | | | | | | 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>
* Archive: Make project name consistent with other subprojects'David Pursehouse2016-07-261-1/+1
| | | | | Change-Id: I8341f3340d8129b4f966d541097269210fbf65d2 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Ignore 'The value of exception parameter is not used' warningDavid Pursehouse2016-07-2617-0/+17
| | | | | Change-Id: I50407e4a33e35b718ca40503fdd436f1f9f70fba Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Update links to LFS API documentationDavid Pursehouse2016-07-263-4/+4
| | | | | | | | 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>
* Merge branch 'stable-4.4'David Pursehouse2016-07-262-4/+29
|\ | | | | | | | | | | | | | | | | * 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>
| * JGit v4.4.1.201607150455-rv4.4.1.201607150455-rMatthias Sohn2016-07-1556-59/+59
| | | | | | | | | | Change-Id: I61dbc29a962c8185fb356fe1ca30a1e673166d47 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
| * Merge "RefDirectory: remove ref lock file for following ref dir removal" ↵Christian Halstrick2016-07-152-4/+29
| |\ | | | | | | | | | into stable-4.4
| | * RefDirectory: remove ref lock file for following ref dir removalMarco Miller2016-06-102-4/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | RefSpecs: allow construction of weird wildcarded RefSpecsStefan Beller2016-07-254-9/+111
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | RefSpec: reject refs ending in '/'Stefan Beller2016-07-252-0/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | Merge "Push implementation of option strings"Terry Parker2016-07-2212-6/+611
|\ \ \
| * | | Push implementation of option stringsDan Wang2016-07-2212-6/+611
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | | DfsObjDatabase: Add lazy last modified method to PackListDave Borowitz2016-07-191-0/+14
| | | | | | | | | | | | | | | | Change-Id: Id045f162fa584ea14da29a9df58a42c53a78dc15
* | | | Merge changes I159e9154,I06c722b2Dave Borowitz2016-07-193-43/+188
|\ \ \ \ | |/ / / |/| | | | | | | | | | | | | | | * changes: DfsObjectDatabase: Expose PackList and move markDirty there Invalidate DfsObjDatabase pack list when refs are updated
| * | | DfsObjectDatabase: Expose PackList and move markDirty thereDave Borowitz2016-07-182-20/+37
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
| * | | Invalidate DfsObjDatabase pack list when refs are updatedDave Borowitz2016-07-143-40/+168
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* | | | BatchRefUpdate: Remove unused namesToCheck variableDan Wang2016-07-151-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | | Fix AppServer build errors in Eclipse with <4.6 target platformsMatthias Sohn2016-07-141-18/+27
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | Merge branch 'stable-4.4'Matthias Sohn2016-07-1212-69/+578
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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>
| * | Log if Repository.useCnt becomes negativeMatthias Sohn2016-07-123-1/+19
| | | | | | | | | | | | | | | | | | | | | 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>
| * | Time based eviction strategy for repository cacheChristian Halstrick2016-07-125-13/+419
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
| * | Add method to read time unit from configHugo Arès2016-07-125-0/+227
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
| * | Align include.path max depth with native gitHugo Arès2016-06-271-1/+1
| | | | | | | | | | | | | | | Change-Id: I52f059816e1d94b2d60d096e3013bf4095cd0fc4 Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>
| * | Config load should not fail on unsupported or nonexistent include pathHugo Arès2016-06-274-7/+33
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
| * | Merge "Extract work queue to allow reusing it" into stable-4.4Matthias Sohn2016-06-212-46/+102
| |\ \
| | * | Extract work queue to allow reusing itMatthias Sohn2016-06-082-46/+102
| | |/ | | | | | | | | | | | | Change-Id: I28f7800030a3b9db48e315061509af0746feffcc Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
| * / Allow using JDK 7 bootclasspath when compiling JGit using Java 8Matthias Sohn2016-06-211-1/+5
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | Implement new abstract MappedLoginService methods added in Jetty 9.3Matthias Sohn2016-07-111-0/+8
| | | | | | | | | | | | | | | | 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>
* | DfsGarbageCollector: avoid closing idx and bitmap streams twiceJonathan Nieder2016-07-071-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* | Fix unclosed resource warnings in FileTreeIteratorTestMatthias Sohn2016-07-071-29/+30
| | | | | | | | Change-Id: I75ea7deca64a707cd6b5c61c3c83062f20041684 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Fix assertion in SmartClientSmartServerTest.testPush_CreateBranch()Matthias Sohn2016-07-071-1/+1
| | | | | | | | | | | | This assertion only defined a message but didn't assert anything. Change-Id: I0914642b64b69dc4e3ec24acbf8052f9171613d8 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | ReceivePack: report protocol parsing failures on channel 3Shawn Pearce2016-07-053-1/+74
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* | ReceivePack: catch InvalidObjectIdException while parsing shallowShawn Pearce2016-07-051-1/+11
| | | | | | | | | | | | | | | | 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