From: Bagas Sanjaya Date: Mon, 14 Feb 2022 03:14:29 GMT Subject: Re: [PATCH v2] hard reset safe mode Message-ID: In-Reply-To: On 12/02/22 06.03, Junio C Hamano wrote: > "Viaceslavus via GitGitGadget" writes: > >> From: Viacelaus >> >> The power of hard reset may frequently be inconvinient for a common user. So >> this is an implementation of safe mode for hard reset. It can be switched on >> by setting 'reset.safe' config variable to true. When running 'reset --hard' >> with 'reset.safe' enabled git will check if there are any staged changes >> that may be discarded by this reset. If there is a chance of deleting the >> changes, git will ask the user for a confirmation with Yes/No choice. > > There needs an explanation on how this avoids breaking scripts that > trust that "git reset --hard HEAD" reliably matches the index and > the working tree files to what is recorded in HEAD without getting > stuck waiting for any user input. "They can turn off reset.safe" is > not an acceptable answer. > >> +static int check_commit_exists(const char *refname, const struct object_id *oid, int f, void *d) >> +{ >> + return is_branch(refname); >> +} > > The returned value from a for_each_ref() callback is used to tell > the caller "stop here, no need to further iterate and call me with > other refs". I think this wants to say "if I ever get called even > once, tell the caller to stop, so that it can tell its caller that > it was stopped". > >> +static void accept_discarding_changes(void) { >> + int answer = getc(stdin); >> + printf(_("Some staged changes may be discarded by this reset. Continue? [Y/n]")); >> + >> + if (answer != 'y' && answer != 'Y') { >> + printf(_("aborted\n")); >> + exit(1); >> + } >> +} > > I'd think at least we should use git_prompt(), instead of > hand-rolled prompt routine like this one that assumes that an > end-user is sitting in front of the terminal waiting to be prompted. > > If updating "git reset" like this patch does were a good idea to > begin with, that is. > I think it's better just to error out when there are staged changes. The message will be something like: "error: there are staged changes that will be hard-reset. Please commit or stash them before resetting. If you want to remove all changes from index, you can do so by running 'git reset'." -- An old man doll... just what I always wanted! - Clara