| 1120 | } |
| 1121 | |
| 1122 | static int ident_to_git(const char *src, size_t len, |
| 1123 | struct strbuf *buf, int ident) |
| 1124 | { |
| 1125 | char *dst; |
| 1126 | const char *dollar; |
| 1127 | |
| 1128 | if (!ident || (src && !count_ident(src, len))) |
| 1129 | return 0; |
| 1130 | |
| 1131 | if (!buf) |
| 1132 | return 1; |
| 1133 | |
| 1134 | /* only grow if not in place */ |
| 1135 | if (strbuf_avail(buf) + buf->len < len) |
| 1136 | strbuf_grow(buf, len - buf->len); |
| 1137 | dst = buf->buf; |
| 1138 | for (;;) { |
| 1139 | dollar = memchr(src, '$', len); |
| 1140 | if (!dollar) |
| 1141 | break; |
| 1142 | memmove(dst, src, dollar + 1 - src); |
| 1143 | dst += dollar + 1 - src; |
| 1144 | len -= dollar + 1 - src; |
| 1145 | src = dollar + 1; |
| 1146 | |
| 1147 | if (len > 3 && !memcmp(src, "Id:", 3)) { |
| 1148 | dollar = memchr(src + 3, '$', len - 3); |
| 1149 | if (!dollar) |
| 1150 | break; |
| 1151 | if (memchr(src + 3, '\n', dollar - src - 3)) { |
| 1152 | /* Line break before the next dollar. */ |
| 1153 | continue; |
| 1154 | } |
| 1155 | |
| 1156 | memcpy(dst, "Id$", 3); |
| 1157 | dst += 3; |
| 1158 | len -= dollar + 1 - src; |
| 1159 | src = dollar + 1; |
| 1160 | } |
| 1161 | } |
| 1162 | memmove(dst, src, len); |
| 1163 | strbuf_setlen(buf, dst + len - buf->buf); |
| 1164 | return 1; |
| 1165 | } |
| 1166 | |
| 1167 | static int ident_to_worktree(const char *src, size_t len, |
| 1168 | struct strbuf *buf, int ident) |
no test coverage detected