/* * Write out any suspect information which depends on the path. This must be * handled separately from emit_one_suspect_detail(), because a given commit * may have changes in multiple paths. So this needs to appear each time * we mention a new group. * * To allow LF and other nonportable characters in pathnames, * they are c-style quoted as needed. */ static void write_filename_info(struct blame_origin *suspect) { if (suspect->previous) { struct blame_origin *prev = suspect->previous; printf("previous %s ", oid_to_hex(&prev->commit->object.oid)); write_name_quoted(prev->path, stdout, '\n'); } printf("filename "); write_name_quoted(suspect->path, stdout, '\n'); }
static void output_exclude(const char *path, struct exclude *exclude) { char *bang = exclude->flags & EXC_FLAG_NEGATIVE ? "!" : ""; char *slash = exclude->flags & EXC_FLAG_MUSTBEDIR ? "/" : ""; if (!null_term_line) { if (!verbose) { write_name_quoted(path, stdout, '\n'); } else { quote_c_style(exclude->el->src, NULL, stdout, 0); printf(":%d:%s%s%s\t", exclude->srcpos, bang, exclude->pattern, slash); quote_c_style(path, NULL, stdout, 0); fputc('\n', stdout); } } else { if (!verbose) { printf("%s%c", path, '\0'); } else { printf("%s%c%d%c%s%s%s%c%s%c", exclude->el->src, '\0', exclude->srcpos, '\0', bang, exclude->pattern, slash, '\0', path, '\0'); } } }
int cmd_ls_files(git_repository *repo, int argc, char **argv) { int i; int rc = EXIT_FAILURE; int show_cached = 1; int err = 0; char *file = NULL; char buf[GIT_OID_HEXSZ+1]; git_index *idx = NULL; for (i=1;i<argc;i++) { if (strcmp(argv[i], "--stage") == 0 || strcmp(argv[i], "-s") == 0) show_cached = 0; else if (strcmp(argv[i], "--cached") == 0 || strcmp(argv[i], "-c") == 0) show_cached = 1; else if (argv[i][0] == '-') { fprintf(stderr,"Unknown option %s!\n",argv[i]); goto out; } else { file = argv[i]; } } if (!file) file = "*"; if ((err = git_repository_index(&idx, repo)) != GIT_OK) goto out; const char *prefix = ""; size_t prefix_len = strlen(prefix); for (unsigned i = 0; i < git_index_entrycount(idx); i++) { const git_index_entry *gie = git_index_get_byindex(idx, i); if (prefixcmp(gie->path, prefix)) continue; if (pathspeccmp(gie->path,file)) continue; if (!show_cached) printf("%06o %s %i\t", gie->mode, git_oid_tostr(buf, GIT_OID_HEXSZ+1, &gie->id), git_index_entry_stage(gie)); write_name_quoted(gie->path + prefix_len, stdout, '\n'); } rc = EXIT_SUCCESS; out: if (err) libgit_error(); if (idx) git_index_free(idx); return rc; }
void write_name_quoted_relative(const char *name, const char *prefix, FILE *fp, int terminator) { struct strbuf sb = STRBUF_INIT; name = relative_path(name, prefix, &sb); write_name_quoted(name, fp, terminator); strbuf_release(&sb); }
void write_name_quoted_relative(const char *name, size_t len, const char *prefix, size_t prefix_len, FILE *fp, int terminator) { struct strbuf sb = STRBUF_INIT; name = path_relative(name, len, &sb, prefix, prefix_len); write_name_quoted(name, fp, terminator); strbuf_release(&sb); }
static void show_dir_entry(const char *tag, struct dir_entry *ent) { int len = prefix_len; int offset = prefix_offset; if (len >= ent->len) die("git ls-files: internal error - directory entry not superset of prefix"); if (!match_pathspec(pathspec, ent->name, ent->len, len, ps_matched)) return; fputs(tag, stdout); write_name_quoted(ent->name + offset, stdout, line_terminator); }
int cmd_ls_files(int argc, const char **argv) { /* Delete the following line once git tests pass */ please_git_do_it_for_me(); int show_cached = 1; /* options parsing */ if (argc > 1) { if (argc > 2) please_git_do_it_for_me(); if (strcmp(argv[1], "--stage") == 0 || strcmp(argv[1], "-s") == 0) show_cached = 0; else if (strcmp(argv[1], "--cached") == 0 || strcmp(argv[1], "-c") == 0) show_cached = 1; else please_git_do_it_for_me(); } git_repository *repo = get_git_repository(); git_index *index_cur; int e = git_repository_index(&index_cur, repo); if (e) libgit_error(); char buf[GIT_OID_HEXSZ+1]; const char *prefix = get_git_prefix(); size_t prefix_len = strlen(prefix); for (unsigned i = 0; i < git_index_entrycount(index_cur); i++) { git_index_entry *gie = git_index_get(index_cur, i); if (prefixcmp(gie->path, prefix)) continue; if (!show_cached) printf("%06o %s %i\t", gie->mode, git_oid_tostr(buf, GIT_OID_HEXSZ+1, &gie->oid), git_index_entry_stage(gie)); write_name_quoted(gie->path + prefix_len, stdout, '\n'); } git_index_free(index_cur); return EXIT_SUCCESS; }
static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct rev_info *rev) { struct diff_options *opt = &rev->diffopt; int i, offset; const char *prefix; int line_termination, inter_name_termination; line_termination = opt->line_termination; inter_name_termination = '\t'; if (!line_termination) inter_name_termination = 0; if (rev->loginfo && !rev->no_commit_id) show_log(rev); if (opt->output_format & DIFF_FORMAT_RAW) { offset = strlen(COLONS) - num_parent; if (offset < 0) offset = 0; prefix = COLONS + offset; /* Show the modes */ for (i = 0; i < num_parent; i++) { printf("%s%06o", prefix, p->parent[i].mode); prefix = " "; } printf("%s%06o", prefix, p->mode); /* Show sha1's */ for (i = 0; i < num_parent; i++) printf(" %s", diff_unique_abbrev(p->parent[i].sha1, opt->abbrev)); printf(" %s ", diff_unique_abbrev(p->sha1, opt->abbrev)); } if (opt->output_format & (DIFF_FORMAT_RAW | DIFF_FORMAT_NAME_STATUS)) { for (i = 0; i < num_parent; i++) putchar(p->parent[i].status); putchar(inter_name_termination); } write_name_quoted(p->path, stdout, line_termination); }
static void show_ce_entry(const char *tag, struct cache_entry *ce) { int len = prefix_len; int offset = prefix_offset; if (len >= ce_namelen(ce)) die("git ls-files: internal error - cache entry not superset of prefix"); if (!match_pathspec(pathspec, ce->name, ce_namelen(ce), len, ps_matched)) return; if (tag && *tag && show_valid_bit && (ce->ce_flags & CE_VALID)) { static char alttag[4]; memcpy(alttag, tag, 3); if (isalpha(tag[0])) alttag[0] = tolower(tag[0]); else if (tag[0] == '?') alttag[0] = '!'; else { alttag[0] = 'v'; alttag[1] = tag[0]; alttag[2] = ' '; alttag[3] = 0; } tag = alttag; } if (!show_stage) { fputs(tag, stdout); } else { printf("%s%06o %s %d\t", tag, ce->ce_mode, abbrev ? find_unique_abbrev(ce->sha1,abbrev) : sha1_to_hex(ce->sha1), ce_stage(ce)); } write_name_quoted(ce->name + offset, stdout, line_terminator); }
static void write_tempfile_record(const char *name, int prefix_length) { int i; if (CHECKOUT_ALL == checkout_stage) { for (i = 1; i < 4; i++) { if (i > 1) putchar(' '); if (topath[i][0]) fputs(topath[i], stdout); else putchar('.'); } } else fputs(topath[checkout_stage], stdout); putchar('\t'); write_name_quoted(name + prefix_length, stdout, line_termination); for (i = 0; i < 4; i++) { topath[i][0] = 0; } }
static int show_one_ru(struct string_list_item *item, void *cbdata) { int offset = prefix_offset; const char *path = item->string; struct resolve_undo_info *ui = item->util; int i, len; len = strlen(path); if (len < prefix_len) return 0; /* outside of the prefix */ if (!match_pathspec(pathspec, path, len, prefix_len, ps_matched)) return 0; /* uninterested */ for (i = 0; i < 3; i++) { if (!ui->mode[i]) continue; printf("%s%06o %s %d\t", tag_resolve_undo, ui->mode[i], abbrev ? find_unique_abbrev(ui->sha1[i], abbrev) : sha1_to_hex(ui->sha1[i]), i + 1); write_name_quoted(path + offset, stdout, line_terminator); } return 0; }