Michael J Gruber <g...@drmicha.warpmail.net> writes:

> Currently, "diff" and "cat-file" for blobs obey "--textconv" options
> (with the former defaulting to "--textconv" and the latter to
> "--no-textconv") whereas "show" does not obey this option, even though
> it takes diff options.
>
> Make "show" on blobs behave like "diff", i.e. obey "--textconv" by
> default and "--no-textconv" when given.

What does "log -p" do currently, and what should it do?  Does/should
it also use --textconv?

The --textconv is a natural extension of what --ext-diff provides us,
so I think it should trigger the same way as how --ext-diff triggers.

We apply "--ext-diff" for "diff" by default but not for "log -p" and
"show"; I suspect this may have been for a good reason but I do not
recall the discussion that led to the current behaviour offhand.

> Signed-off-by: Michael J Gruber <g...@drmicha.warpmail.net>
> ---
>  builtin/log.c | 24 +++++++++++++++++++++---
>  1 file changed, 21 insertions(+), 3 deletions(-)
>
> diff --git a/builtin/log.c b/builtin/log.c
> index 8f0b2e8..f83870d 100644
> --- a/builtin/log.c
> +++ b/builtin/log.c
> @@ -402,10 +402,28 @@ static void show_tagger(char *buf, int len, struct 
> rev_info *rev)
>       strbuf_release(&out);
>  }
>  
> -static int show_blob_object(const unsigned char *sha1, struct rev_info *rev)
> +static int show_blob_object(const unsigned char *sha1, struct rev_info *rev, 
> const char *obj_name)
>  {
> +     unsigned char sha1c[20];
> +     struct object_context obj_context;
> +     char *buf;
> +     unsigned long size;
> +
>       fflush(stdout);
> -     return stream_blob_to_fd(1, sha1, NULL, 0);
> +     if (!DIFF_OPT_TST(&rev->diffopt, ALLOW_TEXTCONV))
> +             return stream_blob_to_fd(1, sha1, NULL, 0);
> +
> +     if (get_sha1_with_context(obj_name, 0, sha1c, &obj_context))
> +             die("Not a valid object name %s", obj_name);
> +     if (!obj_context.path[0] ||
> +         !textconv_object(obj_context.path, obj_context.mode, sha1c, 1, 
> &buf, &size))
> +             return stream_blob_to_fd(1, sha1, NULL, 0);
> +
> +     if (!buf)
> +             die("git show %s: bad file", obj_name);
> +
> +     write_or_die(1, buf, size);
> +     return 0;
>  }
>  
>  static int show_tag_object(const unsigned char *sha1, struct rev_info *rev)
> @@ -491,7 +509,7 @@ int cmd_show(int argc, const char **argv, const char 
> *prefix)
>               const char *name = objects[i].name;
>               switch (o->type) {
>               case OBJ_BLOB:
> -                     ret = show_blob_object(o->sha1, NULL);
> +                     ret = show_blob_object(o->sha1, &rev, name);
>                       break;
>               case OBJ_TAG: {
>                       struct tag *t = (struct tag *)o;
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to