summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Fix racy HTTP tests by waiting for requests to finishShawn O. Pearce2010-01-252-26/+87
| | | | | | | | | | | | | | | | | Ensure the background Jetty threads have been able to write the request log record before the JUnit thread tries to read the set of requests back. This wait is necessary because the JUnit thread may be able to continue as soon as Jetty has finished writing the response onto the socket, and hasn't necessarily finished the post-response logging activity. By using a semaphore with a fixed number of resources, and using one resource per request, but all of them when we want to read the log, we implement a simple lock that requires there be no active requests when we want to get the log from the JUnit thread. Change-Id: I499e1c96418557185d0e19ba8befe892f26ce7e4 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Merge "Don't confuse empty configuration variables with booleans"Shawn Pearce2010-01-252-4/+34
|\
| * Don't confuse empty configuration variables with booleansShawn O. Pearce2010-01-232-4/+34
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Config was confusing the following two variables when writing the file back to text format: [my] empty = enabled When parsed, we say that my.empty has 1 value, null, and my.enabled is an empty string value that in boolean context should be evaluated as true. Saving this configuration file back to text format was ignoring the null value for my.empty, producing a completely different file than what Config read: [my] empty enabled Instead handle the writing differently to ensure the original format is output. New tests cases cover the expected behavior and return values from accessor methods. Change-Id: Id37379ce20cb27e3330923cf989444dd9f2bdd96 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* | Disable the JRE HTTP cache, if anyShawn O. Pearce2010-01-231-0/+1
|/ | | | | | | We don't want to use the JRE cache when fetching content. Change-Id: Id76f3e618967c98ed4fbc47a1a2a9e77acbe41ab Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Correct bundle, provider names to be consistentShawn O. Pearce2010-01-2310-17/+20
| | | | | | | | | | | | | | Technically our project name is "JGit", not "Java Git". In fact there is already another project called "JavaGit" (no space) that we don't want to become confused with. Ensure we always call ourselves "JGit" in user visible assets, like the bundle name. Other Eclipse products list their provider as "Eclipse.org", not "eclipse.org". So list ourselves that way in all of our plugin.properties files. Change-Id: Ibcea1cd6dda2af757a8584099619fc23b7779a84 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Correct indentation in org.eclipse.jgit.packaging/pom.xmlShawn O. Pearce2010-01-231-1/+1
| | | | | Change-Id: I45caafbad4daac827f661d38c7f719e9b5511dd4 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Merge "Make HTTP test project work in Eclipse"Shawn Pearce2010-01-237-0/+94
|\
| * Make HTTP test project work in EclipseRobin Rosenberg2010-01-237-0/+94
| | | | | | | | | | | | | | | | | | | | | | The Jetty components are not available as part of Eclipse, but a P2 packaged version can be found via [1] for Eclipse 3.5 and newer. [1] http://wiki.eclipse.org/Jetty-OSGi_SDK Change-Id: Ibd5930bb9fc9589125876ca50c52e58bd31b051c Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* | Merge branch 'ref-abstract'Shawn O. Pearce2010-01-2344-1286/+5633
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * ref-abstract: Optimize RefAdvertiser performance by avoiding sorting branch: Add -m option to rename a branch Replace writeSymref with RefUpdate.link Rewrite reference handling to be abstract and accurate Create new RefList and RefMap utility types Change-Id: If43aacf5aa4013edbd0a6e84d84c4f9e94de5be0
| * | Optimize RefAdvertiser performance by avoiding sortingShawn O. Pearce2010-01-234-11/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Don't copy and sort the set of references if they are passed through in a RefMap or a SortedMap using the key's natural sort ordering. Either map is already in the order we want to present the items to the client in, so copying and sorting is a waste of local CPU and memory. Change-Id: I49ada7c1220e0fc2a163b9752c2b77525d9c82c1 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
| * | branch: Add -m option to rename a branchShawn O. Pearce2010-01-231-4/+37
| | | | | | | | | | | | | | | Change-Id: I7cf8e43344eaf301592fba0c178e04daad930f9a Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
| * | Replace writeSymref with RefUpdate.linkShawn O. Pearce2010-01-239-67/+147
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | By using RefUpdate for symbolic reference creation we can reuse the logic related to updating the reflog with the event, without needing to expose something such as the legacy ReflogWriter class (which we no longer have). Applications using writeSymref must update their code to use the new pattern of changing the reference through the updateRef method: String refName = "refs/heads/master"; RefUpdate u = repository.updateRef(Constants.HEAD); u.setRefLogMessage("checkout: moving to " + refName, false); switch (u.link(refName)) { case NEW: case FORCED: case NO_CHANGE: // A successful update of the reference break; default: // Handle the failure, e.g. for older behavior throw new IOException(u.getResult()); } Change-Id: I1093e1ec2970147978a786cfdd0a75d0aebf8010 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
| * | Rewrite reference handling to be abstract and accurateShawn O. Pearce2010-01-2339-1241/+3766
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit actually does three major changes to the way references are handled within JGit. Unfortunately they were easier to do as a single massive commit than to break them up into smaller units. Disambiguate symbolic references: --------------------------------- Reporting a symbolic reference such as HEAD as though it were any other normal reference like refs/heads/master causes subtle programming errors. We have been bitten by this error on several occasions, as have some downstream applications written by myself. Instead of reporting HEAD as a reference whose name differs from its "original name", report it as an actual SymbolicRef object that the application can test the type and examine the target of. With this change, Ref is now an abstract type with different subclasses for the different types. In the classical example of "HEAD" being a symbolic reference to branch "refs/heads/master", the Repository.getAllRefs() method will now return: Map<String, Ref> all = repository.getAllRefs(); SymbolicRef HEAD = (SymbolicRef) all.get("HEAD"); ObjectIdRef master = (ObjectIdRef) all.get("refs/heads/master"); assertSame(master, HEAD.getTarget()); assertSame(master.getObjectId(), HEAD.getObjectId()); assertEquals("HEAD", HEAD.getName()); assertEquals("refs/heads/master", master.getName()); A nice side-effect of this change is the storage type of the symbolic reference is no longer ambiguous with the storge type of the underlying reference it targets. In the above example, if master was only available in the packed-refs file, then the following is also true: assertSame(Ref.Storage.LOOSE, HEAD.getStorage()); assertSame(Ref.Storage.PACKED, master.getStorage()); (Prior to this change we returned the ambiguous storage of LOOSE_PACKED for HEAD, which was confusing since it wasn't actually true on disk). Another nice side-effect of this change is all intermediate symbolic references are preserved, and are therefore visible to the application when they walk the target chain. We can now correctly inspect chains of symbolic references. As a result of this change the Ref.getOrigName() method has been removed from the API. Applications should identify a symbolic reference by testing for isSymbolic() and not by using an arcane string comparsion between properties. Abstract the RefDatabase storage: --------------------------------- RefDatabase is now abstract, similar to ObjectDatabase, and a new concrete implementation called RefDirectory is used for the traditional on-disk storage layout. In the future we plan to support additional implementations, such as a pure in-memory RefDatabase for unit testing purposes. Optimize RefDirectory: ---------------------- The implementation of the in-memory reference cache, reading, and update routines has been completely rewritten. Much of the code was heavily borrowed or cribbed from the prior implementation, so copyright notices have been left intact as much as possible. The RefDirectory cache no longer confuses symbolic references with normal references. This permits the cache to resolve the value of a symbolic reference as late as possible, ensuring it is always current, without needing to maintain reverse pointers. The cache is now 2 sorted RefLists, rather than 3 HashMaps. Using sorted lists allows the implementation to reduce the in-memory footprint when storing many refs. Using specialized types for the elements allows the code to avoid additional map lookups for auxiliary stat information. To improve scan time during getRefs(), the lists are returned via a copy-on-write contract. Most callers of getRefs() do not modify the returned collections, so the copy-on-write semantics improves access on repositories with a large number of packed references. Iterator traversals of the returned Map<String,Ref> are performed using a simple merge-join of the two cache lists, ensuring we can perform the entire traversal in linear time as a function of the number of references: O(PackedRefs + LooseRefs). Scans of the loose reference space to update the cache run in O(LooseRefs log LooseRefs) time, as the directory contents are sorted before being merged against the in-memory cache. Since the majority of stable references are kept packed, there typically are only a handful of reference names to be sorted, so the sorting cost should not be very high. Locking is reduced during getRefs() by taking advantage of the copy-on-write semantics of the improved cache data structure. This permits concurrent readers to pull back references without blocking each other. If there is contention updating the cache during a scan, one or more updates are simply skipped and will get picked up again in a future scan. Writing to the $GIT_DIR/packed-refs during reference delete is now fully atomic. The file is locked, reparsed fresh, and written back out if a change is necessary. This avoids all race conditions with concurrent external updates of the packed-refs file. The RefLogWriter class has been fully folded into RefDirectory and is therefore deleted. Maintaining the reference's log is the responsiblity of the database implementation, and not all implementations will use java.io for access. Future work still remains to be done to abstract the ReflogReader class away from local disk IO. Change-Id: I26b9287c45a4b2d2be35ba2849daa316f5eec85d Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
| * | Create new RefList and RefMap utility typesShawn O. Pearce2010-01-225-3/+1703
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | These types can be used by RefDatabase implementations to manage the collection. A RefList stores items sorted by their name, and is an immutable type using copy-on-write semantics to perform modifications to the collection. Binary search is used to locate an existing item by name, or to locate the proper insertion position if an item does not exist. A RefMap can merge up to 3 RefList collections at once during its entry iteration, allowing items in the resolved or loose RefList to override items by the same name in the packed RefList. The RefMap's goal is O(log N) lookup time, and O(N) iteration time, which is suitable for returning from a RefDatabase. By relying on the immutable RefList we might be able to make map construction nearly constant, making Repository.getAllRefs() an inexpensive operation if the caches are current. Since modification is not common, changes require up to O(N + log N) time to copy the internal list and collapse or expand the list's array. As most changes are made to the loose collection and not the packed collection, in practice most changes would require less than the full O(N) time, due to a significantly smaller N in the loose list. Almost complete test coverage is included in the corresponding unit tests. A handful of methods on RefMap are not tested in this change, as writing the proper test depends on a future refactoring of how the Ref class represents symbolic reference names. Change-Id: Ic2095274000336556f719edd75a5c5dd6dd1d857 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* | Use build timestamp as OSGi version qualifierMatthias Sohn2010-01-237-6/+57
| | | | | | | | | | | | | | | | | | | | | | Translate the version qualifier using maven-antrun-plugin since we want manifest-first and currently cannot rely on Tycho for the JGit build. Introduce property for Eclipse p2 repository to enable builds against other Eclipse versions. Change-Id: I62c4e77ae91fe17f56c5a5338d53828d4e225395 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Merge "Adding PDE API Tools nature to JGit"Robin Rosenberg2010-01-172-0/+9
|\ \
| * | Adding PDE API Tools nature to JGitChris Aniszczyk2010-01-162-0/+9
| | |
* | | Remove redundant Maven plugin declarations from sub-modulesMatthias Sohn2010-01-162-29/+0
|/ / | | | | | | | | Change-Id: I2aa1b2e2e08108deec051594ca8ac3992e271f0f Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Merge changes Icfe92059,I65a9da89Shawn Pearce2010-01-1516-44/+61
|\ \ | | | | | | | | | | | | | | | * changes: Introduce a named constant for the ".git" directory extension Introduce a named constant for the .git directory.
| * | Introduce a named constant for the ".git" directory extensionRobin Rosenberg2010-01-154-7/+13
| | | | | | | | | | | | | | | Change-Id: Icfe9205994c6810fcd880054a586e9eef29df9a1 Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
| * | Introduce a named constant for the .git directory.Robin Rosenberg2010-01-1515-37/+48
| |/ | | | | | | | | | | | | | | | | | | | | Not all occurrences of ".git" are replaced by this constant, only those where it actually refers to the directory with that name, i.e not the ".git" directory suffix. Asserts and comment are also excluded from replacement. Change-Id: I65a9da89aedd53817f2ea3eaab4f9c2bed35d7ee Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
* / Maven 3/Tycho build for JGit featureMatthias Sohn2010-01-1517-2/+663
|/ | | | | | | | | | | As discussed on the jgit-dev list here: http://dev.eclipse.org/mhonarc/lists/egit-dev/msg00654.html - Define a separate JGit feature. - As of now create a separate JGit update site and zip it. Change-Id: Ie4026f15f6250c4933dccf6f31b5009b90c036bc Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* Add JUnit tests for HTTP transportShawn O. Pearce2010-01-1222-18/+3476
| | | | | | | | No Eclipse support for this project is provided, because the Jetty project does not publish a complete P2 repository. Change-Id: Ic5fe2e79bb216e36920fd4a70ec15dd6ccfd1468 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Download HEAD by itself if not in info/refsShawn O. Pearce2010-01-121-10/+59
| | | | | | | | | | The dumb HTTP transport needs to download the HEAD ref and resolve it manually if HEAD does not appear in info/refs. Its typically for it to not be in the info/refs file. Change-Id: Ie2a58fdfacfeee530b10edb433b8f98c85568585 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* client side smart HTTPShawn O. Pearce2010-01-125-55/+606
| | | | | | | | | | | | | | | | | | | During fetch over http:// clients now try to take advantage of the info/refs?service=git-upload-pack URL to determine if the remote side will support a standard upload-pack command stream. If so each block of 32 have lines is sent in one POST request, prefixed by all of the 'want' lines and any previously discovered common bases as 'have' lines. During push over http:// clients now try to take advantage of the info/refs?service=git-receive-pack URL to determine if the remote side will support a standard receive-pack command stream. If so, commands are sent along with their pack in a single HTTP POST request. Bug: 291002 Change-Id: I8c69b16ac15c442e1a4c3bd60b4ea1a47882b851 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* server side: smart fetch over HTTPShawn O. Pearce2010-01-124-0/+312
| | | | | | | | | | | | | | | | | | | | Clients can request smart fetch support by examining the info/refs URL with the service parameter set to the magic git-upload-pack string: GET /$GIT_DIR/info/refs?service=git-upload-pack HTTP/1.1 The response is formatted with the upload pack capabilities, using the standard packet line formatter. A special header line is put in front of the standard upload-pack advertisement to let clients know the service was recognized and is supported. If the requested service is disabled an authorization status code is returned, allowing the user agent to retry once they have obtained credentials from a human, in case authentication is required by the configured UploadPackFactory implementation. Change-Id: Ib0f1a458c88b4b5509b0f882f55f83f5752bc57a Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* server side: smart push over HTTPShawn O. Pearce2010-01-125-5/+482
| | | | | | | | | | | | | | | | | | | | Clients can request smart push support by examining the info/refs URL with the service parameter set to the magic git-receive-pack string: GET /$GIT_DIR/info/refs?service=git-receive-pack HTTP/1.1 The response is formatted with the receive pack capabilities, using the standard packet line formatter. A special header block is put in front of the standard receive-pack advertisement to let clients know the service was recognized and is supported. If the requested service is disabled an authorization status code is returned, allowing the user agent to retry once they have obtained credentials from a human, in case authentication is required by the configured ReceivePackFactory implementation. Change-Id: Ie4f6e0c7b68a68ec4b7cdd5072f91dd406210d4f Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Simple dumb HTTP server for GitShawn O. Pearce2010-01-1242-17/+4000
| | | | | | | | | | | | | | | | | | | | | | This is a simple HTTP server that provides the minimum server side support required for dumb (non-git aware) transport clients. We produce the info/refs and objects/info/packs file on the fly from the local repository state, but otherwise serve data as raw files from the on-disk structure. In the future we could better optimize the FileSender class and the servlets that use it to take advantage of direct file to network APIs in more advanced servlet containers like Jetty. Our glue package borrows the idea of a micro embedded DSL from Google Guice and uses it to configure a collection of Filters and HttpServlets, all of which are matched against requests using regular expressions. If a subgroup exists in the pattern, it is extracted and used for the path info component of the request. Change-Id: Ia0f1a425d07d035e344ae54faf8aeb04763e7487 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Expose PacketLineOut for reuse outside of the transport packageShawn O. Pearce2010-01-122-10/+74
| | | | | Change-Id: Iaa331a476e28cf2880df5607de36bc9f67d041df Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Expose RefAdvertiser for reuse outside of the transport packageShawn O. Pearce2010-01-123-23/+165
| | | | | | | | | By making this class and its methods public, and the actual writing abstract, we can reuse this code for other formats like writing an info/refs file for HTTP transports. Change-Id: Id0e349c30a0f5a8c1527e0e7383b80243819d9c5 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Teach UploadPack how to use an RPC style interfaceShawn O. Pearce2010-01-121-5/+55
| | | | | | | | | | | | | If biDirectionalPipe is false UploadPack does not start out with the advertisement but instead assumes it should read one block of want/have lines, process that, and write the ACK/NAKs out. This means it only is doing one read through the input followed by one write to the output, which fits with the HTTP request processing model, and any other type of RPC system. Change-Id: Ia9f7c46ee556f996367180f15d2caa8572cdd59f Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Teach ReceivePack how to use an RPC style interfaceShawn O. Pearce2010-01-121-2/+43
| | | | | | | | | | | | | If biDirectionalPipe is false ReceivePack does not start out with the advertisement but instead assumes it should read the command set once, process that, and write the status report out. This means it only is doing one read through the input followed by one write to the output, which fits with the HTTP request processing model, and any other type of RPC system... assuming that the payload for input can be a very big entity like the command stream followed by the pack file. Change-Id: I6f31f6537a3b7498803a8a54e10b0622105718c1 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Refactor TemporaryBuffer to support reuse in other contextsShawn O. Pearce2010-01-127-123/+238
| | | | | | | | | | | | | | | | Later we are going to add support for smart HTTP, which requires us to buffer at least some of the request created by a client before we ship it to the server. For many requests, we can fit it completely into a 1 MiB buffer, but if it doesn't we can drop back to using the chunked transfer encoding to send an unknown stream length. Rather than recoding the block based memory buffer, we refactor the local file overflow strategy into a subclass, allowing the HTTP client code to replace this portion of the logic with its own approach to start the chunked encoding request. Change-Id: Iac61ea1017b14e0ad3c4425efc3d75718b71bb8e Signed-off-by: Shawn O. Pearce <sop@google.com>
* Implement multi_ack_detailed protocol extensionShawn O. Pearce2010-01-124-35/+134
| | | | | | | | | | The multi_ack_detailed extension breaks out the "ACK %s continue" status code into "ACK %s common" and "ACK %s ready" states, making it easier to discover which objects are truely common, and which objects are simply on a chain the server doesn't care learning about. Change-Id: Ie8e907424cfbbba84996ca205d49eacf339f9d04 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Abstract out utility functions for creating test commitsShawn O. Pearce2010-01-129-102/+704
| | | | | | | | | These routines create a fairly clean DSL for writing out the structure of a repository in a test case. Abstract them into a helper class that we can reuse in other test environments. Change-Id: I55cce3d557e1a28afe2fdf37b3a5b67e2651c9f1 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Fix PersonIdent to always use SystemReaderShawn O. Pearce2010-01-121-1/+4
| | | | | | | | | | Under unit tests we want the when and timezone to come from the MockSystemReader and be stable. We did this for the default constructor based on the Repository, but failed to do it for the name,emailAddress variant of the constructor. Change-Id: I608ac7cf01673729303395e19b379b38fef136b3 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Fix RefWriter creation of info/refs to omit HEADShawn O. Pearce2010-01-121-2/+2
| | | | | | | | | | We really mean to omit HEAD here, but botched the difference between getOrigName and getName on the Ref object. We tested on the wrong value, picking up the target of the symbolic ref and therefore included it twice. Change-Id: If780c65166ccada2e63a4f42bbab752a56b16564 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Move TestRng to our JUnit helper packageShawn O. Pearce2010-01-122-2/+20
| | | | | | | | Other test suites may find this useful, especially when trying to defeat the pack file compression with random data files. Change-Id: Ic00a4ac626af7a1c94d18ee99305e295b267b1a3 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Correct spelling error in StringUtils javadocShawn O. Pearce2010-01-121-3/+3
| | | | | Change-Id: Idd98530d5f6fca4de8631aa865e4bcd6e6cf9306 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Finish removing Apache Felix maven-bundle-pluginShawn O. Pearce2010-01-1211-115/+6
| | | | | | | | | | | | | | | | Since Robin reverted using the maven-bundle-plugin to produce the OSGi manifest, there is no reason for us to reference it from our build process anymore. Also, when Robin reverted the to the Eclipse way of doing things, we failed to update the ignore files to ignore our generated files but not ignore our tracked .classpath. Finally, we cannot delete the MANIFEST.MF file during a Maven build, as this is once again a source file. Change-Id: I53f77f2002cb4285f728968829560e835651e188 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Fix merge for "Partial revert "Switch build to Apache Felix ↵Robin Rosenberg2010-01-121-0/+1
| | | | | | | | | maven-bundle-plugin"" There was a missing dependency. Change-Id: Ib7b9f05ee4c7c2bd7760ce44a7c2cd72759d514d Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
* Merge "Partial revert "Switch build to Apache Felix maven-bundle-plugin""Robin Rosenberg2010-01-1243-82/+548
|\
| * Partial revert "Switch build to Apache Felix maven-bundle-plugin"Robin Rosenberg2010-01-1043-82/+548
| | | | | | | | | | | | | | | | | | | | This restores the ability to build using just Eclipse without strange procedures, extra plugins and it is again possible to work on both JGit and EGit in the same Eclipse workspace with ease. Change-Id: I0af08127d507fbce186f428f1cdeff280f0ddcda Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
* | Read core.worktree regardless of whether .git was discovered or notRobin Rosenberg2010-01-061-9/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | The C Git documentation stated that the core.worktree config was not read when the .git directory was found implicitly (from the working directory). This was not true, and had not been so for a long time. The documentation has been updated to document the existing behaviour. Change-Id: If1e81b6a981b9d70e849f24872f01c110e9bc950 Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* | Explicitly release resources used by java.util.zip.DeflaterIgor Fedorenko2010-01-061-4/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Deflater can use significant amount of native (i.e. C) heap space. Failure to promptly release this memory results in native memory leak in some cases, particularly severe for VMs with large java max heap size. For example, running Team->Commit in one of my EGit workspaces results in ~500M java process size increase without any significant change to amount of used java heap when JVM is started with -Xmx1024m. Change-Id: I649679a8df5683ebedd9380d703513d31c625932 Signed-off-by: Igor Fedorenko <igor@ifedorenko.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* | Use build timestamp as OSGi version qualifier for SNAPSHOT buildsIgor Fedorenko2010-01-061-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Default maven-bundle-plugin behaviour results in use of the same .SNAPSHOT OSGi bundle version qualifier for all snapshot builds. This causes problems for eclipse update manager and other consumers that rely on OSGi bundle metadata to select "newer" or "best matching" version of jgit bundle. To solve the problem, maven-bundle-plugin is configured to replace .SNAPSHOT with build timestamp in format like 20100106-1234. Change-Id: I0999c7bd68aa2ee74dffaed54a8dc4e1b67cf80d Signed-off-by: Igor Fedorenko <igor@ifedorenko.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* | Remove unnecessary semicolon in MergeChunkShawn O. Pearce2010-01-061-1/+2
| | | | | | | | | | Change-Id: I5526edca9816b90f5df2d7f14f24f11d3f5d2ead Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* | Merge branch 'cq-diff'Shawn O. Pearce2010-01-0617-1/+2275
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Per CQ 3559 "JGit - Eugene Myers O(ND) difference algorithm" we have approval to check this into our master branch. * cq-diff: Add file content merge algorithm Add performance tests for MyersDiff Add javadoc comments, remove unused code, shift comments to correct place Fixed MyersDiff to be able to handle more than 100k Fix some warnings regarding unnecessary imports and accessing static methods Add the "jgit diff" command Prepare RawText for diff-index and diff-files Add a test class for Myers' diff algorithm Add Myers' algorithm to generate diff scripts Add set to IntList Conflicts: org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java Change-Id: Ia8e98d81ba1ab52f84d0258a40e6ef5eece9a5b1 CC: Christian Halstrick <christian.halstrick@sap.com>
| * | Add file content merge algorithmChristian Halstrick2010-01-065-0/+875
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Adds the file content merge alorithm and tests for merge to jgit. The merge algorithm: - Gets as input parameters the common base, the two new contents called "ours" and "theirs". - Computes the Edits from base to ours and from base to theirs with the help of MyersDiff. - Iterates over the edits. - Independent edits from ours or from theirs will just be applied to the result. - For conflicting edits we first harmonize the ranges of the edits so that in the end we have exactly two edits starting and ending at the same points in the common base. Then we write the two conclicting contents into the result stream. Change-Id: I411862393e7bf416b6f33ca55ec5af608ff4663 Signed-off-by: Christian Halstrick <christian.halstrick@sap.com> [sp: Fixed up two awkard comments in documentation.] Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
| * | Add performance tests for MyersDiffChristian Halstrick2009-11-053-0/+397
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add some tests which make sure that the diff algorithm really behaves in the promised O(N*D) manner. This tests compute diffs between multiple big chunks of data, measure time for computing the diffs and fail if the measured times are off O(N*D) by more than a factor 10 Signed-off-by: Christian Halstrick <christian.halstrick@sap.com> Change-Id: I8e1e0be60299472828718371b231f1d8a9dc21a7 Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>