Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
git2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
git2
Commits
60ad7d52
Commit
60ad7d52
authored
Nov 01, 2012
by
Russell Belfer
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1037 from libgit2/index-open-cleanup
Some more changes to the Index API
parents
dbd6850d
1e808f9c
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
125 additions
and
59 deletions
+125
-59
include/git2/index.h
+45
-0
include/git2/tree.h
+0
-18
src/index.c
+66
-28
src/index.h
+1
-1
src/stash.c
+1
-1
src/tree.c
+2
-7
src/tree.h
+6
-0
tests-clar/index/read_tree.c
+2
-2
tests-clar/object/commit/commitstagedfile.c
+1
-1
tests-clar/stash/stash_helpers.c
+1
-1
No files found.
include/git2/index.h
View file @
60ad7d52
...
@@ -126,6 +126,19 @@ enum {
...
@@ -126,6 +126,19 @@ enum {
GIT_EXTERN
(
int
)
git_index_open
(
git_index
**
index
,
const
char
*
index_path
);
GIT_EXTERN
(
int
)
git_index_open
(
git_index
**
index
,
const
char
*
index_path
);
/**
/**
* Create an in-memory index object.
*
* This index object cannot be read/written to the filesystem,
* but may be used to perform in-memory index operations.
*
* The index must be freed once it's no longer in use.
*
* @param index the pointer for the new index
* @return 0 or an error code
*/
GIT_EXTERN
(
int
)
git_index_new
(
git_index
**
index
);
/**
* Free an existing index object.
* Free an existing index object.
*
*
* @param index an existing index object
* @param index an existing index object
...
@@ -190,6 +203,38 @@ GIT_EXTERN(int) git_index_write(git_index *index);
...
@@ -190,6 +203,38 @@ GIT_EXTERN(int) git_index_write(git_index *index);
*/
*/
GIT_EXTERN
(
int
)
git_index_read_tree
(
git_index
*
index
,
git_tree
*
tree
);
GIT_EXTERN
(
int
)
git_index_read_tree
(
git_index
*
index
,
git_tree
*
tree
);
/**
* Write the index as a tree
*
* This method will scan the index and write a representation
* of its current state back to disk; it recursively creates
* tree objects for each of the subtrees stored in the index,
* but only returns the OID of the root tree. This is the OID
* that can be used e.g. to create a commit.
*
* The index instance cannot be bare, and needs to be associated
* to an existing repository.
*
* @param oid Pointer where to store the OID of the written tree
* @param index Index to write
* @return 0 or an error code
*/
GIT_EXTERN
(
int
)
git_index_write_tree
(
git_oid
*
oid
,
git_index
*
index
);
/**
* Write the index as a tree to the given repository
*
* This method will do the same as `git_index_write_tree`, but
* letting the user choose the repository where the tree will
* be written.
*
* @param oid Pointer where to store OID of the the written tree
* @param index Index to write
* @param repo Repository where to write the tree
* @return 0 or an error code
*/
GIT_EXTERN
(
int
)
git_index_write_tree_to
(
git_oid
*
oid
,
git_index
*
index
,
git_repository
*
repo
);
/**@}*/
/**@}*/
/** @name Raw Index Entry Functions
/** @name Raw Index Entry Functions
...
...
include/git2/tree.h
View file @
60ad7d52
...
@@ -185,24 +185,6 @@ GIT_EXTERN(int) git_tree_entry_to_object(
...
@@ -185,24 +185,6 @@ GIT_EXTERN(int) git_tree_entry_to_object(
const
git_tree_entry
*
entry
);
const
git_tree_entry
*
entry
);
/**
/**
* Write a tree to the ODB from the index file
*
* This method will scan the index and write a representation
* of its current state back to disk; it recursively creates
* tree objects for each of the subtrees stored in the index,
* but only returns the OID of the root tree. This is the OID
* that can be used e.g. to create a commit.
*
* The index instance cannot be bare, and needs to be associated
* to an existing repository.
*
* @param oid Pointer where to store the written tree
* @param index Index to write
* @return 0 or an error code
*/
GIT_EXTERN
(
int
)
git_tree_create_fromindex
(
git_oid
*
oid
,
git_index
*
index
);
/**
* Create a new tree builder.
* Create a new tree builder.
*
*
* The tree builder can be used to create or modify
* The tree builder can be used to create or modify
...
...
src/index.c
View file @
60ad7d52
...
@@ -264,8 +264,14 @@ int git_index_open(git_index **index_out, const char *index_path)
...
@@ -264,8 +264,14 @@ int git_index_open(git_index **index_out, const char *index_path)
index
=
git__calloc
(
1
,
sizeof
(
git_index
));
index
=
git__calloc
(
1
,
sizeof
(
git_index
));
GITERR_CHECK_ALLOC
(
index
);
GITERR_CHECK_ALLOC
(
index
);
index
->
index_file_path
=
git__strdup
(
index_path
);
if
(
index_path
!=
NULL
)
{
GITERR_CHECK_ALLOC
(
index
->
index_file_path
);
index
->
index_file_path
=
git__strdup
(
index_path
);
GITERR_CHECK_ALLOC
(
index
->
index_file_path
);
/* Check if index file is stored on disk already */
if
(
git_path_exists
(
index
->
index_file_path
)
==
true
)
index
->
on_disk
=
1
;
}
if
(
git_vector_init
(
&
index
->
entries
,
32
,
index_cmp
)
<
0
)
if
(
git_vector_init
(
&
index
->
entries
,
32
,
index_cmp
)
<
0
)
return
-
1
;
return
-
1
;
...
@@ -275,13 +281,15 @@ int git_index_open(git_index **index_out, const char *index_path)
...
@@ -275,13 +281,15 @@ int git_index_open(git_index **index_out, const char *index_path)
index
->
entries_search_path
=
index_srch_path
;
index
->
entries_search_path
=
index_srch_path
;
index
->
reuc_search
=
reuc_srch
;
index
->
reuc_search
=
reuc_srch
;
/* Check if index file is stored on disk already */
if
(
git_path_exists
(
index
->
index_file_path
)
==
true
)
index
->
on_disk
=
1
;
*
index_out
=
index
;
*
index_out
=
index
;
GIT_REFCOUNT_INC
(
index
);
GIT_REFCOUNT_INC
(
index
);
return
git_index_read
(
index
);
return
(
index_path
!=
NULL
)
?
git_index_read
(
index
)
:
0
;
}
int
git_index_new
(
git_index
**
out
)
{
return
git_index_open
(
out
,
NULL
);
}
}
static
void
index_free
(
git_index
*
index
)
static
void
index_free
(
git_index
*
index
)
...
@@ -334,7 +342,7 @@ void git_index_clear(git_index *index)
...
@@ -334,7 +342,7 @@ void git_index_clear(git_index *index)
git_vector_clear
(
&
index
->
entries
);
git_vector_clear
(
&
index
->
entries
);
git_vector_clear
(
&
index
->
reuc
);
git_vector_clear
(
&
index
->
reuc
);
index
->
last_modified
=
0
;
git_futils_filestamp_set
(
&
index
->
stamp
,
NULL
)
;
git_tree_cache_free
(
index
->
tree
);
git_tree_cache_free
(
index
->
tree
);
index
->
tree
=
NULL
;
index
->
tree
=
NULL
;
...
@@ -390,11 +398,15 @@ unsigned int git_index_caps(const git_index *index)
...
@@ -390,11 +398,15 @@ unsigned int git_index_caps(const git_index *index)
int
git_index_read
(
git_index
*
index
)
int
git_index_read
(
git_index
*
index
)
{
{
int
error
,
updated
;
int
error
=
0
,
updated
;
git_buf
buffer
=
GIT_BUF_INIT
;
git_buf
buffer
=
GIT_BUF_INIT
;
time_t
mtime
;
git_futils_filestamp
stamp
;
assert
(
index
->
index_file_path
);
if
(
!
index
->
index_file_path
)
{
giterr_set
(
GITERR_INDEX
,
"Failed to read index: The index is in-memory only"
);
return
-
1
;
}
if
(
!
index
->
on_disk
||
git_path_exists
(
index
->
index_file_path
)
==
false
)
{
if
(
!
index
->
on_disk
||
git_path_exists
(
index
->
index_file_path
)
==
false
)
{
git_index_clear
(
index
);
git_index_clear
(
index
);
...
@@ -402,32 +414,35 @@ int git_index_read(git_index *index)
...
@@ -402,32 +414,35 @@ int git_index_read(git_index *index)
return
0
;
return
0
;
}
}
/* We don't want to update the mtime if we fail to parse the index */
updated
=
git_futils_filestamp_check
(
&
stamp
,
index
->
index_file_path
);
mtime
=
index
->
last_modified
;
if
(
updated
<=
0
)
error
=
git_futils_readbuffer_updated
(
return
updated
;
&
buffer
,
index
->
index_file_path
,
&
mtime
,
NULL
,
&
updated
);
error
=
git_futils_readbuffer
(
&
buffer
,
index
->
index_file_path
);
if
(
error
<
0
)
if
(
error
<
0
)
return
error
;
return
error
;
if
(
updated
)
{
git_index_clear
(
index
);
git_index_clear
(
index
);
error
=
parse_index
(
index
,
buffer
.
ptr
,
buffer
.
size
);
error
=
parse_index
(
index
,
buffer
.
ptr
,
buffer
.
size
);
if
(
!
error
)
index
->
last_modified
=
mtime
;
git_buf_free
(
&
buffer
);
if
(
!
error
)
}
git_futils_filestamp_set
(
&
index
->
stamp
,
&
stamp
);
git_buf_free
(
&
buffer
);
return
error
;
return
error
;
}
}
int
git_index_write
(
git_index
*
index
)
int
git_index_write
(
git_index
*
index
)
{
{
git_filebuf
file
=
GIT_FILEBUF_INIT
;
git_filebuf
file
=
GIT_FILEBUF_INIT
;
struct
stat
indexst
;
int
error
;
int
error
;
if
(
!
index
->
index_file_path
)
{
giterr_set
(
GITERR_INDEX
,
"Failed to write index: The index is in-memory only"
);
return
-
1
;
}
git_vector_sort
(
&
index
->
entries
);
git_vector_sort
(
&
index
->
entries
);
git_vector_sort
(
&
index
->
reuc
);
git_vector_sort
(
&
index
->
reuc
);
...
@@ -443,14 +458,37 @@ int git_index_write(git_index *index)
...
@@ -443,14 +458,37 @@ int git_index_write(git_index *index)
if
((
error
=
git_filebuf_commit
(
&
file
,
GIT_INDEX_FILE_MODE
))
<
0
)
if
((
error
=
git_filebuf_commit
(
&
file
,
GIT_INDEX_FILE_MODE
))
<
0
)
return
error
;
return
error
;
if
(
p_stat
(
index
->
index_file_path
,
&
indexst
)
==
0
)
{
error
=
git_futils_filestamp_check
(
&
index
->
stamp
,
index
->
index_file_path
);
index
->
last_modified
=
indexst
.
st_mtime
;
if
(
error
<
0
)
index
->
on_disk
=
1
;
return
error
;
}
index
->
on_disk
=
1
;
return
0
;
return
0
;
}
}
int
git_index_write_tree
(
git_oid
*
oid
,
git_index
*
index
)
{
git_repository
*
repo
;
assert
(
oid
&&
index
);
repo
=
(
git_repository
*
)
GIT_REFCOUNT_OWNER
(
index
);
if
(
repo
==
NULL
)
{
giterr_set
(
GITERR_INDEX
,
"Failed to write tree. "
"The index file is not backed up by an existing repository"
);
return
-
1
;
}
return
git_tree__write_index
(
oid
,
index
,
repo
);
}
int
git_index_write_tree_to
(
git_oid
*
oid
,
git_index
*
index
,
git_repository
*
repo
)
{
assert
(
oid
&&
index
&&
repo
);
return
git_tree__write_index
(
oid
,
index
,
repo
);
}
unsigned
int
git_index_entrycount
(
git_index
*
index
)
unsigned
int
git_index_entrycount
(
git_index
*
index
)
{
{
assert
(
index
);
assert
(
index
);
...
...
src/index.h
View file @
60ad7d52
...
@@ -22,7 +22,7 @@ struct git_index {
...
@@ -22,7 +22,7 @@ struct git_index {
char
*
index_file_path
;
char
*
index_file_path
;
time_t
last_modified
;
git_futils_filestamp
stamp
;
git_vector
entries
;
git_vector
entries
;
unsigned
int
on_disk
:
1
;
unsigned
int
on_disk
:
1
;
...
...
src/stash.c
View file @
60ad7d52
...
@@ -115,7 +115,7 @@ static int build_tree_from_index(git_tree **out, git_index *index)
...
@@ -115,7 +115,7 @@ static int build_tree_from_index(git_tree **out, git_index *index)
{
{
git_oid
i_tree_oid
;
git_oid
i_tree_oid
;
if
(
git_
tree_create_fromindex
(
&
i_tree_oid
,
index
)
<
0
)
if
(
git_
index_write_tree
(
&
i_tree_oid
,
index
)
<
0
)
return
-
1
;
return
-
1
;
return
git_tree_lookup
(
out
,
git_index_owner
(
index
),
&
i_tree_oid
);
return
git_tree_lookup
(
out
,
git_index_owner
(
index
),
&
i_tree_oid
);
...
...
src/tree.c
View file @
60ad7d52
...
@@ -491,16 +491,11 @@ on_error:
...
@@ -491,16 +491,11 @@ on_error:
return
-
1
;
return
-
1
;
}
}
int
git_tree_
create_fromindex
(
git_oid
*
oid
,
git_index
*
index
)
int
git_tree_
_write_index
(
git_oid
*
oid
,
git_index
*
index
,
git_repository
*
repo
)
{
{
int
ret
;
int
ret
;
git_repository
*
repo
;
repo
=
(
git_repository
*
)
GIT_REFCOUNT_OWNER
(
index
);
assert
(
oid
&&
index
&&
repo
);
if
(
repo
==
NULL
)
return
tree_error
(
"Failed to create tree. "
"The index file is not backed up by an existing repository"
);
if
(
index
->
tree
!=
NULL
&&
index
->
tree
->
entries
>=
0
)
{
if
(
index
->
tree
!=
NULL
&&
index
->
tree
->
entries
>=
0
)
{
git_oid_cpy
(
oid
,
&
index
->
tree
->
oid
);
git_oid_cpy
(
oid
,
&
index
->
tree
->
oid
);
...
...
src/tree.h
View file @
60ad7d52
...
@@ -47,6 +47,12 @@ int git_tree__parse(git_tree *tree, git_odb_object *obj);
...
@@ -47,6 +47,12 @@ int git_tree__parse(git_tree *tree, git_odb_object *obj);
*/
*/
int
git_tree__prefix_position
(
git_tree
*
tree
,
const
char
*
prefix
);
int
git_tree__prefix_position
(
git_tree
*
tree
,
const
char
*
prefix
);
/**
* Write a tree to the given repository
*/
int
git_tree__write_index
(
git_oid
*
oid
,
git_index
*
index
,
git_repository
*
repo
);
/**
/**
* Obsolete mode kept for compatibility reasons
* Obsolete mode kept for compatibility reasons
*/
*/
...
...
tests-clar/index/read_tree.c
View file @
60ad7d52
...
@@ -29,14 +29,14 @@ void test_index_read_tree__read_write_involution(void)
...
@@ -29,14 +29,14 @@ void test_index_read_tree__read_write_involution(void)
cl_git_pass
(
git_index_add_from_workdir
(
index
,
"abc/d"
));
cl_git_pass
(
git_index_add_from_workdir
(
index
,
"abc/d"
));
/* write-tree */
/* write-tree */
cl_git_pass
(
git_
tree_create_fromindex
(
&
expected
,
index
));
cl_git_pass
(
git_
index_write_tree
(
&
expected
,
index
));
/* read-tree */
/* read-tree */
git_tree_lookup
(
&
tree
,
repo
,
&
expected
);
git_tree_lookup
(
&
tree
,
repo
,
&
expected
);
cl_git_pass
(
git_index_read_tree
(
index
,
tree
));
cl_git_pass
(
git_index_read_tree
(
index
,
tree
));
git_tree_free
(
tree
);
git_tree_free
(
tree
);
cl_git_pass
(
git_
tree_create_fromindex
(
&
tree_oid
,
index
));
cl_git_pass
(
git_
index_write_tree
(
&
tree_oid
,
index
));
cl_assert
(
git_oid_cmp
(
&
expected
,
&
tree_oid
)
==
0
);
cl_assert
(
git_oid_cmp
(
&
expected
,
&
tree_oid
)
==
0
);
git_index_free
(
index
);
git_index_free
(
index
);
...
...
tests-clar/object/commit/commitstagedfile.c
View file @
60ad7d52
...
@@ -99,7 +99,7 @@ void test_object_commit_commitstagedfile__generate_predictable_object_ids(void)
...
@@ -99,7 +99,7 @@ void test_object_commit_commitstagedfile__generate_predictable_object_ids(void)
/*
/*
* Build the tree from the index
* Build the tree from the index
*/
*/
cl_git_pass
(
git_
tree_create_fromindex
(
&
tree_oid
,
index
));
cl_git_pass
(
git_
index_write_tree
(
&
tree_oid
,
index
));
cl_assert
(
git_oid_cmp
(
&
expected_tree_oid
,
&
tree_oid
)
==
0
);
cl_assert
(
git_oid_cmp
(
&
expected_tree_oid
,
&
tree_oid
)
==
0
);
...
...
tests-clar/stash/stash_helpers.c
View file @
60ad7d52
...
@@ -13,7 +13,7 @@ void commit_staged_files(
...
@@ -13,7 +13,7 @@ void commit_staged_files(
repo
=
git_index_owner
(
index
);
repo
=
git_index_owner
(
index
);
cl_git_pass
(
git_
tree_create_fromindex
(
&
tree_oid
,
index
));
cl_git_pass
(
git_
index_write_tree
(
&
tree_oid
,
index
));
cl_git_pass
(
git_tree_lookup
(
&
tree
,
repo
,
&
tree_oid
));
cl_git_pass
(
git_tree_lookup
(
&
tree
,
repo
,
&
tree_oid
));
cl_git_pass
(
git_commit_create_v
(
cl_git_pass
(
git_commit_create_v
(
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment