commit d2e4f1e938dd709aa0969b8f334c91dd2f1d24ef from: Stefan Sperling date: Mon Mar 11 09:49:08 2024 UTC build a list of ID/refname pairs from stdin commit - dd669d1824c1e2077bc147b91460ca4209621ced commit + d2e4f1e938dd709aa0969b8f334c91dd2f1d24ef blob - cdc23983f6af5f4cf642e738040bcb424ce25a4b blob + f4b5063722029cc5a154459dd9e915a680617558 --- gotd/libexec/got-notify-email/got-notify-email.c +++ gotd/libexec/got-notify-email/got-notify-email.c @@ -56,17 +56,16 @@ send_notifications(struct got_repository *repo, const int with_diff) { const struct got_error *err; - char *line = NULL, *space = NULL; + char *line = NULL, *space = NULL, *refname = NULL; size_t linesize = 0; ssize_t linelen; struct got_object_id *id = NULL; - struct got_reference *ref = NULL; - const char *refname; - int have_line = 0; + struct got_object_id_queue ids; + struct got_object_qid *qid = NULL; - while ((linelen = getline(&line, &linesize, stdin)) != -1) { - have_line = 1; + STAILQ_INIT(&ids); + while ((linelen = getline(&line, &linesize, stdin)) != -1) { while (linelen > 0 && line[linelen - 1] == '\n') { line[linelen - 1] = '\0'; linelen--; @@ -82,29 +81,52 @@ send_notifications(struct got_repository *repo, const *space = '\0'; - refname = space + 1; - err = got_ref_open(&ref, repo, refname, 0); - if (err) + refname = strdup(space + 1); + if (refname == NULL) { + err = got_error_from_errno("strdup"); goto done; + } + if (!got_ref_name_is_valid(refname)) { + err = got_error_fmt(GOT_ERR_BAD_REF_NAME, "%s", + refname); + goto done; + } err = got_object_resolve_id_str(&id, repo, line); if (err) goto done; + err = got_object_qid_alloc(&qid, id); + if (err) + goto done; + + qid->data = refname; + refname = NULL; + + STAILQ_INSERT_TAIL(&ids, qid, entry); + free(id); id = NULL; - got_ref_close(ref); - ref = NULL; } - if (!have_line) + if (STAILQ_EMPTY(&ids)) { err = got_error_fmt(GOT_ERR_EOF, "reading 'commit reference-name' pairs from stdin"); + goto done; + } + + STAILQ_FOREACH(qid, &ids, entry) { + char *idstr; + got_object_id_str(&idstr, &qid->id); + refname = qid->data; + printf("%s: commit=%s refname=%s\n", __func__, idstr, refname); + } done: free(line); free(id); - if (ref) - got_ref_close(ref); + free(refname); + if (qid) + got_object_qid_free(qid); return err; }