1. 31 Oct, 2010 1 commit
    • Fix in-memory commit getters trying to parse · d80e9d55
      Issue 9 on the tracker. The commit object getters for in-memory objects
      were trying to parse an inexistant on-disk object when one of the commit
      attributes which were still not set was queried.
      
      We now return a NULL value when this happens.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
  2. 28 Oct, 2010 4 commits
  3. 27 Oct, 2010 1 commit
    • Fix internal memory management on the library · 58519018
      String mememory is now managed in a much more sane manner.
      
      Fixes include:
      
      	- git_person email and name is no longer limited to 64 characters
      	- git_tree_entry filename is no longer limited to 255 characters
      	- raw objects are properly opened & closed the minimum amount of
      	times required for parsing
      	- unit tests no longer leak
      	- removed 5 other misc memory leaks as reported by Valgrind
      	- tree writeback no longer segfaults on rare ocassions
      
      The git_person struct is no longer public. It is now managed by the
      library, and getter methods are in place to access its internal
      attributes.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
  4. 26 Oct, 2010 3 commits
  5. 25 Oct, 2010 2 commits
  6. 08 Oct, 2010 1 commit
  7. 06 Oct, 2010 3 commits
  8. 21 Sep, 2010 1 commit
    • Add write-back support for git_tree · 2a884588
      All the setter methods for git_tree have been added, including the
      setters for attributes on each git_tree_entry and methods to add/remove
      entries of the tree.
      
      Modified trees and trees created in-memory from scratch can be written
      back to the repository using git_object_write().
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
  9. 20 Sep, 2010 1 commit
    • Add support for in-memory objects · d45b4a9a
      All repository objects can now be created from scratch in memory using
      either the git_object_new() method, or the corresponding git_XXX_new()
      for each object.
      
      So far, only git_commits can be written back to disk once created in
      memory.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
  10. 19 Sep, 2010 3 commits
    • Add setter methods & write support for git_commit · 0c3596f1
      All the required git_commit_set_XXX methods have been implemented; all
      the attributes of a commit object can now be modified in-memory.
      
      The new method git_object_write() automatically writes back the
      in-memory changes of any object to the repository. So far it only
      supports git_commit objects.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Implement internal methods to write on sources · e802d8cc
      The new 'git__source_printf' does an overflow-safe printf on a source
      bfufer.
      
      The new 'git__source_write' does an overflow-safe byte write on a source
      buffer.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Give object structures more descriptive names · f49a2e49
      The 'git_obj' structure is now called 'git_rawobj', since
      it represents a raw object read from the ODB.
      
      The 'git_repository_object' structure is now called 'git_object',
      since it's the base object class for all objects.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
  11. 18 Sep, 2010 1 commit
    • Add generic methods for object writeback · a7a7ddbe
      git_repository_object has now several internal methods to write back the
      object information in the repository.
      
      - git_repository__dbo_prepare_write()
      	Prepares the DBO object to be modified
      
      - git_repository__dbo_write()
      	Writes new bytes to the DBO object
      
      - git_repository__dbo_writeback()
      	Writes back the changes to the repository
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
  12. 12 Sep, 2010 1 commit
  13. 08 Sep, 2010 1 commit
  14. 12 Aug, 2010 10 commits
    • Add support for manually freeing repo objects · 9c9f4fc1
      A new method 'git_repository_object_free' allows to manually force the
      freeing of a repository object, even though they are still automatically
      managed by the repository and don't need to be freed by the user.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Fix object handling in git_repository · f2408cc2
      All loaded objects through git_repository_lookup are properly parsed &
      free'd on failure.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Add auxiliary method git__hexdump · 0e465f97
      New function in util.c to do a dump of a buffer's contents in
      hexadecimal to stdout.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Finish the tree object API · 003c2690
      The interface for loading and parsing tree objects from a repository has
      been completed with all the required accesor methods for attributes,
      support for manipulating individual tree entries and a new unit test
      t0901-readtree which tries to load and parse a tree object from a
      repository.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Add unit tests for index manipulation · ff17642d
      Three new unit tests, t06XX files have been added.
      
      	t0601-read: tests for loading index files from disk,
      				for creating in-memory indexes and for accessing
      				index entries.
      	t0602-write: tests for writing index files back to disk
      	t0603-sort: tests for properly sorting the entries array of an index
      
      Two test indexes have been added in 'tests/resources/':
      
      	test/resources/index: a sample index from a libgit2 repository
      
      	test/resources/gitgit.index: a sample index from a git.git
      		repository (includes TREE extension data)
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Move test resources to a common directory · 1baa25ee
      All the external resources used by the tests are now placed inside the
      common 'tests/resources' directory.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Add support for git index files · 68535125
      The new 'git_index' structure is an in-memory representation
      of a git index on disk; the 'git_index_entry' structures represent
      each one of the file entries on the index.
      
      The following calls for index instantiation have been added:
      
      	git_index_alloc(): instantiate a new index structure
      	git_index_free(): free an existing index
      	git_index_clear(): clear all the entires in an existing file
      
      The following calls for index reading and writing have been added:
      
      	git_index_read(): update the contents of the index structure from
      					  its file on disk.
      
      		Internally implemented through:
      			git_index__parse()
      
      	Index files are stored on disk in network byte order; all integer fields
      	inside them are properly converted to the machine's byte order when
      	loading them in memory. The parsing engine also distinguishes
      	between normal index entries and extended entries with 2 extra bytes
      	of flags.
      
      	The 'TREE' extension for index entries is also loaded into memory:
      	Tree caches stored in Index files are loaded into the
      	'git_index_tree' structure pointed by the 'tree' pointer inside
      	'git_index'.
      
      	'index->tree' points to the root node of the tree cache; the full tree
      	can be traversed through each of the node's 'tree->children'.
      
      	Index files can be written back to disk through:
      
      	git_index_write(): atomic writing of existing index objects
      		backed by internal method git_index__write()
      
      The following calls for entry manipulation have been added:
      
      	git_index_add(): insert an empty entry to the index
      
      	git_index_find(): search an entry by its path name
      
      	git_index__append(): appends a new index entry to the end of the
      						 list, resizing the entries array if required
      
      	New index entries are always inserted at the end of the array; since the
      	index entries must be sorted for it to be internally consistent, the
      	index object is only sorted once, and if required, before accessing the
      	whole entriea array (e.g. before writing to disk, before traversing,
      	etc).
      
      	git_index__remove_pos(): remove an index entry in a specific position
      
      	git_index__sort(): sort the entries in the array by path name
      
      	The entries array is sorted stably and in place using an
      	insertion sort, which ought to be the most efficient approach
      	since the entries array is always mostly-sorted.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Add support for atomic file locking · bd0a51c0
      The struct 'git_filelock' represents an atomically-locked
      file, git-style.
      
      Locked files can be modified atomically through the new file lock
      interface:
      
      int git_filelock_init(git_filelock *lock, const char *path);
      int git_filelock_lock(git_filelock *lock, int append);
      void git_filelock_unlock(git_filelock *lock);
      int git_filelock_commit(git_filelock *lock);
      int git_filelock_write(git_filelock *lock, const char *buffer, size_t length);
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Redesigned the walking/object lookup interface · 3315782c
      The old 'git_revpool' object has been removed and
      split into two distinct objects with separate
      functionality, in order to have separate methods for
      object management and object walking.
      
      *	A new object 'git_repository' does the high-level
      	management of a repository's objects (commits, trees,
      	tags, etc) on top of a 'git_odb'.
      
      	Eventually, it will also manage other repository
      	attributes (e.g. tag resolution, references, etc).
      
      	See: src/git/repository.h
      
      *	A new external method
      		'git_repository_lookup(repo, oid, type)'
      	has been added to the 'git_repository' API.
      
      	All object lookups (git_XXX_lookup()) are now
      	wrappers to this method, and duplicated code
      	has been removed. The method does automatic type
      	checking and returns a generic 'git_revpool_object'
      	that can be cast to any specific object.
      
      	See: src/git/repository.h
      
      *	The external methods for object parsing of repository
      	objects (git_XXX_parse()) have been removed.
      
      	Loading objects from the repository is now managed
      	through the 'lookup' functions. These objects are
      	loaded with minimal information, and the relevant
      	parsing is done automatically when the user requests
      	any of the parsed attributes through accessor methods.
      
      	An attribute has been added to 'git_repository' in
      	order to force the parsing of all the repository objects
      	immediately after lookup.
      
      	See: src/git/commit.h
      	See: src/git/tag.h
      	See: src/git/tree.h
      
      *	The previous walking functionality of the revpool
      	is now found in 'git_revwalk', which does the actual
      	revision walking on a repository; the attributes
      	when walking through commits in a database have been
      	decoupled from the actual commit objects.
      	This increases performance when accessing commits
      	during the walk and allows to have several
      	'git_revwalk' instances working at the same time on
      	top of the same repository, without having to load
      	commits in memory several times.
      
      	See: src/git/revwalk.h
      
      *	The old 'git_revpool_table' has been renamed to
      	'git_hashtable' and now works as a generic hashtable
      	with support for any kind of object and custom hash
      	functions.
      
      	See: src/hashtable.h
      
      *	All the relevant unit tests have been updated, renamed
      	and grouped accordingly.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Add loading and parsing of tag objects · f8758044
      Tag objects are now properly loaded from the revision pool.
      New test t0801 checks for loading a parsing a series of tags, including
      the tag of a tag.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
  15. 06 Aug, 2010 2 commits
    • Refactor parsing methods · 364788e1
      The 'parse_oid' and 'parse_person' methods which were used by the commit
      parser are now global so they can be used when parsing other objects.
      
      The 'git_commit_person' struct has been changed to a generic
      'git_person'.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Add packfile reading · 7e4f56a5
      Packed objects inside packfiles are now properly unpacked when calling
      the git_odb__read_packed() method; delta'ed objects are also properly
      generated when needed.
      
      A new unit test 0204-readpack tries to read a couple hundred packed
      objects from a standard packed repository.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
  16. 15 Jul, 2010 5 commits
    • Add parsing of tree file contents. · d8603ed9
      The basic information (pointed trees and blobs) of each tree object in a
      revision pool can now be parsed and queried.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Changed test files to use tabs instead of spaces · 3e590fb2
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Add external API to access detailed commit attributes · 52f2390b
      The following new external methods have been added:
      
      GIT_EXTERN(const char *) git_commit_message_short(git_commit *commit);
      GIT_EXTERN(const char *) git_commit_message(git_commit *commit);
      GIT_EXTERN(time_t) git_commit_time(git_commit *commit);
      GIT_EXTERN(const git_commit_person *) git_commit_committer(git_commit *commit);
      GIT_EXTERN(const git_commit_person *) git_commit_author(git_commit *commit);
      GIT_EXTERN(const git_tree *) git_commit_tree(git_commit *commit);
      
      A new structure, git_commit_person has been added to represent a
      commit's author or committer.
      
      The parsing of a commit has been split in two phases.
      When adding a commit to the revision pool:
      	- the commit's ODB object is opened
      	- its raw contents are parsed for commit TIME, PARENTS and TREE
      		(the minimal amount of data required to traverse the pool)
      	- the commit's ODB object is closed
      
      When querying for extended information on a commit:
      	- the commit's ODB object is reopened
      	- its raw contents are parsed for the requested information
      	- the commit's ODB object remains open to handle additional queries
      
      New unit tests have been added for the new functionality:
      
      	In t0401-parse: parse_person_test
      	In t0402-details: query_details_test
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Add support for tree objects in revision pools · 225fe215
      Commits now store pointers to their tree objects.
      Tree objects now work as separate git_revpool_object
      entities.
      Tree objects can be loaded and parsed inedependently
      from commits.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed
    • Changed revpool's object table to support arbitrary objects · 40721f6b
      git_revpool_object now has a type identifier for each object
      type in a revpool (commits, trees, blobs, etc).
      
      Trees can now be stored in the revision pool.
      
      git_revpool_tableit now supports filtering objects by their
      type when iterating through the object table.
      
      Signed-off-by: Vicent Marti <tanoku@gmail.com>
      Vicent Marti committed