Commit Briefs
rename got_commit_graph_iter_start() to got_commit_graph_bfsort()
This function begins a breadth-first traversal. The new name makes it easier to distinguish from got_commit_graph_toposort().
remove a confusing comment
This function starts a breadth-first traversal, not necessarily first-parent.
make 'got rebase' find a merge base with topological sorting if needed
Fixes a problematic case of spurious conflicts encountered by naddy@ on landry's firefox package git repository. The current implementation of toposort is expensive, so this might make rebase appear to run slowly on large repositories. However, this is better than letting users deal with spurious conflicts. ok op@
add support for topological sorting to the commit graph
The algorithm implemented here is based on a description I read on github's blog. See code comments for details. ok op@
remove GOT_ERR_ITER_BUSY from got_commit_graph_iter_start()
Just clear any left-over iteration state and begin a fresh iteration instead of returning GOT_ERR_ITER_BUSY if the caller did not loop through the entire graph. This change currently doesn't matter much since all existing callers only do a single pass over the graph. But it frees up an error code and makes this API more flexible.
handle merge commits that are unrelated to requested changed path history
Problem found and fix tested by James Cook.
simplify ancestry checks in checkout, update, rebase, and merge
No behaviour change as the end result of the rewritten checks should be the same as before. We are just doing less work where possible. Patch by James Cook
include sha2.h too where sha1.h is included
In preparation for wide sha256 support; stsp@ agrees. Change done mechanically with find . -iname \*.[cy] -exec sam {} + X ,x/<sha1\.h>/i/\n#include <sha2.h>
make got_commit_graph_iter_next use caller-provided storage for the id
and adjust the callers. discussed with and ok stsp@
plug leak in the commit graph iterator
We fail to release the memory for the nodes. To fix it however, we some consumer of the commit graph iterator need to be corrected: the returned pointer is safe to be used only up until the next iter_next call; save a copy it if it's needed afterwards too. ok stsp@
replace an indirect call to idset_add(), via add_node(), with a direct call
Avoids leaking the node structure returned from add_node(). ok op@
free commit on error path
while here drop the ternary too: if add_node succeeds `new_node' is non-NULL. ok stsp@
got_commit_graph_close: free tailq contents
The tailq should ideally be empty when we reach got_commit_graph_close, but consumer code may exit the commit graph loop earlier. spotted by and ok stsp@
inline struct got_object_id in struct got_object_qid
Saves us from doing a malloc/free call for every item on the list. ok op@
stop relying on commit cache for good performance of got_object_id_by_path()
Instead of internally opening and closing the same commit object over and over again, require callers to pass an open commit object in. Avoids an inherent dependency on the commit object cache for reasonable performance. ok op@
switch from SIMPLEQ to equivalent STAILQ macros
The singly-linked tail queue macros were added to OpenBSD 6.9 and are more widely available on other systems. ok stsp