On Sat, Feb 10, 2018 at 7:10 PM, Johannes Schindelin <johannes.schindelin@xxxxxx> wrote: > [...] > This commit implements the commands to label, and to reset to, given > revisions. The syntax is: > > label <name> > reset <name> > [...] > Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> > --- > diff --git a/sequencer.c b/sequencer.c > @@ -1922,6 +1951,151 @@ static int do_exec(const char *command_line) > +static int safe_append(const char *filename, const char *fmt, ...) > +{ > + [...] > + if (write_in_full(fd, buf.buf, buf.len) < 0) { > + error_errno(_("could not write to '%s'"), filename); > + rollback_lock_file(&lock); strbuf_release(&buf); > + return -1; > + } > + if (commit_lock_file(&lock) < 0) { > + rollback_lock_file(&lock); strbuf_release(&buf); > + return error(_("failed to finalize '%s'"), filename); > + } > + strbuf_release(&buf); > + return 0; > +} > + > +static int do_reset(const char *name, int len, struct replay_opts *opts) > +{ > + [...] > + unpack_tree_opts.reset = 1; > + > + if (read_cache_unmerged()) rollback_lock_file(&lock); strbuf_release(&ref_name); > + return error_resolve_conflict(_(action_name(opts))); > + > + if (!fill_tree_descriptor(&desc, &oid)) { > + error(_("failed to find tree of %s"), oid_to_hex(&oid)); > + rollback_lock_file(&lock); > + free((void *)desc.buffer); > + strbuf_release(&ref_name); > + return -1; > + }