Eclipse JGit: Java implementation of Git 4.9.0

Primary tabs

Features

  • Implement atomic BatchRefUpdates for RefDirectory. The existing packed-refs file provides a mechanism for implementing atomic multi-ref updates without any changes to the on-disk format or lockfile protocol. We just need to make sure that there are no loose refs involved in the transaction, which we can achieve by packing the refs while holding locks on all loose refs. Full details of the algorithm are in the PackedBatchRefUpdate javadoc.
  • Reftable: implement a new ref storage format. Some repositories contain a lot of references (e.g. android at 866k, rails at 31k). The reftable format provides:
    • Near constant time lookup for any single reference, even when the repository is cold and not in process or kernel cache.
    • Near constant time verification a SHA-1 is referred to by at least one reference (for allow-tip-sha1-in-want).
    • Efficient lookup of an entire namespace, such as `refs/tags/`.
    • Support atomic push `O(size_of_update)` operations.
    • Combine reflog storage with ref storage.
  • Fetch submodule repo before resolving commits (bug 470318)
  • Handle SSL handshake failures in TransportHttp, use CredentialsProvider to inform the user (bug 374703)
  • Support http.<url>.* configs
  • Add BlobObjectChecker
  • Improve getting typed values from a Config to enable handling invalid configuration options (bug 520978)
  • Support most %-token substitutions in OpenSshConfig (bug 496170)
  • Let Jsch know about ~/.ssh/config. Ensure the Jsch instance used knows about ~/.ssh/config. This enables Jsch to honor more user configurations, in particular also the UserKnownHostsFile configuration, or additional identities given via multiple IdentityFile entries. (bug 490939)
  • Add support to follow HTTP redirects (bug 465167)
    • Implement config setting http.followRedirects
    • Number of redirects followed can be limited by http.maxRedirects (default 5)
  • Send a detailed event on working tree modifications to provide the foundations for better file change tracking (bug 500106)
  • Add dfs fsck implementation
  • Support -merge attribute in binary macro. The merger is now able to react to the use of the merge attribute. The value unset and the custom value 'binary' are handled (-merge and merge=binary) (bug 517128)
  • Support --match functionality in DescribeCommand (bug 518377)
  • Allow to programmatically set FastForwardMode for PullCommand (bug 517847)
  • Add support for config option "pull.ff" (bug 474174)
  • Add a new singlePack option to PackConfig. If set, "singlePack" will create a single GC pack file for all objects reachable from refs/*. If not set, the GC pack will contain object reachable from refs/heads/* and refs/tags/*, and the GC_REST pack will contain all other reachable objects.
  • fetch: Accept any SHA-1 on left hand side of refspec

JGit Command Line

  • Added API to TextBuiltin for piped usage.
  • Add --match option for `jgit describe` to CLI (bug 518377)

Performance Improvements

  • ReceivePack: clear advertised .haves if application changes refs to avoid over-advertising ".have" lines
  • Reftable: see above

Build and Release Engineering

  • Upgrade Maven compiler plugins
  • Add org.apache.commons.codec 1.9.0 to target platform
  • Update args4j to 2.33 (CQ: 11068)
  • Update Oxygen Orbit p2 repository to R20170516192513
  • Replace findbugs by spotbugs

Bug Fixes

  • Fix missing RefsChangedEvent when packed refs are used (bug 521296)
  • Fix Daemon.stop() to actually stop the listener thread (bug 376369)
  • Remove workaround for bug in Java's ReferenceQueue which was fixed in Java 8. '''Minimum Java version 8-b100:''' JGit 4.9 removes a  workaround for a bug in ReferenceQueue of Sun's Java 5, 6, 7 implementation. This bug was fixed in JDK 8-b100 hence this is the minimum supported Java version for JGit 4.9.
  • Don't assume name = path in .gitmodules (bug 508801)
  • FetchCommand: pass on CredentialsProvider to submodule fetches (bug 515325)
  • Exclude file matching: fix backtracking on match failures after "**" (bug 520920)
  • Fix path pattern matching to work also for gitattributes (bug 508568)
  • Ignore invalid TagOpt values (bug 429625)
  • Fix default directory used to clone when setDirectory wasn't called (bug 519883)
  • Do authentication re-tries on HTTP POST (bug 513043)
  • Fix exception handling for opening bitmap index files
  • Do not apply pushInsteadOf to existing pushUris (bug 393170)
  • Record submodule paths with untracked changes as FileMode.GITLINK (bug 520702)
  • Ensure EOL stream type is DIRECT when -text attribute is present. Otherwise fancy combinations of attributes (binary or -text in combination with crlf or eol) may result in the corruption of binary data. (bug 520910)
  • Use relative paths for attribute rule matching (bug 520677)
  • Treat RawText of binary data as file with one single line. This avoids executing mergeAlgorithm.merge on binary data, which is unlikely to be useful.
  • Fix committing empty commits (bug 510685)
  • Fix JGit set core.fileMode to false by default instead of true for non Windows OS. (bug 519887)
  • Fix matching ignores and attributes pattern of form a/b/**.
  • Fix deleting symrefs
  • Fix bug in multiple tag handling on DescribeCommand (bug 518377)
  • pushInsteadOf configuration is ignored by EGit. Note: Up to now JGit mistakenly applied pushInsteadOf also to existing pushUris. If some repositories had relied on this mis-feature, pushes may newly suddenly fail (the uncritical case; the config just needs to be fixed) or even still succeed but push to unexpected places, namely to the non-rewritten pushUrls (the critical case). (bug 393170)
Release Date: 
Wednesday, October 4, 2017
Release Type: 
Minor release