mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-02 16:20:01 +00:00
Extending log example code
This adds more command line processing to the example version of log. In particular, this adds the funky command line processing that allows an arbitrary series of revisions followed by an arbitrary number of paths and/or glob patterns. The actual logging part still isn't implemented.
This commit is contained in:
parent
d2ce27dd49
commit
0d44d3dc84
@ -32,24 +32,71 @@ static void usage(const char *message, const char *arg)
|
|||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int i;
|
int i, j, last_nonoption, force_files = -1;
|
||||||
char *a;
|
char *a;
|
||||||
const char *dir = ".";
|
const char *dir = ".";
|
||||||
git_repository *repo;
|
git_repository *repo;
|
||||||
|
git_revwalk *walker;
|
||||||
|
git_revspec revs;
|
||||||
|
|
||||||
git_threads_init();
|
git_threads_init();
|
||||||
|
|
||||||
for (i = 1; i < argc; ++i) {
|
for (i = 1, last_nonoption = 1; i < argc; ++i) {
|
||||||
a = argv[i];
|
a = argv[i];
|
||||||
|
|
||||||
if (a[0] != '-') {
|
if (a[0] != '-' || force_files > 0) {
|
||||||
|
/* condense args not prefixed with '-' to start of argv */
|
||||||
|
if (last_nonoption != i)
|
||||||
|
argv[last_nonoption] = a;
|
||||||
|
last_nonoption++;
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(a, "--"))
|
||||||
|
force_files = last_nonoption; /* copy all args as filenames */
|
||||||
else if (!check_str_param(a, "--git-dir=", &dir))
|
else if (!check_str_param(a, "--git-dir=", &dir))
|
||||||
usage("Unknown argument", a);
|
usage("Unknown argument", a);
|
||||||
}
|
}
|
||||||
|
|
||||||
check(git_repository_open_ext(&repo, dir, 0, NULL),
|
check(git_repository_open_ext(&repo, dir, 0, NULL),
|
||||||
"Could not open repository");
|
"Could not open repository");
|
||||||
|
check(git_revwalk_new(&walker, repo),
|
||||||
|
"Could not create revision walker");
|
||||||
|
|
||||||
|
if (force_files < 0)
|
||||||
|
force_files = last_nonoption;
|
||||||
|
|
||||||
|
for (i = 1; i < force_files; ) {
|
||||||
|
printf("option '%s'\n", argv[i]);
|
||||||
|
|
||||||
|
if (!git_revparse(&revs, repo, argv[i])) {
|
||||||
|
char str[GIT_OID_HEXSZ+1];
|
||||||
|
|
||||||
|
if (revs.from) {
|
||||||
|
git_oid_tostr(str, sizeof(str), git_object_id(revs.from));
|
||||||
|
printf("revwalk from %s\n", str);
|
||||||
|
}
|
||||||
|
if (revs.to) {
|
||||||
|
git_oid_tostr(str, sizeof(str), git_object_id(revs.to));
|
||||||
|
printf("revwalk to %s\n", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* push / hide / merge-base in revwalker */
|
||||||
|
|
||||||
|
++i;
|
||||||
|
} else {
|
||||||
|
/* shift array down */
|
||||||
|
for (a = argv[i], j = i + 1; j < force_files; ++j)
|
||||||
|
argv[j - 1] = argv[j];
|
||||||
|
argv[--force_files] = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == 1) {
|
||||||
|
/* no revs pushed so push HEAD */
|
||||||
|
printf("revwalk HEAD\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = force_files; i < last_nonoption; ++i)
|
||||||
|
printf("file %s\n", argv[i]);
|
||||||
|
|
||||||
git_repository_free(repo);
|
git_repository_free(repo);
|
||||||
git_threads_shutdown();
|
git_threads_shutdown();
|
||||||
|
Loading…
Reference in New Issue
Block a user