int cmd_check_attr(int argc, const char **argv, const char *prefix) { struct git_attr_check *check; int cnt, i, doubledash, filei; argc = parse_options(argc, argv, prefix, check_attr_options, check_attr_usage, PARSE_OPT_KEEP_DASHDASH); if (read_cache() < 0) { die("invalid cache"); } if (cached_attrs) git_attr_set_direction(GIT_ATTR_INDEX, NULL); doubledash = -1; for (i = 0; doubledash < 0 && i < argc; i++) { if (!strcmp(argv[i], "--")) doubledash = i; } /* Process --all and/or attribute arguments: */ if (all_attrs) { if (doubledash >= 1) error_with_usage("Attributes and --all both specified"); cnt = 0; filei = doubledash + 1; } else if (doubledash == 0) { error_with_usage("No attribute specified"); } else if (doubledash < 0) { if (!argc) error_with_usage("No attribute specified"); if (stdin_paths) { /* Treat all arguments as attribute names. */ cnt = argc; filei = argc; } else { /* Treat exactly one argument as an attribute name. */ cnt = 1; filei = 1; } } else { cnt = doubledash; filei = doubledash + 1; } /* Check file argument(s): */ if (stdin_paths) { if (filei < argc) error_with_usage("Can't specify files with --stdin"); } else { if (filei >= argc) error_with_usage("No file specified"); } if (all_attrs) { check = NULL; } else { check = xcalloc(cnt, sizeof(*check)); for (i = 0; i < cnt; i++) { const char *name; struct git_attr *a; name = argv[i]; a = git_attr(name); if (!a) return error("%s: not a valid attribute name", name); check[i].attr = a; } } if (stdin_paths) check_attr_stdin_paths(prefix, cnt, check); else { for (i = filei; i < argc; i++) check_attr(prefix, cnt, check, argv[i]); maybe_flush_or_die(stdout, "attribute to stdout"); } return 0; }
int cmd_check_attr(int argc, const char **argv, const char *prefix) { struct attr_check *check; int cnt, i, doubledash, filei; if (!is_bare_repository()) setup_work_tree(); git_config(git_default_config, NULL); argc = parse_options(argc, argv, prefix, check_attr_options, check_attr_usage, PARSE_OPT_KEEP_DASHDASH); if (read_cache() < 0) { die("invalid cache"); } if (cached_attrs) git_attr_set_direction(GIT_ATTR_INDEX, NULL); doubledash = -1; for (i = 0; doubledash < 0 && i < argc; i++) { if (!strcmp(argv[i], "--")) doubledash = i; } /* Process --all and/or attribute arguments: */ if (all_attrs) { if (doubledash >= 1) error_with_usage("Attributes and --all both specified"); cnt = 0; filei = doubledash + 1; } else if (doubledash == 0) { error_with_usage("No attribute specified"); } else if (doubledash < 0) { if (!argc) error_with_usage("No attribute specified"); if (stdin_paths) { /* Treat all arguments as attribute names. */ cnt = argc; filei = argc; } else { /* Treat exactly one argument as an attribute name. */ cnt = 1; filei = 1; } } else { cnt = doubledash; filei = doubledash + 1; } /* Check file argument(s): */ if (stdin_paths) { if (filei < argc) error_with_usage("Can't specify files with --stdin"); } else { if (filei >= argc) error_with_usage("No file specified"); } check = attr_check_alloc(); if (!all_attrs) { for (i = 0; i < cnt; i++) { const struct git_attr *a = git_attr(argv[i]); if (!a) return error("%s: not a valid attribute name", argv[i]); attr_check_append(check, a); } } if (stdin_paths) check_attr_stdin_paths(prefix, check, all_attrs); else { for (i = filei; i < argc; i++) check_attr(prefix, check, all_attrs, argv[i]); maybe_flush_or_die(stdout, "attribute to stdout"); } attr_check_free(check); return 0; }