]>
git.proxmox.com Git - libgit2.git/blob - examples/ls-files.c
2 * libgit2 "ls-files" example - shows how to view all files currently in the index
4 * Written by the libgit2 contributors
6 * To the extent possible under law, the author(s) have dedicated all copyright
7 * and related and neighboring rights to this software to the public domain
8 * worldwide. This software is distributed without any warranty.
10 * You should have received a copy of the CC0 Public Domain Dedication along
11 * with this software. If not, see
12 * <http://creativecommons.org/publicdomain/zero/1.0/>.
18 * This example demonstrates the libgit2 index APIs to roughly
19 * simulate the output of `git ls-files`.
20 * `git ls-files` has many options and this currently does not show them.
22 * `git ls-files` base command shows all paths in the index at that time.
23 * This includes staged and committed files, but unstaged files will not display.
25 * This currently supports the default behavior and the `--error-unmatch` option.
34 static void usage(const char *message
, const char *arg
)
37 fprintf(stderr
, "%s: %s\n", message
, arg
);
39 fprintf(stderr
, "%s\n", message
);
40 fprintf(stderr
, "usage: ls-files [--error-unmatch] [--] [<file>...]\n");
44 static int parse_options(struct ls_options
*opts
, int argc
, char *argv
[])
46 int parsing_files
= 0;
49 memset(opts
, 0, sizeof(struct ls_options
));
54 for (i
= 1; i
< argc
; ++i
) {
57 /* if it doesn't start with a '-' or is after the '--' then it is a file */
58 if (a
[0] != '-' || parsing_files
) {
61 /* watch for overflows (just in case) */
62 if (opts
->file_count
== 1024) {
63 fprintf(stderr
, "ls-files can only support 1024 files at this time.\n");
67 opts
->files
[opts
->file_count
++] = a
;
68 } else if (!strcmp(a
, "--")) {
70 } else if (!strcmp(a
, "--error-unmatch")) {
71 opts
->error_unmatch
= 1;
73 usage("Unsupported argument", a
);
81 static int print_paths(struct ls_options
*opts
, git_index
*index
)
84 const git_index_entry
*entry
;
86 /* if there are no files explicitly listed by the user print all entries in the index */
87 if (opts
->file_count
== 0) {
88 size_t entry_count
= git_index_entrycount(index
);
90 for (i
= 0; i
< entry_count
; i
++) {
91 entry
= git_index_get_byindex(index
, i
);
97 /* loop through the files found in the args and print them if they exist */
98 for (i
= 0; i
< opts
->file_count
; ++i
) {
99 const char *path
= opts
->files
[i
];
101 if ((entry
= git_index_get_bypath(index
, path
, GIT_INDEX_STAGE_NORMAL
)) != NULL
) {
103 } else if (opts
->error_unmatch
) {
104 fprintf(stderr
, "error: pathspec '%s' did not match any file(s) known to git.\n", path
);
105 fprintf(stderr
, "Did you forget to 'git add'?\n");
113 int lg2_ls_files(git_repository
*repo
, int argc
, char *argv
[])
115 git_index
*index
= NULL
;
116 struct ls_options opts
;
119 if ((error
= parse_options(&opts
, argc
, argv
)) < 0)
122 if ((error
= git_repository_index(&index
, repo
)) < 0)
125 error
= print_paths(&opts
, index
);
128 git_index_free(index
);