Add some funny options for debugging status This allows you to use a --repeat option to run status over and over and see how the output changes as you make local directory changes without reopening the git_repository object each time. Also, adds a flag to explicitly list the submodules before status.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
diff --git a/examples/status.c b/examples/status.c
index feba77f..5f619a0 100644
--- a/examples/status.c
+++ b/examples/status.c
@@ -13,6 +13,7 @@
*/
#include "common.h"
+#include <unistd.h>
/**
* This example demonstrates the use of the libgit2 status APIs,
@@ -44,19 +45,22 @@ enum {
#define MAX_PATHSPEC 8
struct opts {
- git_status_options statusopt;
- char *repodir;
- char *pathspec[MAX_PATHSPEC];
- int npaths;
- int format;
- int zterm;
- int showbranch;
+ git_status_options statusopt;
+ char *repodir;
+ char *pathspec[MAX_PATHSPEC];
+ int npaths;
+ int format;
+ int zterm;
+ int showbranch;
+ int showsubmod;
+ int repeat;
};
static void parse_opts(struct opts *o, int argc, char *argv[]);
static void show_branch(git_repository *repo, int format);
static void print_long(git_status_list *status);
static void print_short(git_repository *repo, git_status_list *status);
+static int print_submod(git_submodule *sm, const char *name, void *payload);
int main(int argc, char *argv[])
{
@@ -84,6 +88,10 @@ int main(int argc, char *argv[])
fatal("Cannot report status on bare repository",
git_repository_path(repo));
+show_status:
+ if (o.repeat)
+ printf("\033[H\033[2J");
+
/**
* Run status on the repository
*
@@ -98,17 +106,29 @@ int main(int argc, char *argv[])
* about what results are presented.
*/
check_lg2(git_status_list_new(&status, repo, &o.statusopt),
- "Could not get status", NULL);
+ "Could not get status", NULL);
if (o.showbranch)
show_branch(repo, o.format);
+ if (o.showsubmod) {
+ int submod_count = 0;
+ check_lg2(git_submodule_foreach(repo, print_submod, &submod_count),
+ "Cannot iterate submodules", o.repodir);
+ }
+
if (o.format == FORMAT_LONG)
print_long(status);
else
print_short(repo, status);
git_status_list_free(status);
+
+ if (o.repeat) {
+ sleep(o.repeat);
+ goto show_status;
+ }
+
git_repository_free(repo);
git_threads_shutdown();
@@ -381,7 +401,7 @@ static void print_short(git_repository *repo, git_status_list *status)
}
/**
- * Now that we have all the information, it's time to format the output.
+ * Now that we have all the information, format the output.
*/
if (s->head_to_index) {
@@ -417,6 +437,21 @@ static void print_short(git_repository *repo, git_status_list *status)
}
}
+static int print_submod(git_submodule *sm, const char *name, void *payload)
+{
+ int *count = payload;
+ (void)name;
+
+ if (*count == 0)
+ printf("# Submodules\n");
+ (*count)++;
+
+ printf("# - submodule '%s' at %s\n",
+ git_submodule_name(sm), git_submodule_path(sm));
+
+ return 0;
+}
+
/**
* Parse options that git's status command supports.
*/
@@ -462,6 +497,12 @@ static void parse_opts(struct opts *o, int argc, char *argv[])
o->statusopt.flags |= GIT_STATUS_OPT_EXCLUDE_SUBMODULES;
else if (!strncmp(a, "--git-dir=", strlen("--git-dir=")))
o->repodir = a + strlen("--git-dir=");
+ else if (!strcmp(a, "--repeat"))
+ o->repeat = 10;
+ else if (match_int_arg(&o->repeat, &args, "--repeat", 0))
+ /* okay */;
+ else if (!strcmp(a, "--list-submodules"))
+ o->showsubmod = 1;
else
check_lg2(-1, "Unsupported option", a);
}