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
b308c11e
Commit
b308c11e
authored
Jul 19, 2012
by
nulltoken
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
branch: change git_branch_create() to make it return a reference
parent
326ca710
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
23 additions
and
54 deletions
+23
-54
include/git2/branch.h
+3
-4
src/branch.c
+5
-9
tests-clar/refs/branches/create.c
+15
-41
No files found.
include/git2/branch.h
View file @
b308c11e
...
...
@@ -26,9 +26,9 @@ GIT_BEGIN_DECL
* this target commit. If `force` is true and a reference
* already exists with the given name, it'll be replaced.
*
*
@param oid_out Pointer where to store the OID of the target commit
.
*
The returned reference must be freed by the user
.
*
* @param re
po Repository where to store the branch
.
* @param re
f_out Pointer where to store the underlying reference
.
*
* @param branch_name Name for the branch; this name is
* validated for consistency. It should also not conflict with
...
...
@@ -46,8 +46,7 @@ GIT_BEGIN_DECL
* pointing to the provided target commit.
*/
GIT_EXTERN
(
int
)
git_branch_create
(
git_oid
*
oid_out
,
git_repository
*
repo
,
git_reference
**
ref_out
,
const
char
*
branch_name
,
const
git_object
*
target
,
int
force
);
...
...
src/branch.c
View file @
b308c11e
...
...
@@ -49,8 +49,7 @@ static int create_error_invalid(const char *msg)
}
int
git_branch_create
(
git_oid
*
oid_out
,
git_repository
*
repo
,
git_reference
**
ref_out
,
const
char
*
branch_name
,
const
git_object
*
target
,
int
force
)
...
...
@@ -61,10 +60,7 @@ int git_branch_create(
git_buf
canonical_branch_name
=
GIT_BUF_INIT
;
int
error
=
-
1
;
assert
(
repo
&&
branch_name
&&
target
&&
oid_out
);
if
(
git_object_owner
(
target
)
!=
repo
)
return
create_error_invalid
(
"The given target does not belong to this repository"
);
assert
(
branch_name
&&
target
&&
ref_out
);
target_type
=
git_object_type
(
target
);
...
...
@@ -91,17 +87,17 @@ int git_branch_create(
if
(
git_buf_joinpath
(
&
canonical_branch_name
,
GIT_REFS_HEADS_DIR
,
branch_name
)
<
0
)
goto
cleanup
;
if
(
git_reference_create_oid
(
&
branch
,
repo
,
git_buf_cstr
(
&
canonical_branch_name
),
git_object_id
(
commit
),
force
)
<
0
)
if
(
git_reference_create_oid
(
&
branch
,
git_object_owner
(
commit
),
git_buf_cstr
(
&
canonical_branch_name
),
git_object_id
(
commit
),
force
)
<
0
)
goto
cleanup
;
git_oid_cpy
(
oid_out
,
git_reference_oid
(
branch
))
;
*
ref_out
=
branch
;
error
=
0
;
cleanup:
if
(
target_type
==
GIT_OBJ_TAG
)
git_object_free
(
commit
);
git_reference_free
(
branch
);
git_buf_free
(
&
canonical_branch_name
);
return
error
;
}
...
...
tests-clar/refs/branches/create.c
View file @
b308c11e
...
...
@@ -2,17 +2,21 @@
#include "refs.h"
static
git_repository
*
repo
;
static
git_oid
branch_target_oid
;
static
git_object
*
target
;
static
git_reference
*
branch
;
void
test_refs_branches_create__initialize
(
void
)
{
cl_fixture_sandbox
(
"testrepo.git"
);
cl_git_pass
(
git_repository_open
(
&
repo
,
"testrepo.git"
));
branch
=
NULL
;
}
void
test_refs_branches_create__cleanup
(
void
)
{
git_reference_free
(
branch
);
git_object_free
(
target
);
git_repository_free
(
repo
);
...
...
@@ -38,54 +42,24 @@ void test_refs_branches_create__can_create_a_local_branch(void)
{
retrieve_known_commit
(
&
target
,
repo
);
cl_git_pass
(
git_branch_create
(
&
branch_target_oid
,
repo
,
NEW_BRANCH_NAME
,
target
,
0
));
cl_git_pass
(
git_oid_cmp
(
&
branch_target_oid
,
git_object_id
(
target
)));
}
void
test_refs_branches_create__creating_a_local_branch_triggers_the_creation_of_a_new_direct_reference
(
void
)
{
git_reference
*
branch
;
retrieve_known_commit
(
&
target
,
repo
);
cl_git_fail
(
git_reference_lookup
(
&
branch
,
repo
,
GIT_REFS_HEADS_DIR
NEW_BRANCH_NAME
));
cl_git_pass
(
git_branch_create
(
&
branch_target_oid
,
repo
,
NEW_BRANCH_NAME
,
target
,
0
));
cl_git_pass
(
git_reference_lookup
(
&
branch
,
repo
,
GIT_REFS_HEADS_DIR
NEW_BRANCH_NAME
));
cl_assert
(
git_reference_type
(
branch
)
==
GIT_REF_OID
);
git_reference_free
(
branch
);
cl_git_pass
(
git_branch_create
(
&
branch
,
NEW_BRANCH_NAME
,
target
,
0
));
cl_git_pass
(
git_oid_cmp
(
git_reference_oid
(
branch
),
git_object_id
(
target
)));
}
void
test_refs_branches_create__can_not_create_a_branch_if_its_name_collide_with_an_existing_one
(
void
)
{
retrieve_known_commit
(
&
target
,
repo
);
cl_git_fail
(
git_branch_create
(
&
branch
_target_oid
,
repo
,
"br2"
,
target
,
0
));
cl_git_fail
(
git_branch_create
(
&
branch
,
"br2"
,
target
,
0
));
}
void
test_refs_branches_create__can_force_create_over_an_existing_branch
(
void
)
{
retrieve_known_commit
(
&
target
,
repo
);
cl_git_pass
(
git_branch_create
(
&
branch_target_oid
,
repo
,
"br2"
,
target
,
1
));
cl_git_pass
(
git_oid_cmp
(
&
branch_target_oid
,
git_object_id
(
target
)));
}
void
test_refs_branches_create__can_not_create_a_branch_pointing_at_an_object_unknown_from_the_repository
(
void
)
{
git_repository
*
repo2
;
/* Open another instance of the same repository */
cl_git_pass
(
git_repository_open
(
&
repo2
,
cl_fixture
(
"testrepo.git"
)));
/* Retrieve a commit object from this different repository */
retrieve_known_commit
(
&
target
,
repo2
);
cl_git_fail
(
git_branch_create
(
&
branch_target_oid
,
repo
,
NEW_BRANCH_NAME
,
target
,
0
));
git_repository_free
(
repo2
);
cl_git_pass
(
git_branch_create
(
&
branch
,
"br2"
,
target
,
1
));
cl_git_pass
(
git_oid_cmp
(
git_reference_oid
(
branch
),
git_object_id
(
target
)));
cl_assert_equal_s
(
"refs/heads/br2"
,
git_reference_name
(
branch
));
}
void
test_refs_branches_create__creating_a_branch_targeting_a_tag_dereferences_it_to_its_commit
(
void
)
...
...
@@ -93,8 +67,8 @@ void test_refs_branches_create__creating_a_branch_targeting_a_tag_dereferences_i
/* b25fa35 is a tag, pointing to another tag which points to a commit */
retrieve_target_from_oid
(
&
target
,
repo
,
"b25fa35b38051e4ae45d4222e795f9df2e43f1d1"
);
cl_git_pass
(
git_branch_create
(
&
branch
_target_oid
,
repo
,
NEW_BRANCH_NAME
,
target
,
0
));
cl_git_pass
(
git_oid_streq
(
&
branch_target_oid
,
"e90810b8df3e80c413d903f631643c716887138d"
));
cl_git_pass
(
git_branch_create
(
&
branch
,
NEW_BRANCH_NAME
,
target
,
0
));
cl_git_pass
(
git_oid_streq
(
git_reference_oid
(
branch
)
,
"e90810b8df3e80c413d903f631643c716887138d"
));
}
void
test_refs_branches_create__can_not_create_a_branch_pointing_to_a_non_commit_object
(
void
)
...
...
@@ -102,11 +76,11 @@ void test_refs_branches_create__can_not_create_a_branch_pointing_to_a_non_commit
/* 53fc32d is the tree of commit e90810b */
retrieve_target_from_oid
(
&
target
,
repo
,
"53fc32d17276939fc79ed05badaef2db09990016"
);
cl_git_fail
(
git_branch_create
(
&
branch
_target_oid
,
repo
,
NEW_BRANCH_NAME
,
target
,
0
));
cl_git_fail
(
git_branch_create
(
&
branch
,
NEW_BRANCH_NAME
,
target
,
0
));
git_object_free
(
target
);
/* 521d87c is an annotated tag pointing to a blob */
retrieve_target_from_oid
(
&
target
,
repo
,
"521d87c1ec3aef9824daf6d96cc0ae3710766d91"
);
cl_git_fail
(
git_branch_create
(
&
branch
_target_oid
,
repo
,
NEW_BRANCH_NAME
,
target
,
0
));
cl_git_fail
(
git_branch_create
(
&
branch
,
NEW_BRANCH_NAME
,
target
,
0
));
}
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