Merge branch 'mg/more-textconv'

Make "git grep" and "git show" pay attention to --textconv when
dealing with blob objects.

* mg/more-textconv:
  grep: honor --textconv for the case rev:path
  grep: allow to use textconv filters
  t7008: demonstrate behavior of grep with textconv
  cat-file: do not die on --textconv without textconv filters
  show: honor --textconv for blobs
  diff_opt: track whether flags have been set explicitly
  t4030: demonstrate behavior of show with textconv
This commit is contained in:
Junio C Hamano
2013-10-23 13:21:30 -07:00
14 changed files with 237 additions and 57 deletions

View File

@ -111,6 +111,7 @@ static void cmd_log_init_defaults(struct rev_info *rev)
if (default_date_mode)
rev->date_mode = parse_date_format(default_date_mode);
rev->diffopt.touched_flags = 0;
}
static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
@ -436,10 +437,29 @@ 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_TOUCHED(&rev->diffopt, ALLOW_TEXTCONV) ||
!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)
@ -525,7 +545,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;