Skip to content

Commit ff74f7f

Browse files
committed
refs.c: move dwim_ref()/dwim_log() from sha1_name.c
Both dwim_ref()/dwim_log() functions are intimately related to the ref parsing rules defined in refs.c and better fits there. Move them together with substitute_branch_name(), a file scope static helper function. Signed-off-by: Junio C Hamano <[email protected]>
1 parent dce4bab commit ff74f7f

File tree

2 files changed

+85
-85
lines changed

2 files changed

+85
-85
lines changed

refs.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,91 @@ static int is_refname_available(const char *ref, const char *oldref,
10671067
return 1;
10681068
}
10691069

1070+
/*
1071+
* *string and *len will only be substituted, and *string returned (for
1072+
* later free()ing) if the string passed in is a magic short-hand form
1073+
* to name a branch.
1074+
*/
1075+
static char *substitute_branch_name(const char **string, int *len)
1076+
{
1077+
struct strbuf buf = STRBUF_INIT;
1078+
int ret = interpret_branch_name(*string, &buf);
1079+
1080+
if (ret == *len) {
1081+
size_t size;
1082+
*string = strbuf_detach(&buf, &size);
1083+
*len = size;
1084+
return (char *)*string;
1085+
}
1086+
1087+
return NULL;
1088+
}
1089+
1090+
int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
1091+
{
1092+
char *last_branch = substitute_branch_name(&str, &len);
1093+
const char **p, *r;
1094+
int refs_found = 0;
1095+
1096+
*ref = NULL;
1097+
for (p = ref_rev_parse_rules; *p; p++) {
1098+
char fullref[PATH_MAX];
1099+
unsigned char sha1_from_ref[20];
1100+
unsigned char *this_result;
1101+
int flag;
1102+
1103+
this_result = refs_found ? sha1_from_ref : sha1;
1104+
mksnpath(fullref, sizeof(fullref), *p, len, str);
1105+
r = resolve_ref(fullref, this_result, 1, &flag);
1106+
if (r) {
1107+
if (!refs_found++)
1108+
*ref = xstrdup(r);
1109+
if (!warn_ambiguous_refs)
1110+
break;
1111+
} else if ((flag & REF_ISSYMREF) && strcmp(fullref, "HEAD"))
1112+
warning("ignoring dangling symref %s.", fullref);
1113+
}
1114+
free(last_branch);
1115+
return refs_found;
1116+
}
1117+
1118+
int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
1119+
{
1120+
char *last_branch = substitute_branch_name(&str, &len);
1121+
const char **p;
1122+
int logs_found = 0;
1123+
1124+
*log = NULL;
1125+
for (p = ref_rev_parse_rules; *p; p++) {
1126+
struct stat st;
1127+
unsigned char hash[20];
1128+
char path[PATH_MAX];
1129+
const char *ref, *it;
1130+
1131+
mksnpath(path, sizeof(path), *p, len, str);
1132+
ref = resolve_ref(path, hash, 1, NULL);
1133+
if (!ref)
1134+
continue;
1135+
if (!stat(git_path("logs/%s", path), &st) &&
1136+
S_ISREG(st.st_mode))
1137+
it = path;
1138+
else if (strcmp(ref, path) &&
1139+
!stat(git_path("logs/%s", ref), &st) &&
1140+
S_ISREG(st.st_mode))
1141+
it = ref;
1142+
else
1143+
continue;
1144+
if (!logs_found++) {
1145+
*log = xstrdup(it);
1146+
hashcpy(sha1, hash);
1147+
}
1148+
if (!warn_ambiguous_refs)
1149+
break;
1150+
}
1151+
free(last_branch);
1152+
return logs_found;
1153+
}
1154+
10701155
static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char *old_sha1, int flags, int *type_p)
10711156
{
10721157
char *ref_file;

sha1_name.c

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -241,91 +241,6 @@ static int ambiguous_path(const char *path, int len)
241241
return slash;
242242
}
243243

244-
/*
245-
* *string and *len will only be substituted, and *string returned (for
246-
* later free()ing) if the string passed in is a magic short-hand form
247-
* to name a branch.
248-
*/
249-
static char *substitute_branch_name(const char **string, int *len)
250-
{
251-
struct strbuf buf = STRBUF_INIT;
252-
int ret = interpret_branch_name(*string, &buf);
253-
254-
if (ret == *len) {
255-
size_t size;
256-
*string = strbuf_detach(&buf, &size);
257-
*len = size;
258-
return (char *)*string;
259-
}
260-
261-
return NULL;
262-
}
263-
264-
int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
265-
{
266-
char *last_branch = substitute_branch_name(&str, &len);
267-
const char **p, *r;
268-
int refs_found = 0;
269-
270-
*ref = NULL;
271-
for (p = ref_rev_parse_rules; *p; p++) {
272-
char fullref[PATH_MAX];
273-
unsigned char sha1_from_ref[20];
274-
unsigned char *this_result;
275-
int flag;
276-
277-
this_result = refs_found ? sha1_from_ref : sha1;
278-
mksnpath(fullref, sizeof(fullref), *p, len, str);
279-
r = resolve_ref(fullref, this_result, 1, &flag);
280-
if (r) {
281-
if (!refs_found++)
282-
*ref = xstrdup(r);
283-
if (!warn_ambiguous_refs)
284-
break;
285-
} else if ((flag & REF_ISSYMREF) && strcmp(fullref, "HEAD"))
286-
warning("ignoring dangling symref %s.", fullref);
287-
}
288-
free(last_branch);
289-
return refs_found;
290-
}
291-
292-
int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
293-
{
294-
char *last_branch = substitute_branch_name(&str, &len);
295-
const char **p;
296-
int logs_found = 0;
297-
298-
*log = NULL;
299-
for (p = ref_rev_parse_rules; *p; p++) {
300-
struct stat st;
301-
unsigned char hash[20];
302-
char path[PATH_MAX];
303-
const char *ref, *it;
304-
305-
mksnpath(path, sizeof(path), *p, len, str);
306-
ref = resolve_ref(path, hash, 1, NULL);
307-
if (!ref)
308-
continue;
309-
if (!stat(git_path("logs/%s", path), &st) &&
310-
S_ISREG(st.st_mode))
311-
it = path;
312-
else if (strcmp(ref, path) &&
313-
!stat(git_path("logs/%s", ref), &st) &&
314-
S_ISREG(st.st_mode))
315-
it = ref;
316-
else
317-
continue;
318-
if (!logs_found++) {
319-
*log = xstrdup(it);
320-
hashcpy(sha1, hash);
321-
}
322-
if (!warn_ambiguous_refs)
323-
break;
324-
}
325-
free(last_branch);
326-
return logs_found;
327-
}
328-
329244
static inline int upstream_mark(const char *string, int len)
330245
{
331246
const char *suffix[] = { "@{upstream}", "@{u}" };

0 commit comments

Comments
 (0)