aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Update uses-clauses in OSGi manifestsMatthias Sohn2015-08-315-15/+42
| | | | | | | | | | In Bug 476164 it was reported that EGit doesn't start when the platform comes with jsch 0.1.51 while this version of EGit/JGit brings jsch 0.1.53. This could be caused by outdated uses-clauses. Hence recompute them using PDE tooling. Bug: 476164 Change-Id: I185ba097884ead9cd034eba842bd3bf34181a99b Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Use java.io.File to check existence of loose objects in ObjectDirectoryMatthias Sohn2015-08-281-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It was reported in [1] that 197e3393a51424fae45e51dce4a649ba26e5a368 led to a performance regression in a BFG benchmark. Analysis showed that this is caused by the exists() method in FS_POSIX, now overriding the default implementation in FS. The default implementation of FS.exists() uses java.io.File.exists(), while the new implementation in FS_POSIX uses java.nio.file.Files.exists() - by simply removing the override in FS_POSIX, performance was restored. Profiling showed that java.nio.file.Files.exists() is substantially slower than java.io.File.exists(), to the point where the exists() call doubles the average cost of a call to ObjectDirectory.insertUnpackedObject() - which the BFG uses a lot, because it's rewriting history. Average times measured on Ubuntu were: java.io.File.exists() - 4 microseconds java.nio.file.Files.exists() - 60 microseconds The loose object exists test should be using java.io.File and not FS. ObjectDirectory uses FS.resolve() to traverse symlinks to objects but then once inside objects all 256 sharded directories should be real directories, and the object files should be real files, not dangling symlinks. java.io.File.exists() is sufficient here, and faster. Change ObjectDirectory to use File.exists() once its computed the File handle. This does mean JGit cannot run ObjectDirectory code on an abstract virtual filesystem plugged into NIO2. If you really want to run JGit on an esoteric non-standard filesystem like "in memory" you should look at the DFS storage backend, which has fewer abstraction points to deal with. Or write your own from scratch. [1] https://dev.eclipse.org/mhonarc/lists/jgit-dev/msg02954.html Change-Id: I74684dc3957ae1ca52a7097f83a6c420aa24310f Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Fix warnings on FileUtils.isStaleFileHandle()Matthias Sohn2015-08-261-1/+3
| | | | | | | - add @since annotation for new API method - silence non-externalized String warning Change-Id: I864176ced64e9569e7f2cdf8f777720655bfc578 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Deprecate redundant FileUtil.delete(File), use FileUtils insteadAndrey Loskutov2015-08-265-20/+4
| | | | | | Bug: 475070 Change-Id: I6dc651f4b47e1b2c8d7954ec982e21ae6bb5f7a6 Signed-off-by: Andrey Loskutov <loskutov@gmx.de> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Handle stale file handles on packed-refs fileMartin Fick2015-08-263-16/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | On a local filesystem the packed-refs file will be orphaned if it is replaced by another client while the current client is reading the old one. However, since NFS servers do not keep track of open files, instead of orphaning the old packed-refs file, such a replacement will cause the old file to be garbage collected instead. A stale file handle exception will be raised on NFS servers if the file is garbage collected (deleted) on the server while it is being read. Since we no longer have access to the old file in these cases, the previous code would just fail. However, in these cases, reopening the file and rereading it will succeed (since it will reopen the new replacement file). So retrying the read is a viable strategy to deal with stale file handles on the packed-refs file, implement such a strategy. Since it is possible that the packed-refs file could be replaced again while rereading it (multiple consecutive updates can easily occur with ref deletions), loop on stale file handle exceptions, up to 5 extra times, trying to read the packed-refs file again, until we either read the new file, or find that the file no longer exists. The limit of 5 is arbitrary, and provides a safe upper bounds to prevent infinite loops consuming resources in a potential unforeseen persistent error condition. Change-Id: I085c472bafa6e2f32f610a33ddc8368bb4ab1814 Signed-off-by: Martin Fick<mfick@codeaurora.org> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Merge "Add public isStaleFileHandle() API, improve detection."Matthias Sohn2015-08-262-4/+12
|\
| * Add public isStaleFileHandle() API, improve detection.Martin Fick2015-08-252-4/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Add a public API to the FileUtils to determine if an IOException is a stale NFS file handle exception. This will make it easier to detect such errors, and interpret them consistently throughout the codebase. This new API is a bit more lenient in its detection than the previous detection, and should be able to detect some errors which previously were not identified as stale file handle exceptions because they had the word NFS in the error message. Adjust the packfile handling code to use this new API for detection. Change-Id: I21f80014546ba1afec7335890e5ae79e7f521412 Signed-off-by: Martin Fick<mfick@codeaurora.org>
* | Set "potentialNullReference" to "error" level and fixed all issuesAndrey Loskutov2015-08-225-16/+39
|/ | | | | | | | | | | | There should be no functional change, the logic updated only to make code simple so that compiler can understand what is going for. Removed all @SuppressWarnings("null") annotations since they cannot be used if "org.eclipse.jdt.core.compiler.problem.potentialNullReference" option is set to the "error" level. Bug: 470647 Change-Id: Ie93c249fa46e792198d362e531d5cbabaf41fdc4 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* Enable annotation based NPE analysis in jgitAndrey Loskutov2015-08-207-12/+21
| | | | | | Bug: 470647 Change-Id: I14d1983bb7c208faeffee0504e0567e38d8a89f3 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* Update Jetty to 9.2.13.v20150730Matthias Sohn2015-08-209-78/+78
| | | | Change-Id: I0c2a4cafcd1992431888c2a48592d9cb1ac04747 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Restored obsoleted createSymLink/readSymLink in FileUtilAndrey Loskutov2015-08-182-14/+25
| | | | | Bug: 475070 Change-Id: I425ad842dc26b55f747f192348398a3912c0ca6b Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* Use NIO2 to implement FileUtils.rename() and expose optionsMatthias Sohn2015-08-172-14/+67
| | | | | | | | - use NIO2's Files.move() to reimplement rename() - provide a second method accepting CopyOptions which can be used to request atomic move. Change-Id: Ibcf722978e65745218a1ccda45344ca295911659 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Move createSymLink/readSymLink to FileUtilsAndrey Loskutov2015-08-179-78/+42
| | | | | | Bug: 475070 Change-Id: I258f4bf291e02ef8e6f867b5d71c04ec902b6bcb Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* Merge "Change FS not to throw NPE when facing InMemory databases"Christian Halstrick2015-08-172-1/+7
|\
| * Change FS not to throw NPE when facing InMemory databasesChristian Halstrick2015-08-162-1/+7
| | | | | | | | | | | | | | | | | | | | The FS class and the subclasses FS_POSIX assumed in the findHook() method that every repository has a valid gitDir. But in tests when using in-memory-repositories this is not true and this method was generating NPEs. Change the method to return null if no repository directory can be determined. Change-Id: I38a4d36dc6452b5dacae3d0dbf562b569ca3c19b
* | Expose the set of root commits in PackStatisticsShawn Pearce2015-08-162-0/+13
|/ | | | | | | | | | | Root commits are commits with zero parents. If a commmit has no parents it is the first commit in the repository. In general the root commits should be unique for any given project, as the first commit will be created at a different time, by a different user with its own message. These root commits can be used as a "fingerprint" to identify disjoint histories. Change-Id: Id891dbc1f17c816cea404569578bb7635ff85cdb
* Fix NPE in DfsGarbageCollector and further reduce memoryShawn Pearce2015-08-142-26/+47
| | | | | | | | | | | | | | | | | | | | | | | | | | | DfsGarbageCollector asks PackWriter for the set of objects packed after the bitmap index is written out. This is now null as it was cleared to release memory. Instead use PackBitmapIndexBuilder to build the set as it also has the objects. Reduce memory in PackBitmapIndexBuilder by fully discarding the ObjectToPack instances. This was the original intent of commit 4bb523475d44 ("PackWriter: shed memory while creating bitmaps") but failed as the instances were still held live here. Switch to BlockList instead of ObjectToPack[]. This allows the JVM to allocate many smaller arrays instead of one contiguous array with 5.2M reference pointers. In a tight heap the smaller allocations are more feasible. Reduce the initial EWAHCompressedBitmaps for the 4 type maps. On average a typical repository is 30% commits, 30% trees and 30% blobs. These bitmaps are typically very dense. PackWriter orders objects by commit, tree, blob when writing the file so these should always be a very dense run of 1s with some 0s before and after. So even the 1/3rd allocation is likely too large, but the later trim() will reduce the internal buffer anyway. Change-Id: If0b80a31cb00894f1485ff8f53ef7ae5a759a046
* Cleanup Attributes and remove obsoleted Java7BasicAttributes classAndrey Loskutov2015-08-132-32/+14
| | | | | | | | | After jgit moved to Java 7 there is no need in an extra Java7BasicAttributes class. Also all fields of Attributes can be made final now. Change-Id: I0be6daf7758189b0eecc4e26294bd278ed8bf7a0 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* Merge "Remove "experimental" from the description of the pack bitmap index"Shawn Pearce2015-08-131-2/+1
|\
| * Remove "experimental" from the description of the pack bitmap indexTerry Parker2015-07-201-2/+1
| | | | | | | | | | Change-Id: I940701093eb6c6d26e147b79de77997b0df481a0 Signed-off-by: Terry Parker <tparker@google.com>
* | PackWriter: shed memory while creating bitmapsShawn Pearce2015-08-131-41/+53
| | | | | | | | | | | | | | | | | | | | | | | | | | Once bitmap creation begins the internal maps required for packing are no longer necessary. On a repository with 5.2M objects this can save more than 438 MiB of memory by allowing the ObjectToPack instances to get garbage collected away. Downside is the PackWriter cannot be used for any further opertions except to write the bitmap index. This is an acceptable trade-off as in practice nobody uses the PackWriter after the bitmaps are built. Change-Id: Ibfaf84b22fa0590896a398ff659a91fcf03d7128
* | Merge "Do not retain commit body during bitmap generation"Shawn Pearce2015-08-131-0/+1
|\ \
| * | Do not retain commit body during bitmap generationShawn Pearce2015-08-121-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | The bitmap preparer only needs commit graph topology; it does not use the message body. Allow the RevWalk to free the body after the commit has been parsed to save memory. Change-Id: I97d4a440c9fc313873fd224bd05b9d9e3dc575db
* | | Merge "Bitmap builder: actually compress EWAH bitmaps in memory"Shawn Pearce2015-08-131-0/+5
|\ \ \
| * | | Bitmap builder: actually compress EWAH bitmaps in memoryShawn Pearce2015-08-121-0/+5
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For construction performance each new EWAHBitmap is allocated at the roughly worst-case size the bitmap would need if all of the words must be literal and no run length compression is available. In practice this is far larger than is required, wasting heap memory while the bitmaps are computed. Trim down each bitmap to its minimum required size. This copies the internal array to a new smaller array, allowing the GC to reclaim the prior larger array for reuse. A single bitmap of 5.2M bits is only 79 KiB of memory without this trim call but 15,000 such bitmaps is 1.1 GiB. Trimming can help fit a larger number of bitmaps during processing. Change-Id: I2bd19a786189db5b01c4c96f209b83de50e10c3b
* / / Consider original file mode while checking parent ignore rulesAndrey Loskutov2015-08-122-4/+57
|/ / | | | | | | | | | | | | | | | | | | | | | | The WorkingTreeIterator.isEntryIgnored() should use originally requested file mode while descending to the file tree root and checking ignore rules. Original code asking isEntryIgnored() on a file was using directory mode instead if the .gitignore was not located in the same directory. Bug: 473506 Change-Id: I9f16ba714c3ea9e6585e9c11623270dbdf4fb1df Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | Changed default log4j log level from "WARNING" to "WARN"Andrey Loskutov2015-08-111-1/+1
| | | | | | | | | | | | Bug: 474674 Change-Id: I8be8934cf6cb3ee60567b59f8e836475efb780ac Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | Clone should create Git instances which are able to close repositoryAndrey Loskutov2015-08-042-2/+2
| | | | | | | | | | | | Bug: 474093 Change-Id: I13be133dac7834d1d2b51eb9948a716b8719d057 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | Merge "Clone should close repository after errors in fetch or checkout"Christian Halstrick2015-08-041-1/+8
|\ \
| * | Clone should close repository after errors in fetch or checkoutAndrey Loskutov2015-08-021-1/+8
| | | | | | | | | | | | | | | | | | Bug: 474093 Change-Id: Ia0a1478260b94a71a947aa8c04ee0c836d390aec Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | | containsGitModulesFile() should not crash on bare repositoryAndrey Loskutov2015-08-032-6/+14
|/ / | | | | | | | | Change-Id: Iba7e4674b3d33c730613a6ac703977f48b015853 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | Fixed javadoc: the getBranch() and getFullBranch() can return nullAndrey Loskutov2015-07-291-4/+6
| | | | | | | | | | Change-Id: I284a1b5f8220f68496f992b0e97e6934e03ae616 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | PushCertificate: Omit null pushee from text representationDave Borowitz2015-07-282-3/+6
| | | | | | | | Change-Id: Ie9546f2e0e9ee62e0a3c919572153b6076355195
* | Fix non-externalized string warning in Main.execute()Matthias Sohn2015-07-241-1/+1
| | | | | | | | Change-Id: Ib0404daaf485aa6c8dc6ba0b169b46fb800325e4 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Honor also https_proxy environment variableChristian Halstrick2015-07-241-25/+31
| | | | | | | | | | | | | | | | | | In addition to honor the http_proxy variable for setting a proxy for http JGit should also honor the https_proxy variable to set a similar proxy for https traffic Bug: 473365 Change-Id: I1002cb575e26cd842bf81ad751ec7c267b585ce2 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Fix ResolveMerger when files should be replaced by foldersChristian Halstrick2015-07-232-7/+83
| | | | | | | | | | | | | | | | | | | | When during Merge for a certain path OURS & BASE contains a file and THEIRS contains a folder there was a bug in JGit leading to unnecessary conflicts. This commit fixes it and adds a test for this situation. Bug: 472693 Change-Id: I71fac5a6a2ef926c01adc266c6f9b3275e870129 Also-by: Clemens Buchacher <drizzd@aon.at> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Merge "Fix typos in javadoc of ObjectId.equals()"Matthias Sohn2015-07-211-4/+4
|\ \
| * | Fix typos in javadoc of ObjectId.equals()Matthias Sohn2015-07-201-4/+4
| |/ | | | | | | Change-Id: Ic2503a2c3c616934d923937fdf8ceb4ae57b7028 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Don't keep empty ignore rules in the ignore node listAndrey Loskutov2015-07-213-2/+33
| | | | | | | | | | Change-Id: Icd893dfaba06561bbe5cc60ebf866ec5d8301c22 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | Allow leading/trailing spaces in ignore rulesAndrey Loskutov2015-07-212-2/+63
| | | | | | | | | | | | | | | | | | | | | | According to [1] leading spaces are allowed in ignore rules and trailing spaces are allowed too if they are escaped via backslash. [1] https://www.kernel.org/pub/software/scm/git/docs/gitignore.html Bug: 472762 Change-Id: I5e3ae5599cb9e5d80072f38c82c20cbc9475a18a Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | Don't crash while parsing ignore patternsAndrey Loskutov2015-07-214-1/+20
| | | | | | | | | | | | | | | | | | Catch unexpected PatternSyntaxException and convert it to InvalidPatternException. Log such errors, do not silently ignore them. Bug: 463581 Change-Id: Id0936d9816769ec0cfae1898beda0f7a3c146e67 Signed-off-by: Andrey Loskutov <loskutov@gmx.de> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Allow leading literal '#' and '!' in ignore rules if they are escapedAndrey Loskutov2015-07-212-15/+34
| | | | | | | | | | | | | | | | | | | | | | According to [1] backslash can escape leading special characters '#' and '!' in ignore rules, so that they are treated literally. [1] https://www.kernel.org/pub/software/scm/git/docs/gitignore.html Bug: 463581 Change-Id: I4c02927413a9c63ea5dbf2954877080d902ec1b2 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | Don't trim trailing space if it is escaped with backslashAndrey Loskutov2015-07-212-1/+30
| | | | | | | | | | | | | | | | | | | | According to [1] backslash can escape trailing space in ignore rules. [1] https://www.kernel.org/pub/software/scm/git/docs/gitignore.html Bug: 463581 Change-Id: I9cf13f8775cb49f0b6d61cfd3ca3fd6d665fccd8 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* | Consider only escaping backslash for regular expressions in ignore rulesAndrey Loskutov2015-07-212-2/+30
|/ | | | | | | | | | | While checking if we should consider an ignore rule without '[]' brackets as a regular expression, check if the backslash escapes one of the glob special characters '?', '*', '[', '\\'. If not, backslash is not a part of a regex and should be treated literally. Bug: 463581 Change-Id: I85208c7f85246fbf6c5029ce3c8b7bb8f4dbd947 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
* DFS: Remove now-redundant getOneRefJonathan Nieder2015-07-161-9/+1
| | | | | | | Instead of reimplementing exactRef in a separate, private method, use it directly. Change-Id: I0fc06fc46eef0e36e571a6ef622f38dc2aa59038
* DFS: Override exactRef() with optimal versionShawn Pearce2015-07-161-0/+7
| | | | | | | This avoids scanning a directory to find all names and then weeding down to the requested name. Change-Id: I36ce31febad6e881182bc3a278c7ed35cc04cbda
* PushCertificate: Add toTextWithSignature() methodDave Borowitz2015-07-152-2/+16
| | | | Change-Id: Ic0129373cc0c0321ffa43dc11a658d4f891ec2c2
* PushCertificateParser: Add fromString methodDave Borowitz2015-07-152-3/+28
| | | | Change-Id: I74c3f65a9ff297f708d996a4c138456a31a466b8
* BaseReceivePack: Add method to override the push certDave Borowitz2015-07-151-0/+14
| | | | Change-Id: Id912f45c933c78a85b245fa7b6edebbeb40b009c
* BaseReceivePack: Don't throw from getPushCertificate()Dave Borowitz2015-07-151-3/+4
| | | | | | | | | Rather than lazily parsing the push in this method, parse it at the end of recvCommands(), which already contains the necessary try/catch for handling this error. This allows later callers to avoid having to handle this condition superfluously. Change-Id: I5dcaf1a44bf4e321adc281e3381e7e17ac89db06