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
8443ed6c
Commit
8443ed6c
authored
Apr 25, 2014
by
Vicent Marti
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2284 from jacquesg/push-progress-callback
Fire progress and update tips callbacks also for pushes.
parents
332e4f20
f70cfd34
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
182 additions
and
121 deletions
+182
-121
examples/network/fetch.c
+1
-1
include/git2/indexer.h
+1
-1
include/git2/odb.h
+1
-1
include/git2/pack.h
+1
-1
include/git2/remote.h
+3
-3
include/git2/sys/odb_backend.h
+1
-1
include/git2/transport.h
+1
-1
include/git2/types.h
+1
-1
src/fetch.h
+1
-1
src/indexer.c
+2
-2
src/odb.c
+1
-1
src/odb_pack.c
+1
-1
src/pack-objects.c
+1
-1
src/push.c
+30
-20
src/remote.c
+2
-2
src/transports/local.c
+2
-2
src/transports/smart.h
+1
-1
src/transports/smart_pkt.c
+2
-2
src/transports/smart_protocol.c
+46
-43
tests/online/push.c
+83
-35
No files found.
examples/network/fetch.c
View file @
8443ed6c
...
...
@@ -97,7 +97,7 @@ int fetch(git_repository *repo, int argc, char **argv)
// Set up the callbacks (only update_tips for now)
callbacks
.
update_tips
=
&
update_cb
;
callbacks
.
progress
=
&
progress_cb
;
callbacks
.
sideband_
progress
=
&
progress_cb
;
callbacks
.
credentials
=
cred_acquire_cb
;
git_remote_set_callbacks
(
remote
,
&
callbacks
);
...
...
include/git2/indexer.h
View file @
8443ed6c
...
...
@@ -32,7 +32,7 @@ GIT_EXTERN(int) git_indexer_new(
const
char
*
path
,
unsigned
int
mode
,
git_odb
*
odb
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_cb_payload
);
/**
...
...
include/git2/odb.h
View file @
8443ed6c
...
...
@@ -338,7 +338,7 @@ GIT_EXTERN(int) git_odb_open_rstream(git_odb_stream **out, git_odb *db, const gi
GIT_EXTERN
(
int
)
git_odb_write_pack
(
git_odb_writepack
**
out
,
git_odb
*
db
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
);
/**
...
...
include/git2/pack.h
View file @
8443ed6c
...
...
@@ -140,7 +140,7 @@ GIT_EXTERN(int) git_packbuilder_write(
git_packbuilder
*
pb
,
const
char
*
path
,
unsigned
int
mode
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_cb_payload
);
/**
...
...
include/git2/remote.h
View file @
8443ed6c
...
...
@@ -457,7 +457,7 @@ struct git_remote_callbacks {
* progress side-band will be passed to this function (this is
* the 'counting objects' output.
*/
int
(
*
progress
)(
const
char
*
str
,
int
len
,
void
*
data
)
;
git_transport_message_cb
sideband_progress
;
/**
* Completion is called when different parts of the download
...
...
@@ -472,14 +472,14 @@ struct git_remote_callbacks {
* Returning GIT_PASSTHROUGH will make libgit2 behave as
* though this field isn't set.
*/
int
(
*
credentials
)(
git_cred
**
cred
,
const
char
*
url
,
const
char
*
username_from_url
,
unsigned
int
allowed_types
,
void
*
data
)
;
git_cred_acquire_cb
credentials
;
/**
* During the download of new data, this will be regularly
* called with the current count of progress done by the
* indexer.
*/
int
(
*
transfer_progress
)(
const
git_transfer_progress
*
stats
,
void
*
data
)
;
git_transfer_progress_cb
transfer_progress
;
/**
* Each time a reference is updated locally, this function
...
...
include/git2/sys/odb_backend.h
View file @
8443ed6c
...
...
@@ -81,7 +81,7 @@ struct git_odb_backend {
int
(
*
writepack
)(
git_odb_writepack
**
,
git_odb_backend
*
,
git_odb
*
odb
,
git_transfer_progress_c
allback
progress_cb
,
void
*
progress_payload
);
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
);
void
(
*
free
)(
git_odb_backend
*
);
};
...
...
include/git2/transport.h
View file @
8443ed6c
...
...
@@ -287,7 +287,7 @@ struct git_transport {
git_transport
*
transport
,
git_repository
*
repo
,
git_transfer_progress
*
stats
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
);
/* Checks to see if the transport is connected */
...
...
include/git2/types.h
View file @
8443ed6c
...
...
@@ -241,7 +241,7 @@ typedef struct git_transfer_progress {
* @param stats Structure containing information about the state of the transfer
* @param payload Payload provided by caller
*/
typedef
int
(
*
git_transfer_progress_c
allback
)(
const
git_transfer_progress
*
stats
,
void
*
payload
);
typedef
int
(
*
git_transfer_progress_c
b
)(
const
git_transfer_progress
*
stats
,
void
*
payload
);
/**
* Opaque structure representing a submodule.
...
...
src/fetch.h
View file @
8443ed6c
...
...
@@ -17,7 +17,7 @@ int git_fetch__download_pack(
git_transport
*
t
,
git_repository
*
repo
,
git_transfer_progress
*
stats
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
);
int
git_fetch_setup_walk
(
git_revwalk
**
out
,
git_repository
*
repo
);
...
...
src/indexer.c
View file @
8443ed6c
...
...
@@ -45,7 +45,7 @@ struct git_indexer {
unsigned
int
fanout
[
256
];
git_hash_ctx
hash_ctx
;
git_oid
hash
;
git_transfer_progress_c
allback
progress_cb
;
git_transfer_progress_c
b
progress_cb
;
void
*
progress_payload
;
char
objbuf
[
8
*
1024
];
...
...
@@ -120,7 +120,7 @@ int git_indexer_new(
const
char
*
prefix
,
unsigned
int
mode
,
git_odb
*
odb
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
)
{
git_indexer
*
idx
;
...
...
src/odb.c
View file @
8443ed6c
...
...
@@ -1051,7 +1051,7 @@ int git_odb_open_rstream(git_odb_stream **stream, git_odb *db, const git_oid *oi
return
error
;
}
int
git_odb_write_pack
(
struct
git_odb_writepack
**
out
,
git_odb
*
db
,
git_transfer_progress_c
allback
progress_cb
,
void
*
progress_payload
)
int
git_odb_write_pack
(
struct
git_odb_writepack
**
out
,
git_odb
*
db
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
)
{
size_t
i
,
writes
=
0
;
int
error
=
GIT_ERROR
;
...
...
src/odb_pack.c
View file @
8443ed6c
...
...
@@ -563,7 +563,7 @@ static void pack_backend__writepack_free(struct git_odb_writepack *_writepack)
static
int
pack_backend__writepack
(
struct
git_odb_writepack
**
out
,
git_odb_backend
*
_backend
,
git_odb
*
odb
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
)
{
struct
pack_backend
*
backend
;
...
...
src/pack-objects.c
View file @
8443ed6c
...
...
@@ -1288,7 +1288,7 @@ int git_packbuilder_write(
git_packbuilder
*
pb
,
const
char
*
path
,
unsigned
int
mode
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_cb_payload
)
{
git_indexer
*
indexer
;
...
...
src/push.c
View file @
8443ed6c
...
...
@@ -208,9 +208,7 @@ int git_push_update_tips(
int
error
=
0
;
git_vector_foreach
(
&
push
->
status
,
i
,
status
)
{
/* If this ref update was successful (ok, not ng), it will have an empty message */
if
(
status
->
msg
)
continue
;
int
fire_callback
=
1
;
/* Find the corresponding remote ref */
fetch_spec
=
git_remote__matching_refspec
(
push
->
remote
,
status
->
ref
);
...
...
@@ -230,24 +228,38 @@ int git_push_update_tips(
if
(
j
==
push
->
specs
.
length
)
continue
;
/* Update the remote ref */
if
(
git_oid_iszero
(
&
push_spec
->
loid
))
{
error
=
git_reference_lookup
(
&
remote_ref
,
push
->
remote
->
repo
,
git_buf_cstr
(
&
remote_ref_name
));
/* If this ref update was successful (ok, not ng), it will have an empty message */
if
(
status
->
msg
==
NULL
)
{
/* Update the remote ref */
if
(
git_oid_iszero
(
&
push_spec
->
loid
))
{
error
=
git_reference_lookup
(
&
remote_ref
,
push
->
remote
->
repo
,
git_buf_cstr
(
&
remote_ref_name
));
if
(
!
error
)
{
if
((
error
=
git_reference_delete
(
remote_ref
))
<
0
)
{
if
(
error
>=
0
)
{
error
=
git_reference_delete
(
remote_ref
);
git_reference_free
(
remote_ref
);
goto
on_error
;
}
git_reference_free
(
remote_ref
);
}
else
if
(
error
==
GIT_ENOTFOUND
)
giterr_clear
();
else
}
else
{
error
=
git_reference_create
(
NULL
,
push
->
remote
->
repo
,
git_buf_cstr
(
&
remote_ref_name
),
&
push_spec
->
loid
,
1
,
signature
,
reflog_message
?
reflog_message
:
"update by push"
);
}
}
if
(
error
<
0
)
{
if
(
error
!=
GIT_ENOTFOUND
)
goto
on_error
;
}
else
if
((
error
=
git_reference_create
(
NULL
,
push
->
remote
->
repo
,
git_buf_cstr
(
&
remote_ref_name
),
&
push_spec
->
loid
,
1
,
signature
,
reflog_message
?
reflog_message
:
"update by push"
))
<
0
)
goto
on_error
;
giterr_clear
();
fire_callback
=
0
;
}
if
(
fire_callback
&&
push
->
remote
->
callbacks
.
update_tips
)
{
error
=
push
->
remote
->
callbacks
.
update_tips
(
git_buf_cstr
(
&
remote_ref_name
),
&
push_spec
->
roid
,
&
push_spec
->
loid
,
push
->
remote
->
callbacks
.
payload
);
if
(
error
<
0
)
goto
on_error
;
}
}
error
=
0
;
...
...
@@ -677,9 +689,7 @@ void git_push_status_free(push_status *status)
if
(
status
==
NULL
)
return
;
if
(
status
->
msg
)
git__free
(
status
->
msg
);
git__free
(
status
->
msg
);
git__free
(
status
->
ref
);
git__free
(
status
);
}
...
...
src/remote.c
View file @
8443ed6c
...
...
@@ -663,7 +663,7 @@ int git_remote_connect(git_remote *remote, git_direction direction)
return
error
;
if
(
t
->
set_callbacks
&&
(
error
=
t
->
set_callbacks
(
t
,
remote
->
callbacks
.
progress
,
NULL
,
remote
->
callbacks
.
payload
))
<
0
)
(
error
=
t
->
set_callbacks
(
t
,
remote
->
callbacks
.
sideband_
progress
,
NULL
,
remote
->
callbacks
.
payload
))
<
0
)
goto
on_error
;
if
(
!
remote
->
check_cert
)
...
...
@@ -1246,7 +1246,7 @@ int git_remote_set_callbacks(git_remote *remote, const git_remote_callbacks *cal
if
(
remote
->
transport
&&
remote
->
transport
->
set_callbacks
)
return
remote
->
transport
->
set_callbacks
(
remote
->
transport
,
remote
->
callbacks
.
progress
,
remote
->
callbacks
.
sideband_
progress
,
NULL
,
remote
->
callbacks
.
payload
);
...
...
src/transports/local.c
View file @
8443ed6c
...
...
@@ -472,7 +472,7 @@ on_error:
typedef
struct
foreach_data
{
git_transfer_progress
*
stats
;
git_transfer_progress_c
allback
progress_cb
;
git_transfer_progress_c
b
progress_cb
;
void
*
progress_payload
;
git_odb_writepack
*
writepack
;
}
foreach_data
;
...
...
@@ -489,7 +489,7 @@ static int local_download_pack(
git_transport
*
transport
,
git_repository
*
repo
,
git_transfer_progress
*
stats
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
)
{
transport_local
*
t
=
(
transport_local
*
)
transport
;
...
...
src/transports/smart.h
View file @
8443ed6c
...
...
@@ -167,7 +167,7 @@ int git_smart__download_pack(
git_transport
*
transport
,
git_repository
*
repo
,
git_transfer_progress
*
stats
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
progress_cb
,
void
*
progress_payload
);
/* smart.c */
...
...
src/transports/smart_pkt.c
View file @
8443ed6c
...
...
@@ -153,7 +153,7 @@ static int data_pkt(git_pkt **out, const char *line, size_t len)
return
0
;
}
static
int
progress_pkt
(
git_pkt
**
out
,
const
char
*
line
,
size_t
len
)
static
int
sideband_
progress_pkt
(
git_pkt
**
out
,
const
char
*
line
,
size_t
len
)
{
git_pkt_progress
*
pkt
;
...
...
@@ -403,7 +403,7 @@ int git_pkt_parse_line(
if
(
*
line
==
GIT_SIDE_BAND_DATA
)
ret
=
data_pkt
(
head
,
line
,
len
);
else
if
(
*
line
==
GIT_SIDE_BAND_PROGRESS
)
ret
=
progress_pkt
(
head
,
line
,
len
);
ret
=
sideband_
progress_pkt
(
head
,
line
,
len
);
else
if
(
*
line
==
GIT_SIDE_BAND_ERROR
)
ret
=
sideband_error_pkt
(
head
,
line
,
len
);
else
if
(
!
git__prefixcmp
(
line
,
"ACK"
))
...
...
src/transports/smart_protocol.c
View file @
8443ed6c
...
...
@@ -450,7 +450,7 @@ static int no_sideband(transport_smart *t, struct git_odb_writepack *writepack,
struct
network_packetsize_payload
{
git_transfer_progress_c
allback
callback
;
git_transfer_progress_c
b
callback
;
void
*
payload
;
git_transfer_progress
*
stats
;
size_t
last_fired_bytes
;
...
...
@@ -478,7 +478,7 @@ int git_smart__download_pack(
git_transport
*
transport
,
git_repository
*
repo
,
git_transfer_progress
*
stats
,
git_transfer_progress_c
allback
progress_cb
,
git_transfer_progress_c
b
transfer_
progress_cb
,
void
*
progress_payload
)
{
transport_smart
*
t
=
(
transport_smart
*
)
transport
;
...
...
@@ -490,8 +490,8 @@ int git_smart__download_pack(
memset
(
stats
,
0
,
sizeof
(
git_transfer_progress
));
if
(
progress_cb
)
{
npp
.
callback
=
progress_cb
;
if
(
transfer_
progress_cb
)
{
npp
.
callback
=
transfer_
progress_cb
;
npp
.
payload
=
progress_payload
;
npp
.
stats
=
stats
;
t
->
packetsize_cb
=
&
network_packetsize
;
...
...
@@ -504,7 +504,7 @@ int git_smart__download_pack(
}
if
((
error
=
git_repository_odb__weakptr
(
&
odb
,
repo
))
<
0
||
((
error
=
git_odb_write_pack
(
&
writepack
,
odb
,
progress_cb
,
progress_payload
))
!=
0
))
((
error
=
git_odb_write_pack
(
&
writepack
,
odb
,
transfer_
progress_cb
,
progress_payload
))
!=
0
))
goto
done
;
/*
...
...
@@ -518,7 +518,7 @@ int git_smart__download_pack(
}
do
{
git_pkt
*
pkt
;
git_pkt
*
pkt
=
NULL
;
/* Check cancellation before network call */
if
(
t
->
cancelled
.
val
)
{
...
...
@@ -527,40 +527,34 @@ int git_smart__download_pack(
goto
done
;
}
if
((
error
=
recv_pkt
(
&
pkt
,
buf
))
<
0
)
goto
done
;
/* Check cancellation after network call */
if
(
t
->
cancelled
.
val
)
{
giterr_clear
();
error
=
GIT_EUSER
;
goto
done
;
if
((
error
=
recv_pkt
(
&
pkt
,
buf
))
>=
0
)
{
/* Check cancellation after network call */
if
(
t
->
cancelled
.
val
)
{
giterr_clear
();
error
=
GIT_EUSER
;
}
else
if
(
pkt
->
type
==
GIT_PKT_PROGRESS
)
{
if
(
t
->
progress_cb
)
{
git_pkt_progress
*
p
=
(
git_pkt_progress
*
)
pkt
;
error
=
t
->
progress_cb
(
p
->
data
,
p
->
len
,
t
->
message_cb_payload
);
}
}
else
if
(
pkt
->
type
==
GIT_PKT_DATA
)
{
git_pkt_data
*
p
=
(
git_pkt_data
*
)
pkt
;
error
=
writepack
->
append
(
writepack
,
p
->
data
,
p
->
len
,
stats
);
}
else
if
(
pkt
->
type
==
GIT_PKT_FLUSH
)
{
/* A flush indicates the end of the packfile */
git__free
(
pkt
);
break
;
}
}
if
(
pkt
->
type
==
GIT_PKT_PROGRESS
)
{
if
(
t
->
progress_cb
)
{
git_pkt_progress
*
p
=
(
git_pkt_progress
*
)
pkt
;
error
=
t
->
progress_cb
(
p
->
data
,
p
->
len
,
t
->
message_cb_payload
);
if
(
error
)
goto
done
;
}
git__free
(
pkt
);
}
else
if
(
pkt
->
type
==
GIT_PKT_DATA
)
{
git_pkt_data
*
p
=
(
git_pkt_data
*
)
pkt
;
error
=
writepack
->
append
(
writepack
,
p
->
data
,
p
->
len
,
stats
);
git__free
(
pkt
);
if
(
error
<
0
)
goto
done
;
git__free
(
pkt
);
if
(
error
!=
0
)
goto
done
;
}
else
if
(
pkt
->
type
==
GIT_PKT_FLUSH
)
{
/* A flush indicates the end of the packfile */
git__free
(
pkt
);
break
;
}
}
while
(
1
);
/*
* Trailing execution of progress_cb, if necessary...
* Trailing execution of
transfer_
progress_cb, if necessary...
* Only the callback through the npp datastructure currently
* updates the last_fired_bytes value. It is possible that
* progress has already been reported with the correct
...
...
@@ -579,7 +573,7 @@ int git_smart__download_pack(
done:
if
(
writepack
)
writepack
->
free
(
writepack
);
if
(
progress_cb
)
{
if
(
transfer_
progress_cb
)
{
t
->
packetsize_cb
=
NULL
;
t
->
packetsize_payload
=
NULL
;
}
...
...
@@ -634,7 +628,7 @@ static int add_push_report_pkt(git_push *push, git_pkt *pkt)
switch
(
pkt
->
type
)
{
case
GIT_PKT_OK
:
status
=
git__calloc
(
1
,
sizeof
(
push_status
)
);
status
=
git__calloc
(
sizeof
(
push_status
),
1
);
GITERR_CHECK_ALLOC
(
status
);
status
->
msg
=
NULL
;
status
->
ref
=
git__strdup
(((
git_pkt_ok
*
)
pkt
)
->
ref
);
...
...
@@ -696,10 +690,11 @@ static int add_push_report_sideband_pkt(git_push *push, git_pkt_data *data_pkt)
return
0
;
}
static
int
parse_report
(
gitno_buffer
*
buf
,
git_push
*
push
)
static
int
parse_report
(
transport_smart
*
transport
,
git_push
*
push
)
{
git_pkt
*
pkt
=
NULL
;
const
char
*
line_end
=
NULL
;
gitno_buffer
*
buf
=
&
transport
->
buffer
;
int
error
,
recvd
;
for
(;;)
{
...
...
@@ -738,6 +733,10 @@ static int parse_report(gitno_buffer *buf, git_push *push)
error
=
-
1
;
break
;
case
GIT_PKT_PROGRESS
:
if
(
transport
->
progress_cb
)
{
git_pkt_progress
*
p
=
(
git_pkt_progress
*
)
pkt
;
error
=
transport
->
progress_cb
(
p
->
data
,
p
->
len
,
transport
->
message_cb_payload
);
}
break
;
default:
error
=
add_push_report_pkt
(
push
,
pkt
);
...
...
@@ -883,10 +882,7 @@ static int stream_thunk(void *buf, size_t size, void *data)
if
((
current_time
-
payload
->
last_progress_report_time
)
>=
MIN_PROGRESS_UPDATE_INTERVAL
)
{
payload
->
last_progress_report_time
=
current_time
;
if
(
payload
->
cb
(
payload
->
pb
->
nr_written
,
payload
->
pb
->
nr_objects
,
payload
->
last_bytes
,
payload
->
cb_payload
))
{
giterr_clear
();
error
=
GIT_EUSER
;
}
error
=
payload
->
cb
(
payload
->
pb
->
nr_written
,
payload
->
pb
->
nr_objects
,
payload
->
last_bytes
,
payload
->
cb_payload
);
}
}
...
...
@@ -953,12 +949,19 @@ int git_smart__push(git_transport *transport, git_push *push)
* we consider the pack to have been unpacked successfully */
if
(
!
push
->
specs
.
length
||
!
push
->
report_status
)
push
->
unpack_ok
=
1
;
else
if
((
error
=
parse_report
(
&
t
->
buffer
,
push
))
<
0
)
else
if
((
error
=
parse_report
(
t
,
push
))
<
0
)
goto
done
;
/* If progress is being reported write the final report */
if
(
push
->
transfer_progress_cb
)
{
push
->
transfer_progress_cb
(
push
->
pb
->
nr_written
,
push
->
pb
->
nr_objects
,
packbuilder_payload
.
last_bytes
,
push
->
transfer_progress_cb_payload
);
error
=
push
->
transfer_progress_cb
(
push
->
pb
->
nr_written
,
push
->
pb
->
nr_objects
,
packbuilder_payload
.
last_bytes
,
push
->
transfer_progress_cb_payload
);
if
(
error
<
0
)
goto
done
;
}
if
(
push
->
status
.
length
)
{
...
...
tests/online/push.c
View file @
8443ed6c
...
...
@@ -254,8 +254,7 @@ static void verify_tracking_branches(git_remote *remote, expected_ref expected_r
}
failed:
if
(
failed
)
if
(
failed
)
cl_fail
(
git_buf_cstr
(
&
msg
));
git_vector_foreach
(
&
actual_refs
,
i
,
actual_ref
)
...
...
@@ -264,7 +263,52 @@ failed:
git_vector_free
(
&
actual_refs
);
git_buf_free
(
&
msg
);
git_buf_free
(
&
ref_name
);
return
;
}
static
void
verify_update_tips_callback
(
git_remote
*
remote
,
expected_ref
expected_refs
[],
size_t
expected_refs_len
)
{
git_refspec
*
fetch_spec
;
git_buf
msg
=
GIT_BUF_INIT
;
git_buf
ref_name
=
GIT_BUF_INIT
;
updated_tip
*
tip
=
NULL
;
size_t
i
,
j
;
int
failed
=
0
;
for
(
i
=
0
;
i
<
expected_refs_len
;
++
i
)
{
/* Convert remote reference name into tracking branch name.
* If the spec is not under refs/heads/, then skip.
*/
fetch_spec
=
git_remote__matching_refspec
(
remote
,
expected_refs
[
i
].
name
);
if
(
!
fetch_spec
)
continue
;
cl_git_pass
(
git_refspec_transform
(
&
ref_name
,
fetch_spec
,
expected_refs
[
i
].
name
));
/* Find matching update_tip entry */
git_vector_foreach
(
&
_record_cbs_data
.
updated_tips
,
j
,
tip
)
{
if
(
!
strcmp
(
git_buf_cstr
(
&
ref_name
),
tip
->
name
))
break
;
}
if
(
j
==
_record_cbs_data
.
updated_tips
.
length
)
{
git_buf_printf
(
&
msg
,
"Did not find expected updated tip entry for branch '%s'."
,
git_buf_cstr
(
&
ref_name
));
failed
=
1
;
goto
failed
;
}
if
(
git_oid_cmp
(
expected_refs
[
i
].
oid
,
tip
->
new_oid
)
!=
0
)
{
git_buf_printf
(
&
msg
,
"Updated tip ID does not match expected ID"
);
failed
=
1
;
goto
failed
;
}
}
failed:
if
(
failed
)
cl_fail
(
git_buf_cstr
(
&
msg
));
git_buf_free
(
&
ref_name
);
git_buf_free
(
&
msg
);
}
void
test_online_push__initialize
(
void
)
...
...
@@ -409,7 +453,7 @@ static void do_push(
const
char
*
refspecs
[],
size_t
refspecs_len
,
push_status
expected_statuses
[],
size_t
expected_statuses_len
,
expected_ref
expected_refs
[],
size_t
expected_refs_len
,
int
expected_ret
,
int
check_progress_cb
)
int
expected_ret
,
int
check_progress_cb
,
int
check_update_tips_cb
)
{
git_push
*
push
;
git_push_options
opts
=
GIT_PUSH_OPTIONS_INIT
;
...
...
@@ -461,6 +505,9 @@ static void do_push(
cl_git_pass
(
git_push_update_tips
(
push
,
pusher
,
"test push"
));
verify_tracking_branches
(
_remote
,
expected_refs
,
expected_refs_len
);
if
(
check_update_tips_cb
)
verify_update_tips_callback
(
_remote
,
expected_refs
,
expected_refs_len
);
git_push_free
(
push
);
git_remote_disconnect
(
_remote
);
...
...
@@ -472,7 +519,7 @@ static void do_push(
/* Call push_finish() without ever calling git_push_add_refspec() */
void
test_online_push__noop
(
void
)
{
do_push
(
NULL
,
0
,
NULL
,
0
,
NULL
,
0
,
0
,
0
);
do_push
(
NULL
,
0
,
NULL
,
0
,
NULL
,
0
,
0
,
0
,
1
);
}
void
test_online_push__b1
(
void
)
...
...
@@ -482,7 +529,7 @@ void test_online_push__b1(void)
expected_ref
exp_refs
[]
=
{
{
"refs/heads/b1"
,
&
_oid_b1
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__b2
(
void
)
...
...
@@ -492,7 +539,7 @@ void test_online_push__b2(void)
expected_ref
exp_refs
[]
=
{
{
"refs/heads/b2"
,
&
_oid_b2
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__b3
(
void
)
...
...
@@ -502,7 +549,7 @@ void test_online_push__b3(void)
expected_ref
exp_refs
[]
=
{
{
"refs/heads/b3"
,
&
_oid_b3
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__b4
(
void
)
...
...
@@ -512,7 +559,7 @@ void test_online_push__b4(void)
expected_ref
exp_refs
[]
=
{
{
"refs/heads/b4"
,
&
_oid_b4
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__b5
(
void
)
...
...
@@ -522,13 +569,13 @@ void test_online_push__b5(void)
expected_ref
exp_refs
[]
=
{
{
"refs/heads/b5"
,
&
_oid_b5
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__b5_cancel
(
void
)
{
const
char
*
specs
[]
=
{
"refs/heads/b5:refs/heads/b5"
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
NULL
,
0
,
NULL
,
0
,
GIT_EUSER
,
1
);
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
NULL
,
0
,
NULL
,
0
,
GIT_EUSER
,
1
,
1
);
}
void
test_online_push__multi
(
void
)
...
...
@@ -559,7 +606,7 @@ void test_online_push__multi(void)
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
cl_git_pass
(
git_reflog_read
(
&
log
,
_repo
,
"refs/remotes/test/b1"
));
entry
=
git_reflog_entry_byindex
(
log
,
0
);
...
...
@@ -586,10 +633,10 @@ void test_online_push__implicit_tgt(void)
do_push
(
specs1
,
ARRAY_SIZE
(
specs1
),
exp_stats1
,
ARRAY_SIZE
(
exp_stats1
),
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
1
);
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
1
,
1
);
do_push
(
specs2
,
ARRAY_SIZE
(
specs2
),
exp_stats2
,
ARRAY_SIZE
(
exp_stats2
),
exp_refs2
,
ARRAY_SIZE
(
exp_refs2
),
0
,
0
);
exp_refs2
,
ARRAY_SIZE
(
exp_refs2
),
0
,
0
,
0
);
}
void
test_online_push__fast_fwd
(
void
)
...
...
@@ -611,19 +658,19 @@ void test_online_push__fast_fwd(void)
do_push
(
specs_init
,
ARRAY_SIZE
(
specs_init
),
exp_stats_init
,
ARRAY_SIZE
(
exp_stats_init
),
exp_refs_init
,
ARRAY_SIZE
(
exp_refs_init
),
0
,
1
);
exp_refs_init
,
ARRAY_SIZE
(
exp_refs_init
),
0
,
1
,
1
);
do_push
(
specs_ff
,
ARRAY_SIZE
(
specs_ff
),
exp_stats_ff
,
ARRAY_SIZE
(
exp_stats_ff
),
exp_refs_ff
,
ARRAY_SIZE
(
exp_refs_ff
),
0
,
0
);
exp_refs_ff
,
ARRAY_SIZE
(
exp_refs_ff
),
0
,
0
,
0
);
do_push
(
specs_reset
,
ARRAY_SIZE
(
specs_reset
),
exp_stats_init
,
ARRAY_SIZE
(
exp_stats_init
),
exp_refs_init
,
ARRAY_SIZE
(
exp_refs_init
),
0
,
0
);
exp_refs_init
,
ARRAY_SIZE
(
exp_refs_init
),
0
,
0
,
0
);
do_push
(
specs_ff_force
,
ARRAY_SIZE
(
specs_ff_force
),
exp_stats_ff
,
ARRAY_SIZE
(
exp_stats_ff
),
exp_refs_ff
,
ARRAY_SIZE
(
exp_refs_ff
),
0
,
0
);
exp_refs_ff
,
ARRAY_SIZE
(
exp_refs_ff
),
0
,
0
,
0
);
}
void
test_online_push__tag_commit
(
void
)
...
...
@@ -633,7 +680,7 @@ void test_online_push__tag_commit(void)
expected_ref
exp_refs
[]
=
{
{
"refs/tags/tag-commit"
,
&
_tag_commit
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__tag_tree
(
void
)
...
...
@@ -643,7 +690,7 @@ void test_online_push__tag_tree(void)
expected_ref
exp_refs
[]
=
{
{
"refs/tags/tag-tree"
,
&
_tag_tree
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__tag_blob
(
void
)
...
...
@@ -653,7 +700,7 @@ void test_online_push__tag_blob(void)
expected_ref
exp_refs
[]
=
{
{
"refs/tags/tag-blob"
,
&
_tag_blob
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__tag_lightweight
(
void
)
...
...
@@ -663,7 +710,7 @@ void test_online_push__tag_lightweight(void)
expected_ref
exp_refs
[]
=
{
{
"refs/tags/tag-lightweight"
,
&
_tag_lightweight
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
}
void
test_online_push__tag_to_tag
(
void
)
...
...
@@ -673,7 +720,7 @@ void test_online_push__tag_to_tag(void)
expected_ref
exp_refs
[]
=
{
{
"refs/tags/tag-tag"
,
&
_tag_tag
}
};
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
0
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
0
,
0
);
}
void
test_online_push__force
(
void
)
...
...
@@ -690,16 +737,17 @@ void test_online_push__force(void)
do_push
(
specs1
,
ARRAY_SIZE
(
specs1
),
exp_stats1
,
ARRAY_SIZE
(
exp_stats1
),
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
1
);
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
1
,
1
);
do_push
(
specs2
,
ARRAY_SIZE
(
specs2
),
NULL
,
0
,
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
GIT_ENONFASTFORWARD
,
0
);
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
GIT_ENONFASTFORWARD
,
0
,
0
);
/* Non-fast-forward update with force should pass. */
record_callbacks_data_clear
(
&
_record_cbs_data
);
do_push
(
specs2_force
,
ARRAY_SIZE
(
specs2_force
),
exp_stats2_force
,
ARRAY_SIZE
(
exp_stats2_force
),
exp_refs2_force
,
ARRAY_SIZE
(
exp_refs2_force
),
0
,
1
);
exp_refs2_force
,
ARRAY_SIZE
(
exp_refs2_force
),
0
,
1
,
1
);
}
void
test_online_push__delete
(
void
)
...
...
@@ -730,7 +778,7 @@ void test_online_push__delete(void)
do_push
(
specs1
,
ARRAY_SIZE
(
specs1
),
exp_stats1
,
ARRAY_SIZE
(
exp_stats1
),
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
1
);
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
1
,
1
);
/* When deleting a non-existent branch, the git client sends zero for both
* the old and new commit id. This should succeed on the server with the
...
...
@@ -740,23 +788,23 @@ void test_online_push__delete(void)
*/
do_push
(
specs_del_fake
,
ARRAY_SIZE
(
specs_del_fake
),
exp_stats_fake
,
1
,
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
0
);
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
0
,
0
);
do_push
(
specs_del_fake_force
,
ARRAY_SIZE
(
specs_del_fake_force
),
exp_stats_fake
,
1
,
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
0
);
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
0
,
0
);
/* Delete one of the pushed branches. */
do_push
(
specs_delete
,
ARRAY_SIZE
(
specs_delete
),
exp_stats_delete
,
ARRAY_SIZE
(
exp_stats_delete
),
exp_refs_delete
,
ARRAY_SIZE
(
exp_refs_delete
),
0
,
0
);
exp_refs_delete
,
ARRAY_SIZE
(
exp_refs_delete
),
0
,
0
,
0
);
/* Re-push branches and retry delete with force. */
do_push
(
specs1
,
ARRAY_SIZE
(
specs1
),
exp_stats1
,
ARRAY_SIZE
(
exp_stats1
),
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
0
);
exp_refs1
,
ARRAY_SIZE
(
exp_refs1
),
0
,
0
,
0
);
do_push
(
specs_delete_force
,
ARRAY_SIZE
(
specs_delete_force
),
exp_stats_delete
,
ARRAY_SIZE
(
exp_stats_delete
),
exp_refs_delete
,
ARRAY_SIZE
(
exp_refs_delete
),
0
,
0
);
exp_refs_delete
,
ARRAY_SIZE
(
exp_refs_delete
),
0
,
0
,
0
);
}
void
test_online_push__bad_refspecs
(
void
)
...
...
@@ -790,11 +838,11 @@ void test_online_push__expressions(void)
/* TODO: Find a more precise way of checking errors than a exit code of -1. */
do_push
(
specs_left_expr
,
ARRAY_SIZE
(
specs_left_expr
),
NULL
,
0
,
NULL
,
0
,
-
1
,
0
);
NULL
,
0
,
-
1
,
0
,
0
);
do_push
(
specs_right_expr
,
ARRAY_SIZE
(
specs_right_expr
),
exp_stats_right_expr
,
ARRAY_SIZE
(
exp_stats_right_expr
),
NULL
,
0
,
0
,
1
);
NULL
,
0
,
0
,
1
,
1
);
}
void
test_online_push__notes
(
void
)
...
...
@@ -814,7 +862,7 @@ void test_online_push__notes(void)
do_push
(
specs
,
ARRAY_SIZE
(
specs
),
exp_stats
,
ARRAY_SIZE
(
exp_stats
),
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
);
exp_refs
,
ARRAY_SIZE
(
exp_refs
),
0
,
1
,
1
);
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