Skip to content

Commit 96f6623

Browse files
committed
Merge branch 'ab/refs-errno-cleanup'
The "remainder" of hn/refs-errno-cleanup topic. * ab/refs-errno-cleanup: (21 commits) refs API: post-migration API renaming [2/2] refs API: post-migration API renaming [1/2] refs API: don't expose "errno" in run_transaction_hook() refs API: make expand_ref() & repo_dwim_log() not set errno refs API: make resolve_ref_unsafe() not set errno refs API: make refs_ref_exists() not set errno refs API: make refs_resolve_refdup() not set errno refs tests: ignore ignore errno in test-ref-store helper refs API: ignore errno in worktree.c's find_shared_symref() refs API: ignore errno in worktree.c's add_head_info() refs API: make files_copy_or_rename_ref() et al not set errno refs API: make loose_fill_ref_dir() not set errno refs API: make resolve_gitlink_ref() not set errno refs API: remove refs_read_ref_full() wrapper refs/files: remove "name exist?" check in lock_ref_oid_basic() reflog tests: add --updateref tests refs API: make refs_rename_ref_available() static refs API: make parse_loose_ref_contents() not set errno refs API: make refs_read_raw_ref() not set errno refs API: add a version of refs_resolve_ref_unsafe() with "errno" ...
2 parents dea96aa + f1da24c commit 96f6623

File tree

10 files changed

+294
-143
lines changed

10 files changed

+294
-143
lines changed

refs.c

Lines changed: 66 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,10 @@ char *refs_resolve_refdup(struct ref_store *refs,
269269
struct object_id *oid, int *flags)
270270
{
271271
const char *result;
272+
int ignore_errno;
272273

273274
result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
274-
oid, flags);
275+
oid, flags, &ignore_errno);
275276
return xstrdup_or_null(result);
276277
}
277278

@@ -291,28 +292,27 @@ struct ref_filter {
291292
void *cb_data;
292293
};
293294

294-
int refs_read_ref_full(struct ref_store *refs, const char *refname,
295-
int resolve_flags, struct object_id *oid, int *flags)
295+
int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
296296
{
297-
if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, oid, flags))
297+
int ignore_errno;
298+
struct ref_store *refs = get_main_ref_store(the_repository);
299+
300+
if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
301+
oid, flags, &ignore_errno))
298302
return 0;
299303
return -1;
300304
}
301305

302-
int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
303-
{
304-
return refs_read_ref_full(get_main_ref_store(the_repository), refname,
305-
resolve_flags, oid, flags);
306-
}
307-
308306
int read_ref(const char *refname, struct object_id *oid)
309307
{
310308
return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
311309
}
312310

313311
int refs_ref_exists(struct ref_store *refs, const char *refname)
314312
{
315-
return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING, NULL, NULL);
313+
int ignore_errno;
314+
return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
315+
NULL, NULL, &ignore_errno);
316316
}
317317

318318
int ref_exists(const char *refname)
@@ -655,13 +655,16 @@ int expand_ref(struct repository *repo, const char *str, int len,
655655
struct object_id oid_from_ref;
656656
struct object_id *this_result;
657657
int flag;
658+
struct ref_store *refs = get_main_ref_store(repo);
659+
int ignore_errno;
658660

659661
this_result = refs_found ? &oid_from_ref : oid;
660662
strbuf_reset(&fullref);
661663
strbuf_addf(&fullref, *p, len, str);
662-
r = refs_resolve_ref_unsafe(get_main_ref_store(repo),
663-
fullref.buf, RESOLVE_REF_READING,
664-
this_result, &flag);
664+
r = refs_resolve_ref_unsafe(refs, fullref.buf,
665+
RESOLVE_REF_READING,
666+
this_result, &flag,
667+
&ignore_errno);
665668
if (r) {
666669
if (!refs_found++)
667670
*ref = xstrdup(r);
@@ -690,12 +693,14 @@ int repo_dwim_log(struct repository *r, const char *str, int len,
690693
for (p = ref_rev_parse_rules; *p; p++) {
691694
struct object_id hash;
692695
const char *ref, *it;
696+
int ignore_errno;
693697

694698
strbuf_reset(&path);
695699
strbuf_addf(&path, *p, len, str);
696700
ref = refs_resolve_ref_unsafe(refs, path.buf,
697701
RESOLVE_REF_READING,
698-
oid ? &hash : NULL, NULL);
702+
oid ? &hash : NULL, NULL,
703+
&ignore_errno);
699704
if (!ref)
700705
continue;
701706
if (refs_reflog_exists(refs, path.buf))
@@ -1373,32 +1378,14 @@ const char *find_descendant_ref(const char *dirname,
13731378
return NULL;
13741379
}
13751380

1376-
int refs_rename_ref_available(struct ref_store *refs,
1377-
const char *old_refname,
1378-
const char *new_refname)
1379-
{
1380-
struct string_list skip = STRING_LIST_INIT_NODUP;
1381-
struct strbuf err = STRBUF_INIT;
1382-
int ok;
1383-
1384-
string_list_insert(&skip, old_refname);
1385-
ok = !refs_verify_refname_available(refs, new_refname,
1386-
NULL, &skip, &err);
1387-
if (!ok)
1388-
error("%s", err.buf);
1389-
1390-
string_list_clear(&skip, 0);
1391-
strbuf_release(&err);
1392-
return ok;
1393-
}
1394-
13951381
int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
13961382
{
13971383
struct object_id oid;
13981384
int flag;
1385+
int ignore_errno;
13991386

1400-
if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING,
1401-
&oid, &flag))
1387+
if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
1388+
&oid, &flag, &ignore_errno))
14021389
return fn("HEAD", &oid, flag, cb_data);
14031390

14041391
return 0;
@@ -1649,7 +1636,8 @@ int for_each_fullref_in_prefixes(const char *namespace,
16491636

16501637
static int refs_read_special_head(struct ref_store *ref_store,
16511638
const char *refname, struct object_id *oid,
1652-
struct strbuf *referent, unsigned int *type)
1639+
struct strbuf *referent, unsigned int *type,
1640+
int *failure_errno)
16531641
{
16541642
struct strbuf full_path = STRBUF_INIT;
16551643
struct strbuf content = STRBUF_INIT;
@@ -1659,38 +1647,42 @@ static int refs_read_special_head(struct ref_store *ref_store,
16591647
if (strbuf_read_file(&content, full_path.buf, 0) < 0)
16601648
goto done;
16611649

1662-
result = parse_loose_ref_contents(content.buf, oid, referent, type);
1650+
result = parse_loose_ref_contents(content.buf, oid, referent, type,
1651+
failure_errno);
16631652

16641653
done:
16651654
strbuf_release(&full_path);
16661655
strbuf_release(&content);
16671656
return result;
16681657
}
16691658

1670-
int refs_read_raw_ref(struct ref_store *ref_store,
1671-
const char *refname, struct object_id *oid,
1672-
struct strbuf *referent, unsigned int *type)
1659+
int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1660+
struct object_id *oid, struct strbuf *referent,
1661+
unsigned int *type, int *failure_errno)
16731662
{
1663+
assert(failure_errno);
16741664
if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
16751665
return refs_read_special_head(ref_store, refname, oid, referent,
1676-
type);
1666+
type, failure_errno);
16771667
}
16781668

16791669
return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
1680-
type, &errno);
1670+
type, failure_errno);
16811671
}
16821672

1683-
/* This function needs to return a meaningful errno on failure */
16841673
const char *refs_resolve_ref_unsafe(struct ref_store *refs,
16851674
const char *refname,
16861675
int resolve_flags,
1687-
struct object_id *oid, int *flags)
1676+
struct object_id *oid,
1677+
int *flags, int *failure_errno)
16881678
{
16891679
static struct strbuf sb_refname = STRBUF_INIT;
16901680
struct object_id unused_oid;
16911681
int unused_flags;
16921682
int symref_count;
16931683

1684+
assert(failure_errno);
1685+
16941686
if (!oid)
16951687
oid = &unused_oid;
16961688
if (!flags)
@@ -1701,7 +1693,7 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
17011693
if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
17021694
if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
17031695
!refname_is_safe(refname)) {
1704-
errno = EINVAL;
1696+
*failure_errno = EINVAL;
17051697
return NULL;
17061698
}
17071699

@@ -1719,9 +1711,11 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
17191711
for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
17201712
unsigned int read_flags = 0;
17211713

1722-
if (refs_read_raw_ref(refs, refname,
1723-
oid, &sb_refname, &read_flags)) {
1714+
if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
1715+
&read_flags, failure_errno)) {
17241716
*flags |= read_flags;
1717+
if (errno)
1718+
*failure_errno = errno;
17251719

17261720
/* In reading mode, refs must eventually resolve */
17271721
if (resolve_flags & RESOLVE_REF_READING)
@@ -1732,9 +1726,9 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
17321726
* may show errors besides ENOENT if there are
17331727
* similarly-named refs.
17341728
*/
1735-
if (errno != ENOENT &&
1736-
errno != EISDIR &&
1737-
errno != ENOTDIR)
1729+
if (*failure_errno != ENOENT &&
1730+
*failure_errno != EISDIR &&
1731+
*failure_errno != ENOTDIR)
17381732
return NULL;
17391733

17401734
oidclr(oid);
@@ -1761,15 +1755,15 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
17611755
if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
17621756
if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
17631757
!refname_is_safe(refname)) {
1764-
errno = EINVAL;
1758+
*failure_errno = EINVAL;
17651759
return NULL;
17661760
}
17671761

17681762
*flags |= REF_ISBROKEN | REF_BAD_NAME;
17691763
}
17701764
}
17711765

1772-
errno = ELOOP;
1766+
*failure_errno = ELOOP;
17731767
return NULL;
17741768
}
17751769

@@ -1784,23 +1778,26 @@ int refs_init_db(struct strbuf *err)
17841778
const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
17851779
struct object_id *oid, int *flags)
17861780
{
1781+
int ignore_errno;
1782+
17871783
return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
1788-
resolve_flags, oid, flags);
1784+
resolve_flags, oid, flags, &ignore_errno);
17891785
}
17901786

17911787
int resolve_gitlink_ref(const char *submodule, const char *refname,
17921788
struct object_id *oid)
17931789
{
17941790
struct ref_store *refs;
17951791
int flags;
1792+
int ignore_errno;
17961793

17971794
refs = get_submodule_ref_store(submodule);
17981795

17991796
if (!refs)
18001797
return -1;
18011798

1802-
if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1803-
is_null_oid(oid))
1799+
if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags,
1800+
&ignore_errno) || is_null_oid(oid))
18041801
return -1;
18051802
return 0;
18061803
}
@@ -2102,8 +2099,11 @@ static int run_transaction_hook(struct ref_transaction *transaction,
21022099
update->refname);
21032100

21042101
if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
2105-
if (errno != EPIPE)
2102+
if (errno != EPIPE) {
2103+
/* Don't leak errno outside this API */
2104+
errno = 0;
21062105
ret = -1;
2106+
}
21072107
break;
21082108
}
21092109
}
@@ -2238,6 +2238,13 @@ int refs_verify_refname_available(struct ref_store *refs,
22382238

22392239
strbuf_grow(&dirname, strlen(refname) + 1);
22402240
for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
2241+
/*
2242+
* Just saying "Is a directory" when we e.g. can't
2243+
* lock some multi-level ref isn't very informative,
2244+
* the user won't be told *what* is a directory, so
2245+
* let's not use strerror() below.
2246+
*/
2247+
int ignore_errno;
22412248
/* Expand dirname to the new prefix, not including the trailing slash: */
22422249
strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
22432250

@@ -2249,7 +2256,8 @@ int refs_verify_refname_available(struct ref_store *refs,
22492256
if (skip && string_list_has_string(skip, dirname.buf))
22502257
continue;
22512258

2252-
if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent, &type)) {
2259+
if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2260+
&type, &ignore_errno)) {
22532261
strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
22542262
dirname.buf, refname);
22552263
goto cleanup;

refs.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ struct worktree;
5858
* resolved. The function returns NULL for such ref names.
5959
* Caps and underscores refers to the special refs, such as HEAD,
6060
* FETCH_HEAD and friends, that all live outside of the refs/ directory.
61+
*
62+
* Callers should not inspect "errno" on failure, but rather pass in a
63+
* "failure_errno" parameter, on failure the "errno" will indicate the
64+
* type of failure encountered, but not necessarily one that came from
65+
* a syscall. We might have faked it up.
6166
*/
6267
#define RESOLVE_REF_READING 0x01
6368
#define RESOLVE_REF_NO_RECURSE 0x02
@@ -67,7 +72,8 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
6772
const char *refname,
6873
int resolve_flags,
6974
struct object_id *oid,
70-
int *flags);
75+
int *flags, int *failure_errno);
76+
7177
const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
7278
struct object_id *oid, int *flags);
7379

@@ -77,8 +83,6 @@ char *refs_resolve_refdup(struct ref_store *refs,
7783
char *resolve_refdup(const char *refname, int resolve_flags,
7884
struct object_id *oid, int *flags);
7985

80-
int refs_read_ref_full(struct ref_store *refs, const char *refname,
81-
int resolve_flags, struct object_id *oid, int *flags);
8286
int read_ref_full(const char *refname, int resolve_flags,
8387
struct object_id *oid, int *flags);
8488
int read_ref(const char *refname, struct object_id *oid);

0 commit comments

Comments
 (0)