Commit Graph

246 Commits

Author SHA1 Message Date
nulltoken
9282e921a3 Merge nulltoken's reference parsing code
All the commits have been squashed into a single one before refactoring
the final code, to keep everything tidy.

Individual commit messages are as follows:

Added repository reference looking up functionality placeholder.

Added basic reference database definition and caching infrastructure.

Removed useless constant.

Added GIT_EINVALIDREFNAME error and description. Added missing description for GIT_EBAREINDEX.

Added GIT_EREFCORRUPTED error and description.

Added GIT_ETOONESTEDSYMREF error and description.

Added resolving of direct and symbolic references.

Prepared the packed-refs parsing.

Added parsing of the packed-refs file content.

When no loose reference has been found, the full content of the packed-refs file is parsed. All of the new (i.e. not previously parsed as a loose reference) references are eagerly stored in the cached references storage.

The method packed_reference_file__parse() is in deer need of some refactoring. :-)

Extracted to a method the parsing of the peeled target of a tag.

Extracted to a method the parsing of a standard packed ref.

Fixed leaky removal of the cached references.

Ensured that a previously parsed packed reference isn't returned if a more up-to-date loose reference exists.

Enhanced documentation of git_repository_reference_lookup().

Moved some refs related constants from repository.c to refs.h.

Made parsing of a packed tag reference more robust.

Updated git_repository_reference_lookup() documentation.

Added some references to the test repository.

Added some tests covering tag references looking up.

Added some tests covering symbolic and head references looking up.

Added some tests covering packed references looking up.
2011-01-29 03:39:02 +02:00
nulltoken
2e6fd09c5d Fixed naming convention related issue. 2011-01-29 03:29:33 +02:00
nulltoken
eb2f3b4790 Made git_repository_open2() and git_repository_open3() benefit from recently added path prettifying function. 2011-01-29 03:29:32 +02:00
nulltoken
9dd34b1e89 Made git_repository_open() and git_repository_init() benefit from recently added path prettifying function. 2011-01-29 03:29:32 +02:00
Vicent Marti
c8f5ff8f65 Fix initialization of in-memory trees
In-memory tree objects were not being properly initialized, because the
internal entries vector was created on the 'parse' method.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2011-01-20 14:43:27 -08:00
Vicent Marti
ec3c7a16c2 Add new Repository initialization method
Lets the user specify the ODB that will be used by the repository
manually.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2011-01-13 04:54:14 +02:00
Alex Budovski
e0c23b88c5 Remove unused variable. 2011-01-11 17:52:45 +11:00
Vicent Marti
e52ed7a559 Split object methods from repository.c
All the relevant git_object methods have been moved to object.c

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2011-01-03 22:34:27 +02:00
Vicent Marti
fb3cd6bca4 Make internal methods static
Keep all the repository init code as static.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2011-01-03 21:46:18 +02:00
nulltoken
f2d6a23aa6 Small code maintenability improvement. 2010-12-21 05:21:33 +01:00
nulltoken
8ea2c83b5d Added creation of 'objects/info' and 'objects/pack' directories. 2010-12-20 16:46:13 +01:00
Vicent Marti
40c44d2fb6 Fix issues in repository initialization
Implemented recursive directory creation
Fix style issues

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-12-19 22:50:20 +02:00
nulltoken
1c2c7c0d16 Added creation of ref/heads/ and refs/tags/ directories. 2010-12-19 15:08:53 +01:00
nulltoken
2899093835 Prettified HEAD symlink generation. 2010-12-17 20:03:20 +01:00
nulltoken
e1f8cad0c9 Added basic HEAD file creation. 2010-12-17 14:45:02 +01:00
nulltoken
a67a096a9e Added creation of 'objects' and 'refs' directories. 2010-12-17 10:41:56 +01:00
nulltoken
58fcfc26e0 Removed unnecessary git_repository_init_results handling. 2010-12-17 10:36:58 +01:00
nulltoken
08190e2ad1 Simplified git_repository_init_results struct. 2010-12-16 15:39:25 +01:00
nulltoken
4b8e27c81e Very first git_repository_init() draft. 2010-12-15 18:25:15 +01:00
Vicent Marti
1f080e2da4 Fix initialization & freeing of inexistent repos
Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-12-13 03:43:56 +02:00
nulltoken
6c14d64123 Fixed a memory leak in git_repository_lookup() when provided git_otype is invalid. 2010-12-10 04:45:20 +02:00
Vicent Marti
44908fe763 Change the library include file
Libgit2 is now officially include as

	#include "<git2.h>"

or indidividual files may be included as

	#include <git2/index.h>

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-12-06 23:03:16 +02:00
Vicent Marti
d12299fe22 Change include structure for the project
The maze with include dependencies has been fixed.
There is now a global include:

	#include <git.h>

The git_odb_backend API has been exposed.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-12-06 01:14:15 +02:00
Vicent Marti
7d7cd8857a Decouple storage from ODB logic
Comes with two default backends: loose object and packfiles.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-12-06 01:14:15 +02:00
nulltoken
6f02c3bad8 Small source code readability improvements.
Replaced magic number "0" with GIT_SUCCESS constant wherever it made sense.
2010-12-05 20:18:56 +01:00
Vicent Marti
691aa96817 Add 'git_repository_open2' to customize repo folders
Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-12-02 18:35:38 +02:00
Vicent Marti
6b1eab3976 Fix MSVC warnings and errors
Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-11-24 00:23:15 +02:00
Vicent Marti
50dd6ca54c Fix repository initialization
We cannot assume that non-bare repositories have an index file, because
'git index' doesn't create it by default.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-11-17 05:16:26 +02:00
Vicent Marti
c3a20d5cab Add support for 'index add'
Actually add files to the index by creating their corresponding blob and
storing it on the repository, then getting the hash and updating the
index file.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-11-16 02:59:28 +02:00
Vicent Marti
237da40181 Add support for blob files
Blob files can now be loaded from the repository like all the other base
Git types.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-11-16 02:59:13 +02:00
Vicent Marti
1795f87952 Improve error handling
All initialization functions now return error codes instead of pointers.
Error codes are now properly propagated on most functions. Several new
and more specific error codes have been added in common.h

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-11-05 03:20:17 +02:00
Dave Borowitz
1544bc31ca Only require an index for non-bare repos. 2010-11-02 16:02:37 -07:00
Vicent Marti
6fd195d76c Change git_repository initialization to use a path
The constructor to git_repository is now called

	'git_repository_open(path)'

and takes a path to a git repository instead of an existing ODB object.
Unit tests have been updated accordingly and the two test repositories
have been merged into one.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-11-02 18:42:42 +02:00
Vicent Marti
a13bc8e74f Add getter methods for object owners
You can know access the owning repository of any existing object, or the
repository on which a revision walker is working on.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-10-29 02:22:38 +03:00
Vicent Marti
585190183b Fix internal memory management on the library
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>
2010-10-28 02:07:18 +03:00
Vicent Marti
ec25391dbb Add write-back support for Tag files
Tag files can now be created and modified in-memory (all the setter
methods have been implemented), and written back to disk using the
generic git_object_write() method.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-10-07 00:20:08 +03:00
Vicent Marti
2a884588b4 Add write-back support for git_tree
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>
2010-09-21 17:17:10 +03:00
Vicent Marti
d45b4a9a1b Add support for in-memory objects
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>
2010-09-20 21:39:11 +03:00
Vicent Marti
0c3596f18a Add setter methods & write support for git_commit
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>
2010-09-20 02:04:06 +03:00
Vicent Marti
e802d8cca8 Implement internal methods to write on sources
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>
2010-09-19 03:53:57 +03:00
Vicent Marti
f49a2e4981 Give object structures more descriptive names
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>
2010-09-19 03:21:06 +03:00
Vicent Marti
a7a7ddbe0f Add generic methods for object writeback
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>
2010-09-18 19:16:04 +03:00
Vicent Marti
46f8566a13 Add methods to access internal attributes in git_repo
Added several methods to access:

	- The ODB behind a repo
	- The SHA1 id behind a generic repo object
	- The type of a generic repo object

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-09-12 23:43:21 +03:00
Vicent Marti
9c9f4fc11c Add support for manually freeing repo objects
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>
2010-08-12 23:40:54 +02:00
Vicent Marti
f2408cc2ef Fix object handling in git_repository
All loaded objects through git_repository_lookup are properly parsed &
free'd on failure.

Signed-off-by: Vicent Marti <tanoku@gmail.com>
2010-08-12 19:59:32 +02:00
Vicent Marti
3315782cb4 Redesigned the walking/object lookup interface
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>
2010-08-12 18:48:55 +02:00