1 \section{Traversal phase --- algorithm}
3 (In general, unless stated otherwise below, when we generate a new
4 commit $C$ using one of the commit kind algorith, we update
5 $W \assign C$. In any such case where we say we're going to Merge
6 with $L = W$, if $R \ge W$ we do not Merge but instead simply set
10 For each patch $\pc \in \allpatches$ in topological order by $\hasdep$,
15 \item Optionally, attempt
16 $\alg{Merge-Base}(\pc)$. This may or may not succeed.
18 \item If this didn't succeed, or was not attempted, execute
19 $\alg{Recreate-Base}(\pc)$.
21 \item Then in any case, execute
22 $\alg{Merge-Tip}(\pc)$.
26 After processing each $\pc$ we will have created $\tipcn$ and $\tipcy$
29 \statement{Correct Base}{
30 \baseof{\tipcy} = \tipcn
32 \statement{Base Ends Supreme}{
33 \tipcn \ge \pendsof{\allsrcs}{\pcn}
35 \statement{Tip Ends Supreme}{
36 \tipcy \ge \pendsof{\allsrcs}{\pcy}
39 \subsection{$\alg{Merge-Base}(\pc)$}
41 This algorithm attempts to construct a suitably updated version of the
42 base branch $\pcn$ using some existing version of $\pcn$ as a starting
45 It should be executed noninteractively. Specifically, if any step
46 fails with a merge conflict, the whole thing should be abandoned.
47 This avoids asking the user to resolve confusing conflicts. It also
48 avoids asking the user to pointlessly resolve conflicts in situations
49 where we will later discover that $\alg{Merge-Base}$ wasn't feasible
52 If $\pc$ has only one direct dependency, this algorithm should not be
53 used as in that case $\alg{Recreate-Base}$ is trivial and guaranteed
54 to generate a perfect answer, whereas this algorithm might involve
55 merges and therefore might not produce a perfect answer if the
56 situation is complicated.
58 Initially, set $W \iassign W^{\pcn}$.
60 \subsubsection{Bases and sources}
62 In some order, perhaps interleaving the two kinds of merge:
66 \item For each $\pd \isdirdep \pc$, find a merge base
67 $M \le W,\; \le \tipdy$ and merge $\tipdy$ into $W$.
68 That is, use $\alg{Merge}$ with $L = W,\; R = \tipdy$.
71 \item For each $S \in S^{\pcn}_i$, merge it into $W$.
72 That is, use $\alg{Merge}$ with $L = W,\; R = S,\; M = M^{\pcn}_i$.
79 Execute $\alg{Fixup-Base}(W,\pc)$.
82 \subsection{$\alg{Recreate-Base}(\pc)$}
88 Choose a $\hasdep$-maximal direct dependency $\pd$ of $\pc$.
92 Use $\alg{Create Base}$ with $L$ = $\pdy,\; \pq = \pc$ to generate $C$
93 and set $W \iassign C$. (Recreate Base Beginning.)
97 Execute the subalgorithm $\alg{Recreate-Recurse}(\pc)$.
101 Declare that we contain all of the relevant information from the
102 sources. That is, use $\alg{Pseudo-merge}$ with $L = W, \;
103 \set R = \{ W \} \cup \set S^{\pcn}$.
104 (Recreate Base Final Declaration.)
108 \subsubsection{$\alg{Recreate-Recurse}(\pd)$}
112 \item Is $W \haspatch \pd$ ? If so, there is nothing to do: return.
114 \item TODO what about non-Topbloke base branches
116 \item Use $\alg{Pseudo-Merge}$ with $L = W,\; \set R = \{ \tipdn \}$.
117 (Recreate Base Dependency Base Declaration.)
119 \item For all $\hasdep$-maximal $\pd' \isdirdep \pd$,
120 execute $\alg{Recreate-Recurse}(\pd')$.
122 \item Use $\alg{Merge}$ to apply $\pd$ to $W$. That is,
123 $L = W, \; R = \tipdy, \; M = \baseof{R} = \tipdn$.
129 \subsection{$\alg{Merge-Tip}(\pc)$}
133 \item TODO CHOOSE/REFINE W AND S as was done during Ranking for bases
135 \item $\alg{Merge}$ from $\tipcn$. That is, $L = W, \;
136 R = \tipcn$ and choose any suitable $M$. (Tip Base Merge.)
138 \item For each source $S \in \set S^{\pcy}$,
139 $\alg{Merge}$ with $L = W, \; R = S$ and any suitable $M$.