summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-06-24 23:21:23 -0700
committerVicent Marti <tanoku@gmail.com>2013-07-10 20:50:32 +0200
commit0d44d3dc84d6996c72d49e6bb8036b9c8edec9e0 (patch)
treeca4a96bd3d895a3d49634f7d8ffa3cbe3498a614
parentd2ce27dd494b65f54b2d110b4defd69aea976115 (diff)
downloadlibgit2-0d44d3dc84d6996c72d49e6bb8036b9c8edec9e0.tar.gz
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.
-rw-r--r--examples/log.c53
1 files changed, 50 insertions, 3 deletions
diff --git a/examples/log.c b/examples/log.c
index f92b66996..83e5cbcc0 100644
--- a/examples/log.c
+++ b/examples/log.c
@@ -32,24 +32,71 @@ static void usage(const char *message, const char *arg)
int main(int argc, char *argv[])
{
- int i;
+ int i, j, last_nonoption, force_files = -1;
char *a;
const char *dir = ".";
git_repository *repo;
+ git_revwalk *walker;
+ git_revspec revs;
git_threads_init();
- for (i = 1; i < argc; ++i) {
+ for (i = 1, last_nonoption = 1; i < argc; ++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))
usage("Unknown argument", a);
}
check(git_repository_open_ext(&repo, dir, 0, NULL),
"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_threads_shutdown();