commit 64a96a6df6285a6c0804e1207eac3e6e636e7fa8 from: Stefan Sperling date: Sun Apr 01 17:57:10 2018 UTC implement got log -l commit - d142fc4582a55b3d8550935f8546bfa080f2bd98 commit + 64a96a6df6285a6c0804e1207eac3e6e636e7fa8 blob - e776aa41a89bdb1de0da979d24c3588f0c344152 blob + 971ecdd719a3ce535e5b243e716db49bf1ebd27b --- got/got.1 +++ got/got.1 @@ -75,16 +75,21 @@ In this case, only files beneath the specified directo be checked out. .\".It Cm status .\"Show current status of files. -.It Cm log [ Fl p ] [ Fl c Ar commit ] [ Ar repository-path ] +.It Cm log [ Fl p ] [ Fl c Ar commit ] [ Fl l Ar N ] [ Ar repository-path ] Display history of the repository. If the .Fl p -flag is given, display the patch of modifications made in each commit. +option is given, display the patch of modifications made in each commit. If a .Ar commit is specified with the .Fl c option, start traversing history at this commit. +The +.Fl l +option limits the output to a number of +.Ar N +commits. If the .Ar repository path is omitted, use the current working directory. blob - ba1a257980d1b9f0e7bebe84ebcfc64c904caf32 blob + dfaf97f3a912622429e8a29da96e518bacf65c30 --- got/got.c +++ got/got.c @@ -16,6 +16,7 @@ */ #include +#include #include #include @@ -317,7 +318,7 @@ struct commit_queue_entry { static const struct got_error * print_commits(struct got_object *root_obj, struct got_object_id *root_id, - struct got_repository *repo, int show_patch) + struct got_repository *repo, int show_patch, int limit) { const struct got_error *err; struct got_commit_object *root_commit; @@ -358,6 +359,9 @@ print_commits(struct got_object *root_obj, struct got_ break; } + if (limit && --limit == 0) + break; + SIMPLEQ_FOREACH(pid, &entry->commit->parent_ids, entry) { struct got_object *obj; struct got_commit_object *pcommit; @@ -404,8 +408,8 @@ print_commits(struct got_object *root_obj, struct got_ __dead void usage_log(void) { - fprintf(stderr, "usage: %s log [-p] [-c commit] [repository-path]\n", - getprogname()); + fprintf(stderr, "usage: %s log [-p] [-c commit] [ -l N ] " + "[repository-path]\n", getprogname()); exit(1); } @@ -419,20 +423,26 @@ cmd_log(int argc, char *argv[]) char *repo_path = NULL; char *start_commit = NULL; int ch; - int show_patch = 0; + int show_patch = 0, limit = 0; + const char *errstr; #ifndef PROFILE if (pledge("stdio rpath wpath cpath", NULL) == -1) err(1, "pledge"); #endif - while ((ch = getopt(argc, argv, "pc:")) != -1) { + while ((ch = getopt(argc, argv, "pc:l:")) != -1) { switch (ch) { case 'p': show_patch = 1; break; case 'c': start_commit = optarg; + break; + case 'l': + limit = strtonum(optarg, 1, INT_MAX, &errstr); + if (errstr != NULL) + err(1, "-l option %s", errstr); break; default: usage(); @@ -477,7 +487,7 @@ cmd_log(int argc, char *argv[]) if (error != NULL) return error; if (got_object_get_type(obj) == GOT_OBJ_TYPE_COMMIT) - error = print_commits(obj, id, repo, show_patch); + error = print_commits(obj, id, repo, show_patch, limit); else error = got_error(GOT_ERR_OBJ_TYPE); got_object_close(obj);