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
a227451d
Commit
a227451d
authored
Mar 21, 2012
by
Russell Belfer
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #602 from arrbee/more-error-handling
More error handling conversions
parents
0d0fa7c3
a4c291ef
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
520 additions
and
559 deletions
+520
-559
include/git2/errors.h
+3
-1
src/fileops.c
+2
-2
src/index.c
+146
-171
src/index.h
+2
-0
src/indexer.c
+64
-70
src/iterator.c
+5
-12
src/notes.c
+75
-104
src/odb.c
+4
-0
src/oid.c
+34
-30
src/reflog.c
+82
-89
src/sha1_lookup.c
+2
-1
src/signature.c
+61
-62
src/util.c
+16
-10
tests-clar/clar
+3
-3
tests-clar/core/buffer.c
+17
-0
tests-clar/core/oid.c
+4
-4
No files found.
include/git2/errors.h
View file @
a227451d
...
...
@@ -123,12 +123,14 @@ typedef struct {
typedef
enum
{
GITERR_NOMEMORY
,
GITERR_OS
,
GITERR_INVALID
,
GITERR_REFERENCE
,
GITERR_ZLIB
,
GITERR_REPOSITORY
,
GITERR_CONFIG
,
GITERR_REGEX
,
GITERR_ODB
GITERR_ODB
,
GITERR_INDEX
}
git_error_class
;
/**
...
...
src/fileops.c
View file @
a227451d
...
...
@@ -108,10 +108,10 @@ mode_t git_futils_canonical_mode(mode_t raw_mode)
return
S_IFREG
|
GIT_CANONICAL_PERMS
(
raw_mode
);
else
if
(
S_ISLNK
(
raw_mode
))
return
S_IFLNK
;
else
if
(
S_ISDIR
(
raw_mode
))
return
S_IFDIR
;
else
if
(
S_ISGITLINK
(
raw_mode
))
return
S_IFGITLINK
;
else
if
(
S_ISDIR
(
raw_mode
))
return
S_IFDIR
;
else
return
0
;
}
...
...
src/index.c
View file @
a227451d
...
...
@@ -135,19 +135,14 @@ int git_index_open(git_index **index_out, const char *index_path)
assert
(
index_out
&&
index_path
);
index
=
git__malloc
(
sizeof
(
git_index
));
if
(
index
==
NULL
)
return
GIT_ENOMEM
;
memset
(
index
,
0x0
,
sizeof
(
git_index
));
index
=
git__calloc
(
1
,
sizeof
(
git_index
));
GITERR_CHECK_ALLOC
(
index
);
index
->
index_file_path
=
git__strdup
(
index_path
);
if
(
index
->
index_file_path
==
NULL
)
{
git__free
(
index
);
return
GIT_ENOMEM
;
}
GITERR_CHECK_ALLOC
(
index
->
index_file_path
);
git_vector_init
(
&
index
->
entries
,
32
,
index_cmp
);
if
(
git_vector_init
(
&
index
->
entries
,
32
,
index_cmp
)
<
0
)
return
-
1
;
/* Check if index file is stored on disk already */
if
(
git_path_exists
(
index
->
index_file_path
)
==
true
)
...
...
@@ -215,7 +210,7 @@ void git_index_clear(git_index *index)
int
git_index_read
(
git_index
*
index
)
{
int
error
=
GIT_SUCCESS
,
updated
;
int
error
,
updated
;
git_buf
buffer
=
GIT_BUF_INIT
;
time_t
mtime
;
...
...
@@ -224,27 +219,26 @@ int git_index_read(git_index *index)
if
(
!
index
->
on_disk
||
git_path_exists
(
index
->
index_file_path
)
==
false
)
{
git_index_clear
(
index
);
index
->
on_disk
=
0
;
return
GIT_SUCCESS
;
return
0
;
}
/* We don't want to update the mtime if we fail to parse the index */
mtime
=
index
->
last_modified
;
error
=
git_futils_readbuffer_updated
(
&
buffer
,
index
->
index_file_path
,
&
mtime
,
&
updated
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to read index"
);
error
=
git_futils_readbuffer_updated
(
&
buffer
,
index
->
index_file_path
,
&
mtime
,
&
updated
);
if
(
error
<
0
)
return
error
;
if
(
updated
)
{
git_index_clear
(
index
);
error
=
parse_index
(
index
,
buffer
.
ptr
,
buffer
.
size
);
if
(
error
==
GIT_SUCCESS
)
if
(
!
error
)
index
->
last_modified
=
mtime
;
git_buf_free
(
&
buffer
);
}
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to parse index"
);
return
error
;
}
...
...
@@ -256,23 +250,24 @@ int git_index_write(git_index *index)
git_vector_sort
(
&
index
->
entries
);
if
((
error
=
git_filebuf_open
(
&
file
,
index
->
index_file_path
,
GIT_FILEBUF_HASH_CONTENTS
))
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to write index"
);
if
((
error
=
git_filebuf_open
(
&
file
,
index
->
index_file_path
,
GIT_FILEBUF_HASH_CONTENTS
))
<
0
)
return
error
;
if
((
error
=
write_index
(
index
,
&
file
))
<
GIT_SUCCESS
)
{
if
((
error
=
write_index
(
index
,
&
file
))
<
0
)
{
git_filebuf_cleanup
(
&
file
);
return
git__rethrow
(
error
,
"Failed to write index"
)
;
return
error
;
}
if
((
error
=
git_filebuf_commit
(
&
file
,
GIT_INDEX_FILE_MODE
))
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to write index"
)
;
if
((
error
=
git_filebuf_commit
(
&
file
,
GIT_INDEX_FILE_MODE
))
<
0
)
return
error
;
if
(
p_stat
(
index
->
index_file_path
,
&
indexst
)
==
0
)
{
index
->
last_modified
=
indexst
.
st_mtime
;
index
->
on_disk
=
1
;
}
return
GIT_SUCCESS
;
return
0
;
}
unsigned
int
git_index_entrycount
(
git_index
*
index
)
...
...
@@ -293,6 +288,20 @@ git_index_entry *git_index_get(git_index *index, unsigned int n)
return
git_vector_get
(
&
index
->
entries
,
n
);
}
void
git_index__init_entry_from_stat
(
struct
stat
*
st
,
git_index_entry
*
entry
)
{
entry
->
ctime
.
seconds
=
(
git_time_t
)
st
->
st_ctime
;
entry
->
mtime
.
seconds
=
(
git_time_t
)
st
->
st_mtime
;
/* entry->mtime.nanoseconds = st->st_mtimensec; */
/* entry->ctime.nanoseconds = st->st_ctimensec; */
entry
->
dev
=
st
->
st_rdev
;
entry
->
ino
=
st
->
st_ino
;
entry
->
mode
=
index_create_mode
(
st
->
st_mode
);
entry
->
uid
=
st
->
st_uid
;
entry
->
gid
=
st
->
st_gid
;
entry
->
file_size
=
st
->
st_size
;
}
static
int
index_entry_init
(
git_index_entry
**
entry_out
,
git_index
*
index
,
const
char
*
rel_path
,
int
stage
)
{
git_index_entry
*
entry
=
NULL
;
...
...
@@ -302,21 +311,17 @@ static int index_entry_init(git_index_entry **entry_out, git_index *index, const
git_buf
full_path
=
GIT_BUF_INIT
;
int
error
;
if
(
INDEX_OWNER
(
index
)
==
NULL
)
return
git__throw
(
GIT_EBAREINDEX
,
"Failed to initialize entry. Repository is bare"
);
if
(
stage
<
0
||
stage
>
3
)
return
git__throw
(
GIT_ERROR
,
"Failed to initialize entry. Invalid stage %i"
,
stage
);
assert
(
stage
>=
0
&&
stage
<=
3
);
workdir
=
git_repository_workdir
(
INDEX_OWNER
(
index
));
if
(
workdir
==
NULL
)
return
git__throw
(
GIT_EBAREINDEX
,
"Failed to initialize entry. Cannot resolved workdir"
);
if
(
INDEX_OWNER
(
index
)
==
NULL
||
(
workdir
=
git_repository_workdir
(
INDEX_OWNER
(
index
)))
==
NULL
)
{
giterr_set
(
GITERR_INDEX
,
"Could not initialize index entry. Repository is bare"
);
return
-
1
;
}
error
=
git_buf_joinpath
(
&
full_path
,
workdir
,
rel_path
);
if
(
error
<
GIT_SUCCESS
)
if
((
error
=
git_buf_joinpath
(
&
full_path
,
workdir
,
rel_path
))
<
0
)
return
error
;
if
((
error
=
git_path_lstat
(
full_path
.
ptr
,
&
st
))
<
0
)
{
...
...
@@ -331,34 +336,21 @@ static int index_entry_init(git_index_entry **entry_out, git_index *index, const
*/
/* write the blob to disk and get the oid */
if
((
error
=
git_blob_create_fromfile
(
&
oid
,
INDEX_OWNER
(
index
),
rel_path
))
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to initialize index entry"
)
;
if
((
error
=
git_blob_create_fromfile
(
&
oid
,
INDEX_OWNER
(
index
),
rel_path
))
<
0
)
return
error
;
entry
=
git__calloc
(
1
,
sizeof
(
git_index_entry
));
if
(
!
entry
)
return
GIT_ENOMEM
;
entry
->
ctime
.
seconds
=
(
git_time_t
)
st
.
st_ctime
;
entry
->
mtime
.
seconds
=
(
git_time_t
)
st
.
st_mtime
;
/* entry.mtime.nanoseconds = st.st_mtimensec; */
/* entry.ctime.nanoseconds = st.st_ctimensec; */
entry
->
dev
=
st
.
st_rdev
;
entry
->
ino
=
st
.
st_ino
;
entry
->
mode
=
index_create_mode
(
st
.
st_mode
);
entry
->
uid
=
st
.
st_uid
;
entry
->
gid
=
st
.
st_gid
;
entry
->
file_size
=
st
.
st_size
;
entry
->
oid
=
oid
;
GITERR_CHECK_ALLOC
(
entry
);
git_index__init_entry_from_stat
(
&
st
,
entry
);
entry
->
oid
=
oid
;
entry
->
flags
|=
(
stage
<<
GIT_IDXENTRY_STAGESHIFT
);
entry
->
path
=
git__strdup
(
rel_path
);
if
(
entry
->
path
==
NULL
)
{
git__free
(
entry
);
return
GIT_ENOMEM
;
}
GITERR_CHECK_ALLOC
(
entry
->
path
);
*
entry_out
=
entry
;
return
GIT_SUCCESS
;
return
0
;
}
static
git_index_entry
*
index_entry_dup
(
const
git_index_entry
*
source_entry
)
...
...
@@ -393,10 +385,7 @@ static int index_insert(git_index *index, git_index_entry *entry, int replace)
int
position
;
git_index_entry
**
entry_array
;
assert
(
index
&&
entry
);
if
(
entry
->
path
==
NULL
)
return
git__throw
(
GIT_EMISSINGOBJDATA
,
"Failed to insert into index. Entry has no path"
);
assert
(
index
&&
entry
&&
entry
->
path
!=
NULL
);
/* make sure that the path length flag is correct */
path_length
=
strlen
(
entry
->
path
);
...
...
@@ -412,12 +401,8 @@ static int index_insert(git_index *index, git_index_entry *entry, int replace)
* replacing is not requested: just insert entry at the end;
* the index is no longer sorted
*/
if
(
!
replace
)
{
if
(
git_vector_insert
(
&
index
->
entries
,
entry
)
<
GIT_SUCCESS
)
return
GIT_ENOMEM
;
return
GIT_SUCCESS
;
}
if
(
!
replace
)
return
git_vector_insert
(
&
index
->
entries
,
entry
);
/* look if an entry with this path already exists */
position
=
git_index_find
(
index
,
entry
->
path
);
...
...
@@ -426,12 +411,8 @@ static int index_insert(git_index *index, git_index_entry *entry, int replace)
* if no entry exists add the entry at the end;
* the index is no longer sorted
*/
if
(
position
==
GIT_ENOTFOUND
)
{
if
(
git_vector_insert
(
&
index
->
entries
,
entry
)
<
GIT_SUCCESS
)
return
GIT_ENOMEM
;
return
GIT_SUCCESS
;
}
if
(
position
==
GIT_ENOTFOUND
)
return
git_vector_insert
(
&
index
->
entries
,
entry
);
/* exists, replace it */
entry_array
=
(
git_index_entry
**
)
index
->
entries
.
contents
;
...
...
@@ -439,7 +420,7 @@ static int index_insert(git_index *index, git_index_entry *entry, int replace)
git__free
(
entry_array
[
position
]);
entry_array
[
position
]
=
entry
;
return
GIT_SUCCESS
;
return
0
;
}
static
int
index_add
(
git_index
*
index
,
const
char
*
path
,
int
stage
,
int
replace
)
...
...
@@ -447,20 +428,15 @@ static int index_add(git_index *index, const char *path, int stage, int replace)
git_index_entry
*
entry
=
NULL
;
int
ret
;
ret
=
index_entry_init
(
&
entry
,
index
,
path
,
stage
);
if
(
ret
)
goto
err
;
ret
=
index_insert
(
index
,
entry
,
replace
);
if
(
ret
)
goto
err
;
if
((
ret
=
index_entry_init
(
&
entry
,
index
,
path
,
stage
))
<
0
||
(
ret
=
index_insert
(
index
,
entry
,
replace
))
<
0
)
{
index_entry_free
(
entry
);
return
ret
;
}
git_tree_cache_invalidate_path
(
index
->
tree
,
entry
->
path
);
return
ret
;
err:
index_entry_free
(
entry
);
return
git__rethrow
(
ret
,
"Failed to append to index"
);
return
0
;
}
int
git_index_add
(
git_index
*
index
,
const
char
*
path
,
int
stage
)
...
...
@@ -473,28 +449,23 @@ int git_index_append(git_index *index, const char *path, int stage)
return
index_add
(
index
,
path
,
stage
,
0
);
}
static
int
index_add2
(
git_index
*
index
,
const
git_index_entry
*
source_entry
,
int
replace
)
static
int
index_add2
(
git_index
*
index
,
const
git_index_entry
*
source_entry
,
int
replace
)
{
git_index_entry
*
entry
=
NULL
;
int
ret
;
entry
=
index_entry_dup
(
source_entry
);
if
(
entry
==
NULL
)
{
ret
=
GIT_ENOMEM
;
goto
err
;
}
if
(
entry
==
NULL
)
return
-
1
;
ret
=
index_insert
(
index
,
entry
,
replace
);
if
(
ret
)
goto
err
;
if
((
ret
=
index_insert
(
index
,
entry
,
replace
))
<
0
)
{
index_entry_free
(
entry
);
return
ret
;
}
git_tree_cache_invalidate_path
(
index
->
tree
,
entry
->
path
);
return
ret
;
err:
index_entry_free
(
entry
);
return
git__rethrow
(
ret
,
"Failed to append to index"
);
return
0
;
}
int
git_index_add2
(
git_index
*
index
,
const
git_index_entry
*
source_entry
)
...
...
@@ -513,13 +484,14 @@ int git_index_remove(git_index *index, int position)
git_index_entry
*
entry
;
git_vector_sort
(
&
index
->
entries
);
entry
=
git_vector_get
(
&
index
->
entries
,
position
);
if
(
entry
!=
NULL
)
git_tree_cache_invalidate_path
(
index
->
tree
,
entry
->
path
);
error
=
git_vector_remove
(
&
index
->
entries
,
(
unsigned
int
)
position
);
if
(
error
==
GIT_SUCCESS
)
if
(
!
error
)
index_entry_free
(
entry
);
return
error
;
...
...
@@ -535,7 +507,8 @@ void git_index_uniq(git_index *index)
git_vector_uniq
(
&
index
->
entries
);
}
const
git_index_entry_unmerged
*
git_index_get_unmerged_bypath
(
git_index
*
index
,
const
char
*
path
)
const
git_index_entry_unmerged
*
git_index_get_unmerged_bypath
(
git_index
*
index
,
const
char
*
path
)
{
int
pos
;
assert
(
index
&&
path
);
...
...
@@ -549,69 +522,81 @@ const git_index_entry_unmerged *git_index_get_unmerged_bypath(git_index *index,
return
git_vector_get
(
&
index
->
unmerged
,
pos
);
}
const
git_index_entry_unmerged
*
git_index_get_unmerged_byindex
(
git_index
*
index
,
unsigned
int
n
)
const
git_index_entry_unmerged
*
git_index_get_unmerged_byindex
(
git_index
*
index
,
unsigned
int
n
)
{
assert
(
index
);
return
git_vector_get
(
&
index
->
unmerged
,
n
);
}
static
int
index_error_invalid
(
const
char
*
message
)
{
giterr_set
(
GITERR_INDEX
,
"Invalid data in index - %s"
,
message
);
return
-
1
;
}
static
int
read_unmerged
(
git_index
*
index
,
const
char
*
buffer
,
size_t
size
)
{
const
char
*
endptr
;
size_t
len
;
int
i
;
git_vector_init
(
&
index
->
unmerged
,
16
,
unmerged_cmp
);
if
(
git_vector_init
(
&
index
->
unmerged
,
16
,
unmerged_cmp
)
<
0
)
return
-
1
;
while
(
size
)
{
git_index_entry_unmerged
*
lost
;
len
=
strlen
(
buffer
)
+
1
;
if
(
size
<=
len
)
return
git__throw
(
GIT_ERROR
,
"Failed to read
unmerged entries"
);
return
index_error_invalid
(
"reading
unmerged entries"
);
if
((
lost
=
git__malloc
(
sizeof
(
git_index_entry_unmerged
)))
==
NULL
)
return
GIT_ENOMEM
;
lost
=
git__malloc
(
sizeof
(
git_index_entry_unmerged
));
GITERR_CHECK_ALLOC
(
lost
)
;
if
(
git_vector_insert
(
&
index
->
unmerged
,
lost
)
<
GIT_SUCCESS
)
return
git__throw
(
GIT_ERROR
,
"Failed to read unmerged entries"
)
;
if
(
git_vector_insert
(
&
index
->
unmerged
,
lost
)
<
0
)
return
-
1
;
/* read NUL-terminated pathname for entry */
lost
->
path
=
git__strdup
(
buffer
);
if
(
!
lost
->
path
)
return
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
lost
->
path
);
size
-=
len
;
buffer
+=
len
;
/* read 3 ASCII octal numbers for stage entries */
for
(
i
=
0
;
i
<
3
;
i
++
)
{
int
tmp
;
if
(
git__strtol32
(
&
tmp
,
buffer
,
&
endptr
,
8
)
<
GIT_SUCCESS
||
!
endptr
||
endptr
==
buffer
||
*
endptr
||
(
unsigned
)
tmp
>
UINT_MAX
)
return
GIT_ERROR
;
if
(
git__strtol32
(
&
tmp
,
buffer
,
&
endptr
,
8
)
<
0
||
!
endptr
||
endptr
==
buffer
||
*
endptr
||
(
unsigned
)
tmp
>
UINT_MAX
)
return
index_error_invalid
(
"reading unmerged entry stage"
);
lost
->
mode
[
i
]
=
tmp
;
len
=
(
endptr
+
1
)
-
buffer
;
if
(
size
<=
len
)
return
git__throw
(
GIT_ERROR
,
"Failed to read unmerged entries
"
);
return
index_error_invalid
(
"reading unmerged entry stage
"
);
size
-=
len
;
buffer
+=
len
;
}
/* read up to 3 OIDs for stage entries */
for
(
i
=
0
;
i
<
3
;
i
++
)
{
if
(
!
lost
->
mode
[
i
])
continue
;
if
(
size
<
20
)
return
git__throw
(
GIT_ERROR
,
"Failed to read unmerged entries"
);
return
index_error_invalid
(
"reading unmerged entry oid"
);
git_oid_fromraw
(
&
lost
->
oid
[
i
],
(
const
unsigned
char
*
)
buffer
);
size
-=
20
;
buffer
+=
20
;
}
}
return
GIT_SUCCESS
;
return
0
;
}
static
size_t
read_entry
(
git_index_entry
*
dest
,
const
void
*
buffer
,
size_t
buffer_size
)
...
...
@@ -657,7 +642,7 @@ static size_t read_entry(git_index_entry *dest, const void *buffer, size_t buffe
path_end
=
memchr
(
path_ptr
,
'\0'
,
buffer_size
);
if
(
path_end
==
NULL
)
return
0
;
return
0
;
path_length
=
path_end
-
path_ptr
;
}
...
...
@@ -682,15 +667,15 @@ static int read_header(struct index_header *dest, const void *buffer)
dest
->
signature
=
ntohl
(
source
->
signature
);
if
(
dest
->
signature
!=
INDEX_HEADER_SIG
)
return
GIT_EOBJCORRUPTED
;
return
index_error_invalid
(
"incorrect header signature"
)
;
dest
->
version
=
ntohl
(
source
->
version
);
if
(
dest
->
version
!=
INDEX_VERSION_NUMBER_EXT
&&
dest
->
version
!=
INDEX_VERSION_NUMBER
)
return
GIT_EOBJCORRUPTED
;
return
index_error_invalid
(
"incorrect header version"
)
;
dest
->
entry_count
=
ntohl
(
source
->
entry_count
);
return
GIT_SUCCESS
;
return
0
;
}
static
size_t
read_extension
(
git_index
*
index
,
const
char
*
buffer
,
size_t
buffer_size
)
...
...
@@ -713,10 +698,10 @@ static size_t read_extension(git_index *index, const char *buffer, size_t buffer
if
(
dest
.
signature
[
0
]
>=
'A'
&&
dest
.
signature
[
0
]
<=
'Z'
)
{
/* tree cache */
if
(
memcmp
(
dest
.
signature
,
INDEX_EXT_TREECACHE_SIG
,
4
)
==
0
)
{
if
(
git_tree_cache_read
(
&
index
->
tree
,
buffer
+
8
,
dest
.
extension_size
)
<
GIT_SUCCESS
)
if
(
git_tree_cache_read
(
&
index
->
tree
,
buffer
+
8
,
dest
.
extension_size
)
<
0
)
return
0
;
}
else
if
(
memcmp
(
dest
.
signature
,
INDEX_EXT_UNMERGED_SIG
,
4
)
==
0
)
{
if
(
read_unmerged
(
index
,
buffer
+
8
,
dest
.
extension_size
)
<
GIT_SUCCESS
)
if
(
read_unmerged
(
index
,
buffer
+
8
,
dest
.
extension_size
)
<
0
)
return
0
;
}
/* else, unsupported extension. We cannot parse this, but we can skip
...
...
@@ -738,21 +723,21 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
#define seek_forward(_increase) { \
if (_increase >= buffer_size) \
return
git__throw(GIT_EOBJCORRUPTED, "Failed to seek forward. Buffer size exceeded
"); \
return
index_error_invalid("ran out of data while parsing
"); \
buffer += _increase; \
buffer_size -= _increase;\
}
if
(
buffer_size
<
INDEX_HEADER_SIZE
+
INDEX_FOOTER_SIZE
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse index. Buffer too small
"
);
return
index_error_invalid
(
"insufficient buffer space
"
);
/* Precalculate the SHA1 of the files's contents -- we'll match it to
* the provided SHA1 in the footer */
git_hash_buf
(
&
checksum_calculated
,
buffer
,
buffer_size
-
INDEX_FOOTER_SIZE
);
/* Parse header */
if
(
read_header
(
&
header
,
buffer
)
<
GIT_SUCCESS
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse index. Header is corrupted"
)
;
if
(
read_header
(
&
header
,
buffer
)
<
0
)
return
-
1
;
seek_forward
(
INDEX_HEADER_SIZE
);
...
...
@@ -764,23 +749,22 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
git_index_entry
*
entry
;
entry
=
git__malloc
(
sizeof
(
git_index_entry
));
if
(
entry
==
NULL
)
return
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
entry
);
entry_size
=
read_entry
(
entry
,
buffer
,
buffer_size
);
/* 0 bytes read means an object corruption */
if
(
entry_size
==
0
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse index. Entry size is zero
"
);
return
index_error_invalid
(
"invalid entry
"
);
if
(
git_vector_insert
(
&
index
->
entries
,
entry
)
<
GIT_SUCCESS
)
return
GIT_ENOMEM
;
if
(
git_vector_insert
(
&
index
->
entries
,
entry
)
<
0
)
return
-
1
;
seek_forward
(
entry_size
);
}
if
(
i
!=
header
.
entry_count
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse index. H
eader entries changed while parsing"
);
return
index_error_invalid
(
"h
eader entries changed while parsing"
);
/* There's still space for some extensions! */
while
(
buffer_size
>
INDEX_FOOTER_SIZE
)
{
...
...
@@ -790,43 +774,43 @@ static int parse_index(git_index *index, const char *buffer, size_t buffer_size)
/* see if we have read any bytes from the extension */
if
(
extension_size
==
0
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse index. E
xtension size is zero"
);
return
index_error_invalid
(
"e
xtension size is zero"
);
seek_forward
(
extension_size
);
}
if
(
buffer_size
!=
INDEX_FOOTER_SIZE
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse index. B
uffer size does not match index footer size"
);
return
index_error_invalid
(
"b
uffer size does not match index footer size"
);
/* 160-bit SHA-1 over the content of the index file before this checksum. */
git_oid_fromraw
(
&
checksum_expected
,
(
const
unsigned
char
*
)
buffer
);
if
(
git_oid_cmp
(
&
checksum_calculated
,
&
checksum_expected
)
!=
0
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse index. Calculated checksum does not match expected checksum
"
);
return
index_error_invalid
(
"calculated checksum does not match expected
"
);
#undef seek_forward
/* force sorting in the vector: the entries are
* assured to be sorted on the index */
index
->
entries
.
sorted
=
1
;
return
GIT_SUCCESS
;
return
0
;
}
static
int
is_index_extended
(
git_index
*
index
)
{
unsigned
int
i
,
extended
;
git_index_entry
*
entry
;
extended
=
0
;
for
(
i
=
0
;
i
<
index
->
entries
.
length
;
++
i
)
{
git_index_entry
*
entry
;
entry
=
git_vector_get
(
&
index
->
entries
,
i
);
git_vector_foreach
(
&
index
->
entries
,
i
,
entry
)
{
entry
->
flags
&=
~
GIT_IDXENTRY_EXTENDED
;
if
(
entry
->
flags_extended
&
GIT_IDXENTRY_EXTENDED_FLAGS
)
{
extended
++
;
entry
->
flags
|=
GIT_IDXENTRY_EXTENDED
;
}
}
return
extended
;
}
...
...
@@ -844,8 +828,8 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry)
else
disk_size
=
short_entry_size
(
path_len
);
if
(
git_filebuf_reserve
(
file
,
&
mem
,
disk_size
)
<
GIT_SUCCESS
)
return
GIT_ENOMEM
;
if
(
git_filebuf_reserve
(
file
,
&
mem
,
disk_size
)
<
0
)
return
-
1
;
ondisk
=
(
struct
entry_short
*
)
mem
;
...
...
@@ -887,7 +871,7 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry)
memcpy
(
path
,
entry
->
path
,
path_len
);
return
GIT_SUCCESS
;
return
0
;
}
static
int
write_entries
(
git_index
*
index
,
git_filebuf
*
file
)
...
...
@@ -897,16 +881,15 @@ static int write_entries(git_index *index, git_filebuf *file)
for
(
i
=
0
;
i
<
index
->
entries
.
length
;
++
i
)
{
git_index_entry
*
entry
;
entry
=
git_vector_get
(
&
index
->
entries
,
i
);
if
(
write_disk_entry
(
file
,
entry
)
<
GIT_SUCCESS
)
return
GIT_ENOMEM
;
if
(
write_disk_entry
(
file
,
entry
)
<
0
)
return
-
1
;
}
return
GIT_SUCCESS
;
return
0
;
}
static
int
write_index
(
git_index
*
index
,
git_filebuf
*
file
)
{
int
error
=
GIT_SUCCESS
;
git_oid
hash_final
;
struct
index_header
header
;
...
...
@@ -921,11 +904,11 @@ static int write_index(git_index *index, git_filebuf *file)
header
.
version
=
htonl
(
is_extended
?
INDEX_VERSION_NUMBER_EXT
:
INDEX_VERSION_NUMBER
);
header
.
entry_count
=
htonl
(
index
->
entries
.
length
);
git_filebuf_write
(
file
,
&
header
,
sizeof
(
struct
index_header
));
if
(
git_filebuf_write
(
file
,
&
header
,
sizeof
(
struct
index_header
))
<
0
)
return
-
1
;
error
=
write_entries
(
index
,
file
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to write index"
);
if
(
write_entries
(
index
,
file
)
<
0
)
return
-
1
;
/* TODO: write extensions (tree cache) */
...
...
@@ -933,9 +916,7 @@ static int write_index(git_index *index, git_filebuf *file)
git_filebuf_hash
(
&
hash_final
,
file
);
/* write it at the end of the file */
git_filebuf_write
(
file
,
hash_final
.
id
,
GIT_OID_RAWSZ
);
return
error
==
GIT_SUCCESS
?
GIT_SUCCESS
:
git__rethrow
(
error
,
"Failed to write index"
);
return
git_filebuf_write
(
file
,
hash_final
.
id
,
GIT_OID_RAWSZ
);
}
int
git_index_entry_stage
(
const
git_index_entry
*
entry
)
...
...
@@ -945,36 +926,30 @@ int git_index_entry_stage(const git_index_entry *entry)
static
int
read_tree_cb
(
const
char
*
root
,
git_tree_entry
*
tentry
,
void
*
data
)
{
int
ret
=
GIT_SUCCESS
;
git_index
*
index
=
data
;
git_index_entry
*
entry
=
NULL
;
git_buf
path
=
GIT_BUF_INIT
;
if
(
entry_is_tree
(
tentry
))
goto
exit
;
return
0
;
ret
=
git_buf_joinpath
(
&
path
,
root
,
tentry
->
filename
);
if
(
ret
<
GIT_SUCCESS
)
goto
exit
;
if
(
git_buf_joinpath
(
&
path
,
root
,
tentry
->
filename
)
<
0
)
return
-
1
;
entry
=
git__calloc
(
1
,
sizeof
(
git_index_entry
));
if
(
!
entry
)
{
ret
=
GIT_ENOMEM
;
goto
exit
;
}
GITERR_CHECK_ALLOC
(
entry
);
entry
->
mode
=
tentry
->
attr
;
entry
->
oid
=
tentry
->
oid
;
entry
->
path
=
git_buf_detach
(
&
path
);
ret
=
index_insert
(
index
,
entry
,
0
);
exit:
git_buf_free
(
&
path
);
if
(
ret
<
GIT_SUCCESS
)
if
(
index_insert
(
index
,
entry
,
0
)
<
0
)
{
index_entry_free
(
entry
);
return
ret
;
return
-
1
;
}
return
0
;
}
int
git_index_read_tree
(
git_index
*
index
,
git_tree
*
tree
)
...
...
src/index.h
View file @
a227451d
...
...
@@ -31,4 +31,6 @@ struct git_index {
git_vector
unmerged
;
};
extern
void
git_index__init_entry_from_stat
(
struct
stat
*
st
,
git_index_entry
*
entry
);
#endif
src/indexer.c
View file @
a227451d
...
...
@@ -49,17 +49,22 @@ static int parse_header(git_indexer *idx)
int
error
;
/* Verify we recognize this pack file format. */
if
((
error
=
p_read
(
idx
->
pack
->
mwf
.
fd
,
&
idx
->
hdr
,
sizeof
(
idx
->
hdr
)))
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to read in pack header"
);
if
(
idx
->
hdr
.
hdr_signature
!=
ntohl
(
PACK_SIGNATURE
))
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Wrong pack signature"
);
if
((
error
=
p_read
(
idx
->
pack
->
mwf
.
fd
,
&
idx
->
hdr
,
sizeof
(
idx
->
hdr
)))
<
0
)
{
giterr_set
(
GITERR_OS
,
"Failed to read in pack header"
);
return
error
;
}
if
(
!
pack_version_ok
(
idx
->
hdr
.
hdr_version
))
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Wrong pack version"
);
if
(
idx
->
hdr
.
hdr_signature
!=
ntohl
(
PACK_SIGNATURE
))
{
giterr_set
(
GITERR_INVALID
,
"Wrong pack signature"
);
return
-
1
;
}
if
(
!
pack_version_ok
(
idx
->
hdr
.
hdr_version
))
{
giterr_set
(
GITERR_INVALID
,
"Wrong pack version"
);
return
-
1
;
}
return
GIT_SUCCESS
;
return
0
;
}
static
int
objects_cmp
(
const
void
*
a
,
const
void
*
b
)
...
...
@@ -87,49 +92,43 @@ int git_indexer_new(git_indexer **out, const char *packname)
assert
(
out
&&
packname
);
if
(
git_path_root
(
packname
)
<
0
)
return
git__throw
(
GIT_EINVALIDPATH
,
"Path is not absolute"
);
idx
=
git__malloc
(
sizeof
(
git_indexer
));
if
(
idx
==
NULL
)
return
GIT_ENOMEM
;
if
(
git_path_root
(
packname
)
<
0
)
{
giterr_set
(
GITERR_INVALID
,
"Path is not absolute"
);
return
-
1
;
}
memset
(
idx
,
0x0
,
sizeof
(
*
idx
));
idx
=
git__calloc
(
1
,
sizeof
(
git_indexer
));
GITERR_CHECK_ALLOC
(
idx
);
namelen
=
strlen
(
packname
);
idx
->
pack
=
git__malloc
(
sizeof
(
struct
git_pack_file
)
+
namelen
+
1
);
if
(
idx
->
pack
==
NULL
)
{
error
=
GIT_ENOMEM
;
goto
cleanup
;
}
idx
->
pack
=
git__calloc
(
1
,
sizeof
(
struct
git_pack_file
)
+
namelen
+
1
);
GITERR_CHECK_ALLOC
(
idx
->
pack
);
memset
(
idx
->
pack
,
0x0
,
sizeof
(
struct
git_pack_file
));
memcpy
(
idx
->
pack
->
pack_name
,
packname
,
namelen
+
1
);
ret
=
p_stat
(
packname
,
&
idx
->
st
);
if
(
ret
<
0
)
{
if
(
errno
==
ENOENT
)
error
=
git__throw
(
GIT_ENOTFOUND
,
"Failed to stat packfile. File not found"
);
else
error
=
git__throw
(
GIT_EOSERR
,
"Failed to stat packfile."
);
if
((
ret
=
p_stat
(
packname
,
&
idx
->
st
))
<
0
)
{
if
(
errno
==
ENOENT
)
{
giterr_set
(
GITERR_OS
,
"Failed to stat packfile. File not found"
);
error
=
GIT_ENOTFOUND
;
}
else
{
giterr_set
(
GITERR_OS
,
"Failed to stat packfile."
);
error
=
-
1
;
}
goto
cleanup
;
}
ret
=
p_open
(
idx
->
pack
->
pack_name
,
O_RDONLY
);
if
(
ret
<
0
)
{
error
=
git__throw
(
GIT_EOSERR
,
"Failed to open packfile"
)
;
if
((
ret
=
p_open
(
idx
->
pack
->
pack_name
,
O_RDONLY
))
<
0
)
{
giterr_set
(
GITERR_OS
,
"Failed to open packfile."
);
error
=
-
1
;
goto
cleanup
;
}
idx
->
pack
->
mwf
.
fd
=
ret
;
idx
->
pack
->
mwf
.
size
=
(
git_off_t
)
idx
->
st
.
st_size
;
error
=
parse_header
(
idx
);
if
(
error
<
GIT_SUCCESS
)
{
error
=
git__rethrow
(
error
,
"Failed to parse packfile header"
);
if
((
error
=
parse_header
(
idx
))
<
0
)
goto
cleanup
;
}
idx
->
nr_objects
=
ntohl
(
idx
->
hdr
.
hdr_entries
);
...
...
@@ -137,17 +136,17 @@ int git_indexer_new(git_indexer **out, const char *packname)
assert
(
idx
->
nr_objects
==
(
size_t
)((
unsigned
int
)
idx
->
nr_objects
));
error
=
git_vector_init
(
&
idx
->
pack
->
cache
,
(
unsigned
int
)
idx
->
nr_objects
,
cache_cmp
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
idx
->
pack
->
has_cache
=
1
;
error
=
git_vector_init
(
&
idx
->
objects
,
(
unsigned
int
)
idx
->
nr_objects
,
objects_cmp
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
*
out
=
idx
;
return
GIT_SUCCESS
;
return
0
;
cleanup:
git_indexer_free
(
idx
);
...
...
@@ -165,8 +164,8 @@ static int index_path(git_buf *path, git_indexer *idx)
slash
--
;
if
(
git_buf_grow
(
path
,
slash
+
1
+
strlen
(
prefix
)
+
GIT_OID_HEXSZ
+
strlen
(
suffix
)
+
1
)
<
GIT_SUCCESS
)
return
GIT_ENOMEM
;
GIT_OID_HEXSZ
+
strlen
(
suffix
)
+
1
)
<
0
)
return
-
1
;
git_buf_truncate
(
path
,
slash
);
git_buf_puts
(
path
,
prefix
);
...
...
@@ -174,10 +173,7 @@ static int index_path(git_buf *path, git_indexer *idx)
path
->
size
+=
GIT_OID_HEXSZ
;
git_buf_puts
(
path
,
suffix
);
if
(
git_buf_oom
(
path
))
return
GIT_ENOMEM
;
return
0
;
return
git_buf_oom
(
path
)
?
-
1
:
0
;
}
int
git_indexer_write
(
git_indexer
*
idx
)
...
...
@@ -197,26 +193,25 @@ int git_indexer_write(git_indexer *idx)
git_buf_sets
(
&
filename
,
idx
->
pack
->
pack_name
);
git_buf_truncate
(
&
filename
,
filename
.
size
-
strlen
(
"pack"
));
git_buf_puts
(
&
filename
,
"idx"
);
if
(
git_buf_oom
(
&
filename
))
return
GIT_ENOMEM
;
return
-
1
;
error
=
git_filebuf_open
(
&
idx
->
file
,
filename
.
ptr
,
GIT_FILEBUF_HASH_CONTENTS
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
/* Write out the header */
hdr
.
idx_signature
=
htonl
(
PACK_IDX_SIGNATURE
);
hdr
.
idx_version
=
htonl
(
2
);
error
=
git_filebuf_write
(
&
idx
->
file
,
&
hdr
,
sizeof
(
hdr
));
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
/* Write out the fanout table */
for
(
i
=
0
;
i
<
256
;
++
i
)
{
uint32_t
n
=
htonl
(
idx
->
fanout
[
i
]);
error
=
git_filebuf_write
(
&
idx
->
file
,
&
n
,
sizeof
(
n
));
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
}
...
...
@@ -225,7 +220,7 @@ int git_indexer_write(git_indexer *idx)
git_vector_foreach
(
&
idx
->
objects
,
i
,
entry
)
{
error
=
git_filebuf_write
(
&
idx
->
file
,
&
entry
->
oid
,
sizeof
(
git_oid
));
SHA1_Update
(
&
ctx
,
&
entry
->
oid
,
GIT_OID_RAWSZ
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
}
SHA1_Final
(
idx
->
hash
.
id
,
&
ctx
);
...
...
@@ -233,7 +228,7 @@ int git_indexer_write(git_indexer *idx)
/* Write out the CRC32 values */
git_vector_foreach
(
&
idx
->
objects
,
i
,
entry
)
{
error
=
git_filebuf_write
(
&
idx
->
file
,
&
entry
->
crc
,
sizeof
(
uint32_t
));
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
}
...
...
@@ -247,7 +242,7 @@ int git_indexer_write(git_indexer *idx)
n
=
htonl
(
entry
->
offset
);
error
=
git_filebuf_write
(
&
idx
->
file
,
&
n
,
sizeof
(
uint32_t
));
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
}
...
...
@@ -262,7 +257,7 @@ int git_indexer_write(git_indexer *idx)
split
[
1
]
=
htonl
(
entry
->
offset_long
&
0xffffffff
);
error
=
git_filebuf_write
(
&
idx
->
file
,
&
split
,
sizeof
(
uint32_t
)
*
2
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
}
...
...
@@ -271,7 +266,7 @@ int git_indexer_write(git_indexer *idx)
packfile_hash
=
git_mwindow_open
(
&
idx
->
pack
->
mwf
,
&
w
,
idx
->
st
.
st_size
-
GIT_OID_RAWSZ
,
GIT_OID_RAWSZ
,
&
left
);
git_mwindow_close
(
&
w
);
if
(
packfile_hash
==
NULL
)
{
error
=
git__rethrow
(
GIT_ENOMEM
,
"Failed to open window to packfile hash"
)
;
error
=
-
1
;
goto
cleanup
;
}
...
...
@@ -280,19 +275,21 @@ int git_indexer_write(git_indexer *idx)
git_mwindow_close
(
&
w
);
error
=
git_filebuf_write
(
&
idx
->
file
,
&
file_hash
,
sizeof
(
git_oid
));
if
(
error
<
0
)
goto
cleanup
;
/* Write out the index sha */
error
=
git_filebuf_hash
(
&
file_hash
,
&
idx
->
file
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
error
=
git_filebuf_write
(
&
idx
->
file
,
&
file_hash
,
sizeof
(
git_oid
));
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
/* Figure out what the final name should be */
error
=
index_path
(
&
filename
,
idx
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
/* Commit file */
...
...
@@ -300,7 +297,7 @@ int git_indexer_write(git_indexer *idx)
cleanup:
git_mwindow_free_all
(
&
idx
->
pack
->
mwf
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
git_filebuf_cleanup
(
&
idx
->
file
);
git_buf_free
(
&
filename
);
...
...
@@ -319,8 +316,8 @@ int git_indexer_run(git_indexer *idx, git_indexer_stats *stats)
mwf
=
&
idx
->
pack
->
mwf
;
error
=
git_mwindow_file_register
(
mwf
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to register mwindow file"
)
;
if
(
error
<
0
)
return
error
;
stats
->
total
=
(
unsigned
int
)
idx
->
nr_objects
;
stats
->
processed
=
processed
=
0
;
...
...
@@ -346,27 +343,26 @@ int git_indexer_run(git_indexer *idx, git_indexer_stats *stats)
}
error
=
git_packfile_unpack
(
&
obj
,
idx
->
pack
,
&
off
);
if
(
error
<
GIT_SUCCESS
)
{
error
=
git__rethrow
(
error
,
"Failed to unpack object"
);
if
(
error
<
0
)
goto
cleanup
;
}
/* FIXME: Parse the object instead of hashing it */
error
=
git_odb__hashobj
(
&
oid
,
&
obj
);
if
(
error
<
GIT_SUCCESS
)
{
error
=
git__rethrow
(
error
,
"Failed to hash object"
);
if
(
error
<
0
)
{
giterr_set
(
GITERR_INVALID
,
"Failed to hash object"
);
goto
cleanup
;
}
pentry
=
git__malloc
(
sizeof
(
struct
git_pack_entry
));
if
(
pentry
==
NULL
)
{
error
=
GIT_ENOMEM
;
error
=
-
1
;
goto
cleanup
;
}
git_oid_cpy
(
&
pentry
->
sha1
,
&
oid
);
pentry
->
offset
=
entry_start
;
error
=
git_vector_insert
(
&
idx
->
pack
->
cache
,
pentry
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
git_oid_cpy
(
&
entry
->
oid
,
&
oid
);
...
...
@@ -375,7 +371,7 @@ int git_indexer_run(git_indexer *idx, git_indexer_stats *stats)
entry_size
=
(
size_t
)(
off
-
entry_start
);
packed
=
git_mwindow_open
(
mwf
,
&
w
,
entry_start
,
entry_size
,
&
left
);
if
(
packed
==
NULL
)
{
error
=
git__rethrow
(
error
,
"Failed to open window to read packed data"
)
;
error
=
-
1
;
goto
cleanup
;
}
entry
->
crc
=
htonl
(
crc32
(
entry
->
crc
,
packed
,
(
uInt
)
entry_size
));
...
...
@@ -383,10 +379,8 @@ int git_indexer_run(git_indexer *idx, git_indexer_stats *stats)
/* Add the object to the list */
error
=
git_vector_insert
(
&
idx
->
objects
,
entry
);
if
(
error
<
GIT_SUCCESS
)
{
error
=
git__rethrow
(
error
,
"Failed to add entry to list"
);
if
(
error
<
0
)
goto
cleanup
;
}
for
(
i
=
oid
.
id
[
0
];
i
<
256
;
++
i
)
{
idx
->
fanout
[
i
]
++
;
...
...
src/iterator.c
View file @
a227451d
...
...
@@ -395,7 +395,6 @@ static void workdir_iterator__free(git_iterator *self)
static
int
workdir_iterator__update_entry
(
workdir_iterator
*
wi
)
{
int
error
;
git_path_with_stat
*
ps
=
git_vector_get
(
&
wi
->
stack
->
entries
,
wi
->
stack
->
index
);
git_buf_truncate
(
&
wi
->
path
,
wi
->
root_len
);
...
...
@@ -412,24 +411,18 @@ static int workdir_iterator__update_entry(workdir_iterator *wi)
/* if there is an error processing the entry, treat as ignored */
wi
->
is_ignored
=
1
;
/* TODO: remove shared code for struct stat conversion with index.c */
wi
->
entry
.
ctime
.
seconds
=
(
git_time_t
)
ps
->
st
.
st_ctime
;
wi
->
entry
.
mtime
.
seconds
=
(
git_time_t
)
ps
->
st
.
st_mtime
;
wi
->
entry
.
dev
=
ps
->
st
.
st_rdev
;
wi
->
entry
.
ino
=
ps
->
st
.
st_ino
;
git_index__init_entry_from_stat
(
&
ps
->
st
,
&
wi
->
entry
);
/* need different mode here to keep directories during iteration */
wi
->
entry
.
mode
=
git_futils_canonical_mode
(
ps
->
st
.
st_mode
);
wi
->
entry
.
uid
=
ps
->
st
.
st_uid
;
wi
->
entry
.
gid
=
ps
->
st
.
st_gid
;
wi
->
entry
.
file_size
=
ps
->
st
.
st_size
;
/* if this is a file type we don't handle, treat as ignored */
if
(
wi
->
entry
.
mode
==
0
)
return
0
;
/* okay, we are far enough along to look up real ignore rule */
error
=
git_ignore__lookup
(
&
wi
->
ignores
,
wi
->
entry
.
path
,
&
wi
->
is_ignored
);
if
(
error
<
0
)
return
0
;
if
(
git_ignore__lookup
(
&
wi
->
ignores
,
wi
->
entry
.
path
,
&
wi
->
is_ignored
)
<
0
)
return
0
;
/* if error, ignore it and ignore file */
/* detect submodules */
if
(
S_ISDIR
(
wi
->
entry
.
mode
)
&&
...
...
src/notes.c
View file @
a227451d
...
...
@@ -21,11 +21,8 @@ static int find_subtree(git_tree **subtree, const git_oid *root,
*
subtree
=
NULL
;
error
=
git_tree_lookup
(
&
tree
,
repo
,
root
);
if
(
error
<
GIT_SUCCESS
)
{
if
(
error
==
GIT_ENOTFOUND
)
return
error
;
/* notes tree doesn't exist yet */
return
git__rethrow
(
error
,
"Failed to open notes tree"
);
}
if
(
error
<
0
)
return
error
;
for
(
i
=
0
;
i
<
git_tree_entrycount
(
tree
);
i
++
)
{
entry
=
git_tree_entry_byindex
(
tree
,
i
);
...
...
@@ -56,7 +53,7 @@ static int find_subtree(git_tree **subtree, const git_oid *root,
}
*
subtree
=
tree
;
return
GIT_SUCCESS
;
return
0
;
}
static
int
find_blob
(
git_oid
*
blob
,
git_tree
*
tree
,
const
char
*
target
)
...
...
@@ -71,7 +68,7 @@ static int find_blob(git_oid *blob, git_tree *tree, const char *target)
/* found matching note object - return */
git_oid_cpy
(
blob
,
git_tree_entry_id
(
entry
));
return
GIT_SUCCESS
;
return
0
;
}
}
return
GIT_ENOTFOUND
;
...
...
@@ -93,18 +90,17 @@ static int note_write(git_oid *out, git_repository *repo,
if
(
tree_sha
)
{
error
=
find_subtree
(
&
tree
,
tree_sha
,
repo
,
target
,
&
fanout
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to lookup subtree"
)
;
if
(
error
<
0
)
return
error
;
error
=
find_blob
(
&
oid
,
tree
,
target
+
fanout
);
if
(
error
<
GIT_SUCCESS
&&
error
!=
GIT_ENOTFOUND
)
{
git_tree_free
(
tree
);
return
git__throw
(
GIT_ENOTFOUND
,
"Failed to read subtree %s"
,
target
);
}
if
(
error
==
GIT_SUCCESS
)
{
if
(
error
!=
GIT_ENOTFOUND
)
{
git_tree_free
(
tree
);
return
git__throw
(
GIT_EEXISTS
,
"Note for `%s` exists already"
,
target
);
if
(
!
error
)
{
giterr_set
(
GITERR_REPOSITORY
,
"Note for '%s' exists already"
,
target
);
error
=
GIT_EEXISTS
;
}
return
error
;
}
}
...
...
@@ -113,8 +109,8 @@ static int note_write(git_oid *out, git_repository *repo,
error
=
git_treebuilder_create
(
&
tb
,
tree
);
git_tree_free
(
tree
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to create treebuilder"
)
;
if
(
error
<
0
)
return
error
;
if
(
!
tree_sha
)
/* no notes tree yet - create fanout */
...
...
@@ -122,18 +118,18 @@ static int note_write(git_oid *out, git_repository *repo,
/* create note object */
error
=
git_blob_create_frombuffer
(
&
oid
,
repo
,
note
,
strlen
(
note
));
if
(
error
<
GIT_SUCCESS
)
{
if
(
error
<
0
)
{
git_treebuilder_free
(
tb
);
return
git__rethrow
(
error
,
"Failed to create note object"
)
;
return
error
;
}
error
=
git_treebuilder_insert
(
&
entry
,
tb
,
target
+
fanout
,
&
oid
,
0100644
);
if
(
error
<
GIT_SUCCESS
)
{
if
(
error
<
0
)
{
/* libgit2 doesn't support object removal (gc) yet */
/* we leave an orphaned blob object behind - TODO */
git_treebuilder_free
(
tb
);
return
git__rethrow
(
error
,
"Failed to insert note object"
)
;
return
error
;
}
if
(
out
)
...
...
@@ -142,8 +138,8 @@ static int note_write(git_oid *out, git_repository *repo,
error
=
git_treebuilder_write
(
&
oid
,
repo
,
tb
);
git_treebuilder_free
(
tb
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to write notes tree"
)
;
if
(
error
<
0
)
return
0
;
if
(
!
tree_sha
)
{
/* create fanout subtree */
...
...
@@ -153,27 +149,28 @@ static int note_write(git_oid *out, git_repository *repo,
subtree
[
2
]
=
'\0'
;
error
=
git_treebuilder_create
(
&
tb
,
NULL
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to create treebuilder"
)
;
if
(
error
<
0
)
return
error
;
error
=
git_treebuilder_insert
(
NULL
,
tb
,
subtree
,
&
oid
,
0040000
);
if
(
error
<
GIT_SUCCESS
)
{
if
(
error
<
0
)
{
git_treebuilder_free
(
tb
);
return
git__rethrow
(
error
,
"Failed to insert note object"
)
;
return
error
;
}
error
=
git_treebuilder_write
(
&
oid
,
repo
,
tb
);
git_treebuilder_free
(
tb
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to write notes tree"
)
;
if
(
error
<
0
)
return
error
;
}
/* create new notes commit */
error
=
git_tree_lookup
(
&
tree
,
repo
,
&
oid
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to open new notes tree"
)
;
if
(
error
<
0
)
return
error
;
error
=
git_commit_create
(
&
oid
,
repo
,
notes_ref
,
author
,
committer
,
NULL
,
GIT_NOTES_DEFAULT_MSG_ADD
,
...
...
@@ -181,10 +178,7 @@ static int note_write(git_oid *out, git_repository *repo,
git_tree_free
(
tree
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to create new notes commit"
);
return
GIT_SUCCESS
;
return
error
;
}
static
int
note_lookup
(
git_note
**
out
,
git_repository
*
repo
,
...
...
@@ -197,31 +191,25 @@ static int note_lookup(git_note **out, git_repository *repo,
git_note
*
note
;
error
=
find_subtree
(
&
tree
,
tree_sha
,
repo
,
target
,
&
fanout
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to lookup subtree"
)
;
if
(
error
<
0
)
return
error
;
error
=
find_blob
(
&
oid
,
tree
,
target
+
fanout
);
if
(
error
<
GIT_SUCCESS
)
{
git_tree_free
(
tree
);
return
git__throw
(
GIT_ENOTFOUND
,
"No note found for object %s"
,
target
);
}
git_tree_free
(
tree
);
if
(
error
<
0
)
return
error
;
error
=
git_blob_lookup
(
&
blob
,
repo
,
&
oid
);
if
(
error
<
GIT_SUCCESS
)
return
git__throw
(
GIT_ERROR
,
"Failed to lookup note object"
)
;
if
(
error
<
0
)
return
error
;
note
=
git__malloc
(
sizeof
(
git_note
));
if
(
note
==
NULL
)
{
git_blob_free
(
blob
);
return
GIT_ENOMEM
;
}
GITERR_CHECK_ALLOC
(
note
);
git_oid_cpy
(
&
note
->
oid
,
&
oid
);
note
->
message
=
git__strdup
(
git_blob_rawcontent
(
blob
));
if
(
note
->
message
==
NULL
)
error
=
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
note
->
message
);
*
out
=
note
;
...
...
@@ -240,39 +228,30 @@ static int note_remove(git_repository *repo,
git_treebuilder
*
tb
;
error
=
find_subtree
(
&
tree
,
tree_sha
,
repo
,
target
,
&
fanout
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to lookup subtree"
)
;
if
(
error
<
0
)
return
error
;
error
=
find_blob
(
&
oid
,
tree
,
target
+
fanout
);
if
(
error
<
GIT_SUCCESS
)
{
git_tree_free
(
tree
);
return
git__throw
(
GIT_ENOTFOUND
,
"No note found for object %s"
,
target
);
}
if
(
!
error
)
error
=
git_treebuilder_create
(
&
tb
,
tree
);
error
=
git_treebuilder_create
(
&
tb
,
tree
);
git_tree_free
(
tree
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to create treebuilder"
);
if
(
error
<
0
)
return
error
;
error
=
git_treebuilder_remove
(
tb
,
target
+
fanout
);
if
(
error
<
GIT_SUCCESS
)
{
git_treebuilder_free
(
tb
);
return
git__rethrow
(
error
,
"Failed to remove entry from notes tree"
);
}
if
(
!
error
)
error
=
git_treebuilder_write
(
&
oid
,
repo
,
tb
);
error
=
git_treebuilder_write
(
&
oid
,
repo
,
tb
);
git_treebuilder_free
(
tb
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to write notes tree"
);
if
(
error
<
0
)
return
error
;
/* create new notes commit */
error
=
git_tree_lookup
(
&
tree
,
repo
,
&
oid
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to open new notes tree"
)
;
if
(
error
<
0
)
return
error
;
error
=
git_commit_create
(
&
oid
,
repo
,
notes_ref
,
author
,
committer
,
NULL
,
GIT_NOTES_DEFAULT_MSG_RM
,
...
...
@@ -280,9 +259,6 @@ static int note_remove(git_repository *repo,
git_tree_free
(
tree
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to create new notes commit"
);
return
error
;
}
...
...
@@ -301,8 +277,8 @@ int git_note_read(git_note **out, git_repository *repo,
notes_ref
=
GIT_NOTES_DEFAULT_REF
;
error
=
git_reference_lookup
(
&
ref
,
repo
,
notes_ref
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to lookup reference `%s`"
,
notes_ref
)
;
if
(
error
<
0
)
return
error
;
assert
(
git_reference_type
(
ref
)
==
GIT_REF_OID
);
...
...
@@ -311,27 +287,26 @@ int git_note_read(git_note **out, git_repository *repo,
git_reference_free
(
ref
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to find notes commit object"
)
;
if
(
error
<
0
)
return
error
;
sha
=
git_commit_tree_oid
(
commit
);
git_commit_free
(
commit
);
target
=
git_oid_allocfmt
(
oid
);
if
(
target
==
NULL
)
return
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
target
);
error
=
note_lookup
(
out
,
repo
,
sha
,
target
);
git__free
(
target
);
return
error
==
GIT_SUCCESS
?
GIT_SUCCESS
:
git__rethrow
(
error
,
"Failed to read note"
);
return
error
;
}
int
git_note_create
(
git_oid
*
out
,
git_repository
*
repo
,
git_signature
*
author
,
git_signature
*
committer
,
const
char
*
notes_ref
,
const
git_oid
*
oid
,
const
char
*
note
)
int
git_note_create
(
git_oid
*
out
,
git_repository
*
repo
,
git_signature
*
author
,
git_signature
*
committer
,
const
char
*
notes_ref
,
const
git_oid
*
oid
,
const
char
*
note
)
{
int
error
,
nparents
=
0
;
char
*
target
;
...
...
@@ -343,10 +318,10 @@ int git_note_create(git_oid *out, git_repository *repo,
notes_ref
=
GIT_NOTES_DEFAULT_REF
;
error
=
git_reference_lookup
(
&
ref
,
repo
,
notes_ref
);
if
(
error
<
GIT_SUCCESS
&&
error
!=
GIT_ENOTFOUND
)
return
git__rethrow
(
error
,
"Failed to lookup reference `%s`"
,
notes_ref
)
;
if
(
error
<
0
&&
error
!=
GIT_ENOTFOUND
)
return
error
;
if
(
error
==
GIT_SUCCESS
)
{
if
(
!
error
)
{
assert
(
git_reference_type
(
ref
)
==
GIT_REF_OID
);
/* lookup existing notes tree oid */
...
...
@@ -355,16 +330,15 @@ int git_note_create(git_oid *out, git_repository *repo,
git_reference_free
(
ref
);
error
=
git_commit_lookup
(
&
commit
,
repo
,
&
sha
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to find notes commit object"
)
;
if
(
error
<
0
)
return
error
;
git_oid_cpy
(
&
sha
,
git_commit_tree_oid
(
commit
));
nparents
++
;
}
target
=
git_oid_allocfmt
(
oid
);
if
(
target
==
NULL
)
return
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
target
);
error
=
note_write
(
out
,
repo
,
author
,
committer
,
notes_ref
,
note
,
nparents
?
&
sha
:
NULL
,
target
,
...
...
@@ -372,8 +346,7 @@ int git_note_create(git_oid *out, git_repository *repo,
git__free
(
target
);
git_commit_free
(
commit
);
return
error
==
GIT_SUCCESS
?
GIT_SUCCESS
:
git__rethrow
(
error
,
"Failed to write note"
);
return
error
;
}
int
git_note_remove
(
git_repository
*
repo
,
const
char
*
notes_ref
,
...
...
@@ -390,8 +363,8 @@ int git_note_remove(git_repository *repo, const char *notes_ref,
notes_ref
=
GIT_NOTES_DEFAULT_REF
;
error
=
git_reference_lookup
(
&
ref
,
repo
,
notes_ref
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to lookup reference `%s`"
,
notes_ref
)
;
if
(
error
<
0
)
return
error
;
assert
(
git_reference_type
(
ref
)
==
GIT_REF_OID
);
...
...
@@ -399,22 +372,20 @@ int git_note_remove(git_repository *repo, const char *notes_ref,
git_reference_free
(
ref
);
error
=
git_commit_lookup
(
&
commit
,
repo
,
&
sha
);
if
(
error
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to find notes commit object"
)
;
if
(
error
<
0
)
return
error
;
git_oid_cpy
(
&
sha
,
git_commit_tree_oid
(
commit
));
target
=
git_oid_allocfmt
(
oid
);
if
(
target
==
NULL
)
return
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
target
);
error
=
note_remove
(
repo
,
author
,
committer
,
notes_ref
,
&
sha
,
target
,
1
,
&
commit
);
git__free
(
target
);
git_commit_free
(
commit
);
return
error
==
GIT_SUCCESS
?
GIT_SUCCESS
:
git__rethrow
(
error
,
"Failed to read note"
);
return
error
;
}
const
char
*
git_note_message
(
git_note
*
note
)
...
...
src/odb.c
View file @
a227451d
...
...
@@ -541,6 +541,10 @@ int git_odb_read(git_odb_object **out, git_odb *db, const git_oid *id)
error
=
b
->
read
(
&
raw
.
data
,
&
raw
.
len
,
&
raw
.
type
,
b
,
id
);
}
/* TODO: If no backends are configured, this returns GIT_ENOTFOUND but
* will never have called giterr_set().
*/
if
(
error
&&
error
!=
GIT_EPASSTHROUGH
)
return
error
;
...
...
src/oid.c
View file @
a227451d
...
...
@@ -13,13 +13,19 @@
static
char
to_hex
[]
=
"0123456789abcdef"
;
static
int
oid_error_invalid
(
const
char
*
msg
)
{
giterr_set
(
GITERR_INVALID
,
"Unable to parse OID - %s"
,
msg
);
return
-
1
;
}
int
git_oid_fromstrn
(
git_oid
*
out
,
const
char
*
str
,
size_t
length
)
{
size_t
p
;
int
v
;
if
(
length
<
4
)
return
git__throw
(
GIT_ENOTOID
,
"Failed to generate sha1. Given string is
too short"
);
return
oid_error_invalid
(
"input
too short"
);
if
(
length
>
GIT_OID_HEXSZ
)
length
=
GIT_OID_HEXSZ
;
...
...
@@ -29,7 +35,7 @@ int git_oid_fromstrn(git_oid *out, const char *str, size_t length)
|
git__fromhex
(
str
[
p
+
1
]);
if
(
v
<
0
)
return
git__throw
(
GIT_ENOTOID
,
"Failed to generate sha1. Given string is not a valid sha1 hash
"
);
return
oid_error_invalid
(
"contains invalid characters
"
);
out
->
id
[
p
/
2
]
=
(
unsigned
char
)
v
;
}
...
...
@@ -37,7 +43,7 @@ int git_oid_fromstrn(git_oid *out, const char *str, size_t length)
if
(
length
%
2
)
{
v
=
(
git__fromhex
(
str
[
p
+
0
])
<<
4
);
if
(
v
<
0
)
return
git__throw
(
GIT_ENOTOID
,
"Failed to generate sha1. Given string is not a valid sha1 hash
"
);
return
oid_error_invalid
(
"contains invalid characters
"
);
out
->
id
[
p
/
2
]
=
(
unsigned
char
)
v
;
p
+=
2
;
...
...
@@ -45,7 +51,7 @@ int git_oid_fromstrn(git_oid *out, const char *str, size_t length)
memset
(
out
->
id
+
p
/
2
,
0
,
(
GIT_OID_HEXSZ
-
p
)
/
2
);
return
GIT_SUCCESS
;
return
0
;
}
int
git_oid_fromstr
(
git_oid
*
out
,
const
char
*
str
)
...
...
@@ -109,8 +115,9 @@ char *git_oid_to_string(char *out, size_t n, const git_oid *oid)
return
out
;
}
int
git_oid__parse
(
git_oid
*
oid
,
const
char
**
buffer_out
,
const
char
*
buffer_end
,
const
char
*
header
)
int
git_oid__parse
(
git_oid
*
oid
,
const
char
**
buffer_out
,
const
char
*
buffer_end
,
const
char
*
header
)
{
const
size_t
sha_len
=
GIT_OID_HEXSZ
;
const
size_t
header_len
=
strlen
(
header
);
...
...
@@ -118,20 +125,20 @@ int git_oid__parse(git_oid *oid, const char **buffer_out,
const
char
*
buffer
=
*
buffer_out
;
if
(
buffer
+
(
header_len
+
sha_len
+
1
)
>
buffer_end
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse OID. Buffer too small
"
);
return
oid_error_invalid
(
"input is too short
"
);
if
(
memcmp
(
buffer
,
header
,
header_len
)
!=
0
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse OID. Buffer and header do not match
"
);
return
oid_error_invalid
(
"did not match expected header
"
);
if
(
buffer
[
header_len
+
sha_len
]
!=
'\n'
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse OID. Buffer
not terminated correctly"
);
return
oid_error_invalid
(
"
not terminated correctly"
);
if
(
git_oid_fromstr
(
oid
,
buffer
+
header_len
)
<
GIT_SUCCESS
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse OID. Failed to generate sha1"
)
;
if
(
git_oid_fromstr
(
oid
,
buffer
+
header_len
)
<
0
)
return
-
1
;
*
buffer_out
=
buffer
+
(
header_len
+
sha_len
+
1
);
return
GIT_SUCCESS
;
return
0
;
}
void
git_oid__writebuf
(
git_buf
*
buf
,
const
char
*
header
,
const
git_oid
*
oid
)
...
...
@@ -182,12 +189,11 @@ int git_oid_ncmp(const git_oid *oid_a, const git_oid *oid_b, unsigned int len)
int
git_oid_streq
(
const
git_oid
*
a
,
const
char
*
str
)
{
git_oid
id
;
int
error
;
if
(
(
error
=
git_oid_fromstr
(
&
id
,
str
))
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to convert '%s' to oid."
,
str
)
;
if
(
git_oid_fromstr
(
&
id
,
str
)
<
0
)
return
-
1
;
return
git_oid_cmp
(
a
,
&
id
)
==
0
?
GIT_SUCCESS
:
GIT_ERROR
;
return
git_oid_cmp
(
a
,
&
id
)
==
0
?
0
:
-
1
;
}
int
git_oid_iszero
(
const
git_oid
*
oid_a
)
...
...
@@ -216,15 +222,14 @@ struct git_oid_shorten {
static
int
resize_trie
(
git_oid_shorten
*
self
,
size_t
new_size
)
{
self
->
nodes
=
git__realloc
(
self
->
nodes
,
new_size
*
sizeof
(
trie_node
));
if
(
self
->
nodes
==
NULL
)
return
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
self
->
nodes
);
if
(
new_size
>
self
->
size
)
{
memset
(
&
self
->
nodes
[
self
->
size
],
0x0
,
(
new_size
-
self
->
size
)
*
sizeof
(
trie_node
));
}
self
->
size
=
new_size
;
return
GIT_SUCCESS
;
return
0
;
}
static
trie_node
*
push_leaf
(
git_oid_shorten
*
os
,
node_index
idx
,
int
push_at
,
const
char
*
oid
)
...
...
@@ -233,7 +238,7 @@ static trie_node *push_leaf(git_oid_shorten *os, node_index idx, int push_at, co
node_index
idx_leaf
;
if
(
os
->
node_count
>=
os
->
size
)
{
if
(
resize_trie
(
os
,
os
->
size
*
2
)
<
GIT_SUCCESS
)
if
(
resize_trie
(
os
,
os
->
size
*
2
)
<
0
)
return
NULL
;
}
...
...
@@ -255,13 +260,11 @@ git_oid_shorten *git_oid_shorten_new(size_t min_length)
{
git_oid_shorten
*
os
;
os
=
git__
malloc
(
sizeof
(
git_oid_shorten
));
os
=
git__
calloc
(
1
,
sizeof
(
git_oid_shorten
));
if
(
os
==
NULL
)
return
NULL
;
memset
(
os
,
0x0
,
sizeof
(
git_oid_shorten
));
if
(
resize_trie
(
os
,
16
)
<
GIT_SUCCESS
)
{
if
(
resize_trie
(
os
,
16
)
<
0
)
{
git__free
(
os
);
return
NULL
;
}
...
...
@@ -329,7 +332,7 @@ int git_oid_shorten_add(git_oid_shorten *os, const char *text_oid)
node_index
idx
;
if
(
os
->
full
)
return
GIT_ENOMEM
;
return
-
1
;
if
(
text_oid
==
NULL
)
return
os
->
min_length
;
...
...
@@ -341,8 +344,10 @@ int git_oid_shorten_add(git_oid_shorten *os, const char *text_oid)
int
c
=
git__fromhex
(
text_oid
[
i
]);
trie_node
*
node
;
if
(
c
==
-
1
)
return
git__throw
(
GIT_ENOTOID
,
"Failed to shorten OID. Invalid hex value"
);
if
(
c
==
-
1
)
{
giterr_set
(
GITERR_INVALID
,
"Unable to shorten OID - invalid hex value"
);
return
-
1
;
}
node
=
&
os
->
nodes
[
idx
];
...
...
@@ -353,13 +358,12 @@ int git_oid_shorten_add(git_oid_shorten *os, const char *text_oid)
node
->
tail
=
NULL
;
node
=
push_leaf
(
os
,
idx
,
git__fromhex
(
tail
[
0
]),
&
tail
[
1
]);
if
(
node
==
NULL
)
return
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
node
);
}
if
(
node
->
children
[
c
]
==
0
)
{
if
(
push_leaf
(
os
,
idx
,
c
,
&
text_oid
[
i
+
1
])
==
NULL
)
return
GIT_ENOMEM
;
return
-
1
;
break
;
}
...
...
src/reflog.c
View file @
a227451d
...
...
@@ -16,23 +16,21 @@ static int reflog_init(git_reflog **reflog, git_reference *ref)
*
reflog
=
NULL
;
log
=
git__malloc
(
sizeof
(
git_reflog
));
if
(
log
==
NULL
)
return
GIT_ENOMEM
;
memset
(
log
,
0x0
,
sizeof
(
git_reflog
));
log
=
git__calloc
(
1
,
sizeof
(
git_reflog
));
GITERR_CHECK_ALLOC
(
log
);
log
->
ref_name
=
git__strdup
(
ref
->
name
);
GITERR_CHECK_ALLOC
(
log
->
ref_name
);
if
(
git_vector_init
(
&
log
->
entries
,
0
,
NULL
)
<
0
)
{
git__free
(
log
->
ref_name
);
git__free
(
log
);
return
GIT_ENOMEM
;
return
-
1
;
}
*
reflog
=
log
;
return
GIT_SUCCESS
;
return
0
;
}
static
int
reflog_write
(
const
char
*
log_path
,
const
char
*
oid_old
,
...
...
@@ -42,9 +40,22 @@ static int reflog_write(const char *log_path, const char *oid_old,
int
error
;
git_buf
log
=
GIT_BUF_INIT
;
git_filebuf
fbuf
=
GIT_FILEBUF_INIT
;
bool
trailing_newline
=
false
;
assert
(
log_path
&&
oid_old
&&
oid_new
&&
committer
);
if
(
msg
)
{
const
char
*
newline
=
strchr
(
msg
,
'\n'
);
if
(
newline
)
{
if
(
*
(
newline
+
1
)
==
'\0'
)
trailing_newline
=
true
;
else
{
giterr_set
(
GITERR_INVALID
,
"Reflog message cannot contain newline"
);
return
-
1
;
}
}
}
git_buf_puts
(
&
log
,
oid_old
);
git_buf_putc
(
&
log
,
' '
);
...
...
@@ -54,68 +65,58 @@ static int reflog_write(const char *log_path, const char *oid_old,
git_buf_truncate
(
&
log
,
log
.
size
-
1
);
/* drop LF */
if
(
msg
)
{
if
(
strchr
(
msg
,
'\n'
))
{
git_buf_free
(
&
log
);
return
git__throw
(
GIT_ERROR
,
"Reflog message cannot contain newline"
);
}
git_buf_putc
(
&
log
,
'\t'
);
git_buf_puts
(
&
log
,
msg
);
}
git_buf_putc
(
&
log
,
'\n'
);
if
(
!
trailing_newline
)
git_buf_putc
(
&
log
,
'\n'
);
if
(
git_buf_oom
(
&
log
))
{
git_buf_free
(
&
log
);
return
git__throw
(
GIT_ENOMEM
,
"Failed to write reflog. Memory allocation failure"
)
;
return
-
1
;
}
if
((
error
=
git_filebuf_open
(
&
fbuf
,
log_path
,
GIT_FILEBUF_APPEND
))
<
GIT_SUCCESS
)
{
git_buf_free
(
&
log
);
return
git__rethrow
(
error
,
"Failed to write reflog. Cannot open reflog `%s`"
,
log_path
);
error
=
git_filebuf_open
(
&
fbuf
,
log_path
,
GIT_FILEBUF_APPEND
);
if
(
!
error
)
{
if
((
error
=
git_filebuf_write
(
&
fbuf
,
log
.
ptr
,
log
.
size
))
<
0
)
git_filebuf_cleanup
(
&
fbuf
);
else
error
=
git_filebuf_commit
(
&
fbuf
,
GIT_REFLOG_FILE_MODE
);
}
git_filebuf_write
(
&
fbuf
,
log
.
ptr
,
log
.
size
);
error
=
git_filebuf_commit
(
&
fbuf
,
GIT_REFLOG_FILE_MODE
);
git_buf_free
(
&
log
);
return
error
==
GIT_SUCCESS
?
GIT_SUCCESS
:
git__rethrow
(
error
,
"Failed to write reflog"
)
;
return
error
;
}
static
int
reflog_parse
(
git_reflog
*
log
,
const
char
*
buf
,
size_t
buf_size
)
{
int
error
=
GIT_SUCCESS
;
const
char
*
ptr
;
git_reflog_entry
*
entry
;
#define seek_forward(_increase) { \
#define seek_forward(_increase)
do
{ \
if (_increase >= buf_size) { \
if (entry->committer) \
git__free(entry->committer); \
git__free(entry); \
return git__throw(GIT_ERROR, "Failed to seek forward. Buffer size exceeded"); \
giterr_set(GITERR_INVALID, "Ran out of data while parsing reflog"); \
goto fail; \
} \
buf += _increase; \
buf_size -= _increase; \
}
} while (0)
while
(
buf_size
>
GIT_REFLOG_SIZE_MIN
)
{
entry
=
git__malloc
(
sizeof
(
git_reflog_entry
));
if
(
entry
==
NULL
)
return
GIT_ENOMEM
;
entry
->
committer
=
NULL
;
GITERR_CHECK_ALLOC
(
entry
);
if
(
git_oid_fromstrn
(
&
entry
->
oid_old
,
buf
,
GIT_OID_HEXSZ
)
<
GIT_SUCCESS
)
{
git__free
(
entry
);
return
GIT_ERROR
;
}
entry
->
committer
=
git__malloc
(
sizeof
(
git_signature
));
GITERR_CHECK_ALLOC
(
entry
->
committer
);
if
(
git_oid_fromstrn
(
&
entry
->
oid_old
,
buf
,
GIT_OID_HEXSZ
)
<
0
)
goto
fail
;
seek_forward
(
GIT_OID_HEXSZ
+
1
);
if
(
git_oid_fromstrn
(
&
entry
->
oid_cur
,
buf
,
GIT_OID_HEXSZ
)
<
GIT_SUCCESS
)
{
git__free
(
entry
);
return
GIT_ERROR
;
}
if
(
git_oid_fromstrn
(
&
entry
->
oid_cur
,
buf
,
GIT_OID_HEXSZ
)
<
0
)
goto
fail
;
seek_forward
(
GIT_OID_HEXSZ
+
1
);
ptr
=
buf
;
...
...
@@ -124,17 +125,8 @@ static int reflog_parse(git_reflog *log, const char *buf, size_t buf_size)
while
(
*
buf
&&
*
buf
!=
'\t'
&&
*
buf
!=
'\n'
)
seek_forward
(
1
);
entry
->
committer
=
git__malloc
(
sizeof
(
git_signature
));
if
(
entry
->
committer
==
NULL
)
{
git__free
(
entry
);
return
GIT_ENOMEM
;
}
if
((
error
=
git_signature__parse
(
entry
->
committer
,
&
ptr
,
buf
+
1
,
NULL
,
*
buf
))
<
GIT_SUCCESS
)
{
git__free
(
entry
->
committer
);
git__free
(
entry
);
return
git__rethrow
(
error
,
"Failed to parse reflog. Could not parse signature"
);
}
if
(
git_signature__parse
(
entry
->
committer
,
&
ptr
,
buf
+
1
,
NULL
,
*
buf
)
<
0
)
goto
fail
;
if
(
*
buf
==
'\t'
)
{
/* We got a message. Read everything till we reach LF. */
...
...
@@ -145,19 +137,27 @@ static int reflog_parse(git_reflog *log, const char *buf, size_t buf_size)
seek_forward
(
1
);
entry
->
msg
=
git__strndup
(
ptr
,
buf
-
ptr
);
GITERR_CHECK_ALLOC
(
entry
->
msg
);
}
else
entry
->
msg
=
NULL
;
while
(
*
buf
&&
*
buf
==
'\n'
&&
buf_size
>
1
)
seek_forward
(
1
);
if
(
(
error
=
git_vector_insert
(
&
log
->
entries
,
entry
))
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to parse reflog. Could not add new entry"
)
;
if
(
git_vector_insert
(
&
log
->
entries
,
entry
)
<
0
)
goto
fail
;
}
return
0
;
#undef seek_forward
return
error
==
GIT_SUCCESS
?
GIT_SUCCESS
:
git__rethrow
(
error
,
"Failed to parse reflog"
);
fail:
if
(
entry
)
{
git__free
(
entry
->
committer
);
git__free
(
entry
);
}
return
-
1
;
}
void
git_reflog_free
(
git_reflog
*
reflog
)
...
...
@@ -188,27 +188,23 @@ int git_reflog_read(git_reflog **reflog, git_reference *ref)
*
reflog
=
NULL
;
if
(
(
error
=
reflog_init
(
&
log
,
ref
))
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to read reflog. Cannot init reflog"
)
;
if
(
reflog_init
(
&
log
,
ref
)
<
0
)
return
-
1
;
error
=
git_buf_join_n
(
&
log_path
,
'/'
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
);
if
(
error
<
GIT_SUCCESS
)
goto
cleanup
;
if
((
error
=
git_futils_readbuffer
(
&
log_file
,
log_path
.
ptr
))
<
GIT_SUCCESS
)
{
git__rethrow
(
error
,
"Failed to read reflog. Cannot read file `%s`"
,
log_path
.
ptr
);
goto
cleanup
;
}
if
(
!
error
)
error
=
git_futils_readbuffer
(
&
log_file
,
log_path
.
ptr
);
if
((
error
=
reflog_parse
(
log
,
log_file
.
ptr
,
log_file
.
size
))
<
GIT_SUCCESS
)
git__rethrow
(
error
,
"Failed to read reflog"
);
else
*
reflog
=
log
;
if
(
!
error
)
error
=
reflog_parse
(
log
,
log_file
.
ptr
,
log_file
.
size
);
cleanup:
if
(
error
!=
GIT_SUCCESS
&&
log
!=
NULL
)
if
(
!
error
)
*
reflog
=
log
;
else
git_reflog_free
(
log
);
git_buf_free
(
&
log_file
);
git_buf_free
(
&
log_path
);
...
...
@@ -225,16 +221,15 @@ int git_reflog_write(git_reference *ref, const git_oid *oid_old,
git_reference
*
r
;
const
git_oid
*
oid
;
if
((
error
=
git_reference_resolve
(
&
r
,
ref
))
<
GIT_SUCCESS
)
return
git__rethrow
(
error
,
"Failed to write reflog. Cannot resolve reference `%s`"
,
ref
->
name
);
if
((
error
=
git_reference_resolve
(
&
r
,
ref
))
<
0
)
return
error
;
oid
=
git_reference_oid
(
r
);
if
(
oid
==
NULL
)
{
error
=
git__throw
(
GIT_ERROR
,
giterr_set
(
GITERR_REFERENCE
,
"Failed to write reflog. Cannot resolve reference `%s`"
,
r
->
name
);
git_reference_free
(
r
);
return
error
;
return
-
1
;
}
git_oid_to_string
(
new
,
GIT_OID_HEXSZ
+
1
,
oid
);
...
...
@@ -243,23 +238,21 @@ int git_reflog_write(git_reference *ref, const git_oid *oid_old,
error
=
git_buf_join_n
(
&
log_path
,
'/'
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
if
(
git_path_exists
(
log_path
.
ptr
)
==
false
)
{
error
=
git_futils_mkpath2file
(
log_path
.
ptr
,
GIT_REFLOG_DIR_MODE
);
if
(
error
<
GIT_SUCCESS
)
git__rethrow
(
error
,
"Failed to write reflog. Cannot create reflog directory"
);
}
else
if
(
git_path_isfile
(
log_path
.
ptr
)
==
false
)
{
error
=
git__throw
(
GIT_ERROR
,
giterr_set
(
GITERR_REFERENCE
,
"Failed to write reflog. `%s` is directory"
,
log_path
.
ptr
);
error
=
-
1
;
}
else
if
(
oid_old
==
NULL
)
{
error
=
git__throw
(
GIT_ERROR
,
giterr_set
(
GITERR_REFERENCE
,
"Failed to write reflog. Old OID cannot be NULL for existing reference"
);
error
=
-
1
;
}
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
goto
cleanup
;
if
(
oid_old
)
...
...
@@ -280,13 +273,13 @@ int git_reflog_rename(git_reference *ref, const char *new_name)
git_buf
old_path
=
GIT_BUF_INIT
;
git_buf
new_path
=
GIT_BUF_INIT
;
if
(
git_buf_join_n
(
&
old_path
,
'/'
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
)
&&
git_buf_join_n
(
&
new_path
,
'/'
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
new_name
))
if
(
!
git_buf_join_n
(
&
old_path
,
'/'
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
)
&&
!
git_buf_join_n
(
&
new_path
,
'/'
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
new_name
))
error
=
p_rename
(
git_buf_cstr
(
&
old_path
),
git_buf_cstr
(
&
new_path
));
else
error
=
GIT_ENOMEM
;
error
=
-
1
;
git_buf_free
(
&
old_path
);
git_buf_free
(
&
new_path
);
...
...
@@ -296,13 +289,13 @@ int git_reflog_rename(git_reference *ref, const char *new_name)
int
git_reflog_delete
(
git_reference
*
ref
)
{
int
error
=
GIT_SUCCESS
;
int
error
;
git_buf
path
=
GIT_BUF_INIT
;
error
=
git_buf_join_n
(
&
path
,
'/'
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
);
error
=
git_buf_join_n
(
&
path
,
'/'
,
3
,
ref
->
owner
->
path_repository
,
GIT_REFLOG_DIR
,
ref
->
name
);
if
(
error
==
GIT_SUCCESS
&&
git_path_exists
(
path
.
ptr
)
==
true
)
if
(
!
error
&&
git_path_exists
(
path
.
ptr
)
)
error
=
p_unlink
(
path
.
ptr
);
git_buf_free
(
&
path
);
...
...
src/sha1_lookup.c
View file @
a227451d
...
...
@@ -158,7 +158,8 @@ int sha1_entry_pos(const void *table,
#endif
if
(
!
(
lo
<=
mi
&&
mi
<
hi
))
{
return
git__throw
(
GIT_ERROR
,
"Assertion failure. Binary search invariant is false"
);
giterr_set
(
GITERR_INVALID
,
"Assertion failure. Binary search invariant is false"
);
return
-
1
;
}
mi_key
=
base
+
elem_size
*
mi
+
key_offset
;
...
...
src/signature.c
View file @
a227451d
...
...
@@ -38,31 +38,38 @@ static const char *skip_trailing_spaces(const char *buffer_start, const char *bu
return
buffer_end
;
}
static
int
signature_error
(
const
char
*
msg
)
{
giterr_set
(
GITERR_INVALID
,
"Failed to parse signature - %s"
,
msg
);
return
-
1
;
}
static
int
process_trimming
(
const
char
*
input
,
char
**
storage
,
const
char
*
input_end
,
int
fail_when_empty
)
{
const
char
*
left
,
*
right
;
int
trimmed_input_length
;
assert
(
storage
);
left
=
skip_leading_spaces
(
input
,
input_end
);
right
=
skip_trailing_spaces
(
input
,
input_end
-
1
);
if
(
right
<
left
)
{
if
(
fail_when_empty
)
return
git__throw
(
GIT_EINVALIDARGS
,
"Failed to trim. Input is either empty or only contains
spaces"
);
else
right
=
left
-
1
;
return
signature_error
(
"input is either empty of contains only
spaces"
);
right
=
left
-
1
;
}
trimmed_input_length
=
right
-
left
+
1
;
*
storage
=
git__malloc
(
trimmed_input_length
+
1
);
if
(
*
storage
==
NULL
)
return
GIT_ENOMEM
;
GITERR_CHECK_ALLOC
(
*
storage
);
memcpy
(
*
storage
,
left
,
trimmed_input_length
);
(
*
storage
)[
trimmed_input_length
]
=
0
;
return
GIT_SUCCESS
;
return
0
;
}
int
git_signature_new
(
git_signature
**
sig_out
,
const
char
*
name
,
const
char
*
email
,
git_time_t
time
,
int
offset
)
...
...
@@ -74,23 +81,14 @@ int git_signature_new(git_signature **sig_out, const char *name, const char *ema
*
sig_out
=
NULL
;
if
((
p
=
git__malloc
(
sizeof
(
git_signature
)))
==
NULL
)
{
error
=
GIT_ENOMEM
;
goto
cleanup
;
}
memset
(
p
,
0x0
,
sizeof
(
git_signature
));
error
=
process_trimming
(
name
,
&
p
->
name
,
name
+
strlen
(
name
),
1
);
if
(
error
<
GIT_SUCCESS
)
{
git__rethrow
(
GIT_EINVALIDARGS
,
"Failed to create signature. 'name' argument is invalid"
);
goto
cleanup
;
}
p
=
git__calloc
(
1
,
sizeof
(
git_signature
));
GITERR_CHECK_ALLOC
(
p
);
error
=
process_trimming
(
email
,
&
p
->
email
,
email
+
strlen
(
email
),
1
);
if
(
error
<
GIT_SUCCESS
)
{
git__rethrow
(
GIT_EINVALIDARGS
,
"Failed to create signature. 'email' argument is invalid"
);
goto
cleanup
;
if
((
error
=
process_trimming
(
name
,
&
p
->
name
,
name
+
strlen
(
name
),
1
))
<
0
||
(
error
=
process_trimming
(
email
,
&
p
->
email
,
email
+
strlen
(
email
),
1
))
<
0
)
{
git_signature_free
(
p
);
return
error
;
}
p
->
when
.
time
=
time
;
...
...
@@ -98,24 +96,19 @@ int git_signature_new(git_signature **sig_out, const char *name, const char *ema
*
sig_out
=
p
;
return
error
;
cleanup:
git_signature_free
(
p
);
return
error
;
return
0
;
}
git_signature
*
git_signature_dup
(
const
git_signature
*
sig
)
{
git_signature
*
new
;
if
(
git_signature_new
(
&
new
,
sig
->
name
,
sig
->
email
,
sig
->
when
.
time
,
sig
->
when
.
offset
)
<
GIT_SUCCESS
)
if
(
git_signature_new
(
&
new
,
sig
->
name
,
sig
->
email
,
sig
->
when
.
time
,
sig
->
when
.
offset
)
<
0
)
return
NULL
;
return
new
;
}
int
git_signature_now
(
git_signature
**
sig_out
,
const
char
*
name
,
const
char
*
email
)
{
int
error
;
time_t
now
;
time_t
offset
;
struct
tm
*
utc_tm
,
*
local_tm
;
...
...
@@ -148,12 +141,18 @@ int git_signature_now(git_signature **sig_out, const char *name, const char *ema
if
(
local_tm
->
tm_isdst
)
offset
+=
60
;
if
(
(
error
=
git_signature_new
(
&
sig
,
name
,
email
,
now
,
(
int
)
offset
))
<
GIT_SUCCESS
)
return
error
;
if
(
git_signature_new
(
&
sig
,
name
,
email
,
now
,
(
int
)
offset
)
<
0
)
return
-
1
;
*
sig_out
=
sig
;
return
error
;
return
0
;
}
static
int
timezone_error
(
const
char
*
msg
)
{
giterr_set
(
GITERR_INVALID
,
"Failed to parse TZ offset - %s"
,
msg
);
return
-
1
;
}
static
int
parse_timezone_offset
(
const
char
*
buffer
,
int
*
offset_out
)
...
...
@@ -172,28 +171,28 @@ static int parse_timezone_offset(const char *buffer, int *offset_out)
}
if
(
offset_start
[
0
]
!=
'-'
&&
offset_start
[
0
]
!=
'+'
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse TZ offset. It doesn'
t start with '+' or '-'"
);
return
timezone_error
(
"does no
t start with '+' or '-'"
);
if
(
offset_start
[
1
]
<
'0'
||
offset_start
[
1
]
>
'9'
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse TZ offset.
"
);
return
timezone_error
(
"expected initial digit
"
);
if
(
git__strtol32
(
&
dec_offset
,
offset_start
+
1
,
&
offset_end
,
10
)
<
GIT_SUCCESS
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse TZ offset. It isn't a
number"
);
return
timezone_error
(
"not a valid
number"
);
if
(
offset_end
-
offset_start
!=
5
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse TZ offset. I
nvalid length"
);
return
timezone_error
(
"i
nvalid length"
);
if
(
dec_offset
>
1400
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse TZ offset. V
alue too large"
);
return
timezone_error
(
"v
alue too large"
);
hours
=
dec_offset
/
100
;
mins
=
dec_offset
%
100
;
if
(
hours
>
14
)
// see http://www.worldtimezone.com/faq.html
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse TZ offset. H
our value too large"
);
return
timezone_error
(
"h
our value too large"
);
if
(
mins
>
59
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse TZ offset. Minute
value too large"
);
return
timezone_error
(
"minutes
value too large"
);
offset
=
(
hours
*
60
)
+
mins
;
...
...
@@ -202,22 +201,22 @@ static int parse_timezone_offset(const char *buffer, int *offset_out)
*
offset_out
=
offset
;
return
GIT_SUCCESS
;
return
0
;
}
static
int
process_next_token
(
const
char
**
buffer_out
,
char
**
storage
,
const
char
*
token_end
,
const
char
*
right_boundary
)
{
int
error
=
process_trimming
(
*
buffer_out
,
storage
,
token_end
,
0
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
return
error
;
*
buffer_out
=
token_end
+
1
;
if
(
*
buffer_out
>
right_boundary
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse signature. Signature
too short"
);
return
signature_error
(
"signature is
too short"
);
return
GIT_SUCCESS
;
return
0
;
}
static
const
char
*
scan_for_previous_token
(
const
char
*
buffer
,
const
char
*
left_boundary
)
...
...
@@ -241,17 +240,17 @@ static int parse_time(git_time_t *time_out, const char *buffer)
int
time
;
int
error
;
if
(
*
buffer
==
'+'
||
*
buffer
==
'-'
)
return
git__throw
(
GIT_ERROR
,
"Failed while parsing time. '%s' rather look like a timezone offset."
,
buffer
);
if
(
*
buffer
==
'+'
||
*
buffer
==
'-'
)
{
giterr_set
(
GITERR_INVALID
,
"Failed while parsing time. '%s' actually looks like a timezone offset."
,
buffer
);
return
-
1
;
}
error
=
git__strtol32
(
&
time
,
buffer
,
&
buffer
,
10
);
if
(
error
<
GIT_SUCCESS
)
return
error
;
if
(
!
error
)
*
time_out
=
(
git_time_t
)
time
;
*
time_out
=
(
git_time_t
)
time
;
return
GIT_SUCCESS
;
return
error
;
}
int
git_signature__parse
(
git_signature
*
sig
,
const
char
**
buffer_out
,
...
...
@@ -259,40 +258,40 @@ int git_signature__parse(git_signature *sig, const char **buffer_out,
{
const
char
*
buffer
=
*
buffer_out
;
const
char
*
line_end
,
*
name_end
,
*
email_end
,
*
tz_start
,
*
time_start
;
int
error
=
GIT_SUCCESS
;
int
error
=
0
;
memset
(
sig
,
0x0
,
sizeof
(
git_signature
));
if
((
line_end
=
memchr
(
buffer
,
ender
,
buffer_end
-
buffer
))
==
NULL
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse signature. N
o newline given"
);
return
signature_error
(
"n
o newline given"
);
if
(
header
)
{
const
size_t
header_len
=
strlen
(
header
);
if
(
memcmp
(
buffer
,
header
,
header_len
)
!=
0
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse signature. Expected prefix '%s' doesn't match actual"
,
header
);
return
signature_error
(
"expected prefix doesn't match actual"
);
buffer
+=
header_len
;
}
if
(
buffer
>
line_end
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse signature. S
ignature too short"
);
return
signature_error
(
"s
ignature too short"
);
if
((
name_end
=
strchr
(
buffer
,
'<'
))
==
NULL
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse signature. Cannot find '<'
in signature"
);
return
signature_error
(
"character '<' not allowed
in signature"
);
if
((
email_end
=
strchr
(
name_end
,
'>'
))
==
NULL
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse signature. Cannot find '>'
in signature"
);
return
signature_error
(
"character '>' not allowed
in signature"
);
if
(
email_end
<
name_end
)
return
git__throw
(
GIT_EOBJCORRUPTED
,
"Failed to parse signature. M
alformed e-mail"
);
return
signature_error
(
"m
alformed e-mail"
);
error
=
process_next_token
(
&
buffer
,
&
sig
->
name
,
name_end
,
line_end
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
return
error
;
error
=
process_next_token
(
&
buffer
,
&
sig
->
email
,
email_end
,
line_end
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
0
)
return
error
;
tz_start
=
scan_for_previous_token
(
line_end
-
1
,
buffer
);
...
...
@@ -301,19 +300,19 @@ int git_signature__parse(git_signature *sig, const char **buffer_out,
goto
clean_exit
;
/* No timezone nor date */
time_start
=
scan_for_previous_token
(
tz_start
-
1
,
buffer
);
if
(
time_start
==
NULL
||
parse_time
(
&
sig
->
when
.
time
,
time_start
)
<
GIT_SUCCESS
)
{
if
(
time_start
==
NULL
||
parse_time
(
&
sig
->
when
.
time
,
time_start
)
<
0
)
{
/* The tz_start might point at the time */
parse_time
(
&
sig
->
when
.
time
,
tz_start
);
goto
clean_exit
;
}
if
(
parse_timezone_offset
(
tz_start
,
&
sig
->
when
.
offset
)
<
GIT_SUCCESS
)
{
if
(
parse_timezone_offset
(
tz_start
,
&
sig
->
when
.
offset
)
<
0
)
{
sig
->
when
.
time
=
0
;
/* Bogus timezone, we reset the time */
}
clean_exit:
*
buffer_out
=
line_end
+
1
;
return
GIT_SUCCESS
;
return
0
;
}
void
git_signature__writebuf
(
git_buf
*
buf
,
const
char
*
header
,
const
git_signature
*
sig
)
...
...
src/util.c
View file @
a227451d
...
...
@@ -112,34 +112,40 @@ int git__strtol64(int64_t *result, const char *nptr, const char **endptr, int ba
}
Return:
if
(
ndig
==
0
)
return
git__throw
(
GIT_ENOTNUM
,
"Failed to convert string to long. Not a number"
);
if
(
ndig
==
0
)
{
giterr_set
(
GITERR_INVALID
,
"Failed to convert string to long. Not a number"
);
return
-
1
;
}
if
(
endptr
)
*
endptr
=
p
;
if
(
ovfl
)
return
git__throw
(
GIT_EOVERFLOW
,
"Failed to convert string to long. Overflow error"
);
if
(
ovfl
)
{
giterr_set
(
GITERR_INVALID
,
"Failed to convert string to long. Overflow error"
);
return
-
1
;
}
*
result
=
neg
?
-
n
:
n
;
return
GIT_SUCCESS
;
return
0
;
}
int
git__strtol32
(
int32_t
*
result
,
const
char
*
nptr
,
const
char
**
endptr
,
int
base
)
{
int
error
=
GIT_SUCCESS
;
int
error
;
int32_t
tmp_int
;
int64_t
tmp_long
;
if
((
error
=
git__strtol64
(
&
tmp_long
,
nptr
,
endptr
,
base
))
<
GIT_SUCCESS
)
if
((
error
=
git__strtol64
(
&
tmp_long
,
nptr
,
endptr
,
base
))
<
0
)
return
error
;
tmp_int
=
tmp_long
&
0xFFFFFFFF
;
if
(
tmp_int
!=
tmp_long
)
return
git__throw
(
GIT_EOVERFLOW
,
"Failed to convert. '%s' is too large"
,
nptr
);
if
(
tmp_int
!=
tmp_long
)
{
giterr_set
(
GITERR_INVALID
,
"Failed to convert. '%s' is too large"
,
nptr
);
return
-
1
;
}
*
result
=
tmp_int
;
return
error
;
}
...
...
tests-clar/clar
View file @
a227451d
...
...
@@ -87,7 +87,7 @@ class ClarTestBuilder:
if
not
self
.
suite_data
:
raise
RuntimeError
(
'No tests found under "
%
s"'
%
folder_name
)
'No tests found under "
%
s"'
%
path
)
def
render
(
self
):
main_file
=
os
.
path
.
join
(
self
.
path
,
'clar_main.c'
)
...
...
@@ -297,13 +297,13 @@ static const struct clar_func _clar_cb_${suite_name}[] = {
CLAR_FILES
=
{
"clar.c"
:
r"""eJy
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
="""
,
"clar.c"
:
r"""eJy
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
="""
,
"clar_print_default.c"
:
r"""eJyFU01P4zAQPSe/YqgU1a5Cuadi98ap4rLaE6DIxA5YSu3InnQPK/479jgFB9FycuZ53vObj5QeBeoOjlZL6Abh2tFpg602Gln4AFQe285OBmuIsZ80qhPQWeMRulfhYJMujDgoz8v/ZcGiJP+k78qCpHu22lshlYRKJjXfQOUfzaqG+CJfvJCrZgp/UDhUMpAC+laWZ6rwrxNK+8/8XEkElHPWJeBcBQnKmB9YRt6Vn0YfTfJYkCunRuuwpVzPLlqnHPJtpsOp0x7d1GFKowTY0EF2T09CaCyHO6GHyamG+hokeO6q8k1TeWCV5/AQgko+wcM1hiOml0VBqte/qNAsjr2I4cpYkMp3To+o7YLS6yFnDNqE8U2HZ+W+6MzowhecFmHOS009+BfK0j2w+SJ7HK5u4f7vfs+D/DmdLJ0vp3N5f6yJTlm+5sl62Me0M1klCehD35X8uj+RsFsixMlWuuqC38SG37C+W0MD6+36B380Ifb9f0gmbjZgrB1hc7Pc3uTokrR4Dru6kA6DqGG73ZLwUbSDDlfCvYw7Cn38KVmMa0gzK479XJ5HGWZBeE0UnjjKSDaHb+U7mrWGAw=="""
,
"clar_print_tap.c"
:
r"""eJyNVMFu2zAMPVtfwbgIYBu2gWK3BmuxnYthh+02wFBtORXmSIYkZxiG/vso2m6lJF12skk9ko+PlJh13MkWjlp20A7cNKORyjVSSZfhDzhhXdPqSbkSvG0n6cTqaLWyDtpnbqCYDxQ/CJuzPyzJfMr8LXy3ugLgiW/FEYU+S799+gpHYazUCm4//FBpvmMvjL1D2T5PrtO/1HXa3iGM0WZ2/A/d2BcE7xhLZA/ZJkqYvPZwAyO3VnTAhwG2HRHLbI7NlAFJbCwRgxVRYM/lgIEYxA9a7U+jg4IlxiVxtjXNbV1vu/Nq78tIaUlDNR3WEVtnptbNMAJAQZ9AOkR7Lda6AFVVzSMLfDhzy/cC7mBr35qo7udeDnYfw63A8Uv3+460OMtGowE4y0b+GOqbhwtQ74+RPYp+Cen9MXKQakV2IdL7G5TjSZh8XY/lqBO2NXJ0fqM3H+HL98fHcFkAAsApgeAoj5Wu6/ra5dCKVie8sLQP/hrOF2I2ifXsmNePJryW2lq/hNVCDIkvK/oAqdIO9M8UxUjx48/ChK8mlmMJ0SdyRozaLDtnsysd0Fizy29ORPMGiqJAkv5DCga4f5fgT0gnKoE7WXqBqcCRN4PEI272445MzIQB3i5hWd9+oWHxNZrwtUk/o0iAvxug/T2eAqiET5HPOYXqssV8YX8BFTvXlQ=="""
,
"clar_sandbox.c"
:
r"""eJyNVV1P20AQfLZ/xRIkYpNATItaVSkPlaBVVEoiEgQSRJaxz+SEfY7uLmkD4r931+fEHwRahBST3Zudmb0xSgeahxDOAgl+mATSnwd6dnvsffk07du2MmUutM2VvwwSHvk6nedNTpgJpc3RffrCtZ9tazz5NvEnoDSetngMDkE4VO7CntIu7JyA59qWJZleSAHeum9n7A/Gp4NLPHCotJ9mEXObfcWzE4QhU6pAvfaHP104Idi+/VLjHHNR5ZszvV/EMZNdUPyJ+RoSJh4M9V0ei4jF4F8PLj5+sK0Cx6gsupdoUJgthIYTOO43egw+E0s0SqrbKfagIVZr8muEulpdoKf848x8Xo3PLkeXw++D87OWDdYLSgSrmMRJb5xJcDjieH3g8LUc34dOh7s5fGM2Nj8wjQ/OhgifojGWMRm/JFPplOZiwWhKXnm9Xmo1I1CmFOF85ay9w1J37RxBV5ZkWS82/tpWbx8GMegZo24uM5EytC3KmBJt9DNYQSBWesbFQxe0XIHOYKEY9HA+7PfsN0i1qN4qeDVpmWKNWYUYktpliWIG+gfTE5bORwTqnF4PL09dc6wLBq5x+XaZiHhsdE1mXIFaKc3SjaCEPzIUUNNC4sOFlLlwLlmoMyy+I+7wTWWH78la/3lwVA3AMuMR5JFeCBWI6D7749B3eUyJQCXv3pQC1L7z2qVqvBoYiWoiwhmqQJZIs2JIrHyZVsCaKUQ/eRL5BQWjdMOjcnup4OuAJ3lyWjkeWXOT/7QobZvIrl8a9YCXHEy8s7hKy8UAVd885JZtIRhOQ7/xoS6iqf4ZcPUikyku7YnldGnRo+F4cAOY1N+BjEAlgZoxlS+5EmXrVZRJRBni5j54sY+7fB+W1ShBu9feRG2ziAYGKTuAoym9cbHfDKrXO50SjO7R+tqVXdAhpt1yOducxTHYtMUyYpQ+Ykzmvvrndhr/GMx6DAJdu+px77PnbT1QCTieosE1nujpxdX5+atDhYFlquoXOEf4/wjB3t62O7/9/hGKyVWV6FYvavT+AhbcW38="""
,
"clar_fixtures.c"
:
r"""eJyFUV1LwzAUfW5+xZU9rLUVJ4ggZQ9DFAUfZEwQSglZmrBAl5Qkk6n43236tWbKfMvNOfecc+81llhBgSppLNAN0XCOuNjbnWa4InYTjpE1MSzxuD1Vki2L0BcKTKfn0EYgu57d3uRpjYhPhi1opSwumUwRCvo3zMFYXT9C5xA5stWSVh9hI5FAa+wUFG//osgJCA5tmQ1SF3CVw9kcppfTCAWBj8ZxDg3UN4/zZ7MaHBrHSBw7vpcJ4mGS5Ijtai9qnannNqk1q7myXU+KvhGaCF4wDnfPiyV+eHpbvS7v8cti9YjGq6Yl7lzCkxfo1L0j/lJOwOtrUrwrUcDBBRsii7Xan3bjBlNVL2WUzuMkgGlJdLuIP21oyYjcVf/a6G3ozXTQPRqmsZkwWQiOfgAVGffP"""
,
"clar_fs.c"
:
r"""eJylVdtu20YQfSa/YkAD8TKWY8dJX6L0wXDEVqgsBhINN7UFhiGX1qIkl9hd+dLG/57ZCynJUWEkfZE0s7NnZufMGe2xsqAlpJfj6ZsT399DgzUUojhKo8npb3Mg+ud8PBlNE/hq/NP4LJ5G49n5aTKOp71zNJvFs4vx06DzPz6MZ6HvS5UplkO+zAS89EtWUd7KtM3UkuS8kcqdGE/o/+t71tYm/ArTi8lk6HuS/UNTBRVtbtRyAGzo+x4rgaQ2zMaFvucJqlaicdd8z15AHKkE/rbxIQI6+DqrKp4TF3YAJ2GH/AxwTeu8fTBRA0jtl0Xp0K+sucAsx9suzPPauX2v5AIIMxYweO9AhnBwwELAbvTFXLGFrmf/aF+X4/Uu2L++3scEjwjmitRnQ/+x7/0tZ0XXecIaBTUv6AC22i/5SuRPnQWVynAy/z3CSYg/zpPZxVkCJQLp4m2YvYqVbJHrEHU7bJgG+y7IZNBQf1HBz2nNxQN5oeEHoDnnJdlOHYa2aa18dRetmlxziI8ZOl8bCV5ruk3u3ptw9OlUnaeMquxGorOfd/OcKs2kpEKlBFuMibHUuKUCm8gbW1aoOTge4HFwyZqC30l4EgdlhmYR+J4tVVBK1q0wpnv0U4JkKmqygxTDQEdfFKcfRpNRMsKx6zgzM7oLL+c4oz9A80aSs/jjp40U6bpmA46t0vgVzZpVS7TLApg3lOwe55A6ivMqE04hwcsgtCB7tJK0KxdH0pdLWlUpXylii3IVZuLm9mphsPXg6gsrqeXECtwH+Kl7jF96sLj4m6z1i773cGw1VLYCb5dEqoIKodnzgvmDVLQGtLl4B5/t7c+Q40ZwFL66bgLNmUfvmSKHr0Onsg5eT4LFp/c0vyWm1uPFwBTdBd9lTGGwvjCAF7b+Ad4b9mq9HP05TubJaXIxJ/b8f3DZU2lNU9Ivi+G2VNcL1dopLh3dt17IuC0LpHVDwuvA9TLtT21LrHm1EXlo9ly/s/4rwC5C1z00g6MvrDnK22DovCYoOJz1jpPFpsaN6412udkJndTNwdtF/zdiFF6vpMJxlNKIfD12hjQj7MiwD4qD7jkovbfcSEvtlVlTfOH3uxX+rKg3NL3B0dvFrh6I+rselNtN6F68oxk/+2araVBLuv3SZ6RvZL5q3BVi9r52bTgeUfZNwUr/G9kaoSs="""
,
"clar.h"
:
r"""eJy9V
ctu2zAQPEdfwVo9WIIQp9c0DWAENmLACIrUQXojaHIVEZVJlaQaAUX/vSQlP/Rw3PTgk6nlDmd2d0iHPBUMUoTx3XL6iFezbyt8j3EQ2iAX0IsHIRc0LxmgG21YzteX2W0Q/JKcIZoThTHRGpQZBxdcGESlYNxwKZLgwq61jWREoTjlOSR1Sm5ZOruglFSdGANNFS+asxxQZ7LMGSZrqUz0eacBazCY5kBEWYx9bBw3n1H9HUcJqheyID9LsOAtNtUtqDs25Knrj+/CfPF99fQ4w1+nq/vgUJ2D8sqUCsbtMn0MC7JpsTRhTQRby+o9kK26NyAh2J6nQTCJ4wDFaOrnYduGNoQqqdErNxmCqsg55Qb5XqMNaE1ewOZPdpO3rJtSG1zYieKxBagEuSlE7UH7nQjdfkFXiXXLfLGcYexWy8WDX43mpaBeACV5jlJiZ8+u0QiF+zMT9CnqEbvM08Q3R3lnVQHUAENpS4CRXsMJBTXJafoPx+u2/Mr21RFzjYQ0yKgShni3s7rLgP74jzlRhzvToK6iPvOZJzUk4QyDuopOXCoh//E6NZKGbtjD03I5fBU6oMOe90BN6TtE2811+nHTnapjb7c9Q9+CPVF7r3Rhb9biU7qIwUrmUlFnInuafQ8nr0QJLl666r2AAZ8cc8cK7EtbX4bL0fBj0TC959TnGoJYqdyPcSRQAS2dq65HA57zOjZgMsnspiMhLlf7+j7+hsqAEvhw50+w/TP4C4S1nfY=
"""
"clar.h"
:
r"""eJy9V
U1P4zAQPZNfYZo9JJUFlCMLSAi1AqlCKyjavVmO4xBrEyfYztLVav874yRtmq922QOX1pnxzHvOe+O4IpIhjxAht8ubR7KaP63IHSGOC0EheS/uuEKypAg5utQmTERwEl87zq9MhIglVBFCtebKeM6RkAaxTIbCiExi5wjWGiIxVWgaiYTjaksCKJ0sVypTnVjINVMir3vZQh1nRRISGmTK+F8HOBD+WtCEaG+3Dx5/gKa9ADQe6ys8WzBUNNRl04ZobghLOJVF7pUxb1o/+tXz1MeoWmQ5fS14Q4FEulVq27oisvKVIi3uf6yeH+fk283qztnlYEvF2hSKe20VyhiRNG2h1GFNZRhk64+UbNjtKXE5WCJynNPp1EFTdFO+UlAVpZSpTKM3YWLE13kimDCotAJKudb0hcP+060xATUttCE5iEI8KFAYWZP4bR+WGR9dX6EzDGZe3C/nhNjV8v6hXE0WhWQlAUaTBEUUrBleoAlym54YzfwesN15GPhyFHe+zjkzPERRi4DJSg4HGNROPAh/PH5uwFfwXi2w0EhmBhlV8CHcjVa3MWc//0MnZus+Sagzv4/8yUoNUfgEoc78A0Mls38cp5rS0IQ9PC+Xw6PQKdp9572i+ujbirabq+3jpjt0jsZuDULfgj1SjVe6ZXvPUm7pVgyeZJEpZk0E3eA+PH2jSgr50mVfEhjwyZg7Vhxu2moYTibDl0WN9JGu36sSFBbK/hkLwtecFdZVF5MBz61+53A42nFe93SdL7OeYX3eprTNQdLHHqTxluGW4OTJlLxSoVNqWFwOg57BL8yRXZ6PXJjbT/cMi2Fg4UESgMUgsCsaELEfJPCCGQ7GQI6PIe1j+zcMFDRAwX6g3MtnOD/fmSQPIj66ukIehHcksiqm3MRZCPpZWtRKVYn05Q9fG64k2c38dTbf63eIKlZw
"""
}
if
__name__
==
'__main__'
:
main
()
tests-clar/core/buffer.c
View file @
a227451d
...
...
@@ -544,3 +544,20 @@ void test_core_buffer__9(void)
git_buf_free
(
&
buf
);
}
void
test_core_buffer__10
(
void
)
{
git_buf
a
=
GIT_BUF_INIT
;
cl_git_pass
(
git_buf_join_n
(
&
a
,
'/'
,
1
,
"test"
));
cl_assert_strequal
(
a
.
ptr
,
"test"
);
cl_git_pass
(
git_buf_join_n
(
&
a
,
'/'
,
1
,
"string"
));
cl_assert_strequal
(
a
.
ptr
,
"test/string"
);
git_buf_clear
(
&
a
);
cl_git_pass
(
git_buf_join_n
(
&
a
,
'/'
,
3
,
"test"
,
"string"
,
"join"
));
cl_assert_strequal
(
a
.
ptr
,
"test/string/join"
);
cl_git_pass
(
git_buf_join_n
(
&
a
,
'/'
,
2
,
a
.
ptr
,
"more"
));
cl_assert_strequal
(
a
.
ptr
,
"test/string/join/test/string/join/more"
);
git_buf_free
(
&
a
);
}
tests-clar/core/oid.c
View file @
a227451d
...
...
@@ -10,9 +10,9 @@ void test_core_oid__initialize(void)
void
test_core_oid__streq
(
void
)
{
cl_assert
(
git_oid_streq
(
&
id
,
str_oid
)
==
GIT_SUCCESS
);
cl_assert
(
git_oid_streq
(
&
id
,
"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
)
==
GIT_ERROR
);
cl_assert
(
git_oid_streq
(
&
id
,
str_oid
)
==
0
);
cl_assert
(
git_oid_streq
(
&
id
,
"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
)
==
-
1
);
cl_assert
(
git_oid_streq
(
&
id
,
"deadbeef"
)
==
GIT_ENOTOID
);
cl_assert
(
git_oid_streq
(
&
id
,
"I'm not an oid.... :)"
)
==
GIT_ENOTOID
);
cl_assert
(
git_oid_streq
(
&
id
,
"deadbeef"
)
==
-
1
);
cl_assert
(
git_oid_streq
(
&
id
,
"I'm not an oid.... :)"
)
==
-
1
);
}
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