Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 1 | #include "test-tool.h" |
| 2 | #include "git-compat-util.h" |
| 3 | #include "strbuf.h" |
| 4 | #include "iterator.h" |
| 5 | #include "dir-iterator.h" |
| 6 | |
Junio C Hamano | 9042140 | 2019-07-30 10:45:48 -0700 | [diff] [blame] | 7 | static const char *error_name(int error_number) |
| 8 | { |
| 9 | switch (error_number) { |
| 10 | case ENOENT: return "ENOENT"; |
| 11 | case ENOTDIR: return "ENOTDIR"; |
| 12 | default: return "ESOMETHINGELSE"; |
| 13 | } |
| 14 | } |
| 15 | |
Matheus Tavares | fa1da7d | 2019-07-10 20:59:00 -0300 | [diff] [blame] | 16 | /* |
| 17 | * usage: |
| 18 | * tool-test dir-iterator [--follow-symlinks] [--pedantic] directory_path |
| 19 | */ |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 20 | int cmd__dir_iterator(int argc, const char **argv) |
| 21 | { |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 22 | struct dir_iterator *diter; |
Matheus Tavares | fa1da7d | 2019-07-10 20:59:00 -0300 | [diff] [blame] | 23 | unsigned int flags = 0; |
| 24 | int iter_status; |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 25 | |
Matheus Tavares | fa1da7d | 2019-07-10 20:59:00 -0300 | [diff] [blame] | 26 | for (++argv, --argc; *argv && starts_with(*argv, "--"); ++argv, --argc) { |
| 27 | if (strcmp(*argv, "--follow-symlinks") == 0) |
| 28 | flags |= DIR_ITERATOR_FOLLOW_SYMLINKS; |
| 29 | else if (strcmp(*argv, "--pedantic") == 0) |
| 30 | flags |= DIR_ITERATOR_PEDANTIC; |
| 31 | else |
| 32 | die("invalid option '%s'", *argv); |
| 33 | } |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 34 | |
Matheus Tavares | fa1da7d | 2019-07-10 20:59:00 -0300 | [diff] [blame] | 35 | if (!*argv || argc != 1) |
| 36 | die("dir-iterator needs exactly one non-option argument"); |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 37 | |
René Scharfe | 7df3bd4 | 2019-08-07 13:15:20 +0200 | [diff] [blame] | 38 | diter = dir_iterator_begin(*argv, flags); |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 39 | |
Matheus Tavares | 3012397 | 2019-07-10 20:58:59 -0300 | [diff] [blame] | 40 | if (!diter) { |
Junio C Hamano | 9042140 | 2019-07-30 10:45:48 -0700 | [diff] [blame] | 41 | printf("dir_iterator_begin failure: %s\n", error_name(errno)); |
Matheus Tavares | 3012397 | 2019-07-10 20:58:59 -0300 | [diff] [blame] | 42 | exit(EXIT_FAILURE); |
| 43 | } |
| 44 | |
Matheus Tavares | fa1da7d | 2019-07-10 20:59:00 -0300 | [diff] [blame] | 45 | while ((iter_status = dir_iterator_advance(diter)) == ITER_OK) { |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 46 | if (S_ISDIR(diter->st.st_mode)) |
| 47 | printf("[d] "); |
| 48 | else if (S_ISREG(diter->st.st_mode)) |
| 49 | printf("[f] "); |
Matheus Tavares | fa1da7d | 2019-07-10 20:59:00 -0300 | [diff] [blame] | 50 | else if (S_ISLNK(diter->st.st_mode)) |
| 51 | printf("[s] "); |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 52 | else |
| 53 | printf("[?] "); |
| 54 | |
| 55 | printf("(%s) [%s] %s\n", diter->relative_path, diter->basename, |
| 56 | diter->path.buf); |
| 57 | } |
| 58 | |
Matheus Tavares | fa1da7d | 2019-07-10 20:59:00 -0300 | [diff] [blame] | 59 | if (iter_status != ITER_DONE) { |
| 60 | printf("dir_iterator_advance failure\n"); |
| 61 | return 1; |
| 62 | } |
| 63 | |
Daniel Ferreira | 150791a | 2019-07-10 20:58:57 -0300 | [diff] [blame] | 64 | return 0; |
| 65 | } |