Hi Denton,

On Wed, 16 Oct 2019, Denton Liu wrote:

> Continue the process of lib-ifying the autostash code. In a future
> commit, this will be used to implement `--autostash` in other builtins.
>
> This patch is best viewed with `--color-moved` and
> `--color-moved-ws=allow-indentation-change`.
>
> Signed-off-by: Denton Liu <liu.den...@gmail.com>
> ---
>  autostash.c      | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  autostash.h      |  1 +
>  builtin/rebase.c | 44 +-------------------------------------------
>  3 files changed, 48 insertions(+), 43 deletions(-)
>
> diff --git a/autostash.c b/autostash.c
> index eb58e0c8a4..722cf78b12 100644
> --- a/autostash.c
> +++ b/autostash.c
> @@ -12,6 +12,7 @@
>  #include "tree-walk.h"
>  #include "tree.h"
>  #include "unpack-trees.h"
> +#include "wt-status.h"
>
>  int read_one(const char *path, struct strbuf *buf)
>  {
> @@ -150,6 +151,51 @@ int reset_head(struct object_id *oid, const char *action,
>       return ret;
>  }
>
> +void perform_autostash(const char *path)

Maybe we can find a better name than "perform_autostash"? It is not
clear whether this is the "saving" or "applying" part of the autostash,
I think.

Maybe `save_autostash()`? And maybe instead of `path`, the parameter
could be `save_hash_to_path` or something similar?

Now that I think of it, I forgot to mention in a reply to an earlier
patch in this series that `reset_head()` might be too generic a name to
be a global function...

Ciao,
Dscho

> +{
> +     struct strbuf buf = STRBUF_INIT;
> +     struct lock_file lock_file = LOCK_INIT;
> +     int fd;
> +
> +     fd = hold_locked_index(&lock_file, 0);
> +     refresh_cache(REFRESH_QUIET);
> +     if (0 <= fd)
> +             repo_update_index_if_able(the_repository, &lock_file);
> +     rollback_lock_file(&lock_file);
> +
> +     if (has_unstaged_changes(the_repository, 1) ||
> +         has_uncommitted_changes(the_repository, 1)) {
> +             struct child_process stash = CHILD_PROCESS_INIT;
> +             struct object_id oid;
> +
> +             argv_array_pushl(&stash.args,
> +                              "stash", "create", "autostash", NULL);
> +             stash.git_cmd = 1;
> +             stash.no_stdin = 1;
> +             if (capture_command(&stash, &buf, GIT_MAX_HEXSZ))
> +                     die(_("Cannot autostash"));
> +             strbuf_trim_trailing_newline(&buf);
> +             if (get_oid(buf.buf, &oid))
> +                     die(_("Unexpected stash response: '%s'"),
> +                         buf.buf);
> +             strbuf_reset(&buf);
> +             strbuf_add_unique_abbrev(&buf, &oid, DEFAULT_ABBREV);
> +
> +             if (safe_create_leading_directories_const(path))
> +                     die(_("Could not create directory for '%s'"),
> +                         path);
> +             write_file(path, "%s", oid_to_hex(&oid));
> +             printf(_("Created autostash: %s\n"), buf.buf);
> +             if (reset_head(NULL, "reset --hard",
> +                            NULL, RESET_HEAD_HARD, NULL, NULL) < 0)
> +                     die(_("could not reset --hard"));
> +
> +             if (discard_index(the_repository->index) < 0 ||
> +                     repo_read_index(the_repository) < 0)
> +                     die(_("could not read index"));
> +     }
> +}
> +
>  int apply_autostash(const char *path)
>  {
>       struct strbuf autostash = STRBUF_INIT;
> diff --git a/autostash.h b/autostash.h
> index 1406638166..e08ccb9881 100644
> --- a/autostash.h
> +++ b/autostash.h
> @@ -18,6 +18,7 @@ int reset_head(struct object_id *oid, const char *action,
>              const char *switch_to_branch, unsigned flags,
>              const char *reflog_orig_head, const char *reflog_head);
>
> +void perform_autostash(const char *path);
>  int apply_autostash(const char *path);
>
>  #endif
> diff --git a/builtin/rebase.c b/builtin/rebase.c
> index c3165896cc..c4decdfb5b 100644
> --- a/builtin/rebase.c
> +++ b/builtin/rebase.c
> @@ -1797,49 +1797,7 @@ int cmd_rebase(int argc, const char **argv, const char 
> *prefix)
>               die(_("could not read index"));
>
>       if (options.autostash) {
> -             struct lock_file lock_file = LOCK_INIT;
> -             int fd;
> -
> -             fd = hold_locked_index(&lock_file, 0);
> -             refresh_cache(REFRESH_QUIET);
> -             if (0 <= fd)
> -                     repo_update_index_if_able(the_repository, &lock_file);
> -             rollback_lock_file(&lock_file);
> -
> -             if (has_unstaged_changes(the_repository, 1) ||
> -                 has_uncommitted_changes(the_repository, 1)) {
> -                     const char *autostash =
> -                             state_dir_path("autostash", &options);
> -                     struct child_process stash = CHILD_PROCESS_INIT;
> -                     struct object_id oid;
> -
> -                     argv_array_pushl(&stash.args,
> -                                      "stash", "create", "autostash", NULL);
> -                     stash.git_cmd = 1;
> -                     stash.no_stdin = 1;
> -                     strbuf_reset(&buf);
> -                     if (capture_command(&stash, &buf, GIT_MAX_HEXSZ))
> -                             die(_("Cannot autostash"));
> -                     strbuf_trim_trailing_newline(&buf);
> -                     if (get_oid(buf.buf, &oid))
> -                             die(_("Unexpected stash response: '%s'"),
> -                                 buf.buf);
> -                     strbuf_reset(&buf);
> -                     strbuf_add_unique_abbrev(&buf, &oid, DEFAULT_ABBREV);
> -
> -                     if (safe_create_leading_directories_const(autostash))
> -                             die(_("Could not create directory for '%s'"),
> -                                 options.state_dir);
> -                     write_file(autostash, "%s", oid_to_hex(&oid));
> -                     printf(_("Created autostash: %s\n"), buf.buf);
> -                     if (reset_head(NULL, "reset --hard",
> -                                    NULL, RESET_HEAD_HARD, NULL, NULL) < 0)
> -                             die(_("could not reset --hard"));
> -
> -                     if (discard_index(the_repository->index) < 0 ||
> -                             repo_read_index(the_repository) < 0)
> -                             die(_("could not read index"));
> -             }
> +             perform_autostash(state_dir_path("autostash", &options));
>       }
>
>       if (require_clean_work_tree(the_repository, "rebase",
> --
> 2.23.0.897.g0a19638b1e
>
>

Reply via email to