On Mon, Dec 29, 2014 at 9:36 PM, Stefan Beller <sbeller@xxxxxxxxxx> wrote: > Update receive-pack to use an atomic transaction iff the client negotiated > that it wanted atomic push. This first line seems germane to this patch... > This leaves the default behavior to be the old > non-atomic one ref at a time update. This is to cause as little disruption > as possible to existing clients. It is unknown if there are client scripts > that depend on the old non-atomic behavior so we make it opt-in for now. > > If it turns out over time that there are no client scripts that depend on the > old behavior we can change git to default to use atomic pushes and instead > offer an opt-out argument for people that do not want atomic pushes. However, the remainder feels like it belongs with some other patch, such as a patch which introduces an --atomic option. > Inspired-by: Ronnie Sahlberg <sahlberg@xxxxxxxxxx> > Helped-by: Eric Sunshine <sunshine@xxxxxxxxxxxxxx> > Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> > --- > diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c > index 5f44466..35a2264 100644 > --- a/builtin/receive-pack.c > +++ b/builtin/receive-pack.c > @@ -1076,8 +1076,8 @@ static void check_shallow_bugs(struct command *commands, > "the reported refs above"); > } > > -static void execute_commands_loop(struct command *commands, > - struct shallow_info *si) > +static void execute_commands_non_atomic(struct command *commands, > + struct shallow_info *si) Style: Indent the wrapped line to align with the text following the '(' in the first line. > { > struct command *cmd; > struct strbuf err = STRBUF_INIT; > @@ -1104,7 +1104,50 @@ static void execute_commands_loop(struct command *commands, > } > ref_transaction_free(transaction); > } > + strbuf_release(&err); > +} > + > +static void execute_commands_atomic(struct command *commands, > + struct shallow_info *si) Style: Indentation. > +{ > + struct command *cmd; > + struct strbuf err = STRBUF_INIT; > + const char *reported_error = "atomic push failure"; > + > + transaction = ref_transaction_begin(&err); > + if (!transaction) { > + rp_error("%s", err.buf); > + strbuf_reset(&err); > + reported_error = "transaction failed to start"; > + goto failure; > + } > + > + for (cmd = commands; cmd; cmd = cmd->next) { > + if (!should_process_cmd(cmd)) > + continue; > > + cmd->error_string = update(cmd, si); > + > + if (cmd->error_string) > + goto failure; > + } > + > + if (ref_transaction_commit(transaction, &err)) { > + rp_error("%s", err.buf); > + reported_error = "atomic transaction failed"; > + goto failure; > + } > + > + ref_transaction_free(transaction); > + strbuf_release(&err); > + return; Minor comment: This cleanup code is repeated in both the success and fail branches. It _might_ (or not) be a bit cleaner and more maintainable to replace the above three lines with: goto done; > + > +failure: > + for (cmd = commands; cmd; cmd = cmd->next) > + if (!cmd->error_string) > + cmd->error_string = reported_error; And add a 'done' label here: done: > + ref_transaction_free(transaction); > strbuf_release(&err); > } > > @@ -1142,7 +1185,10 @@ static void execute_commands(struct command *commands, > free(head_name_to_free); > head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL); > > - execute_commands_loop(commands, si); > + if (use_atomic) > + execute_commands_atomic(commands, si); > + else > + execute_commands_non_atomic(commands, si); > > check_shallow_bugs(commands, si); > } > -- > 2.2.1.62.g3f15098 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html