commit b1ebc001df71bed2afcac6b0037bea21a988e1a7 from: Stefan Sperling date: Tue Aug 13 21:54:01 2019 UTC add GOT_LOG_DEFAULT_LIMIT env var for setting a got log -l default commit - 5ce8bd3ee4e8c211b08ebc3623c43d60a9e4c3bc commit + b1ebc001df71bed2afcac6b0037bea21a988e1a7 blob - 50515573c51480aab8336746216df002c2bc16e1 blob + 73aea3cfea4330adf6c818c111123d56e65d918f --- got/got.1 +++ got/got.1 @@ -314,6 +314,11 @@ Merge commits which affected the current branch will b individual commits which originated on other branches will be omitted. .It Fl l Ar N Limit history traversal to a given number of commits. +If this option is not specified, a default limit value of zero is used, +which is treated as an unbounded limit. +The +.Ev GOT_LOG_DEFAULT_LIMIT +environment variable may be set to change this default value. .It Fl p Display the patch of modifications made in each commit. .It Fl r Ar repository-path @@ -1099,6 +1104,11 @@ environment variables with a missing email address. .It Ev VISUAL , EDITOR The editor spawned by .Cm got commit . +.It Ev GOT_LOG_DEFAULT_LIMIT +The default limit on the number of commits traversed by +.Cm got log . +If set to zero, the limit is unbounded. +This variable will be silently ignored if it is set to a non-numeric value. .El .Sh EXIT STATUS .Ex -std got blob - 0ebd0d6734cfc7bed752a53694a775aa00e278cd blob + 5bac0ada628015fcf4a73ca4cf01ca65250b0816 --- got/got.c +++ got/got.c @@ -1549,6 +1549,22 @@ usage_log(void) fprintf(stderr, "usage: %s log [-c commit] [-C number] [-f] [ -l N ] [-p] " "[-r repository-path] [path]\n", getprogname()); exit(1); +} + +static int +get_default_log_limit(void) +{ + const char *got_default_log_limit; + long long n; + const char *errstr; + + got_default_log_limit = getenv("GOT_LOG_DEFAULT_LIMIT"); + if (got_default_log_limit == NULL) + return 0; + n = strtonum(got_default_log_limit, 0, INT_MAX, &errstr); + if (errstr != NULL) + return 0; + return n; } static const struct got_error * @@ -1575,6 +1591,8 @@ cmd_log(int argc, char *argv[]) err(1, "pledge"); #endif + limit = get_default_log_limit(); + while ((ch = getopt(argc, argv, "b:pc:C:l:fr:")) != -1) { switch (ch) { case 'p': @@ -1590,7 +1608,7 @@ cmd_log(int argc, char *argv[]) err(1, "-C option %s", errstr); break; case 'l': - limit = strtonum(optarg, 1, INT_MAX, &errstr); + limit = strtonum(optarg, 0, INT_MAX, &errstr); if (errstr != NULL) err(1, "-l option %s", errstr); break; blob - e4dc12dd4212adb3e8c317913e2883edfc8d33f1 blob + 75546009c46e4564fdad73f3d119abc3af74af62 --- regress/cmdline/common.sh +++ regress/cmdline/common.sh @@ -15,6 +15,7 @@ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. export GOT_AUTHOR="Flan Hacker " +export GOT_LOG_DEFAULT_LIMIT=0 export MALLOC_OPTIONS=S blob - 470a29d176ecfa541bd5c52a8eb0dc9a03b004fc blob + bfe52f0c383ba4f9c31265bea0f4ffca6c44cbec --- regress/cmdline/log.sh +++ regress/cmdline/log.sh @@ -151,8 +151,86 @@ function test_log_tag { test_done "$testroot" "$ret" } +function test_log_limit { + local testroot=`test_init log_limit` + local commit_id0=`git_show_head $testroot/repo` + got checkout $testroot/repo $testroot/wt > /dev/null + ret="$?" + if [ "$ret" != "0" ]; then + test_done "$testroot" "$ret" + return 1 + fi + + echo "modified alpha" > $testroot/wt/alpha + (cd $testroot/wt && got commit -m 'test log_limit' > /dev/null) + local commit_id1=`git_show_head $testroot/repo` + + (cd $testroot/wt && got rm beta >/dev/null) + (cd $testroot/wt && got commit -m 'test log_limit' > /dev/null) + local commit_id2=`git_show_head $testroot/repo` + + echo "new file" > $testroot/wt/new + (cd $testroot/wt && got add new >/dev/null) + (cd $testroot/wt && got commit -m 'test log_limit' > /dev/null) + local commit_id3=`git_show_head $testroot/repo` + + # -l1 should print the first commit only + echo "commit $commit_id3 (master)" > $testroot/stdout.expected + (cd $testroot/wt && got log -l1 | grep ^commit > $testroot/stdout) + cmp -s $testroot/stdout.expected $testroot/stdout + ret="$?" + if [ "$ret" != "0" ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # env var can be used to set a log limit without -l option + echo "commit $commit_id3 (master)" > $testroot/stdout.expected + echo "commit $commit_id2" >> $testroot/stdout.expected + (cd $testroot/wt && env GOT_LOG_DEFAULT_LIMIT=2 got log | \ + grep ^commit > $testroot/stdout) + cmp -s $testroot/stdout.expected $testroot/stdout + ret="$?" + if [ "$ret" != "0" ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # non-numeric env var is ignored + (cd $testroot/wt && env GOT_LOG_DEFAULT_LIMIT=foobar got log | \ + grep ^commit > $testroot/stdout) + echo "commit $commit_id3 (master)" > $testroot/stdout.expected + echo "commit $commit_id2" >> $testroot/stdout.expected + echo "commit $commit_id1" >> $testroot/stdout.expected + echo "commit $commit_id0" >> $testroot/stdout.expected + cmp -s $testroot/stdout.expected $testroot/stdout + ret="$?" + if [ "$ret" != "0" ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # -l option takes precedence over env var + echo "commit $commit_id3 (master)" > $testroot/stdout.expected + echo "commit $commit_id2" >> $testroot/stdout.expected + echo "commit $commit_id1" >> $testroot/stdout.expected + echo "commit $commit_id0" >> $testroot/stdout.expected + (cd $testroot/wt && env GOT_LOG_DEFAULT_LIMIT=1 got log -l0 | \ + grep ^commit > $testroot/stdout) + cmp -s $testroot/stdout.expected $testroot/stdout + ret="$?" + if [ "$ret" != "0" ]; then + diff -u $testroot/stdout.expected $testroot/stdout + fi + test_done "$testroot" "0" +} + run_test test_log_in_repo run_test test_log_in_bare_repo run_test test_log_in_worktree run_test test_log_tag +run_test test_log_limit