summaryrefslogtreecommitdiff
path: root/fast-import.c
Commit message (Collapse)AuthorAgeFilesLines
...
* Allow creating branches without committing in fast-import.Shawn O. Pearce2007-01-141-1/+7
| | | | | | | | | | | | | | | | Some importers may want to create a branch long before they actually commit to it, or in some cases they may never commit to the branch but they still need the ref to be created in the repository after the import is complete. This extends the 'reset ' command to automatically create a new branch if the supplied reference isn't already known as a branch. While I'm at it I also modified the syntax of the reset command to terminate with an empty line, like commit and tag operate. This just makes the command set more consistent. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Support creation of merge commits in fast-import.Shawn O. Pearce2007-01-141-0/+58
| | | | | | | | | | | | | | Some importers are able to determine when branch merges occurred within their source data. In these cases they will want to supply the correct commits to fast-import so that a proper merge commit will exist in Git. This is now supported by supplying a 'merge ' command after the commit message and optional from command. A merge is not actually performed by fast-import, its assumed that the frontend performed any sort of merging activity already and that fast-import should simply be storing its result. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Fix repository corruption when using marks for modified blobs.Shawn O. Pearce2007-01-141-0/+1
| | | | | | | | | | Apparently we did not copy the blob SHA1 into the stack variable 'sha1' when a mark is used to refer to a prior blob. This code was not previously tested as the Mozilla CVS -> git-fast-import program always fed us full SHA1s for modified blobs and did not use the mark feature there. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Additional fast-import tree delta corruption cleanups.Shawn O. Pearce2007-01-141-11/+11
| | | | Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Correct tree corruption problems in fast-import.Shawn O. Pearce2007-01-141-5/+11
| | | | | | | | | The new tree delta implementation caused blob SHA1s to be used instead of a tree SHA1 when a tree was written out. This really only appeared to happen when converting an existing file to a tree, but may have been possible in some other situations. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Replace ywrite in fast-import with the standard write_or_die.Shawn O. Pearce2007-01-141-20/+7
| | | | Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Reuse the same buffer for all commits/tags in fast-import.Shawn O. Pearce2007-01-141-20/+23
| | | | | | | | Since most commits and tag objects are around the same size and we only generate one at a time we can reuse the same buffer rather than xmalloc'ing and free'ing the buffer every time we generate a commit. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Recycle data buffers for tree generation in fast-import.Shawn O. Pearce2007-01-141-14/+32
| | | | | | | | | | We only ever generate at most two tree streams at a time. Since most trees are around the same size we can simply recycle the buffers from one tree generation to the next rather than constantly xmalloc'ing and free'ing them. This should perform slightly better when handling a large number of trees as malloc has less work to do. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Implemented tree delta compression in fast-import.Shawn O. Pearce2007-01-141-65/+155
| | | | | | | | | | | | | | | We now store for every tree entry two modes and two sha1 values; the base (aka "version 0") and the current/new (aka "version 1"). When we generate a tree object we also regenerate the prior version object and use that as our base object for a delta. This strategy saves a significant amount of memory as we can continue to use the atom pool for file/directory names and only increases each tree entry by an additional 24 bytes of memory. Branches should automatically delta against their ancestor tree, unless the ancestor tree is already at the delta chain limit. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Converted hash memcpy/memcmp to new hashcpy/hashcmp/hashclr.Shawn O. Pearce2007-01-141-26/+26
| | | | Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Don't crash fast-import if no branch log was requested.Shawn O. Pearce2007-01-141-1/+2
| | | | Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Added 'reset' command to clear a branch's tree.Shawn O. Pearce2007-01-141-0/+32
| | | | | | | | | | Sometimes an import frontend may need to work with a temporary branch which will actually contain many different branches over the life of the import. This is especially useful when the frontend needs to create a tag from a set of file versions which are otherwise never a commit. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Map only part of the generated pack file at any point in time.Shawn O. Pearce2007-01-141-20/+24
| | | | | | | | | | | | | | | | | | When generating a very large pack file (for example close to 1 GB in size) it may be impossible for the kernel to find a contiguous free range within a 32 bit address space for the mapping to be located at. This is especially problematic on large imports where there is a lot of malloc activity occuring within the same process and the malloc'd regions may straddle the previously mapped regions, thereby creating large holes in the address space. So instead we map only 128 MB of the pack at any given time. This will likely increase the number of times the file gets mapped (with additional system time required to update the page tables more frequently) but will allow the program to handle packs up to 4 GB in size. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Fixed compile error in fast-import.Shawn O. Pearce2007-01-141-1/+1
| | | | Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Fixed GPF in fast-import caused by unterminated linked list.Shawn O. Pearce2007-01-141-1/+2
| | | | | | | | | | fast-import was encounting a GPF when it ran out of free tree_entry objects but didn't know this was the cause because the last tree_entry wasn't terminated with a NULL pointer. The missing NULL pointer occurred when we allocated additional entries via xmalloc but didn't set the last tree_entry's "next" pointer to NULL. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Added --branch-log to option to fast-import.Shawn O. Pearce2007-01-141-5/+37
| | | | | | | | | | This option can be used to have a record of every commit, the mark (if supplied) and branch name of the commit recorded into a log file when the commit is generated. This log can be useful to verify the results of an import as the commits can be compared to some source repository matching commits through the mark value. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Added option to export the marks table when fast-import terminates.Shawn O. Pearce2007-01-141-1/+35
| | | | | | | | | | The marks table can be used by the frontend to load any commit after the import and compare it to whatever data the frontend knows about that commit. If the mark idnums can be easily correlated to some reference source then its relatively trivial to compare the GIT tree to the reference to verify the accuracy of the import. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Account for tree entry memory costs in fast-import.Shawn O. Pearce2007-01-141-0/+1
| | | | Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Moved from command to after data to help cvs2svn.Shawn O. Pearce2007-01-141-3/+4
| | | | | | | | | cvs2svn has three phases: begin_commit, middle_commit, end_commit. The ancester is computed in the middle_commit phase. So its easier to generate a stream if the from command appears after the commit message itself but before the file change commands. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Remove branch creation command from fast-import.Shawn O. Pearce2007-01-141-98/+71
| | | | | | | | | | | | | Jon Smirl was finding it difficult to alter cvs2svn to generate branch commands prior to the first commit of the same branch. This change moves the 'from' command to be an optional parameter of the 'commit' command, thereby allowing a new branch to be defined at the moment it gets used to create the first commit on that branch. This change makes it impossible to create a branch with no commits on it as at least one commit is needed to register the branch. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Round out memory pool allocations in fast-import to pointer sizes.Shawn O. Pearce2007-01-141-0/+3
| | | | | | | | | | | Some architectures (e.g. SPARC) would require that we access pointers only on pointer-sized alignments. So ensure the pool allocator rounds out non-pointer sized allocations to the next pointer so we don't generate bad memory addresses. This could have occurred if we had previously allocated an atom whose string was not a whole multiple of the pointer size, for example. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Implemented tree reloading in fast-import.Shawn O. Pearce2007-01-141-13/+149
| | | | | | | | | | | | | | | | | Tree reloading allows fast-import to swap out the least-recently used branch by simply deallocating the data structures from memory that were associated with that branch. Later if the branch becomes active again it can lazily recreate those structures on demand by reloading the necessary trees from the pack file it originally wrote them to. The reloading process is implemented by mmap'ing the pack into memory and using a much tighter variant of the pack reading code contained in sha1_file.c. This was a blatent copy from sha1_file.c but the unpacking functions were significantly simplified and are actually now in a form that should make it easier to map only the necessary regions of a pack rather than the entire file. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Implemented 'tag' command in fast-import.Shawn O. Pearce2007-01-141-0/+125
| | | | | | | | | | | Tags received from the frontend are generated in memory in a simple linked list in the order that the tag commands were sent by the frontend. If multiple different tag objects for the same tag name get generated the last one sent by the frontend will be the one that gets written out at termination. Multiple tag objects for the same name will cause all older tags of the same name to be lost. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Added branch load counter to fast-import.Shawn O. Pearce2007-01-141-2/+4
| | | | | | | | | | | If the branch load count exceeds the number of branches created then the frontend is causing fast-import to page branches into and out of memory due to the way its ordering its commits. Performance can likely be increased if the frontend were to alter its commit sequence such that it stays on one branch before switching to another branch, then never returns to the prior branch. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Added mark store/find to fast-import.Shawn O. Pearce2007-01-141-17/+87
| | | | | | | | | | | Marks are now saved when the mark directive gets used by the frontend and may be used in place of a SHA1 expression to locate a previous SHA1 which fast-import may have generated. This is particularly useful with commits where the frontend does not (easily) have the ability to compute the SHA1 for an arbitrary commit but needs it to generate a branch or tag from that commit. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Converted fast-import to accept standard command line parameters.Shawn O. Pearce2007-01-141-6/+28
| | | | | | | | | | | The following command line options are now accepted before the pack name: --objects=n # replaces the object count after the pack name --depth=n # delta chain depth to use (default is 10) --active-branches=n # maximum number of branches to keep in memory Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Fixed segfault in fast-import after growing a tree.Shawn O. Pearce2007-01-141-5/+10
| | | | | | | | | | | Growing a tree caused all subtrees to be deallocated and put back into the free list yet those subtree's contents were still actively in use. Consequently they were doled out again and got stomped on elsewhere. Releasing a tree is now performed in two parts, either releasing only the content array or releasing the content array and recursively releasing the subtree(s). Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Allow symlink blobs in trees during fast-import.Shawn O. Pearce2007-01-141-0/+1
| | | | | | | | | If a frontend is smart enough to import a symlink then we should let them do so. We'll assume that they were smart enough to first generate a blob to hold the link target, as that's how symlinks get represented in GIT. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Changed fast-import's pack header creation to use pack.hShawn O. Pearce2007-01-141-9/+8
| | | | | | Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Converted fast-import to a text based protocol.Shawn O. Pearce2007-01-141-160/+326
| | | | | | | | | Frontend clients can now send a text stream to fast-import rather than a binary stream. This should facilitate developing frontend software as the data stream is easier to view, manipulate and debug my hand and Mark-I eyeball. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Implement blob ID validation in fast-import.Shawn O. Pearce2007-01-141-4/+24
| | | | | | | | | | | | When accepting revision SHA1 IDs from the frontend verify the SHA1 actually refers to a blob and is known to exist. Its an error to use a SHA1 in a tree if the blob doesn't exist as this would cause git-fsck-objects to report a missing blob should the pack get closed without the blob being appended into it or a subsequent pack. So right now we'll just ask that the frontend "pre-declare" any blobs it wants to use in a tree before it can use them. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Added tree and commit writing to fast-import.Shawn O. Pearce2007-01-141-177/+729
| | | | | | | | | | | | | The tree of the current commit can be altered by file_change commands before the commit gets written to the pack. The file changes are rather primitive as they simply allow removal of a tree entry or setting/adding a tree entry. Currently trees and commits aren't being deltafied when written to the pack and branch reloading from the current pack doesn't work, so at most 5 branches can be worked with at any one time. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Implemented branch handling and basic tree support in fast-import.Shawn O. Pearce2007-01-141-5/+165
| | | | | | | | | | | | | | | | This provides the basic data structures needed to store trees in memory while we are processing them for a branch. What we are attempting to do is track one complete tree for each branch that the frontend has registered with us through the 'newb' (new_branch) command. When the frontend edits that tree through 'updf' or 'delf' commands we'll mark the affected tree(s) as being dirty and recompute their objects during 'comt' (commit). Currently the protocol is decidedly _not_ user friendly. I crashed fast-import by giving it bad input data from Perl. I may try to improve upon it, or at least upon its error handling. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Added basic command handler to fast-import.Shawn O. Pearce2007-01-141-14/+46
| | | | | | | | | | Moved the new_blob logic off into a new subroutine and invoked it when getting the 'blob' command. Added statistics dump to STDERR when the program terminates listing what it did at a high level. This is somewhat interesting. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Refactored fast-import's internals for future additions.Shawn O. Pearce2007-01-141-66/+83
| | | | | | | | | | Too many globals variables were being used not not enough code was resuable to process trees and commits so this is a simple refactoring of the existing blob processing code to get into a state that will be easier to handle trees and commits in. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Cleaned up memory allocation for object_entry structs.Shawn O. Pearce2007-01-141-47/+46
| | | | | | | | | | | | Although its easy to ask the user to tell us how many objects they will need, its probably better to dynamically grow the object table in large units. But if the user can give us a hint as to roughly how many objects then we can still use it during startup. Also stopped printing the SHA1 strings to stdout as no user is currently making use of that facility. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Added automatic index generation to fast-import.Shawn O. Pearce2007-01-141-19/+163
| | | | Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
* Created fast-import, a tool to quickly generating a pack from blobs.Shawn O. Pearce2007-01-141-0/+214
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>