static int check_updates(struct unpack_trees_options *o) { unsigned cnt = 0, total = 0; struct progress *progress = NULL; struct index_state *index = &o->result; int i; int errs = 0; if (o->update && o->verbose_update) { for (total = cnt = 0; cnt < index->cache_nr; cnt++) { const struct cache_entry *ce = index->cache[cnt]; if (ce->ce_flags & (CE_UPDATE | CE_WT_REMOVE)) total++; } progress = start_progress_delay(_("Checking out files"), total, 50, 1); cnt = 0; } if (o->update) git_attr_set_direction(GIT_ATTR_CHECKOUT, &o->result); for (i = 0; i < index->cache_nr; i++) { const struct cache_entry *ce = index->cache[i]; if (ce->ce_flags & CE_WT_REMOVE) { display_progress(progress, ++cnt); if (o->update && !o->dry_run) unlink_entry(ce); continue; } } remove_marked_cache_entries(&o->result); remove_scheduled_dirs(); for (i = 0; i < index->cache_nr; i++) { struct cache_entry *ce = index->cache[i]; if (ce->ce_flags & CE_UPDATE) { if (ce->ce_flags & CE_WT_REMOVE) die("BUG: both update and delete flags are set on %s", ce->name); display_progress(progress, ++cnt); ce->ce_flags &= ~CE_UPDATE; if (o->update && !o->dry_run) { errs |= checkout_entry(ce, &state, NULL); } } } stop_progress(&progress); if (o->update) git_attr_set_direction(GIT_ATTR_CHECKIN, NULL); return errs != 0; }
int write_archive_entries(struct archiver_args *args, write_archive_entry_fn_t write_entry) { struct archiver_context context; struct unpack_trees_options opts; struct tree_desc t; int err; if (args->baselen > 0 && args->base[args->baselen - 1] == '/') { size_t len = args->baselen; while (len > 1 && args->base[len - 2] == '/') len--; if (args->verbose) fprintf(stderr, "%.*s\n", (int)len, args->base); err = write_entry(args, args->tree->object.sha1, args->base, len, 040777); if (err) return err; } memset(&context, 0, sizeof(context)); context.args = args; context.write_entry = write_entry; /* * Setup index and instruct attr to read index only */ if (!args->worktree_attributes) { memset(&opts, 0, sizeof(opts)); opts.index_only = 1; opts.head_idx = -1; opts.src_index = &the_index; opts.dst_index = &the_index; opts.fn = oneway_merge; init_tree_desc(&t, args->tree->buffer, args->tree->size); if (unpack_trees(1, &t, &opts)) return -1; git_attr_set_direction(GIT_ATTR_INDEX, &the_index); } err = read_tree_recursive(args->tree, "", 0, 0, &args->pathspec, args->pathspec.has_wildcard ? queue_or_write_archive_entry : write_archive_entry_buf, &context); if (err == READ_TREE_RECURSIVE) err = 0; while (context.bottom) { struct directory *next = context.bottom->up; free(context.bottom); context.bottom = next; } return err; }
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; }