Blame examples/status.c

Packit Service 20376f
/*
Packit Service 20376f
 * libgit2 "status" example - shows how to use the status APIs
Packit Service 20376f
 *
Packit Service 20376f
 * Written by the libgit2 contributors
Packit Service 20376f
 *
Packit Service 20376f
 * To the extent possible under law, the author(s) have dedicated all copyright
Packit Service 20376f
 * and related and neighboring rights to this software to the public domain
Packit Service 20376f
 * worldwide. This software is distributed without any warranty.
Packit Service 20376f
 *
Packit Service 20376f
 * You should have received a copy of the CC0 Public Domain Dedication along
Packit Service 20376f
 * with this software. If not, see
Packit Service 20376f
 * <http://creativecommons.org/publicdomain/zero/1.0/>.
Packit Service 20376f
 */
Packit Service 20376f
Packit Service 20376f
#include "common.h"
Packit Service 20376f
#ifdef _WIN32
Packit Service 20376f
# include <Windows.h>
Packit Service 20376f
# define sleep(a) Sleep(a * 1000)
Packit Service 20376f
#else
Packit Service 20376f
# include <unistd.h>
Packit Service 20376f
#endif
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * This example demonstrates the use of the libgit2 status APIs,
Packit Service 20376f
 * particularly the `git_status_list` object, to roughly simulate the
Packit Service 20376f
 * output of running `git status`.  It serves as a simple example of
Packit Service 20376f
 * using those APIs to get basic status information.
Packit Service 20376f
 *
Packit Service 20376f
 * This does not have:
Packit Service 20376f
 *
Packit Service 20376f
 * - Robust error handling
Packit Service 20376f
 * - Colorized or paginated output formatting
Packit Service 20376f
 *
Packit Service 20376f
 * This does have:
Packit Service 20376f
 *
Packit Service 20376f
 * - Examples of translating command line arguments to the status
Packit Service 20376f
 *   options settings to mimic `git status` results.
Packit Service 20376f
 * - A sample status formatter that matches the default "long" format
Packit Service 20376f
 *   from `git status`
Packit Service 20376f
 * - A sample status formatter that matches the "short" format
Packit Service 20376f
 */
Packit Service 20376f
Packit Service 20376f
enum {
Packit Service 20376f
	FORMAT_DEFAULT   = 0,
Packit Service 20376f
	FORMAT_LONG      = 1,
Packit Service 20376f
	FORMAT_SHORT     = 2,
Packit Service 20376f
	FORMAT_PORCELAIN = 3,
Packit Service 20376f
};
Packit Service 20376f
Packit Service 20376f
#define MAX_PATHSPEC 8
Packit Service 20376f
Packit Service 20376f
struct opts {
Packit Service 20376f
	git_status_options statusopt;
Packit Service 20376f
	char *repodir;
Packit Service 20376f
	char *pathspec[MAX_PATHSPEC];
Packit Service 20376f
	int npaths;
Packit Service 20376f
	int format;
Packit Service 20376f
	int zterm;
Packit Service 20376f
	int showbranch;
Packit Service 20376f
	int showsubmod;
Packit Service 20376f
	int repeat;
Packit Service 20376f
};
Packit Service 20376f
Packit Service 20376f
static void parse_opts(struct opts *o, int argc, char *argv[]);
Packit Service 20376f
static void show_branch(git_repository *repo, int format);
Packit Service 20376f
static void print_long(git_status_list *status);
Packit Service 20376f
static void print_short(git_repository *repo, git_status_list *status);
Packit Service 20376f
static int print_submod(git_submodule *sm, const char *name, void *payload);
Packit Service 20376f
Packit Service 20376f
int main(int argc, char *argv[])
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = NULL;
Packit Service 20376f
	git_status_list *status;
Packit Service 20376f
	struct opts o = { GIT_STATUS_OPTIONS_INIT, "." };
Packit Service 20376f
Packit Service 20376f
	git_libgit2_init();
Packit Service 20376f
Packit Service 20376f
	o.statusopt.show  = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
Packit Service 20376f
	o.statusopt.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
Packit Service 20376f
		GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX |
Packit Service 20376f
		GIT_STATUS_OPT_SORT_CASE_SENSITIVELY;
Packit Service 20376f
Packit Service 20376f
	parse_opts(&o, argc, argv);
Packit Service 20376f
Packit Service 20376f
	/**
Packit Service 20376f
	 * Try to open the repository at the given path (or at the current
Packit Service 20376f
	 * directory if none was given).
Packit Service 20376f
	 */
Packit Service 20376f
	check_lg2(git_repository_open_ext(&repo, o.repodir, 0, NULL),
Packit Service 20376f
		  "Could not open repository", o.repodir);
Packit Service 20376f
Packit Service 20376f
	if (git_repository_is_bare(repo))
Packit Service 20376f
		fatal("Cannot report status on bare repository",
Packit Service 20376f
			git_repository_path(repo));
Packit Service 20376f
Packit Service 20376f
show_status:
Packit Service 20376f
	if (o.repeat)
Packit Service 20376f
		printf("\033[H\033[2J");
Packit Service 20376f
Packit Service 20376f
	/**
Packit Service 20376f
	 * Run status on the repository
Packit Service 20376f
	 *
Packit Service 20376f
	 * We use `git_status_list_new()` to generate a list of status
Packit Service 20376f
	 * information which lets us iterate over it at our
Packit Service 20376f
	 * convenience and extract the data we want to show out of
Packit Service 20376f
	 * each entry.
Packit Service 20376f
	 *
Packit Service 20376f
	 * You can use `git_status_foreach()` or
Packit Service 20376f
	 * `git_status_foreach_ext()` if you'd prefer to execute a
Packit Service 20376f
	 * callback for each entry. The latter gives you more control
Packit Service 20376f
	 * about what results are presented.
Packit Service 20376f
	 */
Packit Service 20376f
	check_lg2(git_status_list_new(&status, repo, &o.statusopt),
Packit Service 20376f
		"Could not get status", NULL);
Packit Service 20376f
Packit Service 20376f
	if (o.showbranch)
Packit Service 20376f
		show_branch(repo, o.format);
Packit Service 20376f
Packit Service 20376f
	if (o.showsubmod) {
Packit Service 20376f
		int submod_count = 0;
Packit Service 20376f
		check_lg2(git_submodule_foreach(repo, print_submod, &submod_count),
Packit Service 20376f
			"Cannot iterate submodules", o.repodir);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	if (o.format == FORMAT_LONG)
Packit Service 20376f
		print_long(status);
Packit Service 20376f
	else
Packit Service 20376f
		print_short(repo, status);
Packit Service 20376f
Packit Service 20376f
	git_status_list_free(status);
Packit Service 20376f
Packit Service 20376f
	if (o.repeat) {
Packit Service 20376f
		sleep(o.repeat);
Packit Service 20376f
		goto show_status;
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
	git_libgit2_shutdown();
Packit Service 20376f
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * If the user asked for the branch, let's show the short name of the
Packit Service 20376f
 * branch.
Packit Service 20376f
 */
Packit Service 20376f
static void show_branch(git_repository *repo, int format)
Packit Service 20376f
{
Packit Service 20376f
	int error = 0;
Packit Service 20376f
	const char *branch = NULL;
Packit Service 20376f
	git_reference *head = NULL;
Packit Service 20376f
Packit Service 20376f
	error = git_repository_head(&head, repo);
Packit Service 20376f
Packit Service 20376f
	if (error == GIT_EUNBORNBRANCH || error == GIT_ENOTFOUND)
Packit Service 20376f
		branch = NULL;
Packit Service 20376f
	else if (!error) {
Packit Service 20376f
		branch = git_reference_shorthand(head);
Packit Service 20376f
	} else
Packit Service 20376f
		check_lg2(error, "failed to get current branch", NULL);
Packit Service 20376f
Packit Service 20376f
	if (format == FORMAT_LONG)
Packit Service 20376f
		printf("# On branch %s\n",
Packit Service 20376f
			branch ? branch : "Not currently on any branch.");
Packit Service 20376f
	else
Packit Service 20376f
		printf("## %s\n", branch ? branch : "HEAD (no branch)");
Packit Service 20376f
Packit Service 20376f
	git_reference_free(head);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * This function print out an output similar to git's status command
Packit Service 20376f
 * in long form, including the command-line hints.
Packit Service 20376f
 */
Packit Service 20376f
static void print_long(git_status_list *status)
Packit Service 20376f
{
Packit Service 20376f
	size_t i, maxi = git_status_list_entrycount(status);
Packit Service 20376f
	const git_status_entry *s;
Packit Service 20376f
	int header = 0, changes_in_index = 0;
Packit Service 20376f
	int changed_in_workdir = 0, rm_in_workdir = 0;
Packit Service 20376f
	const char *old_path, *new_path;
Packit Service 20376f
Packit Service 20376f
	/** Print index changes. */
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < maxi; ++i) {
Packit Service 20376f
		char *istatus = NULL;
Packit Service 20376f
Packit Service 20376f
		s = git_status_byindex(status, i);
Packit Service 20376f
Packit Service 20376f
		if (s->status == GIT_STATUS_CURRENT)
Packit Service 20376f
			continue;
Packit Service 20376f
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_DELETED)
Packit Service 20376f
			rm_in_workdir = 1;
Packit Service 20376f
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_NEW)
Packit Service 20376f
			istatus = "new file: ";
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_MODIFIED)
Packit Service 20376f
			istatus = "modified: ";
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_DELETED)
Packit Service 20376f
			istatus = "deleted:  ";
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_RENAMED)
Packit Service 20376f
			istatus = "renamed:  ";
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_TYPECHANGE)
Packit Service 20376f
			istatus = "typechange:";
Packit Service 20376f
Packit Service 20376f
		if (istatus == NULL)
Packit Service 20376f
			continue;
Packit Service 20376f
Packit Service 20376f
		if (!header) {
Packit Service 20376f
			printf("# Changes to be committed:\n");
Packit Service 20376f
			printf("#   (use \"git reset HEAD <file>...\" to unstage)\n");
Packit Service 20376f
			printf("#\n");
Packit Service 20376f
			header = 1;
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		old_path = s->head_to_index->old_file.path;
Packit Service 20376f
		new_path = s->head_to_index->new_file.path;
Packit Service 20376f
Packit Service 20376f
		if (old_path && new_path && strcmp(old_path, new_path))
Packit Service 20376f
			printf("#\t%s  %s -> %s\n", istatus, old_path, new_path);
Packit Service 20376f
		else
Packit Service 20376f
			printf("#\t%s  %s\n", istatus, old_path ? old_path : new_path);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	if (header) {
Packit Service 20376f
		changes_in_index = 1;
Packit Service 20376f
		printf("#\n");
Packit Service 20376f
	}
Packit Service 20376f
	header = 0;
Packit Service 20376f
Packit Service 20376f
	/** Print workdir changes to tracked files. */
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < maxi; ++i) {
Packit Service 20376f
		char *wstatus = NULL;
Packit Service 20376f
Packit Service 20376f
		s = git_status_byindex(status, i);
Packit Service 20376f
Packit Service 20376f
		/**
Packit Service 20376f
		 * With `GIT_STATUS_OPT_INCLUDE_UNMODIFIED` (not used in this example)
Packit Service 20376f
		 * `index_to_workdir` may not be `NULL` even if there are
Packit Service 20376f
		 * no differences, in which case it will be a `GIT_DELTA_UNMODIFIED`.
Packit Service 20376f
		 */
Packit Service 20376f
		if (s->status == GIT_STATUS_CURRENT || s->index_to_workdir == NULL)
Packit Service 20376f
			continue;
Packit Service 20376f
Packit Service 20376f
		/** Print out the output since we know the file has some changes */
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_MODIFIED)
Packit Service 20376f
			wstatus = "modified: ";
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_DELETED)
Packit Service 20376f
			wstatus = "deleted:  ";
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_RENAMED)
Packit Service 20376f
			wstatus = "renamed:  ";
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_TYPECHANGE)
Packit Service 20376f
			wstatus = "typechange:";
Packit Service 20376f
Packit Service 20376f
		if (wstatus == NULL)
Packit Service 20376f
			continue;
Packit Service 20376f
Packit Service 20376f
		if (!header) {
Packit Service 20376f
			printf("# Changes not staged for commit:\n");
Packit Service 20376f
			printf("#   (use \"git add%s <file>...\" to update what will be committed)\n", rm_in_workdir ? "/rm" : "");
Packit Service 20376f
			printf("#   (use \"git checkout -- <file>...\" to discard changes in working directory)\n");
Packit Service 20376f
			printf("#\n");
Packit Service 20376f
			header = 1;
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		old_path = s->index_to_workdir->old_file.path;
Packit Service 20376f
		new_path = s->index_to_workdir->new_file.path;
Packit Service 20376f
Packit Service 20376f
		if (old_path && new_path && strcmp(old_path, new_path))
Packit Service 20376f
			printf("#\t%s  %s -> %s\n", wstatus, old_path, new_path);
Packit Service 20376f
		else
Packit Service 20376f
			printf("#\t%s  %s\n", wstatus, old_path ? old_path : new_path);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	if (header) {
Packit Service 20376f
		changed_in_workdir = 1;
Packit Service 20376f
		printf("#\n");
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	/** Print untracked files. */
Packit Service 20376f
Packit Service 20376f
	header = 0;
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < maxi; ++i) {
Packit Service 20376f
		s = git_status_byindex(status, i);
Packit Service 20376f
Packit Service 20376f
		if (s->status == GIT_STATUS_WT_NEW) {
Packit Service 20376f
Packit Service 20376f
			if (!header) {
Packit Service 20376f
				printf("# Untracked files:\n");
Packit Service 20376f
				printf("#   (use \"git add <file>...\" to include in what will be committed)\n");
Packit Service 20376f
				printf("#\n");
Packit Service 20376f
				header = 1;
Packit Service 20376f
			}
Packit Service 20376f
Packit Service 20376f
			printf("#\t%s\n", s->index_to_workdir->old_file.path);
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	header = 0;
Packit Service 20376f
Packit Service 20376f
	/** Print ignored files. */
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < maxi; ++i) {
Packit Service 20376f
		s = git_status_byindex(status, i);
Packit Service 20376f
Packit Service 20376f
		if (s->status == GIT_STATUS_IGNORED) {
Packit Service 20376f
Packit Service 20376f
			if (!header) {
Packit Service 20376f
				printf("# Ignored files:\n");
Packit Service 20376f
				printf("#   (use \"git add -f <file>...\" to include in what will be committed)\n");
Packit Service 20376f
				printf("#\n");
Packit Service 20376f
				header = 1;
Packit Service 20376f
			}
Packit Service 20376f
Packit Service 20376f
			printf("#\t%s\n", s->index_to_workdir->old_file.path);
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	if (!changes_in_index && changed_in_workdir)
Packit Service 20376f
		printf("no changes added to commit (use \"git add\" and/or \"git commit -a\")\n");
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * This version of the output prefixes each path with two status
Packit Service 20376f
 * columns and shows submodule status information.
Packit Service 20376f
 */
Packit Service 20376f
static void print_short(git_repository *repo, git_status_list *status)
Packit Service 20376f
{
Packit Service 20376f
	size_t i, maxi = git_status_list_entrycount(status);
Packit Service 20376f
	const git_status_entry *s;
Packit Service 20376f
	char istatus, wstatus;
Packit Service 20376f
	const char *extra, *a, *b, *c;
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < maxi; ++i) {
Packit Service 20376f
		s = git_status_byindex(status, i);
Packit Service 20376f
Packit Service 20376f
		if (s->status == GIT_STATUS_CURRENT)
Packit Service 20376f
			continue;
Packit Service 20376f
Packit Service 20376f
		a = b = c = NULL;
Packit Service 20376f
		istatus = wstatus = ' ';
Packit Service 20376f
		extra = "";
Packit Service 20376f
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_NEW)
Packit Service 20376f
			istatus = 'A';
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_MODIFIED)
Packit Service 20376f
			istatus = 'M';
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_DELETED)
Packit Service 20376f
			istatus = 'D';
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_RENAMED)
Packit Service 20376f
			istatus = 'R';
Packit Service 20376f
		if (s->status & GIT_STATUS_INDEX_TYPECHANGE)
Packit Service 20376f
			istatus = 'T';
Packit Service 20376f
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_NEW) {
Packit Service 20376f
			if (istatus == ' ')
Packit Service 20376f
				istatus = '?';
Packit Service 20376f
			wstatus = '?';
Packit Service 20376f
		}
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_MODIFIED)
Packit Service 20376f
			wstatus = 'M';
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_DELETED)
Packit Service 20376f
			wstatus = 'D';
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_RENAMED)
Packit Service 20376f
			wstatus = 'R';
Packit Service 20376f
		if (s->status & GIT_STATUS_WT_TYPECHANGE)
Packit Service 20376f
			wstatus = 'T';
Packit Service 20376f
Packit Service 20376f
		if (s->status & GIT_STATUS_IGNORED) {
Packit Service 20376f
			istatus = '!';
Packit Service 20376f
			wstatus = '!';
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		if (istatus == '?' && wstatus == '?')
Packit Service 20376f
			continue;
Packit Service 20376f
Packit Service 20376f
		/**
Packit Service 20376f
		 * A commit in a tree is how submodules are stored, so
Packit Service 20376f
		 * let's go take a look at its status.
Packit Service 20376f
		 */
Packit Service 20376f
		if (s->index_to_workdir &&
Packit Service 20376f
			s->index_to_workdir->new_file.mode == GIT_FILEMODE_COMMIT)
Packit Service 20376f
		{
Packit Service 20376f
			unsigned int smstatus = 0;
Packit Service 20376f
Packit Service 20376f
			if (!git_submodule_status(&smstatus, repo, s->index_to_workdir->new_file.path,
Packit Service 20376f
						  GIT_SUBMODULE_IGNORE_UNSPECIFIED)) {
Packit Service 20376f
				if (smstatus & GIT_SUBMODULE_STATUS_WD_MODIFIED)
Packit Service 20376f
					extra = " (new commits)";
Packit Service 20376f
				else if (smstatus & GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED)
Packit Service 20376f
					extra = " (modified content)";
Packit Service 20376f
				else if (smstatus & GIT_SUBMODULE_STATUS_WD_WD_MODIFIED)
Packit Service 20376f
					extra = " (modified content)";
Packit Service 20376f
				else if (smstatus & GIT_SUBMODULE_STATUS_WD_UNTRACKED)
Packit Service 20376f
					extra = " (untracked content)";
Packit Service 20376f
			}
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		/**
Packit Service 20376f
		 * Now that we have all the information, format the output.
Packit Service 20376f
		 */
Packit Service 20376f
Packit Service 20376f
		if (s->head_to_index) {
Packit Service 20376f
			a = s->head_to_index->old_file.path;
Packit Service 20376f
			b = s->head_to_index->new_file.path;
Packit Service 20376f
		}
Packit Service 20376f
		if (s->index_to_workdir) {
Packit Service 20376f
			if (!a)
Packit Service 20376f
				a = s->index_to_workdir->old_file.path;
Packit Service 20376f
			if (!b)
Packit Service 20376f
				b = s->index_to_workdir->old_file.path;
Packit Service 20376f
			c = s->index_to_workdir->new_file.path;
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		if (istatus == 'R') {
Packit Service 20376f
			if (wstatus == 'R')
Packit Service 20376f
				printf("%c%c %s %s %s%s\n", istatus, wstatus, a, b, c, extra);
Packit Service 20376f
			else
Packit Service 20376f
				printf("%c%c %s %s%s\n", istatus, wstatus, a, b, extra);
Packit Service 20376f
		} else {
Packit Service 20376f
			if (wstatus == 'R')
Packit Service 20376f
				printf("%c%c %s %s%s\n", istatus, wstatus, a, c, extra);
Packit Service 20376f
			else
Packit Service 20376f
				printf("%c%c %s%s\n", istatus, wstatus, a, extra);
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < maxi; ++i) {
Packit Service 20376f
		s = git_status_byindex(status, i);
Packit Service 20376f
Packit Service 20376f
		if (s->status == GIT_STATUS_WT_NEW)
Packit Service 20376f
			printf("?? %s\n", s->index_to_workdir->old_file.path);
Packit Service 20376f
	}
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int print_submod(git_submodule *sm, const char *name, void *payload)
Packit Service 20376f
{
Packit Service 20376f
	int *count = payload;
Packit Service 20376f
	(void)name;
Packit Service 20376f
Packit Service 20376f
	if (*count == 0)
Packit Service 20376f
		printf("# Submodules\n");
Packit Service 20376f
	(*count)++;
Packit Service 20376f
Packit Service 20376f
	printf("# - submodule '%s' at %s\n",
Packit Service 20376f
		git_submodule_name(sm), git_submodule_path(sm));
Packit Service 20376f
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/**
Packit Service 20376f
 * Parse options that git's status command supports.
Packit Service 20376f
 */
Packit Service 20376f
static void parse_opts(struct opts *o, int argc, char *argv[])
Packit Service 20376f
{
Packit Service 20376f
	struct args_info args = ARGS_INFO_INIT;
Packit Service 20376f
Packit Service 20376f
	for (args.pos = 1; args.pos < argc; ++args.pos) {
Packit Service 20376f
		char *a = argv[args.pos];
Packit Service 20376f
Packit Service 20376f
		if (a[0] != '-') {
Packit Service 20376f
			if (o->npaths < MAX_PATHSPEC)
Packit Service 20376f
				o->pathspec[o->npaths++] = a;
Packit Service 20376f
			else
Packit Service 20376f
				fatal("Example only supports a limited pathspec", NULL);
Packit Service 20376f
		}
Packit Service 20376f
		else if (!strcmp(a, "-s") || !strcmp(a, "--short"))
Packit Service 20376f
			o->format = FORMAT_SHORT;
Packit Service 20376f
		else if (!strcmp(a, "--long"))
Packit Service 20376f
			o->format = FORMAT_LONG;
Packit Service 20376f
		else if (!strcmp(a, "--porcelain"))
Packit Service 20376f
			o->format = FORMAT_PORCELAIN;
Packit Service 20376f
		else if (!strcmp(a, "-b") || !strcmp(a, "--branch"))
Packit Service 20376f
			o->showbranch = 1;
Packit Service 20376f
		else if (!strcmp(a, "-z")) {
Packit Service 20376f
			o->zterm = 1;
Packit Service 20376f
			if (o->format == FORMAT_DEFAULT)
Packit Service 20376f
				o->format = FORMAT_PORCELAIN;
Packit Service 20376f
		}
Packit Service 20376f
		else if (!strcmp(a, "--ignored"))
Packit Service 20376f
			o->statusopt.flags |= GIT_STATUS_OPT_INCLUDE_IGNORED;
Packit Service 20376f
		else if (!strcmp(a, "-uno") ||
Packit Service 20376f
				 !strcmp(a, "--untracked-files=no"))
Packit Service 20376f
			o->statusopt.flags &= ~GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
		else if (!strcmp(a, "-unormal") ||
Packit Service 20376f
				 !strcmp(a, "--untracked-files=normal"))
Packit Service 20376f
			o->statusopt.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
		else if (!strcmp(a, "-uall") ||
Packit Service 20376f
				 !strcmp(a, "--untracked-files=all"))
Packit Service 20376f
			o->statusopt.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED |
Packit Service 20376f
				GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
Packit Service 20376f
		else if (!strcmp(a, "--ignore-submodules=all"))
Packit Service 20376f
			o->statusopt.flags |= GIT_STATUS_OPT_EXCLUDE_SUBMODULES;
Packit Service 20376f
		else if (!strncmp(a, "--git-dir=", strlen("--git-dir=")))
Packit Service 20376f
			o->repodir = a + strlen("--git-dir=");
Packit Service 20376f
		else if (!strcmp(a, "--repeat"))
Packit Service 20376f
			o->repeat = 10;
Packit Service 20376f
		else if (match_int_arg(&o->repeat, &args, "--repeat", 0))
Packit Service 20376f
			/* okay */;
Packit Service 20376f
		else if (!strcmp(a, "--list-submodules"))
Packit Service 20376f
			o->showsubmod = 1;
Packit Service 20376f
		else
Packit Service 20376f
			check_lg2(-1, "Unsupported option", a);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	if (o->format == FORMAT_DEFAULT)
Packit Service 20376f
		o->format = FORMAT_LONG;
Packit Service 20376f
	if (o->format == FORMAT_LONG)
Packit Service 20376f
		o->showbranch = 1;
Packit Service 20376f
	if (o->npaths > 0) {
Packit Service 20376f
		o->statusopt.pathspec.strings = o->pathspec;
Packit Service 20376f
		o->statusopt.pathspec.count   = o->npaths;
Packit Service 20376f
	}
Packit Service 20376f
}