Skip to content

Commit 07a4540

Browse files
committed
Merge branch 'fh/transport-push-leakfix'
Leakfix. * fh/transport-push-leakfix: transport: free local and remote refs in transport_push() transport: unify return values and exit point from transport_push() transport: remove unnecessary indenting in transport_push()
2 parents fc5a070 + 8c49d70 commit 07a4540

File tree

1 file changed

+133
-127
lines changed

1 file changed

+133
-127
lines changed

transport.c

Lines changed: 133 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,146 +1276,152 @@ int transport_push(struct repository *r,
12761276
struct refspec *rs, int flags,
12771277
unsigned int *reject_reasons)
12781278
{
1279+
struct ref *remote_refs = NULL;
1280+
struct ref *local_refs = NULL;
1281+
int match_flags = MATCH_REFS_NONE;
1282+
int verbose = (transport->verbose > 0);
1283+
int quiet = (transport->verbose < 0);
1284+
int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
1285+
int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
1286+
int push_ret, err;
1287+
int ret = -1;
1288+
struct transport_ls_refs_options transport_options =
1289+
TRANSPORT_LS_REFS_OPTIONS_INIT;
1290+
12791291
*reject_reasons = 0;
12801292

12811293
if (transport_color_config() < 0)
1282-
return -1;
1283-
1284-
if (transport->vtable->push_refs) {
1285-
struct ref *remote_refs;
1286-
struct ref *local_refs = get_local_heads();
1287-
int match_flags = MATCH_REFS_NONE;
1288-
int verbose = (transport->verbose > 0);
1289-
int quiet = (transport->verbose < 0);
1290-
int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
1291-
int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
1292-
int push_ret, ret, err;
1293-
struct transport_ls_refs_options transport_options =
1294-
TRANSPORT_LS_REFS_OPTIONS_INIT;
1295-
1296-
if (check_push_refs(local_refs, rs) < 0)
1297-
return -1;
1298-
1299-
refspec_ref_prefixes(rs, &transport_options.ref_prefixes);
1300-
1301-
trace2_region_enter("transport_push", "get_refs_list", r);
1302-
remote_refs = transport->vtable->get_refs_list(transport, 1,
1303-
&transport_options);
1304-
trace2_region_leave("transport_push", "get_refs_list", r);
1305-
1306-
transport_ls_refs_options_release(&transport_options);
1307-
1308-
if (flags & TRANSPORT_PUSH_ALL)
1309-
match_flags |= MATCH_REFS_ALL;
1310-
if (flags & TRANSPORT_PUSH_MIRROR)
1311-
match_flags |= MATCH_REFS_MIRROR;
1312-
if (flags & TRANSPORT_PUSH_PRUNE)
1313-
match_flags |= MATCH_REFS_PRUNE;
1314-
if (flags & TRANSPORT_PUSH_FOLLOW_TAGS)
1315-
match_flags |= MATCH_REFS_FOLLOW_TAGS;
1316-
1317-
if (match_push_refs(local_refs, &remote_refs, rs, match_flags))
1318-
return -1;
1319-
1320-
if (transport->smart_options &&
1321-
transport->smart_options->cas &&
1322-
!is_empty_cas(transport->smart_options->cas))
1323-
apply_push_cas(transport->smart_options->cas,
1324-
transport->remote, remote_refs);
1325-
1326-
set_ref_status_for_push(remote_refs,
1327-
flags & TRANSPORT_PUSH_MIRROR,
1328-
flags & TRANSPORT_PUSH_FORCE);
1329-
1330-
if (!(flags & TRANSPORT_PUSH_NO_HOOK))
1331-
if (run_pre_push_hook(transport, remote_refs))
1332-
return -1;
1333-
1334-
if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
1335-
TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
1336-
!is_bare_repository()) {
1337-
struct ref *ref = remote_refs;
1338-
struct oid_array commits = OID_ARRAY_INIT;
1339-
1340-
trace2_region_enter("transport_push", "push_submodules", r);
1341-
for (; ref; ref = ref->next)
1342-
if (!is_null_oid(&ref->new_oid))
1343-
oid_array_append(&commits,
1344-
&ref->new_oid);
1345-
1346-
if (!push_unpushed_submodules(r,
1347-
&commits,
1348-
transport->remote,
1349-
rs,
1350-
transport->push_options,
1351-
pretend)) {
1352-
oid_array_clear(&commits);
1353-
trace2_region_leave("transport_push", "push_submodules", r);
1354-
die(_("failed to push all needed submodules"));
1355-
}
1294+
goto done;
1295+
1296+
if (!transport->vtable->push_refs)
1297+
goto done;
1298+
1299+
local_refs = get_local_heads();
1300+
1301+
if (check_push_refs(local_refs, rs) < 0)
1302+
goto done;
1303+
1304+
refspec_ref_prefixes(rs, &transport_options.ref_prefixes);
1305+
1306+
trace2_region_enter("transport_push", "get_refs_list", r);
1307+
remote_refs = transport->vtable->get_refs_list(transport, 1,
1308+
&transport_options);
1309+
trace2_region_leave("transport_push", "get_refs_list", r);
1310+
1311+
transport_ls_refs_options_release(&transport_options);
1312+
1313+
if (flags & TRANSPORT_PUSH_ALL)
1314+
match_flags |= MATCH_REFS_ALL;
1315+
if (flags & TRANSPORT_PUSH_MIRROR)
1316+
match_flags |= MATCH_REFS_MIRROR;
1317+
if (flags & TRANSPORT_PUSH_PRUNE)
1318+
match_flags |= MATCH_REFS_PRUNE;
1319+
if (flags & TRANSPORT_PUSH_FOLLOW_TAGS)
1320+
match_flags |= MATCH_REFS_FOLLOW_TAGS;
1321+
1322+
if (match_push_refs(local_refs, &remote_refs, rs, match_flags))
1323+
goto done;
1324+
1325+
if (transport->smart_options &&
1326+
transport->smart_options->cas &&
1327+
!is_empty_cas(transport->smart_options->cas))
1328+
apply_push_cas(transport->smart_options->cas,
1329+
transport->remote, remote_refs);
1330+
1331+
set_ref_status_for_push(remote_refs,
1332+
flags & TRANSPORT_PUSH_MIRROR,
1333+
flags & TRANSPORT_PUSH_FORCE);
1334+
1335+
if (!(flags & TRANSPORT_PUSH_NO_HOOK))
1336+
if (run_pre_push_hook(transport, remote_refs))
1337+
goto done;
1338+
1339+
if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
1340+
TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
1341+
!is_bare_repository()) {
1342+
struct ref *ref = remote_refs;
1343+
struct oid_array commits = OID_ARRAY_INIT;
1344+
1345+
trace2_region_enter("transport_push", "push_submodules", r);
1346+
for (; ref; ref = ref->next)
1347+
if (!is_null_oid(&ref->new_oid))
1348+
oid_array_append(&commits,
1349+
&ref->new_oid);
1350+
1351+
if (!push_unpushed_submodules(r,
1352+
&commits,
1353+
transport->remote,
1354+
rs,
1355+
transport->push_options,
1356+
pretend)) {
13561357
oid_array_clear(&commits);
13571358
trace2_region_leave("transport_push", "push_submodules", r);
1359+
die(_("failed to push all needed submodules"));
13581360
}
1361+
oid_array_clear(&commits);
1362+
trace2_region_leave("transport_push", "push_submodules", r);
1363+
}
13591364

1360-
if (((flags & TRANSPORT_RECURSE_SUBMODULES_CHECK) ||
1361-
((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
1362-
TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
1363-
!pretend)) && !is_bare_repository()) {
1364-
struct ref *ref = remote_refs;
1365-
struct string_list needs_pushing = STRING_LIST_INIT_DUP;
1366-
struct oid_array commits = OID_ARRAY_INIT;
1367-
1368-
trace2_region_enter("transport_push", "check_submodules", r);
1369-
for (; ref; ref = ref->next)
1370-
if (!is_null_oid(&ref->new_oid))
1371-
oid_array_append(&commits,
1372-
&ref->new_oid);
1373-
1374-
if (find_unpushed_submodules(r,
1375-
&commits,
1376-
transport->remote->name,
1377-
&needs_pushing)) {
1378-
oid_array_clear(&commits);
1379-
trace2_region_leave("transport_push", "check_submodules", r);
1380-
die_with_unpushed_submodules(&needs_pushing);
1381-
}
1382-
string_list_clear(&needs_pushing, 0);
1365+
if (((flags & TRANSPORT_RECURSE_SUBMODULES_CHECK) ||
1366+
((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND |
1367+
TRANSPORT_RECURSE_SUBMODULES_ONLY)) &&
1368+
!pretend)) && !is_bare_repository()) {
1369+
struct ref *ref = remote_refs;
1370+
struct string_list needs_pushing = STRING_LIST_INIT_DUP;
1371+
struct oid_array commits = OID_ARRAY_INIT;
1372+
1373+
trace2_region_enter("transport_push", "check_submodules", r);
1374+
for (; ref; ref = ref->next)
1375+
if (!is_null_oid(&ref->new_oid))
1376+
oid_array_append(&commits,
1377+
&ref->new_oid);
1378+
1379+
if (find_unpushed_submodules(r,
1380+
&commits,
1381+
transport->remote->name,
1382+
&needs_pushing)) {
13831383
oid_array_clear(&commits);
13841384
trace2_region_leave("transport_push", "check_submodules", r);
1385+
die_with_unpushed_submodules(&needs_pushing);
13851386
}
1387+
string_list_clear(&needs_pushing, 0);
1388+
oid_array_clear(&commits);
1389+
trace2_region_leave("transport_push", "check_submodules", r);
1390+
}
13861391

1387-
if (!(flags & TRANSPORT_RECURSE_SUBMODULES_ONLY)) {
1388-
trace2_region_enter("transport_push", "push_refs", r);
1389-
push_ret = transport->vtable->push_refs(transport, remote_refs, flags);
1390-
trace2_region_leave("transport_push", "push_refs", r);
1391-
} else
1392-
push_ret = 0;
1393-
err = push_had_errors(remote_refs);
1394-
ret = push_ret | err;
1395-
1396-
if (!quiet || err)
1397-
transport_print_push_status(transport->url, remote_refs,
1398-
verbose | porcelain, porcelain,
1399-
reject_reasons);
1400-
1401-
if (flags & TRANSPORT_PUSH_SET_UPSTREAM)
1402-
set_upstreams(transport, remote_refs, pretend);
1403-
1404-
if (!(flags & (TRANSPORT_PUSH_DRY_RUN |
1405-
TRANSPORT_RECURSE_SUBMODULES_ONLY))) {
1406-
struct ref *ref;
1407-
for (ref = remote_refs; ref; ref = ref->next)
1408-
transport_update_tracking_ref(transport->remote, ref, verbose);
1409-
}
1392+
if (!(flags & TRANSPORT_RECURSE_SUBMODULES_ONLY)) {
1393+
trace2_region_enter("transport_push", "push_refs", r);
1394+
push_ret = transport->vtable->push_refs(transport, remote_refs, flags);
1395+
trace2_region_leave("transport_push", "push_refs", r);
1396+
} else
1397+
push_ret = 0;
1398+
err = push_had_errors(remote_refs);
1399+
ret = push_ret | err;
1400+
1401+
if (!quiet || err)
1402+
transport_print_push_status(transport->url, remote_refs,
1403+
verbose | porcelain, porcelain,
1404+
reject_reasons);
1405+
1406+
if (flags & TRANSPORT_PUSH_SET_UPSTREAM)
1407+
set_upstreams(transport, remote_refs, pretend);
1408+
1409+
if (!(flags & (TRANSPORT_PUSH_DRY_RUN |
1410+
TRANSPORT_RECURSE_SUBMODULES_ONLY))) {
1411+
struct ref *ref;
1412+
for (ref = remote_refs; ref; ref = ref->next)
1413+
transport_update_tracking_ref(transport->remote, ref, verbose);
1414+
}
14101415

1411-
if (porcelain && !push_ret)
1412-
puts("Done");
1413-
else if (!quiet && !ret && !transport_refs_pushed(remote_refs))
1414-
fprintf(stderr, "Everything up-to-date\n");
1416+
if (porcelain && !push_ret)
1417+
puts("Done");
1418+
else if (!quiet && !ret && !transport_refs_pushed(remote_refs))
1419+
fprintf(stderr, "Everything up-to-date\n");
14151420

1416-
return ret;
1417-
}
1418-
return 1;
1421+
done:
1422+
free_refs(local_refs);
1423+
free_refs(remote_refs);
1424+
return ret;
14191425
}
14201426

14211427
const struct ref *transport_get_remote_refs(struct transport *transport,

0 commit comments

Comments
 (0)