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
8be28acf
Commit
8be28acf
authored
Oct 09, 2014
by
Edward Thomson
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2462 from libgit2/cmn/remote-fetch-refs
Implement opportunistic ref updates
parents
8bd747cf
c5837cad
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
262 additions
and
67 deletions
+262
-67
CHANGELOG.md
+6
-0
examples/network/fetch.c
+1
-1
include/git2/remote.h
+7
-1
src/clone.c
+2
-2
src/remote.c
+142
-25
src/remote.h
+2
-0
tests/fetchhead/nonetwork.c
+1
-1
tests/network/fetchlocal.c
+2
-2
tests/network/remote/local.c
+88
-26
tests/online/fetch.c
+5
-5
tests/online/fetchhead.c
+5
-3
tests/online/push.c
+1
-1
No files found.
CHANGELOG.md
View file @
8be28acf
...
@@ -56,6 +56,12 @@ v0.21 + 1
...
@@ -56,6 +56,12 @@ v0.21 + 1
*
Add support for refspecs with the asterisk in the middle of a
*
Add support for refspecs with the asterisk in the middle of a
pattern.
pattern.
*
Fetching now performs opportunistic updates. To achieve this, we
introduce a difference between active and passive refspecs, which
make git_remote_download and git_remote_fetch to take a list of
resfpecs to be the active list, similarly to how git fetch accepts a
list on the command-line.
*
Introduce git_merge_bases() and the git_oidarray type to expose all
*
Introduce git_merge_bases() and the git_oidarray type to expose all
merge bases between two commits.
merge bases between two commits.
...
...
examples/network/fetch.c
View file @
8be28acf
...
@@ -36,7 +36,7 @@ static void *download(void *ptr)
...
@@ -36,7 +36,7 @@ static void *download(void *ptr)
// Download the packfile and index it. This function updates the
// Download the packfile and index it. This function updates the
// amount of received data and the indexer stats which lets you
// amount of received data and the indexer stats which lets you
// inform the user about progress.
// inform the user about progress.
if
(
git_remote_download
(
data
->
remote
)
<
0
)
{
if
(
git_remote_download
(
data
->
remote
,
NULL
)
<
0
)
{
data
->
ret
=
-
1
;
data
->
ret
=
-
1
;
goto
exit
;
goto
exit
;
}
}
...
...
include/git2/remote.h
View file @
8be28acf
...
@@ -306,9 +306,12 @@ GIT_EXTERN(int) git_remote_ls(const git_remote_head ***out, size_t *size, git_r
...
@@ -306,9 +306,12 @@ GIT_EXTERN(int) git_remote_ls(const git_remote_head ***out, size_t *size, git_r
* The .idx file will be created and both it and the packfile with be
* The .idx file will be created and both it and the packfile with be
* renamed to their final name.
* renamed to their final name.
*
*
* @param remote the remote
* @param refspecs the refspecs to use for this negotiation and
* download. Use NULL to use the base refspecs
* @return 0 or an error code
* @return 0 or an error code
*/
*/
GIT_EXTERN
(
int
)
git_remote_download
(
git_remote
*
remote
);
GIT_EXTERN
(
int
)
git_remote_download
(
git_remote
*
remote
,
const
git_strarray
*
refspecs
);
/**
/**
* Check whether the remote is connected
* Check whether the remote is connected
...
@@ -373,6 +376,8 @@ GIT_EXTERN(int) git_remote_update_tips(
...
@@ -373,6 +376,8 @@ GIT_EXTERN(int) git_remote_update_tips(
* disconnect and update the remote-tracking branches.
* disconnect and update the remote-tracking branches.
*
*
* @param remote the remote to fetch from
* @param remote the remote to fetch from
* @param refspecs the refspecs to use for this fetch. Pass NULL to
* use the base refspecs.
* @param signature The identity to use when updating reflogs
* @param signature The identity to use when updating reflogs
* @param reflog_message The message to insert into the reflogs. If NULL, the
* @param reflog_message The message to insert into the reflogs. If NULL, the
* default is "fetch"
* default is "fetch"
...
@@ -380,6 +385,7 @@ GIT_EXTERN(int) git_remote_update_tips(
...
@@ -380,6 +385,7 @@ GIT_EXTERN(int) git_remote_update_tips(
*/
*/
GIT_EXTERN
(
int
)
git_remote_fetch
(
GIT_EXTERN
(
int
)
git_remote_fetch
(
git_remote
*
remote
,
git_remote
*
remote
,
const
git_strarray
*
refspecs
,
const
git_signature
*
signature
,
const
git_signature
*
signature
,
const
char
*
reflog_message
);
const
char
*
reflog_message
);
...
...
src/clone.c
View file @
8be28acf
...
@@ -358,7 +358,7 @@ static int clone_into(git_repository *repo, git_remote *_remote, const git_check
...
@@ -358,7 +358,7 @@ static int clone_into(git_repository *repo, git_remote *_remote, const git_check
git_remote_set_update_fetchhead
(
remote
,
0
);
git_remote_set_update_fetchhead
(
remote
,
0
);
git_buf_printf
(
&
reflog_message
,
"clone: from %s"
,
git_remote_url
(
remote
));
git_buf_printf
(
&
reflog_message
,
"clone: from %s"
,
git_remote_url
(
remote
));
if
((
error
=
git_remote_fetch
(
remote
,
signature
,
git_buf_cstr
(
&
reflog_message
)))
!=
0
)
if
((
error
=
git_remote_fetch
(
remote
,
NULL
,
signature
,
git_buf_cstr
(
&
reflog_message
)))
!=
0
)
goto
cleanup
;
goto
cleanup
;
error
=
checkout_branch
(
repo
,
remote
,
co_opts
,
branch
,
signature
,
git_buf_cstr
(
&
reflog_message
));
error
=
checkout_branch
(
repo
,
remote
,
co_opts
,
branch
,
signature
,
git_buf_cstr
(
&
reflog_message
));
...
@@ -553,7 +553,7 @@ static int clone_local_into(git_repository *repo, git_remote *remote, const git_
...
@@ -553,7 +553,7 @@ static int clone_local_into(git_repository *repo, git_remote *remote, const git_
git_buf_printf
(
&
reflog_message
,
"clone: from %s"
,
git_remote_url
(
remote
));
git_buf_printf
(
&
reflog_message
,
"clone: from %s"
,
git_remote_url
(
remote
));
if
((
error
=
git_remote_fetch
(
remote
,
signature
,
git_buf_cstr
(
&
reflog_message
)))
!=
0
)
if
((
error
=
git_remote_fetch
(
remote
,
NULL
,
signature
,
git_buf_cstr
(
&
reflog_message
)))
!=
0
)
goto
cleanup
;
goto
cleanup
;
error
=
checkout_branch
(
repo
,
remote
,
co_opts
,
branch
,
signature
,
git_buf_cstr
(
&
reflog_message
));
error
=
checkout_branch
(
repo
,
remote
,
co_opts
,
branch
,
signature
,
git_buf_cstr
(
&
reflog_message
));
...
...
src/remote.c
View file @
8be28acf
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
static
int
dwim_refspecs
(
git_vector
*
out
,
git_vector
*
refspecs
,
git_vector
*
refs
);
static
int
dwim_refspecs
(
git_vector
*
out
,
git_vector
*
refspecs
,
git_vector
*
refs
);
static
int
add_refspec
(
git_remote
*
remote
,
const
char
*
string
,
bool
is_fetch
)
static
int
add_refspec
_to
(
git_vector
*
vector
,
const
char
*
string
,
bool
is_fetch
)
{
{
git_refspec
*
spec
;
git_refspec
*
spec
;
...
@@ -34,7 +34,7 @@ static int add_refspec(git_remote *remote, const char *string, bool is_fetch)
...
@@ -34,7 +34,7 @@ static int add_refspec(git_remote *remote, const char *string, bool is_fetch)
}
}
spec
->
push
=
!
is_fetch
;
spec
->
push
=
!
is_fetch
;
if
(
git_vector_insert
(
&
remote
->
refspecs
,
spec
)
<
0
)
{
if
(
git_vector_insert
(
vector
,
spec
)
<
0
)
{
git_refspec__free
(
spec
);
git_refspec__free
(
spec
);
git__free
(
spec
);
git__free
(
spec
);
return
-
1
;
return
-
1
;
...
@@ -43,6 +43,11 @@ static int add_refspec(git_remote *remote, const char *string, bool is_fetch)
...
@@ -43,6 +43,11 @@ static int add_refspec(git_remote *remote, const char *string, bool is_fetch)
return
0
;
return
0
;
}
}
static
int
add_refspec
(
git_remote
*
remote
,
const
char
*
string
,
bool
is_fetch
)
{
return
add_refspec_to
(
&
remote
->
refspecs
,
string
,
is_fetch
);
}
static
int
download_tags_value
(
git_remote
*
remote
,
git_config
*
cfg
)
static
int
download_tags_value
(
git_remote
*
remote
,
git_config
*
cfg
)
{
{
const
git_config_entry
*
ce
;
const
git_config_entry
*
ce
;
...
@@ -370,6 +375,7 @@ int git_remote_load(git_remote **out, git_repository *repo, const char *name)
...
@@ -370,6 +375,7 @@ int git_remote_load(git_remote **out, git_repository *repo, const char *name)
if
(
git_vector_init
(
&
remote
->
refs
,
32
,
NULL
)
<
0
||
if
(
git_vector_init
(
&
remote
->
refs
,
32
,
NULL
)
<
0
||
git_vector_init
(
&
remote
->
refspecs
,
2
,
NULL
)
<
0
||
git_vector_init
(
&
remote
->
refspecs
,
2
,
NULL
)
<
0
||
git_vector_init
(
&
remote
->
passive_refspecs
,
2
,
NULL
)
<
0
||
git_vector_init
(
&
remote
->
active_refspecs
,
2
,
NULL
)
<
0
)
{
git_vector_init
(
&
remote
->
active_refspecs
,
2
,
NULL
)
<
0
)
{
error
=
-
1
;
error
=
-
1
;
goto
cleanup
;
goto
cleanup
;
...
@@ -813,20 +819,43 @@ static int ls_to_vector(git_vector *out, git_remote *remote)
...
@@ -813,20 +819,43 @@ static int ls_to_vector(git_vector *out, git_remote *remote)
return
0
;
return
0
;
}
}
int
git_remote_download
(
git_remote
*
remote
)
int
git_remote_download
(
git_remote
*
remote
,
const
git_strarray
*
refspecs
)
{
{
int
error
;
int
error
;
git_vector
refs
;
size_t
i
;
git_vector
refs
,
specs
,
*
to_active
;
assert
(
remote
);
assert
(
remote
);
if
(
ls_to_vector
(
&
refs
,
remote
)
<
0
)
if
(
ls_to_vector
(
&
refs
,
remote
)
<
0
)
return
-
1
;
return
-
1
;
if
((
git_vector_init
(
&
specs
,
0
,
NULL
))
<
0
)
goto
on_error
;
remote
->
passed_refspecs
=
0
;
if
(
!
refspecs
)
{
to_active
=
&
remote
->
refspecs
;
}
else
{
for
(
i
=
0
;
i
<
refspecs
->
count
;
i
++
)
{
if
((
error
=
add_refspec_to
(
&
specs
,
refspecs
->
strings
[
i
],
true
))
<
0
)
goto
on_error
;
}
to_active
=
&
specs
;
remote
->
passed_refspecs
=
1
;
}
free_refspecs
(
&
remote
->
passive_refspecs
);
if
((
error
=
dwim_refspecs
(
&
remote
->
passive_refspecs
,
&
remote
->
refspecs
,
&
refs
))
<
0
)
goto
on_error
;
free_refspecs
(
&
remote
->
active_refspecs
);
free_refspecs
(
&
remote
->
active_refspecs
);
error
=
dwim_refspecs
(
&
remote
->
active_refspecs
,
to_active
,
&
refs
);
error
=
dwim_refspecs
(
&
remote
->
active_refspecs
,
&
remote
->
refspecs
,
&
refs
);
git_vector_free
(
&
refs
);
git_vector_free
(
&
refs
);
free_refspecs
(
&
specs
);
git_vector_free
(
&
specs
);
if
(
error
<
0
)
if
(
error
<
0
)
return
error
;
return
error
;
...
@@ -835,10 +864,17 @@ int git_remote_download(git_remote *remote)
...
@@ -835,10 +864,17 @@ int git_remote_download(git_remote *remote)
return
error
;
return
error
;
return
git_fetch_download_pack
(
remote
);
return
git_fetch_download_pack
(
remote
);
on_error:
git_vector_free
(
&
refs
);
free_refspecs
(
&
specs
);
git_vector_free
(
&
specs
);
return
error
;
}
}
int
git_remote_fetch
(
int
git_remote_fetch
(
git_remote
*
remote
,
git_remote
*
remote
,
const
git_strarray
*
refspecs
,
const
git_signature
*
signature
,
const
git_signature
*
signature
,
const
char
*
reflog_message
)
const
char
*
reflog_message
)
{
{
...
@@ -849,7 +885,7 @@ int git_remote_fetch(
...
@@ -849,7 +885,7 @@ int git_remote_fetch(
if
((
error
=
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
))
!=
0
)
if
((
error
=
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
))
!=
0
)
return
error
;
return
error
;
error
=
git_remote_download
(
remote
);
error
=
git_remote_download
(
remote
,
refspecs
);
/* We don't need to be connected anymore */
/* We don't need to be connected anymore */
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
...
@@ -1106,6 +1142,96 @@ on_error:
...
@@ -1106,6 +1142,96 @@ on_error:
}
}
/**
* Iteration over the three vectors, with a pause whenever we find a match
*
* On each stop, we store the iteration stat in the inout i,j,k
* parameters, and return the currently matching passive refspec as
* well as the head which we matched.
*/
static
int
next_head
(
const
git_remote
*
remote
,
git_vector
*
refs
,
git_refspec
**
out_spec
,
git_remote_head
**
out_head
,
size_t
*
out_i
,
size_t
*
out_j
,
size_t
*
out_k
)
{
const
git_vector
*
active
,
*
passive
;
git_remote_head
*
head
;
git_refspec
*
spec
,
*
passive_spec
;
size_t
i
,
j
,
k
;
active
=
&
remote
->
active_refspecs
;
passive
=
&
remote
->
passive_refspecs
;
i
=
*
out_i
;
j
=
*
out_j
;
k
=
*
out_k
;
for
(;
i
<
refs
->
length
;
i
++
)
{
head
=
git_vector_get
(
refs
,
i
);
if
(
!
git_reference_is_valid_name
(
head
->
name
))
continue
;
for
(;
j
<
active
->
length
;
j
++
)
{
spec
=
git_vector_get
(
active
,
j
);
if
(
!
git_refspec_src_matches
(
spec
,
head
->
name
))
continue
;
for
(;
k
<
passive
->
length
;
k
++
)
{
passive_spec
=
git_vector_get
(
passive
,
k
);
if
(
!
git_refspec_src_matches
(
passive_spec
,
head
->
name
))
continue
;
*
out_spec
=
passive_spec
;
*
out_head
=
head
;
*
out_i
=
i
;
*
out_j
=
j
;
*
out_k
=
k
+
1
;
return
0
;
}
k
=
0
;
}
j
=
0
;
}
return
GIT_ITEROVER
;
}
static
int
opportunistic_updates
(
const
git_remote
*
remote
,
git_vector
*
refs
,
const
git_signature
*
sig
,
const
char
*
msg
)
{
size_t
i
,
j
,
k
;
git_refspec
*
spec
;
git_remote_head
*
head
;
git_reference
*
ref
;
git_buf
refname
=
GIT_BUF_INIT
;
int
error
;
i
=
j
=
k
=
0
;
while
((
error
=
next_head
(
remote
,
refs
,
&
spec
,
&
head
,
&
i
,
&
j
,
&
k
))
==
0
)
{
/*
* If we got here, there is a refspec which was used
* for fetching which matches the source of one of the
* passive refspecs, so we should update that
* remote-tracking branch, but not add it to
* FETCH_HEAD
*/
if
((
error
=
git_refspec_transform
(
&
refname
,
spec
,
head
->
name
))
<
0
)
return
error
;
error
=
git_reference_create
(
&
ref
,
remote
->
repo
,
refname
.
ptr
,
&
head
->
oid
,
true
,
sig
,
msg
);
git_buf_free
(
&
refname
);
if
(
error
<
0
)
return
error
;
}
return
0
;
}
int
git_remote_update_tips
(
int
git_remote_update_tips
(
git_remote
*
remote
,
git_remote
*
remote
,
const
git_signature
*
signature
,
const
git_signature
*
signature
,
...
@@ -1136,6 +1262,10 @@ int git_remote_update_tips(
...
@@ -1136,6 +1262,10 @@ int git_remote_update_tips(
goto
out
;
goto
out
;
}
}
/* only try to do opportunisitic updates if the refpec lists differ */
if
(
remote
->
passed_refspecs
)
error
=
opportunistic_updates
(
remote
,
&
refs
,
signature
,
reflog_message
);
out:
out:
git_vector_free
(
&
refs
);
git_vector_free
(
&
refs
);
git_refspec__free
(
&
tagspec
);
git_refspec__free
(
&
tagspec
);
...
@@ -1189,6 +1319,9 @@ void git_remote_free(git_remote *remote)
...
@@ -1189,6 +1319,9 @@ void git_remote_free(git_remote *remote)
free_refspecs
(
&
remote
->
active_refspecs
);
free_refspecs
(
&
remote
->
active_refspecs
);
git_vector_free
(
&
remote
->
active_refspecs
);
git_vector_free
(
&
remote
->
active_refspecs
);
free_refspecs
(
&
remote
->
passive_refspecs
);
git_vector_free
(
&
remote
->
passive_refspecs
);
git__free
(
remote
->
url
);
git__free
(
remote
->
url
);
git__free
(
remote
->
pushurl
);
git__free
(
remote
->
pushurl
);
git__free
(
remote
->
name
);
git__free
(
remote
->
name
);
...
@@ -1640,27 +1773,14 @@ void git_remote_clear_refspecs(git_remote *remote)
...
@@ -1640,27 +1773,14 @@ void git_remote_clear_refspecs(git_remote *remote)
git_vector_clear
(
&
remote
->
refspecs
);
git_vector_clear
(
&
remote
->
refspecs
);
}
}
static
int
add_and_dwim
(
git_remote
*
remote
,
const
char
*
str
,
int
push
)
{
git_refspec
*
spec
;
git_vector
*
vec
;
if
(
add_refspec
(
remote
,
str
,
!
push
)
<
0
)
return
-
1
;
vec
=
&
remote
->
refspecs
;
spec
=
git_vector_get
(
vec
,
vec
->
length
-
1
);
return
git_refspec__dwim_one
(
&
remote
->
active_refspecs
,
spec
,
&
remote
->
refs
);
}
int
git_remote_add_fetch
(
git_remote
*
remote
,
const
char
*
refspec
)
int
git_remote_add_fetch
(
git_remote
*
remote
,
const
char
*
refspec
)
{
{
return
add_
and_dwim
(
remote
,
refspec
,
fals
e
);
return
add_
refspec
(
remote
,
refspec
,
tru
e
);
}
}
int
git_remote_add_push
(
git_remote
*
remote
,
const
char
*
refspec
)
int
git_remote_add_push
(
git_remote
*
remote
,
const
char
*
refspec
)
{
{
return
add_
and_dwim
(
remote
,
refspec
,
tru
e
);
return
add_
refspec
(
remote
,
refspec
,
fals
e
);
}
}
static
int
set_refspecs
(
git_remote
*
remote
,
git_strarray
*
array
,
int
push
)
static
int
set_refspecs
(
git_remote
*
remote
,
git_strarray
*
array
,
int
push
)
...
@@ -1688,10 +1808,7 @@ static int set_refspecs(git_remote *remote, git_strarray *array, int push)
...
@@ -1688,10 +1808,7 @@ static int set_refspecs(git_remote *remote, git_strarray *array, int push)
return
-
1
;
return
-
1
;
}
}
free_refspecs
(
&
remote
->
active_refspecs
);
return
0
;
git_vector_clear
(
&
remote
->
active_refspecs
);
return
dwim_refspecs
(
&
remote
->
active_refspecs
,
&
remote
->
refspecs
,
&
remote
->
refs
);
}
}
int
git_remote_set_fetch_refspecs
(
git_remote
*
remote
,
git_strarray
*
array
)
int
git_remote_set_fetch_refspecs
(
git_remote
*
remote
,
git_strarray
*
array
)
...
...
src/remote.h
View file @
8be28acf
...
@@ -23,6 +23,7 @@ struct git_remote {
...
@@ -23,6 +23,7 @@ struct git_remote {
git_vector
refs
;
git_vector
refs
;
git_vector
refspecs
;
git_vector
refspecs
;
git_vector
active_refspecs
;
git_vector
active_refspecs
;
git_vector
passive_refspecs
;
git_transport_cb
transport_cb
;
git_transport_cb
transport_cb
;
void
*
transport_cb_payload
;
void
*
transport_cb_payload
;
git_transport
*
transport
;
git_transport
*
transport
;
...
@@ -32,6 +33,7 @@ struct git_remote {
...
@@ -32,6 +33,7 @@ struct git_remote {
unsigned
int
need_pack
;
unsigned
int
need_pack
;
git_remote_autotag_option_t
download_tags
;
git_remote_autotag_option_t
download_tags
;
int
update_fetchhead
;
int
update_fetchhead
;
int
passed_refspecs
;
};
};
const
char
*
git_remote__urlfordirection
(
struct
git_remote
*
remote
,
int
direction
);
const
char
*
git_remote__urlfordirection
(
struct
git_remote
*
remote
,
int
direction
);
...
...
tests/fetchhead/nonetwork.c
View file @
8be28acf
...
@@ -335,7 +335,7 @@ void test_fetchhead_nonetwork__unborn_with_upstream(void)
...
@@ -335,7 +335,7 @@ void test_fetchhead_nonetwork__unborn_with_upstream(void)
cl_git_pass
(
git_remote_set_url
(
remote
,
cl_fixture
(
"testrepo.git"
)));
cl_git_pass
(
git_remote_set_url
(
remote
,
cl_fixture
(
"testrepo.git"
)));
cl_git_pass
(
git_remote_save
(
remote
));
cl_git_pass
(
git_remote_save
(
remote
));
cl_git_pass
(
git_remote_fetch
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_fetch
(
remote
,
NULL
,
NULL
,
NULL
));
git_remote_free
(
remote
);
git_remote_free
(
remote
);
cl_git_pass
(
git_repository_fetchhead_foreach
(
repo
,
assert_master_for_merge
,
NULL
));
cl_git_pass
(
git_repository_fetchhead_foreach
(
repo
,
assert_master_for_merge
,
NULL
));
...
...
tests/network/fetchlocal.c
View file @
8be28acf
...
@@ -36,7 +36,7 @@ void test_network_fetchlocal__complete(void)
...
@@ -36,7 +36,7 @@ void test_network_fetchlocal__complete(void)
cl_git_pass
(
git_remote_create
(
&
origin
,
repo
,
GIT_REMOTE_ORIGIN
,
url
));
cl_git_pass
(
git_remote_create
(
&
origin
,
repo
,
GIT_REMOTE_ORIGIN
,
url
));
git_remote_set_callbacks
(
origin
,
&
callbacks
);
git_remote_set_callbacks
(
origin
,
&
callbacks
);
cl_git_pass
(
git_remote_connect
(
origin
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_connect
(
origin
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_download
(
origin
));
cl_git_pass
(
git_remote_download
(
origin
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
origin
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
origin
,
NULL
,
NULL
));
cl_git_pass
(
git_reference_list
(
&
refnames
,
repo
));
cl_git_pass
(
git_reference_list
(
&
refnames
,
repo
));
...
@@ -74,7 +74,7 @@ void test_network_fetchlocal__partial(void)
...
@@ -74,7 +74,7 @@ void test_network_fetchlocal__partial(void)
cl_git_pass
(
git_remote_create
(
&
origin
,
repo
,
GIT_REMOTE_ORIGIN
,
url
));
cl_git_pass
(
git_remote_create
(
&
origin
,
repo
,
GIT_REMOTE_ORIGIN
,
url
));
git_remote_set_callbacks
(
origin
,
&
callbacks
);
git_remote_set_callbacks
(
origin
,
&
callbacks
);
cl_git_pass
(
git_remote_connect
(
origin
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_connect
(
origin
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_download
(
origin
));
cl_git_pass
(
git_remote_download
(
origin
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
origin
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
origin
,
NULL
,
NULL
));
git_strarray_free
(
&
refnames
);
git_strarray_free
(
&
refnames
);
...
...
tests/network/remote/local.c
View file @
8be28acf
...
@@ -116,16 +116,20 @@ void test_network_remote_local__nested_tags_are_completely_peeled(void)
...
@@ -116,16 +116,20 @@ void test_network_remote_local__nested_tags_are_completely_peeled(void)
void
test_network_remote_local__shorthand_fetch_refspec0
(
void
)
void
test_network_remote_local__shorthand_fetch_refspec0
(
void
)
{
{
const
char
*
refspec
=
"master:remotes/sloppy/master"
;
char
*
refspec_strings
[]
=
{
const
char
*
refspec2
=
"master:boh/sloppy/master"
;
"master:remotes/sloppy/master"
,
"master:boh/sloppy/master"
,
};
git_strarray
array
=
{
refspec_strings
,
2
,
};
git_reference
*
ref
;
git_reference
*
ref
;
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
refspec
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
refspec2
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
&
array
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_reference_lookup
(
&
ref
,
repo
,
"refs/remotes/sloppy/master"
));
cl_git_pass
(
git_reference_lookup
(
&
ref
,
repo
,
"refs/remotes/sloppy/master"
));
...
@@ -137,17 +141,21 @@ void test_network_remote_local__shorthand_fetch_refspec0(void)
...
@@ -137,17 +141,21 @@ void test_network_remote_local__shorthand_fetch_refspec0(void)
void
test_network_remote_local__shorthand_fetch_refspec1
(
void
)
void
test_network_remote_local__shorthand_fetch_refspec1
(
void
)
{
{
const
char
*
refspec
=
"master"
;
char
*
refspec_strings
[]
=
{
const
char
*
refspec2
=
"hard_tag"
;
"master"
,
"hard_tag"
,
};
git_strarray
array
=
{
refspec_strings
,
2
,
};
git_reference
*
ref
;
git_reference
*
ref
;
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
git_remote_clear_refspecs
(
remote
);
git_remote_clear_refspecs
(
remote
);
cl_git_pass
(
git_remote_add_fetch
(
remote
,
refspec
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
refspec2
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
&
array
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_fail
(
git_reference_lookup
(
&
ref
,
repo
,
"refs/remotes/master"
));
cl_git_fail
(
git_reference_lookup
(
&
ref
,
repo
,
"refs/remotes/master"
));
...
@@ -162,7 +170,7 @@ void test_network_remote_local__tagopt(void)
...
@@ -162,7 +170,7 @@ void test_network_remote_local__tagopt(void)
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
git_remote_set_autotag
(
remote
,
GIT_REMOTE_DOWNLOAD_TAGS_ALL
);
git_remote_set_autotag
(
remote
,
GIT_REMOTE_DOWNLOAD_TAGS_ALL
);
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
...
@@ -174,14 +182,20 @@ void test_network_remote_local__tagopt(void)
...
@@ -174,14 +182,20 @@ void test_network_remote_local__tagopt(void)
void
test_network_remote_local__push_to_bare_remote
(
void
)
void
test_network_remote_local__push_to_bare_remote
(
void
)
{
{
char
*
refspec_strings
[]
=
{
"master:master"
,
};
git_strarray
array
=
{
refspec_strings
,
1
,
};
/* Should be able to push to a bare remote */
/* Should be able to push to a bare remote */
git_remote
*
localremote
;
git_remote
*
localremote
;
git_push
*
push
;
git_push
*
push
;
/* Get some commits */
/* Get some commits */
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
"master:master"
));
cl_git_pass
(
git_remote_download
(
remote
,
&
array
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
...
@@ -210,6 +224,13 @@ void test_network_remote_local__push_to_bare_remote(void)
...
@@ -210,6 +224,13 @@ void test_network_remote_local__push_to_bare_remote(void)
void
test_network_remote_local__push_to_bare_remote_with_file_url
(
void
)
void
test_network_remote_local__push_to_bare_remote_with_file_url
(
void
)
{
{
char
*
refspec_strings
[]
=
{
"master:master"
,
};
git_strarray
array
=
{
refspec_strings
,
1
,
};
/* Should be able to push to a bare remote */
/* Should be able to push to a bare remote */
git_remote
*
localremote
;
git_remote
*
localremote
;
git_push
*
push
;
git_push
*
push
;
...
@@ -217,8 +238,7 @@ void test_network_remote_local__push_to_bare_remote_with_file_url(void)
...
@@ -217,8 +238,7 @@ void test_network_remote_local__push_to_bare_remote_with_file_url(void)
/* Get some commits */
/* Get some commits */
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
"master:master"
));
cl_git_pass
(
git_remote_download
(
remote
,
&
array
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
...
@@ -251,14 +271,20 @@ void test_network_remote_local__push_to_bare_remote_with_file_url(void)
...
@@ -251,14 +271,20 @@ void test_network_remote_local__push_to_bare_remote_with_file_url(void)
void
test_network_remote_local__push_to_non_bare_remote
(
void
)
void
test_network_remote_local__push_to_non_bare_remote
(
void
)
{
{
char
*
refspec_strings
[]
=
{
"master:master"
,
};
git_strarray
array
=
{
refspec_strings
,
1
,
};
/* Shouldn't be able to push to a non-bare remote */
/* Shouldn't be able to push to a non-bare remote */
git_remote
*
localremote
;
git_remote
*
localremote
;
git_push
*
push
;
git_push
*
push
;
/* Get some commits */
/* Get some commits */
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
"master:master"
));
cl_git_pass
(
git_remote_download
(
remote
,
&
array
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
...
@@ -287,7 +313,13 @@ void test_network_remote_local__push_to_non_bare_remote(void)
...
@@ -287,7 +313,13 @@ void test_network_remote_local__push_to_non_bare_remote(void)
void
test_network_remote_local__fetch
(
void
)
void
test_network_remote_local__fetch
(
void
)
{
{
const
char
*
refspec
=
"master:remotes/sloppy/master"
;
char
*
refspec_strings
[]
=
{
"master:remotes/sloppy/master"
,
};
git_strarray
array
=
{
refspec_strings
,
1
,
};
git_reflog
*
log
;
git_reflog
*
log
;
const
git_reflog_entry
*
entry
;
const
git_reflog_entry
*
entry
;
...
@@ -297,9 +329,8 @@ void test_network_remote_local__fetch(void)
...
@@ -297,9 +329,8 @@ void test_network_remote_local__fetch(void)
cl_git_pass
(
git_signature_now
(
&
sig
,
"Foo Bar"
,
"foo@example.com"
));
cl_git_pass
(
git_signature_now
(
&
sig
,
"Foo Bar"
,
"foo@example.com"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
refspec
));
cl_git_pass
(
git_remote_fetch
(
remote
,
sig
,
"UPDAAAAAATE!!"
));
cl_git_pass
(
git_remote_fetch
(
remote
,
&
array
,
sig
,
"UPDAAAAAATE!!"
));
cl_git_pass
(
git_reference_lookup
(
&
ref
,
repo
,
"refs/remotes/sloppy/master"
));
cl_git_pass
(
git_reference_lookup
(
&
ref
,
repo
,
"refs/remotes/sloppy/master"
));
git_reference_free
(
ref
);
git_reference_free
(
ref
);
...
@@ -316,7 +347,13 @@ void test_network_remote_local__fetch(void)
...
@@ -316,7 +347,13 @@ void test_network_remote_local__fetch(void)
void
test_network_remote_local__reflog
(
void
)
void
test_network_remote_local__reflog
(
void
)
{
{
const
char
*
refspec
=
"master:remotes/sloppy/master"
;
char
*
refspec_strings
[]
=
{
"master:remotes/sloppy/master"
,
};
git_strarray
array
=
{
refspec_strings
,
1
,
};
git_reflog
*
log
;
git_reflog
*
log
;
const
git_reflog_entry
*
entry
;
const
git_reflog_entry
*
entry
;
...
@@ -325,9 +362,8 @@ void test_network_remote_local__reflog(void)
...
@@ -325,9 +362,8 @@ void test_network_remote_local__reflog(void)
cl_git_pass
(
git_signature_now
(
&
sig
,
"Foo Bar"
,
"foo@example.com"
));
cl_git_pass
(
git_signature_now
(
&
sig
,
"Foo Bar"
,
"foo@example.com"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
refspec
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
&
array
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
sig
,
"UPDAAAAAATE!!"
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
sig
,
"UPDAAAAAATE!!"
));
cl_git_pass
(
git_reflog_read
(
&
log
,
repo
,
"refs/remotes/sloppy/master"
));
cl_git_pass
(
git_reflog_read
(
&
log
,
repo
,
"refs/remotes/sloppy/master"
));
...
@@ -342,7 +378,13 @@ void test_network_remote_local__reflog(void)
...
@@ -342,7 +378,13 @@ void test_network_remote_local__reflog(void)
void
test_network_remote_local__fetch_default_reflog_message
(
void
)
void
test_network_remote_local__fetch_default_reflog_message
(
void
)
{
{
const
char
*
refspec
=
"master:remotes/sloppy/master"
;
char
*
refspec_strings
[]
=
{
"master:remotes/sloppy/master"
,
};
git_strarray
array
=
{
refspec_strings
,
1
,
};
git_reflog
*
log
;
git_reflog
*
log
;
const
git_reflog_entry
*
entry
;
const
git_reflog_entry
*
entry
;
...
@@ -352,9 +394,8 @@ void test_network_remote_local__fetch_default_reflog_message(void)
...
@@ -352,9 +394,8 @@ void test_network_remote_local__fetch_default_reflog_message(void)
cl_git_pass
(
git_signature_now
(
&
sig
,
"Foo Bar"
,
"foo@example.com"
));
cl_git_pass
(
git_signature_now
(
&
sig
,
"Foo Bar"
,
"foo@example.com"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
connect_to_local_repository
(
cl_fixture
(
"testrepo.git"
));
cl_git_pass
(
git_remote_add_fetch
(
remote
,
refspec
));
cl_git_pass
(
git_remote_fetch
(
remote
,
sig
,
NULL
));
cl_git_pass
(
git_remote_fetch
(
remote
,
&
array
,
sig
,
NULL
));
cl_git_pass
(
git_reflog_read
(
&
log
,
repo
,
"refs/remotes/sloppy/master"
));
cl_git_pass
(
git_reflog_read
(
&
log
,
repo
,
"refs/remotes/sloppy/master"
));
cl_assert_equal_i
(
1
,
git_reflog_entrycount
(
log
));
cl_assert_equal_i
(
1
,
git_reflog_entrycount
(
log
));
...
@@ -367,3 +408,24 @@ void test_network_remote_local__fetch_default_reflog_message(void)
...
@@ -367,3 +408,24 @@ void test_network_remote_local__fetch_default_reflog_message(void)
git_reflog_free
(
log
);
git_reflog_free
(
log
);
git_signature_free
(
sig
);
git_signature_free
(
sig
);
}
}
void
test_network_remote_local__opportunistic_update
(
void
)
{
git_reference
*
ref
;
char
*
refspec_strings
[]
=
{
"master"
,
};
git_strarray
array
=
{
refspec_strings
,
1
,
};
/* this remote has a passive refspec of "refs/heads/<star>:refs/remotes/origin/<star>" */
cl_git_pass
(
git_remote_create
(
&
remote
,
repo
,
"origin"
,
cl_git_fixture_url
(
"testrepo.git"
)));
/* and we pass the active refspec "master" */
cl_git_pass
(
git_remote_fetch
(
remote
,
&
array
,
NULL
,
NULL
));
/* and we expect that to update our copy of origin's master */
cl_git_pass
(
git_reference_lookup
(
&
ref
,
repo
,
"refs/remotes/origin/master"
));
git_reference_free
(
ref
);
}
tests/online/fetch.c
View file @
8be28acf
...
@@ -47,7 +47,7 @@ static void do_fetch(const char *url, git_remote_autotag_option_t flag, int n)
...
@@ -47,7 +47,7 @@ static void do_fetch(const char *url, git_remote_autotag_option_t flag, int n)
git_remote_set_callbacks
(
remote
,
&
callbacks
);
git_remote_set_callbacks
(
remote
,
&
callbacks
);
git_remote_set_autotag
(
remote
,
flag
);
git_remote_set_autotag
(
remote
,
flag
);
cl_git_pass
(
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
cl_assert_equal_i
(
counter
,
n
);
cl_assert_equal_i
(
counter
,
n
);
...
@@ -86,11 +86,11 @@ void test_online_fetch__fetch_twice(void)
...
@@ -86,11 +86,11 @@ void test_online_fetch__fetch_twice(void)
git_remote
*
remote
;
git_remote
*
remote
;
cl_git_pass
(
git_remote_create
(
&
remote
,
_repo
,
"test"
,
"git://github.com/libgit2/TestGitRepository.git"
));
cl_git_pass
(
git_remote_create
(
&
remote
,
_repo
,
"test"
,
"git://github.com/libgit2/TestGitRepository.git"
));
cl_git_pass
(
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
NULL
));
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
);
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
);
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
NULL
));
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
git_remote_free
(
remote
);
git_remote_free
(
remote
);
...
@@ -128,7 +128,7 @@ void test_online_fetch__doesnt_retrieve_a_pack_when_the_repository_is_up_to_date
...
@@ -128,7 +128,7 @@ void test_online_fetch__doesnt_retrieve_a_pack_when_the_repository_is_up_to_date
callbacks
.
transfer_progress
=
&
transferProgressCallback
;
callbacks
.
transfer_progress
=
&
transferProgressCallback
;
callbacks
.
payload
=
&
invoked
;
callbacks
.
payload
=
&
invoked
;
git_remote_set_callbacks
(
remote
,
&
callbacks
);
git_remote_set_callbacks
(
remote
,
&
callbacks
);
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
NULL
));
cl_assert_equal_i
(
false
,
invoked
);
cl_assert_equal_i
(
false
,
invoked
);
...
@@ -162,7 +162,7 @@ void test_online_fetch__can_cancel(void)
...
@@ -162,7 +162,7 @@ void test_online_fetch__can_cancel(void)
git_remote_set_callbacks
(
remote
,
&
callbacks
);
git_remote_set_callbacks
(
remote
,
&
callbacks
);
cl_git_pass
(
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
));
cl_git_fail_with
(
git_remote_download
(
remote
),
-
4321
);
cl_git_fail_with
(
git_remote_download
(
remote
,
NULL
),
-
4321
);
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
git_remote_free
(
remote
);
git_remote_free
(
remote
);
}
}
...
...
tests/online/fetchhead.c
View file @
8be28acf
...
@@ -40,17 +40,19 @@ static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fet
...
@@ -40,17 +40,19 @@ static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fet
git_remote
*
remote
;
git_remote
*
remote
;
git_buf
fetchhead_buf
=
GIT_BUF_INIT
;
git_buf
fetchhead_buf
=
GIT_BUF_INIT
;
int
equals
=
0
;
int
equals
=
0
;
git_strarray
array
,
*
active_refs
=
NULL
;
cl_git_pass
(
git_remote_load
(
&
remote
,
g_repo
,
"origin"
));
cl_git_pass
(
git_remote_load
(
&
remote
,
g_repo
,
"origin"
));
git_remote_set_autotag
(
remote
,
GIT_REMOTE_DOWNLOAD_TAGS_AUTO
);
git_remote_set_autotag
(
remote
,
GIT_REMOTE_DOWNLOAD_TAGS_AUTO
);
if
(
fetchspec
!=
NULL
)
{
if
(
fetchspec
!=
NULL
)
{
git_remote_clear_refspecs
(
remote
);
array
.
count
=
1
;
git_remote_add_fetch
(
remote
,
fetchspec
);
array
.
strings
=
(
char
**
)
&
fetchspec
;
active_refs
=
&
array
;
}
}
cl_git_pass
(
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_connect
(
remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_download
(
remote
));
cl_git_pass
(
git_remote_download
(
remote
,
active_refs
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
remote
,
NULL
,
NULL
));
git_remote_disconnect
(
remote
);
git_remote_disconnect
(
remote
);
git_remote_free
(
remote
);
git_remote_free
(
remote
);
...
...
tests/online/push.c
View file @
8be28acf
...
@@ -408,7 +408,7 @@ void test_online_push__initialize(void)
...
@@ -408,7 +408,7 @@ void test_online_push__initialize(void)
/* Now that we've deleted everything, fetch from the remote */
/* Now that we've deleted everything, fetch from the remote */
cl_git_pass
(
git_remote_connect
(
_remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_connect
(
_remote
,
GIT_DIRECTION_FETCH
));
cl_git_pass
(
git_remote_download
(
_remote
));
cl_git_pass
(
git_remote_download
(
_remote
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
_remote
,
NULL
,
NULL
));
cl_git_pass
(
git_remote_update_tips
(
_remote
,
NULL
,
NULL
));
git_remote_disconnect
(
_remote
);
git_remote_disconnect
(
_remote
);
}
}
...
...
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