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
087f64d3
Commit
087f64d3
authored
Dec 17, 2012
by
Jameson Miller
Committed by
Michael Schubert
Jan 09, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Relax refspecs accepted by push
parent
11fccddc
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
55 additions
and
16 deletions
+55
-16
include/git2/refs.h
+1
-1
src/push.c
+32
-15
tests-clar/online/push.c
+22
-0
No files found.
include/git2/refs.h
View file @
087f64d3
...
...
@@ -44,7 +44,7 @@ GIT_EXTERN(int) git_reference_lookup(git_reference **out, git_repository *repo,
* allocate or free any `git_reference` objects for simple situations.
*
* The name will be checked for validity.
* See `git_reference_
create_symbolic
()` for rules about valid names.
* See `git_reference_
symbolic_create
()` for rules about valid names.
*
* @param out Pointer to oid to be filled in
* @param repo The repository in which to look up the reference
...
...
src/push.c
View file @
087f64d3
...
...
@@ -68,18 +68,37 @@ static void free_status(push_status *status)
git__free
(
status
);
}
static
int
check_ref
(
char
*
ref
)
static
int
check_r
r
ef
(
char
*
ref
)
{
if
(
strcmp
(
ref
,
"HEAD"
)
&&
git__prefixcmp
(
ref
,
"refs/heads/"
)
&&
git__prefixcmp
(
ref
,
"refs/tags/"
))
{
giterr_set
(
GITERR_INVALID
,
"No valid reference '%s'"
,
ref
);
if
(
git__prefixcmp
(
ref
,
"refs/"
))
{
giterr_set
(
GITERR_INVALID
,
"Not a valid reference '%s'"
,
ref
);
return
-
1
;
}
return
0
;
}
static
int
parse_refspec
(
push_spec
**
spec
,
const
char
*
str
)
static
int
check_lref
(
git_push
*
push
,
char
*
ref
)
{
/* lref must be resolvable to an existing object */
git_object
*
obj
;
int
error
=
git_revparse_single
(
&
obj
,
push
->
repo
,
ref
);
if
(
error
)
{
if
(
error
==
GIT_ENOTFOUND
)
giterr_set
(
GITERR_REFERENCE
,
"src refspec '%s' does not match any existing object"
,
ref
);
else
giterr_set
(
GITERR_INVALID
,
"Not a valid reference '%s'"
,
ref
);
return
-
1
;
}
else
{
git_object_free
(
obj
);
}
return
0
;
}
static
int
parse_refspec
(
git_push
*
push
,
push_spec
**
spec
,
const
char
*
str
)
{
push_spec
*
s
;
char
*
delim
;
...
...
@@ -94,22 +113,22 @@ static int parse_refspec(push_spec **spec, const char *str)
str
++
;
}
#define check(ref) \
if (!ref || check_ref(ref) < 0) goto on_error
delim
=
strchr
(
str
,
':'
);
if
(
delim
==
NULL
)
{
s
->
lref
=
git__strdup
(
str
);
check
(
s
->
lref
);
if
(
!
s
->
lref
||
check_lref
(
push
,
s
->
lref
)
<
0
)
goto
on_error
;
}
else
{
if
(
delim
-
str
)
{
s
->
lref
=
git__strndup
(
str
,
delim
-
str
);
check
(
s
->
lref
);
if
(
!
s
->
lref
||
check_lref
(
push
,
s
->
lref
)
<
0
)
goto
on_error
;
}
if
(
strlen
(
delim
+
1
))
{
s
->
rref
=
git__strdup
(
delim
+
1
);
check
(
s
->
rref
);
if
(
!
s
->
rref
||
check_rref
(
s
->
rref
)
<
0
)
goto
on_error
;
}
}
...
...
@@ -122,8 +141,6 @@ static int parse_refspec(push_spec **spec, const char *str)
check
(
s
->
rref
);
}
#undef check
*
spec
=
s
;
return
0
;
...
...
@@ -136,7 +153,7 @@ int git_push_add_refspec(git_push *push, const char *refspec)
{
push_spec
*
spec
;
if
(
parse_refspec
(
&
spec
,
refspec
)
<
0
||
if
(
parse_refspec
(
push
,
&
spec
,
refspec
)
<
0
||
git_vector_insert
(
&
push
->
specs
,
spec
)
<
0
)
return
-
1
;
...
...
tests-clar/online/push.c
View file @
087f64d3
...
...
@@ -525,3 +525,25 @@ void test_online_push__expressions(void)
exp_stats_right_expr
,
ARRAY_SIZE
(
exp_stats_right_expr
),
NULL
,
0
,
0
);
}
void
test_network_push__notes
(
void
)
{
git_oid
note_oid
,
*
target_oid
,
expected_oid
;
git_signature
*
signature
;
const
char
*
specs
[]
=
{
"refs/notes/commits:refs/notes/commits"
};
push_status
exp_stats
[]
=
{
{
"refs/notes/commits"
,
NULL
}
};
expected_ref
exp_refs
[]
=
{
{
"refs/notes/commits"
,
&
expected_oid
}
};
git_oid_fromstr
(
&
expected_oid
,
"8461a99b27b7043e58ff6e1f5d2cf07d282534fb"
);
target_oid
=
&
_oid_b6
;
/* Create note to push */
cl_git_pass
(
git_signature_new
(
&
signature
,
"nulltoken"
,
"emeric.fermas@gmail.com"
,
1323847743
,
60
));
/* Wed Dec 14 08:29:03 2011 +0100 */
cl_git_pass
(
git_note_create
(
&
note_oid
,
_repo
,
signature
,
signature
,
NULL
,
target_oid
,
"hello world
\n
"
));
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
);
git_signature_free
(
signature
);
}
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