On Wed, May 16, 2018 at 03:21:18PM -0700, Stefan Beller wrote:

This commit may need some more explanation. It's not always safe to
replace "read_cache();" with "repo_read_index_or_die();" and you do
sometimes avoid that variant.

While I agree _or_die() is the right thing to do most of the time. You
need to consider that we (or some of us) have tried to avoid die() in
some library code. So..

> Signed-off-by: Stefan Beller <sbel...@google.com>
> ---
>  blame.c               | 5 +++--
>  builtin/am.c          | 3 ++-
>  builtin/diff.c        | 3 ++-
>  builtin/fsck.c        | 3 ++-
>  builtin/merge-index.c | 3 ++-

These should be good.

>  check-racy.c          | 2 +-

Meh.. this one is test code.

> diff --git a/diff.c b/diff.c
> index 1289df4b1f9..383f52fa118 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -22,6 +22,7 @@
>  #include "argv-array.h"
>  #include "graph.h"
>  #include "packfile.h"
> +#include "repository.h"
>  
>  #ifdef NO_FAST_WORKING_DIRECTORY
>  #define FAST_WORKING_DIRECTORY 0
> @@ -4210,13 +4211,13 @@ void diff_setup_done(struct diff_options *options)
>               options->rename_limit = diff_rename_limit_default;
>       if (options->setup & DIFF_SETUP_USE_CACHE) {
>               if (!active_cache)
> -                     /* read-cache does not die even when it fails
> +                     /* repo_read_indexe does not die even when it fails

s/indexe/index/

>                        * so it is safe for us to do this here.  Also
>                        * it does not smudge active_cache or active_nr
>                        * when it fails, so we do not have to worry about
>                        * cleaning it up ourselves either.
>                        */
> -                     read_cache();
> +                     repo_read_index(the_repository);

Should we write a warning message or something?

> diff --git a/revision.c b/revision.c
> index 1cff11833e7..8ad9824143d 100644
> --- a/revision.c
> +++ b/revision.c
> @@ -23,6 +23,7 @@
>  #include "packfile.h"
>  #include "worktree.h"
>  #include "argv-array.h"
> +#include "repository.h"
>  
>  volatile show_early_output_fn_t show_early_output;
>  
> @@ -1344,7 +1345,7 @@ void add_index_objects_to_pending(struct rev_info 
> *revs, unsigned int flags)
>  {
>       struct worktree **worktrees, **p;
>  
> -     read_cache();
> +     repo_read_index_or_die(the_repository);

I think here we should be able to tolerate a bad index file. If you
have bad index file, we ignore object references from it and continue
on the rev walk without it. So repo_read_index() may be better,
optionally with a warning.

> diff --git a/sha1-name.c b/sha1-name.c
> index 5b93bf8da36..83d5f945cf1 100644
> --- a/sha1-name.c
> +++ b/sha1-name.c
> @@ -1639,7 +1639,7 @@ static int get_oid_with_context_1(const char *name,
>                       oc->path = xstrdup(cp);
>  
>               if (!active_cache)
> -                     read_cache();
> +                     repo_read_index_or_die(the_repository);

This should return an error code instead. I notice there's a
"only_to_die" flag somewhere in here. Something to think about.

BTW you probably want to move away from "active_cache" too. It makes
sense to read "if active cache is null then read the cache". But with
the move to the repository it now seems disconnected.

This looks clearer but a bit verbose

                if (!the_repository->index_file.cache)
                        repo_read_index_or_die(the_repository);

This might be the best

                if (!repo_index_loaded(the_repository))
                        repo_read_index_or_die(the_repository);

but obviously more work for you, so your choice :)

>               pos = cache_name_pos(cp, namelen);
>               if (pos < 0)
>                       pos = -pos - 1;
> -- 
> 2.17.0.582.gccdcbd54c44.dirty
> 

Reply via email to