commit - 827e685d40606c809ce90eeb3b30094f3f586393
commit + e6fdf1dda4bb09f48bc1344b207aebb193636a7f
blob - 0b7ff7916ba48b09d48cbc1c37cf75175316b469
blob + ee41732e49ededaf4c54218c0d0b9deb2c1feff9
--- got/got.1
+++ got/got.1
in a pattern.
.It Xo
.Cm log
-.Op Fl bdPpRs
+.Op Fl bdPpRst
.Op Fl C Ar number
.Op Fl c Ar commit
.Op Fl l Ar N
or
.Fl P
option.
+.It Fl t
+Display commits in topological order.
+This option has no effect without the
+.Fl b
+option because a linear history is sorted in topological order by definition.
+Topological sorting is disabled by default because the present implementation
+requires that commit history is fully traversed before any output can be shown.
.It Fl x Ar commit
Stop traversing commit history immediately after the specified
.Ar commit
blob - b2207ea62be2ceedcd79728f10ffabc58ab19898
blob + 8eb1de9d033a4fbe3d7bc8adff0491af9182f4f1
--- got/got.c
+++ got/got.c
struct got_repository *repo, const char *path, int show_changed_paths,
int show_diffstat, int show_patch, const char *search_pattern,
int diff_context, int limit, int log_branches, int reverse_display_order,
- struct got_reflist_object_id_map *refs_idmap, int one_line,
+ struct got_reflist_object_id_map *refs_idmap, int one_line, int toposort,
FILE *tmpfile)
{
const struct got_error *err;
err = got_commit_graph_open(&graph, path, !log_branches);
if (err)
return err;
- err = got_commit_graph_iter_start(graph, root_id, repo,
- check_cancelled, NULL);
+ if (log_branches && toposort) {
+ err = got_commit_graph_toposort(graph, root_id, repo,
+ check_cancelled, NULL);
+ } else {
+ err = got_commit_graph_iter_start(graph, root_id, repo,
+ check_cancelled, NULL);
+ }
if (err)
goto done;
for (;;) {
__dead static void
usage_log(void)
{
- fprintf(stderr, "usage: %s log [-bdPpRs] [-C number] [-c commit] "
+ fprintf(stderr, "usage: %s log [-bdPpRst] [-C number] [-c commit] "
"[-l N] [-r repository-path] [-S search-pattern] [-x commit] "
"[path]\n", getprogname());
exit(1);
int diff_context = -1, ch;
int show_changed_paths = 0, show_patch = 0, limit = 0, log_branches = 0;
int show_diffstat = 0, reverse_display_order = 0, one_line = 0;
+ int toposort = 0;
const char *errstr;
struct got_reflist_head refs;
struct got_reflist_object_id_map *refs_idmap = NULL;
limit = get_default_log_limit();
- while ((ch = getopt(argc, argv, "bC:c:dl:PpRr:S:sx:")) != -1) {
+ while ((ch = getopt(argc, argv, "bC:c:dl:PpRr:S:stx:")) != -1) {
switch (ch) {
case 'b':
log_branches = 1;
case 's':
one_line = 1;
break;
+ case 't':
+ toposort = 1;
+ break;
case 'x':
end_commit = optarg;
break;
error = print_commits(start_id, end_id, repo, path ? path : "",
show_changed_paths, show_diffstat, show_patch, search_pattern,
diff_context, limit, log_branches, reverse_display_order,
- refs_idmap, one_line, tmpfile);
+ refs_idmap, one_line, toposort, tmpfile);
done:
free(path);
free(repo_path);
blob - 4a83ec7819b07c9e4a689fc50177a7b979abbbf9
blob + c3e22d2178b4eebd38723079274f19c9e8b9d2d5
--- regress/cmdline/log.sh
+++ regress/cmdline/log.sh
test_done "$testroot" "$ret"
}
+test_log_toposort() {
+ local testroot=`test_init log_toposort`
+ local commit0=`git_show_head $testroot/repo`
+ local author_time0=`git_show_author_time $testroot/repo`
+
+ got checkout $testroot/repo $testroot/wt > /dev/null
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ test_done "$testroot" "$ret"
+ return 1
+ fi
+
+ echo aaa > $testroot/wt/alpha
+ (cd $testroot/wt && got commit -m 'change alpha' >/dev/null)
+ local commit1=`git_show_head $testroot/repo`
+ local author_time1=`git_show_author_time $testroot/repo`
+
+ got branch -r $testroot/repo -c $commit0 newbranch
+ (cd $testroot/wt && got update -b newbranch > /dev/null)
+ echo ddd > $testroot/wt/gamma/delta
+ (cd $testroot/wt && got commit -m 'change delta' >/dev/null)
+ local commit2=`git_show_branch_head $testroot/repo newbranch`
+ local author_time2=`git_show_author_time $testroot/repo newbranch`
+
+ echo zzz > $testroot/wt/epsilon/zeta
+ (cd $testroot/wt && got commit -m 'change zeta' >/dev/null)
+ local commit3=`git_show_head $testroot/repo`
+ local author_time3=`git_show_author_time $testroot/repo newbranch`
+
+ (cd $testroot/wt && got update -b master > /dev/null)
+ (cd $testroot/wt && got merge newbranch > /dev/null)
+ local merge_commit=`git_show_head $testroot/repo`
+ local merge_time=`git_show_author_time $testroot/repo`
+
+ local short_commit0=`trim_obj_id 33 $commit0`
+ local short_commit1=`trim_obj_id 33 $commit1`
+ local short_commit2=`trim_obj_id 33 $commit2`
+ local short_commit3=`trim_obj_id 33 $commit3`
+
+ d_0=`date -u -r $author_time0 +"%G-%m-%d"`
+ d_1=`date -u -r $author_time1 +"%G-%m-%d"`
+ d_2=`date -u -r $author_time2 +"%G-%m-%d"`
+ d_3=`date -u -r $author_time3 +"%G-%m-%d"`
+ d_m=`date -u -r $merge_time +"%G-%m-%d"`
+
+ got log -r $testroot/repo -s -b -t > $testroot/stdout
+ cat > $testroot/stdout.expected <<EOF
+$d_m master merge refs/heads/newbranch into refs/heads/master
+$d_1 $short_commit1 change alpha
+$d_3 newbranch change zeta
+$d_2 $short_commit2 change delta
+$d_0 $short_commit0 adding the test tree
+EOF
+ cmp -s $testroot/stdout.expected $testroot/stdout
+ ret=$?
+ if [ $ret -ne 0 ]; then
+ diff -u $testroot/stdout.expected $testroot/stdout
+ fi
+ test_done "$testroot" "$ret"
+}
+
+
test_parseargs "$@"
run_test test_log_in_repo
run_test test_log_in_bare_repo
run_test test_log_submodule
run_test test_log_diffstat
run_test test_log_commit_keywords
+run_test test_log_toposort