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
b5ced41e
Commit
b5ced41e
authored
Dec 18, 2010
by
Vicent Marti
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'timezone'
parents
1f080e2d
638c2ca4
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
345 additions
and
192 deletions
+345
-192
src/commit.c
+29
-32
src/commit.h
+2
-3
src/git2.h
+1
-0
src/git2/commit.h
+13
-10
src/git2/common.h
+0
-9
src/git2/signature.h
+70
-0
src/git2/tag.h
+3
-5
src/git2/types.h
+13
-0
src/person.h
+0
-20
src/revwalk.c
+2
-2
src/signature.c
+90
-31
src/signature.h
+12
-0
src/tag.c
+12
-11
src/tag.h
+1
-1
tests/t0401-parse.c
+71
-33
tests/t0402-details.c
+2
-2
tests/t0403-write.c
+18
-29
tests/t0502-list.c
+6
-4
No files found.
src/commit.c
View file @
b5ced41e
...
...
@@ -26,11 +26,12 @@
#include "git2/common.h"
#include "git2/object.h"
#include "git2/repository.h"
#include "git2/signature.h"
#include "common.h"
#include "commit.h"
#include "revwalk.h"
#include "
person
.h"
#include "
signature
.h"
#define COMMIT_BASIC_PARSE 0x0
#define COMMIT_FULL_PARSE 0x1
...
...
@@ -50,8 +51,8 @@ void git_commit__free(git_commit *commit)
{
clear_parents
(
commit
);
git_
person_
_free
(
commit
->
author
);
git_
person_
_free
(
commit
->
committer
);
git_
signature
_free
(
commit
->
author
);
git_
signature
_free
(
commit
->
committer
);
free
(
commit
->
message
);
free
(
commit
->
message_short
);
...
...
@@ -82,12 +83,12 @@ int git_commit__writeback(git_commit *commit, git_odb_source *src)
if
(
commit
->
author
==
NULL
)
return
GIT_EMISSINGOBJDATA
;
git_
person
__write
(
src
,
"author"
,
commit
->
author
);
git_
signature
__write
(
src
,
"author"
,
commit
->
author
);
if
(
commit
->
committer
==
NULL
)
return
GIT_EMISSINGOBJDATA
;
git_
person
__write
(
src
,
"committer"
,
commit
->
committer
);
git_
signature
__write
(
src
,
"committer"
,
commit
->
committer
);
if
(
commit
->
message
!=
NULL
)
git__source_printf
(
src
,
"
\n
%s"
,
commit
->
message
);
...
...
@@ -137,10 +138,10 @@ int commit_parse_buffer(git_commit *commit, void *data, size_t len, unsigned int
if
(
parse_flags
&
COMMIT_FULL_PARSE
)
{
if
(
commit
->
author
)
git_
person_
_free
(
commit
->
author
);
git_
signature
_free
(
commit
->
author
);
commit
->
author
=
git__malloc
(
sizeof
(
git_
person
));
if
((
error
=
git_
person
__parse
(
commit
->
author
,
&
buffer
,
buffer_end
,
"author "
))
<
GIT_SUCCESS
)
commit
->
author
=
git__malloc
(
sizeof
(
git_
signature
));
if
((
error
=
git_
signature
__parse
(
commit
->
author
,
&
buffer
,
buffer_end
,
"author "
))
<
GIT_SUCCESS
)
return
error
;
}
else
{
...
...
@@ -152,14 +153,12 @@ int commit_parse_buffer(git_commit *commit, void *data, size_t len, unsigned int
/* Always parse the committer; we need the commit time */
if
(
commit
->
committer
)
git_
person_
_free
(
commit
->
committer
);
git_
signature
_free
(
commit
->
committer
);
commit
->
committer
=
git__malloc
(
sizeof
(
git_
person
));
if
((
error
=
git_
person
__parse
(
commit
->
committer
,
&
buffer
,
buffer_end
,
"committer "
))
<
GIT_SUCCESS
)
commit
->
committer
=
git__malloc
(
sizeof
(
git_
signature
));
if
((
error
=
git_
signature
__parse
(
commit
->
committer
,
&
buffer
,
buffer_end
,
"committer "
))
<
GIT_SUCCESS
)
return
error
;
commit
->
commit_time
=
commit
->
committer
->
time
;
/* parse commit message */
while
(
buffer
<=
buffer_end
&&
*
buffer
==
'\n'
)
buffer
++
;
...
...
@@ -231,22 +230,21 @@ int git_commit__parse_full(git_commit *commit)
git_commit__parse_full(commit);
GIT_COMMIT_GETTER
(
git_tree
*
,
tree
)
GIT_COMMIT_GETTER
(
git_
person
*
,
author
)
GIT_COMMIT_GETTER
(
git_
person
*
,
committer
)
GIT_COMMIT_GETTER
(
git_
signature
*
,
author
)
GIT_COMMIT_GETTER
(
git_
signature
*
,
committer
)
GIT_COMMIT_GETTER
(
char
*
,
message
)
GIT_COMMIT_GETTER
(
char
*
,
message_short
)
time_t
git_commit_time
(
git_commit
*
commit
)
{
assert
(
commit
);
if
(
commit
->
commit_time
)
return
commit
->
commit_time
;
if
(
!
commit
->
object
.
in_memory
)
git_commit__parse_full
(
commit
);
assert
(
commit
&&
commit
->
committer
);
return
commit
->
committer
->
when
.
time
;
}
return
commit
->
commit_time
;
int
git_commit_time_offset
(
git_commit
*
commit
)
{
assert
(
commit
&&
commit
->
committer
);
return
commit
->
committer
->
when
.
offset
;
}
unsigned
int
git_commit_parentcount
(
git_commit
*
commit
)
...
...
@@ -269,25 +267,24 @@ void git_commit_set_tree(git_commit *commit, git_tree *tree)
commit
->
tree
=
tree
;
}
void
git_commit_set_author
(
git_commit
*
commit
,
const
char
*
name
,
const
char
*
email
,
time_t
time
)
void
git_commit_set_author
(
git_commit
*
commit
,
const
git_signature
*
author_sig
)
{
assert
(
commit
&&
name
&&
email
);
assert
(
commit
&&
author_sig
);
commit
->
object
.
modified
=
1
;
CHECK_FULL_PARSE
();
git_
person_
_free
(
commit
->
author
);
commit
->
author
=
git_
person__new
(
name
,
email
,
time
);
git_
signature
_free
(
commit
->
author
);
commit
->
author
=
git_
signature_dup
(
author_sig
);
}
void
git_commit_set_committer
(
git_commit
*
commit
,
const
char
*
name
,
const
char
*
email
,
time_t
time
)
void
git_commit_set_committer
(
git_commit
*
commit
,
const
git_signature
*
committer_sig
)
{
assert
(
commit
&&
name
&&
email
);
assert
(
commit
&&
committer_sig
);
commit
->
object
.
modified
=
1
;
CHECK_FULL_PARSE
();
git_person__free
(
commit
->
committer
);
commit
->
committer
=
git_person__new
(
name
,
email
,
time
);
commit
->
commit_time
=
time
;
git_signature_free
(
commit
->
committer
);
commit
->
committer
=
git_signature_dup
(
committer_sig
);
}
void
git_commit_set_message
(
git_commit
*
commit
,
const
char
*
message
)
...
...
src/commit.h
View file @
b5ced41e
...
...
@@ -11,12 +11,11 @@
struct
git_commit
{
git_object
object
;
time_t
commit_time
;
git_vector
parents
;
git_tree
*
tree
;
git_
person
*
author
;
git_
person
*
committer
;
git_
signature
*
author
;
git_
signature
*
committer
;
char
*
message
;
char
*
message_short
;
...
...
src/git2.h
View file @
b5ced41e
...
...
@@ -33,6 +33,7 @@
#include "git2/types.h"
#include "git2/oid.h"
#include "git2/signature.h"
#include "git2/odb.h"
#include "git2/repository.h"
...
...
src/git2/commit.h
View file @
b5ced41e
...
...
@@ -93,18 +93,25 @@ GIT_EXTERN(const char *) git_commit_message(git_commit *commit);
GIT_EXTERN
(
time_t
)
git_commit_time
(
git_commit
*
commit
);
/**
* Get the commit timezone offset (i.e. committer's preferred timezone) of a commit.
* @param commit a previously loaded commit.
* @return positive or negative timezone offset, in minutes from UTC
*/
GIT_EXTERN
(
int
)
git_commit_timezone_offset
(
git_commit
*
commit
);
/**
* Get the committer of a commit.
* @param commit a previously loaded commit.
* @return the committer of a commit
*/
GIT_EXTERN
(
const
git_
person
*
)
git_commit_committer
(
git_commit
*
commit
);
GIT_EXTERN
(
const
git_
signature
*
)
git_commit_committer
(
git_commit
*
commit
);
/**
* Get the author of a commit.
* @param commit a previously loaded commit.
* @return the author of a commit
*/
GIT_EXTERN
(
const
git_
person
*
)
git_commit_author
(
git_commit
*
commit
);
GIT_EXTERN
(
const
git_
signature
*
)
git_commit_author
(
git_commit
*
commit
);
/**
* Get the tree pointed to by a commit.
...
...
@@ -147,20 +154,16 @@ GIT_EXTERN(void) git_commit_set_message(git_commit *commit, const char *message)
/**
* Set the committer of a commit
* @param commit the commit object
* @param name name of the new committer
* @param email email of the new committer
* @param time time when the committer committed the commit
* @param author_sig signature of the committer
*/
GIT_EXTERN
(
void
)
git_commit_set_committer
(
git_commit
*
commit
,
const
char
*
name
,
const
char
*
email
,
time_t
time
);
GIT_EXTERN
(
void
)
git_commit_set_committer
(
git_commit
*
commit
,
const
git_signature
*
committer_sig
);
/**
* Set the author of a commit
* @param commit the commit object
* @param name name of the new author
* @param email email of the new author
* @param time time when the author created the commit
* @param author_sig signature of the author
*/
GIT_EXTERN
(
void
)
git_commit_set_author
(
git_commit
*
commit
,
const
char
*
name
,
const
char
*
email
,
time_t
time
);
GIT_EXTERN
(
void
)
git_commit_set_author
(
git_commit
*
commit
,
const
git_signature
*
author_sig
);
/**
* Set the tree which is pointed to by a commit
...
...
src/git2/common.h
View file @
b5ced41e
...
...
@@ -134,16 +134,7 @@
/** The index file is not backed up by an existing repository */
#define GIT_EBAREINDEX (GIT_ERROR -14)
GIT_BEGIN_DECL
/** Parsed representation of a person */
typedef
struct
git_person
git_person
;
const
char
*
git_person_name
(
git_person
*
person
);
const
char
*
git_person_email
(
git_person
*
person
);
time_t
git_person_time
(
git_person
*
person
);
/** @} */
GIT_END_DECL
#endif
src/git2/signature.h
0 → 100644
View file @
b5ced41e
/*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2,
* as published by the Free Software Foundation.
*
* In addition to the permissions in the GNU General Public License,
* the authors give you unlimited permission to link the compiled
* version of this file into combinations with other programs,
* and to distribute those combinations without any restriction
* coming from the use of this file. (The General Public License
* restrictions do apply in other respects; for example, they cover
* modification of the file, and distribution when not linked into
* a combined executable.)
*
* This file is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef INCLUDE_git_signature_h__
#define INCLUDE_git_signature_h__
#include "common.h"
#include "types.h"
/**
* @file git2/signature.h
* @brief Git signature creation
* @defgroup git_signature Git signature creation
* @ingroup Git
* @{
*/
GIT_BEGIN_DECL
/**
* Create a new action signature. The signature must be freed
* manually or using git_signature_free
*
* @name name of the person
* @email email of the person
* @time time when the action happened
* @offset timezone offset in minutes for the time
* @return the new sig, NULl on out of memory
*/
GIT_EXTERN
(
git_signature
*
)
git_signature_new
(
const
char
*
name
,
const
char
*
email
,
time_t
time
,
int
offset
);
/**
* Create a copy of an existing signature.
*
* All internal strings are also duplicated.
* @sig signature to duplicated
* @return a copy of sig, NULL on out of memory
*/
GIT_EXTERN
(
git_signature
*
)
git_signature_dup
(
const
git_signature
*
sig
);
/**
* Free an existing signature
*
* @sig signature to free
*/
GIT_EXTERN
(
void
)
git_signature_free
(
git_signature
*
sig
);
/** @} */
GIT_END_DECL
#endif
src/git2/tag.h
View file @
b5ced41e
...
...
@@ -96,7 +96,7 @@ GIT_EXTERN(const char *) git_tag_name(git_tag *t);
* @param tag a previously loaded tag.
* @return reference to the tag's author
*/
GIT_EXTERN
(
const
git_
person
*
)
git_tag_tagger
(
git_tag
*
t
);
GIT_EXTERN
(
const
git_
signature
*
)
git_tag_tagger
(
git_tag
*
t
);
/**
* Get the message of a tag
...
...
@@ -122,11 +122,9 @@ GIT_EXTERN(void) git_tag_set_name(git_tag *tag, const char *name);
/**
* Set the tagger of a tag
* @param tag The tag to modify
* @param name the name of the new tagger
* @param email the email of the new tagger
* @param time the time when the tag was created
* @param tagger_sig signature of the tagging action
*/
GIT_EXTERN
(
void
)
git_tag_set_tagger
(
git_tag
*
tag
,
const
char
*
name
,
const
char
*
email
,
time_t
time
);
GIT_EXTERN
(
void
)
git_tag_set_tagger
(
git_tag
*
tag
,
const
git_signature
*
tagger_sig
);
/**
* Set the message of a tag
...
...
src/git2/types.h
View file @
b5ced41e
...
...
@@ -82,6 +82,19 @@ typedef struct git_tree git_tree;
/** Memory representation of an index file. */
typedef
struct
git_index
git_index
;
/** Time in a signature */
typedef
struct
git_time
{
time_t
time
;
/** time in seconds from epoch */
int
offset
;
/** timezone offset, in minutes */
}
git_time
;
/** An action signature (e.g. for committers, taggers, etc) */
typedef
struct
git_signature
{
char
*
name
;
/** full name of the author */
char
*
email
;
/** email of the author */
git_time
when
;
/** time when the action happened */
}
git_signature
;
/** @} */
GIT_END_DECL
...
...
src/person.h
deleted
100644 → 0
View file @
1f080e2d
#ifndef INCLUDE_person_h__
#define INCLUDE_person_h__
#include "git2/common.h"
#include "repository.h"
#include <time.h>
/** Parsed representation of a person */
struct
git_person
{
char
*
name
;
/**< Full name */
char
*
email
;
/**< Email address */
time_t
time
;
/**< Time when this person committed the change */
};
void
git_person__free
(
git_person
*
person
);
git_person
*
git_person__new
(
const
char
*
name
,
const
char
*
email
,
time_t
time
);
int
git_person__parse
(
git_person
*
person
,
char
**
buffer_out
,
const
char
*
buffer_end
,
const
char
*
header
);
int
git_person__write
(
git_odb_source
*
src
,
const
char
*
header
,
const
git_person
*
person
);
#endif
src/revwalk.c
View file @
b5ced41e
...
...
@@ -400,8 +400,8 @@ void git_revwalk_list_timesort(git_revwalk_list *list)
e
=
q
,
q
=
q
->
next
,
q_size
--
;
else
if
(
q_size
==
0
||
q
==
NULL
||
p
->
walk_commit
->
commit_object
->
commit
_
time
>=
q
->
walk_commit
->
commit_object
->
commit
_
time
)
p
->
walk_commit
->
commit_object
->
commit
ter
->
when
.
time
>=
q
->
walk_commit
->
commit_object
->
commit
ter
->
when
.
time
)
e
=
p
,
p
=
p
->
next
,
p_size
--
;
else
...
...
src/
person
.c
→
src/
signature
.c
View file @
b5ced41e
...
...
@@ -24,30 +24,37 @@
*/
#include "common.h"
#include "
person
.h"
#include "
signature
.h"
#include "repository.h"
#include "git2/common.h"
void
git_
person__free
(
git_person
*
person
)
void
git_
signature_free
(
git_signature
*
sig
)
{
if
(
person
==
NULL
)
if
(
sig
==
NULL
)
return
;
free
(
person
->
name
);
free
(
person
->
email
);
free
(
person
);
free
(
sig
->
name
);
free
(
sig
->
email
);
free
(
sig
);
}
git_
person
*
git_person__new
(
const
char
*
name
,
const
char
*
email
,
time_t
time
)
git_
signature
*
git_signature_new
(
const
char
*
name
,
const
char
*
email
,
time_t
time
,
int
offset
)
{
git_
person
*
p
;
git_
signature
*
p
=
NULL
;
if
((
p
=
git__malloc
(
sizeof
(
git_
person
)))
==
NULL
)
if
((
p
=
git__malloc
(
sizeof
(
git_
signature
)))
==
NULL
)
goto
cleanup
;
p
->
name
=
git__strdup
(
name
);
if
(
p
->
name
==
NULL
)
goto
cleanup
;
p
->
email
=
git__strdup
(
email
);
p
->
time
=
time
;
if
(
p
->
email
==
NULL
)
goto
cleanup
;
p
->
when
.
time
=
time
;
p
->
when
.
offset
=
offset
;
if
(
p
->
name
==
NULL
||
p
->
email
==
NULL
)
goto
cleanup
;
...
...
@@ -55,26 +62,60 @@ git_person *git_person__new(const char *name, const char *email, time_t time)
return
p
;
cleanup:
git_
person_
_free
(
p
);
git_
signature
_free
(
p
);
return
NULL
;
}
const
char
*
git_person_name
(
git_person
*
person
)
git_signature
*
git_signature_dup
(
const
git_signature
*
sig
)
{
return
person
->
name
;
return
git_signature_new
(
sig
->
name
,
sig
->
email
,
sig
->
when
.
time
,
sig
->
when
.
offset
)
;
}
const
char
*
git_person_email
(
git_person
*
person
)
{
return
person
->
email
;
}
time_t
git_person_time
(
git_person
*
person
)
static
int
parse_timezone_offset
(
const
char
*
buffer
,
int
*
offset_out
)
{
return
person
->
time
;
int
offset
,
dec_offset
;
int
mins
,
hours
;
const
char
*
offset_start
;
char
*
offset_end
;
offset_start
=
buffer
+
1
;
if
(
*
offset_start
==
'\n'
)
{
*
offset_out
=
0
;
return
GIT_SUCCESS
;
}
if
(
offset_start
[
0
]
!=
'-'
&&
offset_start
[
0
]
!=
'+'
)
return
GIT_EOBJCORRUPTED
;
dec_offset
=
strtol
(
offset_start
+
1
,
&
offset_end
,
10
);
if
(
offset_end
-
offset_start
!=
5
)
return
GIT_EOBJCORRUPTED
;
hours
=
dec_offset
/
100
;
mins
=
dec_offset
%
100
;
if
(
hours
>
14
)
// see http://www.worldtimezone.com/faq.html
return
GIT_EOBJCORRUPTED
;
if
(
mins
>
59
)
return
GIT_EOBJCORRUPTED
;
offset
=
(
hours
*
60
)
+
mins
;
if
(
offset_start
[
0
]
==
'-'
)
offset
*=
-
1
;
*
offset_out
=
offset
;
return
GIT_SUCCESS
;
}
int
git_person__parse
(
git_person
*
person
,
char
**
buffer_out
,
int
git_signature__parse
(
git_signature
*
sig
,
char
**
buffer_out
,
const
char
*
buffer_end
,
const
char
*
header
)
{
const
size_t
header_len
=
strlen
(
header
);
...
...
@@ -82,8 +123,9 @@ int git_person__parse(git_person *person, char **buffer_out,
int
name_length
,
email_length
;
char
*
buffer
=
*
buffer_out
;
char
*
line_end
,
*
name_end
,
*
email_end
;
int
offset
=
0
;
memset
(
person
,
0x0
,
sizeof
(
git_person
));
memset
(
sig
,
0x0
,
sizeof
(
git_signature
));
line_end
=
memchr
(
buffer
,
'\n'
,
buffer_end
-
buffer
);
if
(
!
line_end
)
...
...
@@ -102,9 +144,9 @@ int git_person__parse(git_person *person, char **buffer_out,
return
GIT_EOBJCORRUPTED
;
name_length
=
name_end
-
buffer
-
1
;
person
->
name
=
git__malloc
(
name_length
+
1
);
memcpy
(
person
->
name
,
buffer
,
name_length
);
person
->
name
[
name_length
]
=
0
;
sig
->
name
=
git__malloc
(
name_length
+
1
);
memcpy
(
sig
->
name
,
buffer
,
name_length
);
sig
->
name
[
name_length
]
=
0
;
buffer
=
name_end
+
1
;
if
(
buffer
>=
line_end
)
...
...
@@ -115,26 +157,43 @@ int git_person__parse(git_person *person, char **buffer_out,
return
GIT_EOBJCORRUPTED
;
email_length
=
email_end
-
buffer
;
person
->
email
=
git__malloc
(
email_length
+
1
);
memcpy
(
person
->
email
,
buffer
,
email_length
);
person
->
email
[
email_length
]
=
0
;
sig
->
email
=
git__malloc
(
email_length
+
1
);
memcpy
(
sig
->
email
,
buffer
,
email_length
);
sig
->
email
[
email_length
]
=
0
;
buffer
=
email_end
+
1
;
if
(
buffer
>=
line_end
)
return
GIT_EOBJCORRUPTED
;
person
->
time
=
strtol
(
buffer
,
&
buffer
,
10
);
sig
->
when
.
time
=
strtol
(
buffer
,
&
buffer
,
10
);
if
(
sig
->
when
.
time
==
0
)
return
GIT_EOBJCORRUPTED
;
if
(
p
erson
->
time
==
0
)
if
(
p
arse_timezone_offset
(
buffer
,
&
offset
)
<
GIT_SUCCESS
)
return
GIT_EOBJCORRUPTED
;
sig
->
when
.
offset
=
offset
;
*
buffer_out
=
(
line_end
+
1
);
return
GIT_SUCCESS
;
}
int
git_
person__write
(
git_odb_source
*
src
,
const
char
*
header
,
const
git_person
*
person
)
int
git_
signature__write
(
git_odb_source
*
src
,
const
char
*
header
,
const
git_signature
*
sig
)
{
return
git__source_printf
(
src
,
"%s %s <%s> %u
\n
"
,
header
,
person
->
name
,
person
->
email
,
person
->
time
);
char
sign
;
int
offset
,
hours
,
mins
;
offset
=
sig
->
when
.
offset
;
sign
=
(
sig
->
when
.
offset
<
0
)
?
'-'
:
'+'
;
if
(
offset
<
0
)
offset
=
-
offset
;
hours
=
offset
/
60
;
mins
=
offset
%
60
;
return
git__source_printf
(
src
,
"%s %s <%s> %u %c%02d%02d
\n
"
,
header
,
sig
->
name
,
sig
->
email
,
sig
->
when
.
time
,
sign
,
hours
,
mins
);
}
src/signature.h
0 → 100644
View file @
b5ced41e
#ifndef INCLUDE_signature_h__
#define INCLUDE_signature_h__
#include "git2/common.h"
#include "git2/signature.h"
#include "repository.h"
#include <time.h>
int
git_signature__parse
(
git_signature
*
sig
,
char
**
buffer_out
,
const
char
*
buffer_end
,
const
char
*
header
);
int
git_signature__write
(
git_odb_source
*
src
,
const
char
*
header
,
const
git_signature
*
sig
);
#endif
src/tag.c
View file @
b5ced41e
...
...
@@ -26,14 +26,15 @@
#include "common.h"
#include "commit.h"
#include "tag.h"
#include "
person
.h"
#include "
signature
.h"
#include "revwalk.h"
#include "git2/object.h"
#include "git2/repository.h"
#include "git2/signature.h"
void
git_tag__free
(
git_tag
*
tag
)
{
git_
person_
_free
(
tag
->
tagger
);
git_
signature
_free
(
tag
->
tagger
);
free
(
tag
->
message
);
free
(
tag
->
tag_name
);
free
(
tag
);
...
...
@@ -92,18 +93,18 @@ void git_tag_set_name(git_tag *tag, const char *name)
tag
->
tag_name
=
git__strdup
(
name
);
}
const
git_
person
*
git_tag_tagger
(
git_tag
*
t
)
const
git_
signature
*
git_tag_tagger
(
git_tag
*
t
)
{
return
t
->
tagger
;
}
void
git_tag_set_tagger
(
git_tag
*
tag
,
const
char
*
name
,
const
char
*
email
,
time_t
time
)
void
git_tag_set_tagger
(
git_tag
*
tag
,
const
git_signature
*
tagger_sig
)
{
assert
(
tag
&&
name
&&
email
);
assert
(
tag
&&
tagger_sig
);
tag
->
object
.
modified
=
1
;
git_
person_
_free
(
tag
->
tagger
);
tag
->
tagger
=
git_
person__new
(
name
,
email
,
time
);
git_
signature
_free
(
tag
->
tagger
);
tag
->
tagger
=
git_
signature_dup
(
tagger_sig
);
}
const
char
*
git_tag_message
(
git_tag
*
t
)
...
...
@@ -190,11 +191,11 @@ static int parse_tag_buffer(git_tag *tag, char *buffer, const char *buffer_end)
buffer
=
search
+
1
;
if
(
tag
->
tagger
!=
NULL
)
git_
person_
_free
(
tag
->
tagger
);
git_
signature
_free
(
tag
->
tagger
);
tag
->
tagger
=
git__malloc
(
sizeof
(
git_
person
));
tag
->
tagger
=
git__malloc
(
sizeof
(
git_
signature
));
if
((
error
=
git_
person
__parse
(
tag
->
tagger
,
&
buffer
,
buffer_end
,
"tagger "
))
!=
0
)
if
((
error
=
git_
signature
__parse
(
tag
->
tagger
,
&
buffer
,
buffer_end
,
"tagger "
))
!=
0
)
return
error
;
text_len
=
buffer_end
-
++
buffer
;
...
...
@@ -217,7 +218,7 @@ int git_tag__writeback(git_tag *tag, git_odb_source *src)
git__write_oid
(
src
,
"object"
,
git_object_id
(
tag
->
target
));
git__source_printf
(
src
,
"type %s
\n
"
,
git_object_type2string
(
tag
->
type
));
git__source_printf
(
src
,
"tag %s
\n
"
,
tag
->
tag_name
);
git_
person
__write
(
src
,
"tagger"
,
tag
->
tagger
);
git_
signature
__write
(
src
,
"tagger"
,
tag
->
tagger
);
if
(
tag
->
message
!=
NULL
)
git__source_printf
(
src
,
"
\n
%s"
,
tag
->
message
);
...
...
src/tag.h
View file @
b5ced41e
...
...
@@ -10,7 +10,7 @@ struct git_tag {
git_object
*
target
;
git_otype
type
;
char
*
tag_name
;
git_
person
*
tagger
;
git_
signature
*
tagger
;
char
*
message
;
};
...
...
tests/t0401-parse.c
View file @
b5ced41e
#include "test_lib.h"
#include "test_helpers.h"
#include "commit.h"
#include "
person
.h"
#include "
signature
.h"
#include <git2/odb.h>
#include <git2/commit.h>
#include <git2/revwalk.h>
...
...
@@ -129,96 +129,134 @@ BEGIN_TEST(parse_oid_test)
END_TEST
BEGIN_TEST
(
parse_
person
_test
)
BEGIN_TEST
(
parse_
sig
_test
)
#define TEST_
PERSON_PASS(_string, _header, _name, _email, _time
)
{
\
#define TEST_
SIGNATURE_PASS(_string, _header, _name, _email, _time, _offset
)
{
\
char
*
ptr
=
_string
;
\
size_t
len
=
strlen
(
_string
);
\
git_
person
person
=
{
NULL
,
NULL
,
0
};
\
must_pass
(
git_
person
__parse
(
&
person
,
&
ptr
,
ptr
+
len
,
_header
));
\
git_
signature
person
=
{
NULL
,
NULL
,
{
0
,
0
}
};
\
must_pass
(
git_
signature
__parse
(
&
person
,
&
ptr
,
ptr
+
len
,
_header
));
\
must_be_true
(
strcmp
(
_name
,
person
.
name
)
==
0
);
\
must_be_true
(
strcmp
(
_email
,
person
.
email
)
==
0
);
\
must_be_true
(
_time
==
person
.
time
);
\
must_be_true
(
_time
==
person
.
when
.
time
);
\
must_be_true
(
_offset
==
person
.
when
.
offset
);
\
free
(
person
.
name
);
free
(
person
.
email
);
\
}
#define TEST_
PERSON
_FAIL(_string, _header) { \
#define TEST_
SIGNATURE
_FAIL(_string, _header) { \
char *ptr = _string; \
size_t len = strlen(_string);\
git_
person person = {NULL, NULL, 0
}; \
must_fail(git_
person
__parse(&person, &ptr, ptr + len, _header));\
git_
signature person = {NULL, NULL, {0, 0}
}; \
must_fail(git_
signature
__parse(&person, &ptr, ptr + len, _header));\
free(person.name); free(person.email);\
}
TEST_PERSON_PASS
(
"author Vicent Marti <tanoku@gmail.com> 12345
\n
"
,
"author "
,
"Vicent Marti"
,
"tanoku@gmail.com"
,
12345
);
TEST_SIGNATURE_PASS
(
"author Vicent Marti <tanoku@gmail.com> 12345
\n
"
,
"author "
,
"Vicent Marti"
,
"tanoku@gmail.com"
,
12345
,
0
);
TEST_
PERSON
_PASS
(
TEST_
SIGNATURE
_PASS
(
"author Vicent Marti <> 12345
\n
"
,
"author "
,
"Vicent Marti"
,
""
,
12345
);
12345
,
0
);
TEST_
PERSON
_PASS
(
"author Vicent Marti <tanoku@gmail.com> 231301 +
2
020
\n
"
,
TEST_
SIGNATURE
_PASS
(
"author Vicent Marti <tanoku@gmail.com> 231301 +
1
020
\n
"
,
"author "
,
"Vicent Marti"
,
"tanoku@gmail.com"
,
231301
);
231301
,
620
);
TEST_
PERSON
_PASS
(
TEST_
SIGNATURE
_PASS
(
"author Vicent Marti with an outrageously long name \
which will probably overflow the buffer <tanoku@gmail.com> 12345
\n
"
,
"author "
,
"Vicent Marti with an outrageously long name \
which will probably overflow the buffer"
,
"tanoku@gmail.com"
,
12345
);
12345
,
0
);
TEST_
PERSON
_PASS
(
TEST_
SIGNATURE
_PASS
(
"author Vicent Marti <tanokuwithaveryveryverylongemail\
whichwillprobablyvoverflowtheemailbuffer@gmail.com> 12345
\n
"
,
"author "
,
"Vicent Marti"
,
"tanokuwithaveryveryverylongemail\
whichwillprobablyvoverflowtheemailbuffer@gmail.com"
,
12345
);
12345
,
0
);
TEST_SIGNATURE_PASS
(
"committer Vicent Marti <tanoku@gmail.com> 123456 +0000
\n
"
,
"committer "
,
"Vicent Marti"
,
"tanoku@gmail.com"
,
123456
,
0
);
TEST_SIGNATURE_PASS
(
"committer Vicent Marti <tanoku@gmail.com> 123456 +0100
\n
"
,
"committer "
,
"Vicent Marti"
,
"tanoku@gmail.com"
,
123456
,
60
);
TEST_SIGNATURE_PASS
(
"committer Vicent Marti <tanoku@gmail.com> 123456 -0100
\n
"
,
"committer "
,
"Vicent Marti"
,
"tanoku@gmail.com"
,
123456
,
-
60
);
TEST_SIGNATURE_FAIL
(
"committer Vicent Marti <tanoku@gmail.com> 123456 -1500
\n
"
,
"committer "
);
TEST_SIGNATURE_FAIL
(
"committer Vicent Marti <tanoku@gmail.com> 123456 +0163
\n
"
,
"committer "
);
TEST_
PERSON
_FAIL
(
TEST_
SIGNATURE
_FAIL
(
"author Vicent Marti <tanoku@gmail.com> 12345
\n
"
,
"author "
);
TEST_
PERSON
_FAIL
(
TEST_
SIGNATURE
_FAIL
(
"author Vicent Marti <tanoku@gmail.com> 12345
\n
"
,
"committer "
);
TEST_
PERSON
_FAIL
(
TEST_
SIGNATURE
_FAIL
(
"author Vicent Marti 12345
\n
"
,
"author "
);
TEST_
PERSON
_FAIL
(
TEST_
SIGNATURE
_FAIL
(
"author Vicent Marti <broken@email 12345
\n
"
,
"author "
);
TEST_
PERSON
_FAIL
(
TEST_
SIGNATURE
_FAIL
(
"author Vicent Marti <tanoku@gmail.com> notime
\n
"
,
"author "
);
TEST_
PERSON
_FAIL
(
TEST_
SIGNATURE
_FAIL
(
"author Vicent Marti <tanoku@gmail.com>
\n
"
,
"author "
);
TEST_
PERSON
_FAIL
(
TEST_
SIGNATURE
_FAIL
(
"author "
,
"author "
);
#undef TEST_
PERSON
_PASS
#undef TEST_
PERSON
_FAIL
#undef TEST_
SIGNATURE
_PASS
#undef TEST_
SIGNATURE
_FAIL
END_TEST
...
...
tests/t0402-details.c
View file @
b5ced41e
#include "test_lib.h"
#include "test_helpers.h"
#include "commit.h"
#include "
person
.h"
#include "
signature
.h"
#include <git2/odb.h>
#include <git2/commit.h>
...
...
@@ -28,7 +28,7 @@ BEGIN_TEST(query_details_test)
git_oid
id
;
git_commit
*
commit
;
const
git_
person
*
author
,
*
committer
;
const
git_
signature
*
author
,
*
committer
;
const
char
*
message
,
*
message_short
;
time_t
commit_time
;
unsigned
int
parents
,
p
;
...
...
tests/t0403-write.c
View file @
b5ced41e
#include "test_lib.h"
#include "test_helpers.h"
#include "commit.h"
#include "
person
.h"
#include "
signature
.h"
#include <git2/odb.h>
#include <git2/commit.h>
#include <git2/revwalk.h>
#include <git2/signature.h>
static
const
char
*
commit_ids
[]
=
{
"a4a7dce85cf63874e984719f4fdd239f5145052f"
,
/* 0 */
...
...
@@ -27,7 +28,7 @@ BEGIN_TEST(writenew_test)
git_commit
*
commit
,
*
parent
;
git_tree
*
tree
;
git_oid
id
;
const
git_
person
*
author
,
*
committer
;
const
git_
signature
*
author
,
*
committer
;
/* char hex_oid[41]; */
must_pass
(
git_repository_open
(
&
repo
,
REPOSITORY_FOLDER
));
...
...
@@ -42,23 +43,33 @@ BEGIN_TEST(writenew_test)
git_commit_add_parent
(
commit
,
parent
);
/* Set other attributes */
git_commit_set_committer
(
commit
,
COMMITTER_NAME
,
COMMITTER_EMAIL
,
123456789
);
git_commit_set_author
(
commit
,
COMMITTER_NAME
,
COMMITTER_EMAIL
,
987654321
);
committer
=
git_signature_new
(
COMMITTER_NAME
,
COMMITTER_EMAIL
,
123456789
,
60
);
must_be_true
(
committer
!=
NULL
);
author
=
git_signature_new
(
COMMITTER_NAME
,
COMMITTER_EMAIL
,
987654321
,
90
);
must_be_true
(
author
!=
NULL
);
git_commit_set_committer
(
commit
,
committer
);
git_commit_set_author
(
commit
,
author
);
git_commit_set_message
(
commit
,
COMMIT_MESSAGE
);
git_signature_free
((
git_signature
*
)
committer
);
git_signature_free
((
git_signature
*
)
author
);
/* Check attributes were set correctly */
author
=
git_commit_author
(
commit
);
must_be_true
(
author
!=
NULL
);
must_be_true
(
strcmp
(
author
->
name
,
COMMITTER_NAME
)
==
0
);
must_be_true
(
strcmp
(
author
->
email
,
COMMITTER_EMAIL
)
==
0
);
must_be_true
(
author
->
time
==
987654321
);
must_be_true
(
author
->
when
.
time
==
987654321
);
must_be_true
(
author
->
when
.
offset
==
90
);
committer
=
git_commit_committer
(
commit
);
must_be_true
(
committer
!=
NULL
);
must_be_true
(
strcmp
(
committer
->
name
,
COMMITTER_NAME
)
==
0
);
must_be_true
(
strcmp
(
committer
->
email
,
COMMITTER_EMAIL
)
==
0
);
must_be_true
(
committer
->
time
==
123456789
);
must_be_true
(
git_commit_time
(
commit
)
==
123456789
);
must_be_true
(
committer
->
when
.
time
==
123456789
);
must_be_true
(
committer
->
when
.
offset
==
60
);
must_be_true
(
strcmp
(
git_commit_message
(
commit
),
COMMIT_MESSAGE
)
==
0
);
...
...
@@ -74,18 +85,8 @@ BEGIN_TEST(writenew_test)
/* Write to disk */
must_pass
(
git_object_write
((
git_object
*
)
commit
));
/* Show new SHA1 */
/*
git_oid_fmt(hex_oid, git_commit_id(commit));
hex_oid[40] = 0;
printf("Written new commit, SHA1: %s\n", hex_oid);
*/
must_pass
(
remove_loose_object
(
REPOSITORY_FOLDER
,
(
git_object
*
)
commit
));
//git_person_free(&author);
//git_person_free(&committer);
git_repository_free
(
repo
);
END_TEST
...
...
@@ -104,12 +105,6 @@ BEGIN_TEST(writeback_test)
message
=
git_commit_message
(
commit
);
/*
git_oid_fmt(hex_oid, git_commit_id(commit));
hex_oid[40] = 0;
printf("Old SHA1: %s\n", hex_oid);
*/
git_commit_set_message
(
commit
,
"This is a new test message. Cool!
\n
"
);
git_oid_mkstr
(
&
id
,
commit_ids
[
4
]);
...
...
@@ -119,12 +114,6 @@ BEGIN_TEST(writeback_test)
must_pass
(
git_object_write
((
git_object
*
)
commit
));
/*
git_oid_fmt(hex_oid, git_commit_id(commit));
hex_oid[40] = 0;
printf("New SHA1: %s\n", hex_oid);
*/
must_pass
(
remove_loose_object
(
REPOSITORY_FOLDER
,
(
git_object
*
)
commit
));
git_repository_free
(
repo
);
...
...
tests/t0502-list.c
View file @
b5ced41e
...
...
@@ -4,6 +4,7 @@
#include "revwalk.h"
#include <git2/odb.h>
#include <git2/commit.h>
#include <git2/signature.h>
BEGIN_TEST
(
list_timesort_test
)
...
...
@@ -15,12 +16,13 @@ BEGIN_TEST(list_timesort_test)
#define TEST_SORTED() \
previous_time = INT_MAX;\
for (n = list.head; n != NULL; n = n->next) {\
must_be_true(n->walk_commit->commit_object->commit
_
time <= previous_time);\
previous_time = n->walk_commit->commit_object->commit
_
time;\
must_be_true(n->walk_commit->commit_object->commit
ter->when.
time <= previous_time);\
previous_time = n->walk_commit->commit_object->commit
ter->when.
time;\
}
#define CLEAR_LIST() \
for (n = list.head; n != NULL; n = n->next) {\
git_signature_free(n->walk_commit->commit_object->committer);\
free(n->walk_commit->commit_object);\
free(n->walk_commit);\
}\
...
...
@@ -37,7 +39,7 @@ BEGIN_TEST(list_timesort_test)
git_commit
*
c
=
git__malloc
(
sizeof
(
git_commit
));
git_revwalk_commit
*
rc
=
git__malloc
(
sizeof
(
git_revwalk_commit
));
c
->
commit
_time
=
(
time_t
)
rand
(
);
c
->
commit
ter
=
git_signature_new
(
""
,
""
,
(
time_t
)
rand
(),
0
);
rc
->
commit_object
=
c
;
git_revwalk_list_push_back
(
&
list
,
rc
);
...
...
@@ -53,7 +55,7 @@ BEGIN_TEST(list_timesort_test)
git_commit
*
c
=
git__malloc
(
sizeof
(
git_commit
));
git_revwalk_commit
*
rc
=
git__malloc
(
sizeof
(
git_revwalk_commit
));
c
->
commit
_time
=
0
;
c
->
commit
ter
=
git_signature_new
(
""
,
""
,
0
,
0
)
;
rc
->
commit_object
=
c
;
git_revwalk_list_push_back
(
&
list
,
rc
);
...
...
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