summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src
Commit message (Collapse)AuthorAgeFilesLines
* [infer] Fix resource leaks in SubmoduleAddCommandMatthias Sohn2016-12-181-2/+8
| | | | | Bug: 509385 Change-Id: I9d25cf117cfb19df108f5fe281232193fd898474 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* [infer] Fix resource leaks in RebaseCommandMatthias Sohn2016-12-181-7/+9
| | | | | Bug: 509385 Change-Id: I9fbdfda59f7bc577aab55dc92ff897b00b5cb050 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* [infer] Fix resource leak in BlameCommandMatthias Sohn2016-12-181-5/+6
| | | | | Bug: 509385 Change-Id: Ic57fd3bf940752229e35102e7761823f7d3d8732 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Fix FileSnapshot.isModifiedChristian Halstrick2016-12-131-6/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | FileSnapshot.isModified may have reported a file to be clean although it was actually dirty. Imagine you have a FileSnapshot on file f. lastmodified and lastread are both t0. Now time is t1 and you 1) modify the file 2) update the FileSnapshot of the file (lastModified=t1, lastRead=t1) 3) modify the file again 4) wait 3 seconds 5) ask the Filesnapshot whether the file is dirty or not. It erroneously answered it's clean. Any file which has been modified longer than 2.5 seconds ago was reported to be clean. As the test shows that's not always correct. The real-world problem fixed by this change is the following: * A gerrit server using JGit to serve git repositories is processing fetch requests while simultaneously a native git garbage collection runs on the repo. * At time t1 native git writes temporary files in the pack folder setting the mtime of the pack folder to t1. * A fetch request causes JGit to search for new packfiles and JGit remembers this scan in a Filesnapshot on the packs folder. Since the gc is not finished JGit doesn't see any new packfiles. * The fetch is processed and the gc ends while the filesystem timer is still t1. GC writes a new packfile and deletes the old packfile. * 3 seconds later another request arrives. JGit does not yet know about the new packfile but is also not rescanning the pack folder because it cached that the last scan happened at time t1 and pack folder's mtime is also t1. Now JGit will not be able to resolve any object contained in this new pack. This behavior may be persistent if objects referenced by the ref/meta/config branch are affected so gerrit can't read permissions stored in the refs/meta/config branch anymore and will not allow any pushes anymore. The pack folder will not change its mtime and therefore no rescan will take place. Change-Id: I3efd0ccffeb97b01207dc3e7a6b85c6b06928fad Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Decide whether to "Accept-Encoding: gzip" on a request-by-request basisZhen Chen2016-12-092-18/+78
| | | | | | | | | When the reply is already compressed (e.g. a packfile fetched using dumb HTTP), "Content-Encoding: gzip" wastes bandwidth relative to sending the content raw. So don't "Accept-Encoding: gzip" for such requests. Change-Id: Id25702c0b0ed2895df8e9790052c3417d713572c Signed-off-by: Zhen Chen <czhen@google.com>
* Replace usage of deprecated EWAHCompressedBitmap.add(long)David Pursehouse2016-12-072-3/+3
| | | | | | | | | | The add(long) method was deprecated in favor of addWord(long) in the 0.8.3 release of JavaEWAH [1]. [1] https://github.com/lemire/javaewah/commit/e443cf5e Change-Id: I89c397ed02e040f57663d04504399dfdc0889626 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Fix merge-base calculationChristian Halstrick2016-11-281-10/+33
| | | | | | | | | | | | | | | | | | | | Fix JGits merge-base calculation in case of inconsistent commit times. JGit was potentially failing to compute correct merge-bases when the commit times where inconsistent (a parent commit was younger than a child commit). The code in MergeBaseGenerator was aware of the fact that sometimes the discovery of a merge base x can occur after the parents of x have been seen (see comment in #carryOntoOne()). But in the light of inconsistent commit times it was possible that these parents of a merge-base have already been returned as a merge-base. This commit fixes the bug by buffering all commits generated by MergeBaseGenerator. It is expected that this buffer will be small because the number of merge-bases will be small. Additionally a new flag is used to mark the ancestors of merge-bases. This allows to filter out the unwanted commits. Bug: 507584 Change-Id: I9cc140b784c3231b972bd2c3de61a789365237ab
* Specify RevisionSyntaxException message in Repository#resolveGrace Wang2016-11-241-3/+11
| | | | | | | | This does not address all cases where no message is specified, only cases where Repository#isValidRefName returns false. Change-Id: Ib88cdabfdcdf37be0053e06949b0e21ad87a9575 Signed-off-by: Grace Wang <gracewang92@gmail.com>
* Add missing @since tags for new APIMatthias Sohn2016-11-232-1/+5
| | | | Change-Id: I900d745195f58c067fadf209bb92cd3c852c59f4 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* dump HTTP: Avoid being confused by Content-Length of a gzipped streamZhen Chen2016-11-222-3/+18
| | | | | | | | | | | | | | | | | | | | | | | | TransportHttp sets 'Accept-Encoding: gzip' to allow the server to compress HTTP responses. When fetching a loose object over HTTP, it uses the following code to read the response: InputStream in = openInputStream(c); int len = c.getContentLength(); return new FileStream(in, len); If the content is gzipped, openInputStream decompresses it and produces the correct content for the object. Unfortunately the Content-Length header contains the length of the compressed stream instead of the actual content length. Use a length of -1 instead since we don't know the actual length. Loose objects are already compressed, so the gzip encoding typically produces a longer compressed payload. The value from the Content-Length is too high, producing EOFException: Short read of block. Change-Id: I8d5284dad608e3abd8217823da2b365e8cd998b0 Signed-off-by: Zhen Chen <czhen@google.com> Helped-by: Jonathan Nieder <jrn@google.com>
* Close input stream after useZhen Chen2016-11-221-7/+11
| | | | | | | The InputStream in FileStream in downloadPack is never closed. Change-Id: I59975d0b8d51f4b3e3ba9d4496b254d508cb936d Signed-off-by: Zhen Chen <czhen@google.com>
* Define MonotonicClock interface for advanced timestampsShawn Pearce2016-11-2114-30/+658
| | | | | | | | | | | | | MonotonicClock can be implemented to provide more certainity about time than the standard System.currentTimeMillis() can provide. This can be used by classes such as PersonIdent and Ketch to rely on more certainity about time moving in a strictly ascending order. Gerrit Code Review can also leverage this interface through its embedding of JGit and use MonotonicClock and ProposedTimestamp to provide stronger assurance that NoteDb time is moving forward. Change-Id: I1a3cbd49a39b150a0d49b36d572da113ca83a786
* Update JavaEWAH to 1.1.6Dave Borowitz2016-11-171-2/+2
| | | | | | | | Use Oxygen M3 Orbit repository which provides the bundles built using the new orbit-recipe based build. CQ: 11658 Change-Id: I7f3dcc966732b32830c75d5daa55383bd028d182 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Add missing @since tags for new APIMatthias Sohn2016-11-141-0/+2
| | | | Change-Id: Iaf83f66637d6a13e4a6d096ba8529553af7e30ed Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Fix cryptoVer constant name to CRYPTO_VERShawn Pearce2016-11-141-3/+3
| | | | Change-Id: I46c39f2eceb4d58e49bd6273b87711f35250ab5c
* RepositoryCache: simplify codeShawn Pearce2016-11-141-6/+3
| | | | | | | | | | | The type parameters can now be inferred when creating ConcurrentHashMap. A for loop over the keys of a ConcurrentHashMap doesn't need to use an Iterator<Map.Entry>; loop syntax handles this just fine over keySet(). Change-Id: I1f85bb81b77f7cd1caec77197f2f0bf78e4a82a1
* Add missing @Override found by ErrorProneShawn Pearce2016-11-144-17/+25
| | | | Change-Id: I585242507815aad4aa0103fd55a6c369e342ab33
* Deprecate SafeBufferedOutputStreamShawn Pearce2016-11-1411-58/+27
| | | | | | | | | | | | | | | | | | | | | Java 8 fixed the silent flush during close issue by FilterOutputStream (base class of BufferedOutputStream) using try-with-resources to close the stream, getting a behavior matching what JGit's SafeBufferedOutputStream was doing: try { flush(); } finally { out.close(); } With Java 8 as the minimum required version to run JGit it is no longer necessary to override close() or have this class. Deprecate the class, and use the JRE's version of close. Change-Id: Ic0584c140010278dbe4062df2e71be5df9a797b3
* Merge "Support {get,set}GitwebDescription on InMemoryRepository"David Pursehouse2016-11-141-0/+13
|\
| * Support {get,set}GitwebDescription on InMemoryRepositoryShawn Pearce2016-11-141-0/+13
| | | | | | | | | | | | | | | | This simplifies testing for Gerrit Code Review where application code is updating the repository description and the test harness uses InMemoryRepository. Change-Id: I9fbcc028ae24d90209a862f5f4f03e46bfb71db0
* | Organize importsDavid Pursehouse2016-11-1435-51/+46
|/ | | | | Change-Id: I7c545d06b1bced678c020fab9af1382bc4416b6e Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Add {get,set}GitwebDescription to RepositoryShawn Pearce2016-11-143-6/+87
| | | | | | | | | | | | | | | | This method pair allows the caller to read and modify the description file that is traditionally used by gitweb and cgit when rendering a repository on the web. Gerrit Code Review has offered this feature for years as part of its GitRepositoryManager interface, but its fundamentally a feature of JGit and its Repository abstraction. git-core typically initializes a repository with a default value inside the description file. During getDescription() this string is converted to null as it is never a useful description. Change-Id: I0a457026c74e9c73ea27e6f070d5fbaca3439be5
* Merge "Don't serialize internal hash collision chain link"Shawn Pearce2016-11-141-1/+1
|\
| * Don't serialize internal hash collision chain linkThomas Wolf2016-10-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ObjectId is serializable, and so are its subtypes. Ensure that serialization does not follow the hash collision chain internal to the ObjectIdOwnerMap, otherwise completely unrelated objects may get serialized when a RevObject is serialized. Note that serializing a RevCommit or RevTag may serialize quite a few objects due to the parent/object links they contain. A user has no real control over how many objects will be written when a RevCommit is serialized. C.f [1]. This change does not resolve that, but in any case this internal hash collision chain link should not participate in serialization. [1] https://github.com/gitblit/gitblit/pull/1141 Change-Id: Ice331a9dc80a59ca360fcc04adaff8b5e750d847 Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
* | Merge "Reduce synchronized scope around ConcurrentHashMap"Shawn Pearce2016-11-141-15/+15
|\ \
| * | Reduce synchronized scope around ConcurrentHashMapPhilipp Marx2016-11-121-15/+15
| | | | | | | | | | | | | | | Change-Id: I982a78070efb6bc2d3395330456d62e0d5ce6da7 Signed-off-by: Philipp Marx <smigfu@googlemail.com>
* | | Merge "StreamCopyThread: Remove unused AtomicInteger import"Jonathan Nieder2016-11-131-1/+0
|\ \ \
| * | | StreamCopyThread: Remove unused AtomicInteger importJonathan Nieder2016-11-131-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | I forgot to do this in 97f3baa0d3df7ed26a55b2240cc5ce1a04861a4c (StreamCopyThread: Remove unnecessary flushCount, 2016-11-13). Change-Id: Iaed9f345848cf0f854c9d0debcf94bc831d53054
* | | | Merge "Extract insecure Cipher factory"Matthias Sohn2016-11-132-6/+71
|\ \ \ \
| * | | | Extract insecure Cipher factoryShawn Pearce2016-11-132-6/+71
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Bazel runs ErrorProne by default and ErrorProne rightly complains that allowing the user to specify any Cipher can lead to insecure code (in particular, getCipher("AES") operates in ECB mode). Unfortunately this is required to support existing repositories insecurely stored on S3. Extract the insecure factory code to its own class so this can be built as a java_library() with this check disabled. Change-Id: I34f381965bdaa25d5aa8ebf6d8d5271b238334e0
* | | | | Merge "Get rid of SoftReference in RepositoryCache"Jonathan Nieder2016-11-132-23/+12
|\ \ \ \ \ | |_|/ / / |/| | | |
| * | | | Get rid of SoftReference in RepositoryCacheHugo Arès2016-11-132-23/+12
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now that RepositoryCache have a time based eviction strategy, get rid of the strategy to evict cache entries if heap memory is running low, i.e. soft references. Main reason why time based eviction was implemented was to offer an alternative to the unpredictable soft references. Relying on soft references is not working, especially in large heap. The JVM GC will consider collecting soft references as last resort before throwing an out of memory error. For example, an application like Gerrit configured with a 128GB heap, GC will wait until all 128GB is filled before collecting the soft references so the application will be suffering long pauses caused by GC for a long time already. In other words, you will have to restart application because it's unusable before JVM eviction kicks in. Keeping the SoftReference in RepositoryCache is causing more harm than good. If you use the time based eviction (which is the default strategy) and want to tune JVM to release soft references more aggressively, it will release repositories from the cache even though they are not expired which defeats the purpose of the repository cache. Gerrit uses Lucene library which uses soft references and this is causing a "memory leak" except if you configure JVM to release soft references more aggressively which have the nasty side effect of evicting non expired repositories from the cache. Change-Id: I9940bd800464c7f007696d0ccde52ea617b2ebce Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>
* | | | StreamCopyThread: flush cannot interrupt a writeJonathan Nieder2016-11-131-13/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Because flush calls interrupt with writeLock held, it cannot interrupt a write. Simplify by no longer defending against that. Change-Id: Ib0b39b425335ff7b0ea1b1733562da5392576a15
* | | | StreamCopyThread: Remove unnecessary flushCountJonathan Nieder2016-11-131-12/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | StreamCopyThread#run consistently interrupts itself whenever it discovers it has been interrupted by StreamCopyThread#flush while not reading. The flushCount is not needed to avoid lost flushes. All in-tree users of StreamCopyThread never flush. As a nice side benefit, this avoids the expense of atomic operations that have no purpose for those users. Change-Id: I1afe415cd09a67f1891c3baf712a9003ad553062
* | | | Merge "Switch JSchSession to simple isolated OutputStream"Shawn Pearce2016-11-134-27/+248
|\ \ \ \ | |/ / / |/| | |
| * | | Switch JSchSession to simple isolated OutputStreamShawn Pearce2016-11-134-27/+248
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Work around issues with JSch not handling interrupts by isolating the JSch interactions onto another thread. Run write and flush on a single threaded Executor using simple Callable operations wrapping the method calls, waiting on the future to determine the outcome before allowing the caller to continue. If any operation was interrupted the state of the stream becomes fuzzy at close time. The implementation tries to interrupt the pending write or flush, but this is very likely to corrupt the stream object, so exceptions are ignored during such a dirty close. Change-Id: I42e3ba3d8c35a2e40aad340580037ebefbb99b53
* / / WalkEncryption: Cleanup Java 8 supportShawn Pearce2016-11-131-35/+3
|/ / | | | | | | | | | | | | Java 8 is now the minimum for JGit, so Java 7 only paths are not necessary. Change-Id: I0151625fed4d0da95321ebed5cca648b8c29d5f1
* | Check that DfsBlockCache#blockSize is a power of 2Philipp Marx2016-11-113-1/+10
| | | | | | | | | | | | | | | | | | | | In case a value is used which isn’t a power of 2 there will be a high chance of java.lang.ArrayIndexOutBoundsException and org.eclipse.jgit.errors.CorruptObjectException due to a mismatching assumption for the DfsBlockCache#blockSizeShift parameter. Change-Id: Ib348b3704edf10b5f93a3ffab4fa6f09cbbae231 Signed-off-by: Philipp Marx <smigfu@googlemail.com>
* | Fix loop in auto gcMatthias Sohn2016-11-071-5/+5
| | | | | | | | | | | | | | | | | | | | * GC.tooManyLooseObjects() always responded true since the loop missed to advance the iterator so it always incremented until the threshold was exceeded. * Also fix loop exit criterion which was off by 1. * Add some tests. Change-Id: I70976dfaa026efbcf3c46bd45941f37277a18e04 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | StreamCopyThread: Do not drop data when flush is observed before writingJonathan Nieder2016-11-041-5/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | StreamCopyThread.flush was introduced in 61645b938bc934fda3b0624c5bac1e3495634750 (Add timeouts to smart transport clients, 2009-06-19) to support timeouts on write in JSch. The commit message from that change explains: JSch made a timeout on write difficult because they explicitly do a catch for InterruptedException inside of their OutputStream. We have to work around that by creating an additional thread that just shuttles data between our own OutputStream and the real JSch stream. The code that runs on that thread is structured as follows: while (!done) { int n = src.read(buf); dst.write(buf, 0, n); } with src being a PipedInputStream representing the data to be written to JSch. To add flush support, that change wanted to add an extra step if (wantFlush) dst.flush(); but to handle the case where the thread is blocked in the read() call waiting for new input, it needs to interrupt the read. So that is how it works: the caller runs pipeOut.write(some data); pipeOut.flush(); copyThread.flush(); to write some data and force it to flush by interrupting the read. After the pipeOut.flush(), the StreamCopyThread reads the data that was written and prepares to copy it out. If the copyThread.flush() call interrupts the copyThread before it acquires writeLock and starts writing, we throw away the data we just read to fulfill the flush. Oops. Noticed during the review of e67d59df3fb8ae1efe94a54efce36784f7cc83e8 (StreamCopyThread: Do not let flush interrupt a write, 2016-11-04), which introduced this bug. Change-Id: I4aceb5610e1bfb251046097adf46bca54bc1d998
* | StreamCopyThread: Do not let flush interrupt a writeJonathan Nieder2016-11-041-17/+29
| | | | | | | | | | | | | | | | | | | | flush calls interrupt() to interrupt a pending read and trigger a flush. Unfortunately that interrupt() call can also interrupt a pending write, putting Jsch in a bad state and triggering "Short read of block" errors. Add locking to ensure the flush only interrupts reads as intended. Change-Id: Ib105d9e107ae43549ced7e6da29c22ee41cde9d8
* | Fix flush call race condition in StreamCopyThreadZhen Chen2016-10-311-1/+7
| | | | | | | | | | | | | | | | | | | | If there was a new flush() call during flush previous bytes, we need to catch it in order to process the new bytes between the two flush() calls instead of going to last catch IOException clause and end the thread. Change-Id: Ibc58a1fa97559238c13590aedbb85e482d85e465 Signed-off-by: Zhen Chen <czhen@google.com>
* | Add missing @since tag for new protected field in ObjectReaderMatthias Sohn2016-10-241-2/+3
| | | | | | | | Change-Id: I93d67d7fd2fde55be39480944d9d7072dbb6c600 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Make streamFileThreshold configurableKevin Corcoran2016-10-243-8/+32
|/ | | | | | | | | | | | | Previously, the streamFileThreshold, the threshold at which a file would be streamed rather than loaded entirely into memory, was only configurable on a global basis. This commit makes this threshold configurable on a per-loader basis. Bug: 490404 Change-Id: I492c18c3155dbf56eedda9044a61d76120fd75f9 Signed-off-by: Kevin Corcoran <kevin.corcoran@puppetlabs.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Move constants used for config-files to ConfigConstantsChristian Halstrick2016-10-233-10/+18
| | | | Change-Id: I7d8db4bfa1a851afd599bb8eaa8f8273204d2e1d
* Implement auto gcMatthias Sohn2016-10-238-1/+217
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With the auto option, gc checks whether any housekeeping is required; if not, it exits without performing any work. Some JGit commands run gc --auto after performing operations that could create many loose objects. Housekeeping is required if there are too many loose objects or too many packs in the repository. If the number of loose objects exceeds the value of the gc.auto option jgit's GC consolidates all existing packs into a single pack (equivalent to -A option), whereas git-core would combine all loose objects into a single pack using repack -d -l. Setting the value of gc.auto to 0 disables automatic packing of loose objects. If the number of packs exceeds the value of gc.autoPackLimit, then existing packs (except those marked with a .keep file) are consolidated into a single pack by using the -A option of repack. Setting gc.autoPackLimit to 0 disables automatic consolidation of packs. Like git the following jgit commands run auto gc: - fetch - merge - rebase - receive-pack The auto gc for receive-pack can be suppressed by setting the config option receive.autogc = false Change-Id: I68a2a051b39ec2c53cb7c4b8f6c596ba65eeba5d Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* CheckoutCommand: Add method to add multiple pathsDavid Pursehouse2016-10-221-0/+20
| | | | | | | | The new method addPaths(List<String>) allows callers to add multiple paths without having to iterate over several calls to addPath(String). Change-Id: I2c3746a97ead7118fb0ed5543a2c843224719031 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Fix possible SIOOBE in RefDirectory.parsePackedRefsMarc Strapetz2016-10-212-0/+6
| | | | | | | | | This SIOOBE happens reproducibly when trying to access a repository containing Cygwin symlinks Change-Id: I25f103fcc723bac7bfaaeee333a86f11627a92c7 Signed-off-by: Marc Strapetz <marc.strapetz@syntevo.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* TransportBundleFile: Resolve remote repository locallyThomas Meyer2016-10-211-1/+1
| | | | | | | Remove the assumption that the local repository is a file based one. Change-Id: I8f10fe7a54e9fc07f2a23d7901e52b65aa570d45 Signed-off-by: Thomas Meyer <thomas.mey@web.de> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* TreeFormatter: disallow empty filenames in treesDavid Turner2016-10-192-0/+30
| | | | | | | | | Git barfs on these (and they don't make any sense), so we certainly shouldn't write them. Change-Id: I3faf8554a05f0fd147be2e63fbe55987d3f88099 Signed-off-by: David Turner <dturner@twosigma.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>