| 296 | } |
| 297 | |
| 298 | int match_refname_with_pattern(const char *pattern, const char *refname, |
| 299 | const char *replacement, char **result) |
| 300 | { |
| 301 | const char *kstar = strchr(pattern, '*'); |
| 302 | size_t klen; |
| 303 | size_t ksuffixlen; |
| 304 | size_t namelen; |
| 305 | int ret; |
| 306 | if (!kstar) |
| 307 | die(_("pattern '%s' has no '*'"), pattern); |
| 308 | klen = kstar - pattern; |
| 309 | ksuffixlen = strlen(kstar + 1); |
| 310 | namelen = strlen(refname); |
| 311 | ret = !strncmp(refname, pattern, klen) && namelen >= klen + ksuffixlen && |
| 312 | !memcmp(refname + namelen - ksuffixlen, kstar + 1, ksuffixlen); |
| 313 | if (ret && replacement) { |
| 314 | struct strbuf sb = STRBUF_INIT; |
| 315 | const char *vstar = strchr(replacement, '*'); |
| 316 | if (!vstar) |
| 317 | die(_("replacement '%s' has no '*'"), replacement); |
| 318 | strbuf_add(&sb, replacement, vstar - replacement); |
| 319 | strbuf_add(&sb, refname + klen, namelen - klen - ksuffixlen); |
| 320 | strbuf_addstr(&sb, vstar + 1); |
| 321 | *result = strbuf_detach(&sb, NULL); |
| 322 | } |
| 323 | return ret; |
| 324 | } |
| 325 | |
| 326 | static int refspec_match(const struct refspec_item *refspec, |
| 327 | const char *name) |
no test coverage detected