]> git.proxmox.com Git - libgit2.git/commitdiff
Add some funny options for debugging status
authorRussell Belfer <rb@github.com>
Fri, 28 Mar 2014 17:42:38 +0000 (10:42 -0700)
committerRussell Belfer <rb@github.com>
Tue, 1 Apr 2014 16:45:20 +0000 (09:45 -0700)
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.

examples/status.c

index feba77f84b7758578b6d65825f0f858e545c0058..5f619a055ff56370f9a89f7d51ac012f41d95103 100644 (file)
@@ -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);
        }