this skips all blob objects who's path does not begin with the specified prefix Signed-off-by: Robin Ruede <r.ruede@xxxxxxxxx> --- list-objects.c | 4 +++- revision.c | 4 ++++ revision.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/list-objects.c b/list-objects.c index f3ca6aa..91a6091 100644 --- a/list-objects.c +++ b/list-objects.c @@ -28,7 +28,9 @@ static void process_blob(struct rev_info *revs, pathlen = path->len; strbuf_addstr(path, name); - show(obj, path->buf, cb_data); + if (!revs->sparse_prefix || starts_with(path->buf, revs->sparse_prefix + 1)) { + show(obj, path->buf, cb_data); + } strbuf_setlen(path, pathlen); } diff --git a/revision.c b/revision.c index edba5b7..a36a796 100644 --- a/revision.c +++ b/revision.c @@ -1664,6 +1664,10 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg } else if ((argcount = parse_long_opt("skip", argv, &optarg))) { revs->skip_count = atoi(optarg); return argcount; + } else if ((argcount = parse_long_opt("sparse-prefix", argv, &optarg))) { + if(optarg[0] != '/') return error(N_("sparse prefix must start with /")); + revs->sparse_prefix = optarg; + return argcount; } else if ((*arg == '-') && isdigit(arg[1])) { /* accept -<digit>, like traditional "head" */ if (strtol_i(arg + 1, 10, &revs->max_count) < 0 || diff --git a/revision.h b/revision.h index 9fac1a6..2c7c5f2 100644 --- a/revision.h +++ b/revision.h @@ -113,6 +113,7 @@ struct rev_info { ancestry_path:1, first_parent_only:1, line_level_traverse:1; + const char *sparse_prefix; /* Diff flags */ unsigned int diff:1, -- 2.9.1.283.g3ca5b4c.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html