Re: [PATCH v2 04/17] sequencer: configurably warn on non-existent files
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Dec 26, 2019, 20:39 UTC
- Message-ID
- <xmqqwoaikehz.fsf@gitster-ct.c.googlers.com>
- In-Reply-To
- <fd547aab491b24a47f683d717c6b77255ac16901.1577185374.git.liu.denton@gmail.com>
Denton Liu <liu.denton@gmail.com> writes:
> -static int read_oneliner(struct strbuf *buf, > - const char *path, int skip_if_empty) > +static int read_oneliner(struct strbuf *buf, const char *path, > + int skip_if_empty, int warn_nonexistence)
I would have to say that this results in a rather poor API in the end, and also forces an awkward API evolution, and we need to be careful especially if we plan to make this an external API in a later step in the series.
There is a topic in flight that introduces additional callsites of read_oneliner(). It is a selfish move that breaks codebase unnecessarily to unilaterally change the function signature.
Two possible ways to improve are:
* keep read_oneliner() with existing function signature working for other topics in flight, by renaming your extended variant and making read_oneliner() a thin wrapper that calls yours with the extended feature disabled (i.e. warn_nonexistence==0); or
* update skip_if_empty that wastes an int parameter to pass only a single bit into an unsigned that is a collection of bits, after vetting that new callsites contemporary topics add always pass either 0 or 1 as the parameter. Then
#define READ_ONELINER_SKIP_IF_EMPTY 01 #define READ_ONELINER_WARN_MISSING 02 static int read_oneliner(struct strbuf *buf, const char *path, unsigned flags)
would transparently work well for those other topics.
The latter probably is more preferrable, as the end result would be a cleaner API than the former or the one presented in this series.
Thanks.
Show 119 quoted lines
> {
> int ret = 0;
> struct strbuf file_buf = STRBUF_INIT;
>
> - if (!file_exists(path))
> + if (!warn_nonexistence && !file_exists(path))
> return 0;
>
> if (strbuf_read_file(&file_buf, path, 0) < 0) {
> @@ -2558,10 +2558,10 @@ void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
> static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
> {
> strbuf_reset(buf);
> - if (!read_oneliner(buf, rebase_path_strategy(), 0))
> + if (!read_oneliner(buf, rebase_path_strategy(), 0, 0))
> return;
> opts->strategy = strbuf_detach(buf, NULL);
> - if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
> + if (!read_oneliner(buf, rebase_path_strategy_opts(), 0, 0))
> return;
>
> parse_strategy_opts(opts, buf->buf);
> @@ -2572,7 +2572,7 @@ static int read_populate_opts(struct replay_opts *opts)
> if (is_rebase_i(opts)) {
> struct strbuf buf = STRBUF_INIT;
>
> - if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
> + if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1, 0)) {
> if (!starts_with(buf.buf, "-S"))
> strbuf_reset(&buf);
> else {
> @@ -2582,7 +2582,7 @@ static int read_populate_opts(struct replay_opts *opts)
> strbuf_reset(&buf);
> }
>
> - if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
> + if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1, 0)) {
> if (!strcmp(buf.buf, "--rerere-autoupdate"))
> opts->allow_rerere_auto = RERERE_AUTOUPDATE;
> else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
> @@ -2618,7 +2618,7 @@ static int read_populate_opts(struct replay_opts *opts)
> strbuf_release(&buf);
>
> if (read_oneliner(&opts->current_fixups,
> - rebase_path_current_fixups(), 1)) {
> + rebase_path_current_fixups(), 1, 0)) {
> const char *p = opts->current_fixups.buf;
> opts->current_fixup_count = 1;
> while ((p = strchr(p, '\n'))) {
> @@ -2627,7 +2627,7 @@ static int read_populate_opts(struct replay_opts *opts)
> }
> }
>
> - if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
> + if (read_oneliner(&buf, rebase_path_squash_onto(), 0, 0)) {
> if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
> return error(_("unusable squash-onto"));
> opts->have_squash_onto = 1;
> @@ -3759,7 +3759,7 @@ static int apply_autostash(struct replay_opts *opts)
> struct child_process child = CHILD_PROCESS_INIT;
> int ret = 0;
>
> - if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
> + if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1, 0)) {
> strbuf_release(&stash_sha1);
> return 0;
> }
> @@ -4093,7 +4093,7 @@ static int pick_commits(struct repository *r,
> if (todo_list->current < todo_list->nr)
> return 0;
>
> - if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
> + if (read_oneliner(&head_ref, rebase_path_head_name(), 0, 0) &&
> starts_with(head_ref.buf, "refs/")) {
> const char *msg;
> struct object_id head, orig;
> @@ -4106,13 +4106,13 @@ static int pick_commits(struct repository *r,
> strbuf_release(&buf);
> return res;
> }
> - if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
> + if (!read_oneliner(&buf, rebase_path_orig_head(), 0, 0) ||
> get_oid_hex(buf.buf, &orig)) {
> res = error(_("could not read orig-head"));
> goto cleanup_head_ref;
> }
> strbuf_reset(&buf);
> - if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
> + if (!read_oneliner(&buf, rebase_path_onto(), 0, 0)) {
> res = error(_("could not read 'onto'"));
> goto cleanup_head_ref;
> }
> @@ -4145,7 +4145,7 @@ static int pick_commits(struct repository *r,
> DIFF_FORMAT_DIFFSTAT;
> log_tree_opt.disable_stdin = 1;
>
> - if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
> + if (read_oneliner(&buf, rebase_path_orig_head(), 0, 0) &&
> !get_oid(buf.buf, &orig) &&
> !get_oid("HEAD", &head)) {
> diff_tree_oid(&orig, &head, "",
> @@ -4230,7 +4230,7 @@ static int commit_staged_changes(struct repository *r,
>
> if (get_oid("HEAD", &head))
> return error(_("cannot amend non-existing commit"));
> - if (!read_oneliner(&rev, rebase_path_amend(), 0))
> + if (!read_oneliner(&rev, rebase_path_amend(), 0, 0))
> return error(_("invalid file: '%s'"), rebase_path_amend());
> if (get_oid_hex(rev.buf, &to_amend))
> return error(_("invalid contents: '%s'"),
> @@ -4391,7 +4391,7 @@ int sequencer_continue(struct repository *r, struct replay_opts *opts)
> struct strbuf buf = STRBUF_INIT;
> struct object_id oid;
>
> - if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
> + if (read_oneliner(&buf, rebase_path_stopped_sha(), 1, 0) &&
> !get_oid_committish(buf.buf, &oid))
> record_in_rewritten(&oid, peek_command(&todo_list, 0));
> strbuf_release(&buf);