Commit d543d59cf0d90264aa84ac49b7f21c6a603d5d3a

Russell Belfer 2014-03-28T10:42:38

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.

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);
 	}