X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke-formulae.git;a=blobdiff_plain;f=strategy.tex;h=0f03ddb9883200fed514b821df14948994e78aca;hp=62998371becf379d9aea154b32663e7d034c0ae2;hb=d1a680abdf1985a08c1a88157588ef881df7fb29;hpb=fdd5c703b15790389545f3b12264dbe24db5033e diff --git a/strategy.tex b/strategy.tex index 6299837..0f03ddb 100644 --- a/strategy.tex +++ b/strategy.tex @@ -98,6 +98,11 @@ The desired direct dependencies of $\pc$, a set of patches. The set of all the patches we are dealing with (constructed during the update algorithm). +\item[ $\tipcn, \tipcy$ ] +The new tips of the git branches $\pcn$ and $\pcy$, containing +all the correct commits (and the correct other patches), as +generated by the Traversal phase of the update algorithm. + \end{basedescript} \section{Ranking phase} @@ -224,7 +229,14 @@ this must complete eventually. $\qed$ -\section{Traversal phase} +\section{Traversal phase --- algorithm} + +(In general, unless stated otherwise below, when we generate a new +commit $C$ using one of the commit kind algorith, we update +$W \assign C$. In any such case where we say we're going to Merge +with $L = W$, if $R \ge W$ we do not Merge but instead simply set +$W \assign R$.) + For each patch $\pc \in \allpatches$ in topological order by $\hasdep$, lowest first: @@ -246,14 +258,15 @@ After processing each $\pc$ we will have created: \begin{itemize} -\item tip +\item $\tipcn$ and $\tipcy$ such that $\baseof{\tipcy} = \tipcn$. \end{itemize} \subsection{$\alg{Merge-Base}(\pc)$} This algorithm attempts to construct a suitably updated version of the -base branch $\pcn$. +base branch $\pcn$ using some existing version of $\pcn$ as a starting +point. It should be executed noninteractively. Specifically, if any step fails with a merge conflict, the whole thing should be abandoned. @@ -262,17 +275,103 @@ avoids asking the user to pointlessly resolve conflicts in situations where we will later discover that $\alg{Merge-Base}$ wasn't feasible after all. +If $\pc$ has only one direct dependency, this algorithm should not be +used as in that case $\alg{Recreate-Base}$ is trivial and guaranteed +to generate a perfect answer, whereas this algorithm might involve +merges and therefore might not produce a perfect answer if the +situation is complicated. + +Initially, set $W \iassign W^{\pcn}$. + \subsubsection{Bases and sources} In some order, perhaps interleaving the two kinds of merge: \begin{enumerate} -\item For each $\pd \isdirdep \pc$, merge $\pd$ +\item For each $\pd \isdirdep \pc$, find a merge base +$M \le W,\; \le \tipdy$ and merge $\tipdy$ into $W$. +That is, use $\alg{Merge}$ with $L = W,\; R = \tipdy$. +(Dependency Merge.) + +\item For each $S \in S^{\pcn}_i$, merge it into $W$. +That is, use $\alg{Merge}$ with $L = W,\; R = S,\; M = M^{\pcn}_i$. +(Base Sibling Merge.) + +\end{enumerate} + +\subsubsection{Fixup} + +Execute $\alg{Fixup-Base}(W,\pc)$. + + +\subsection{$\alg{Recreate-Base}(\pc)$} + +\begin{enumerate} + +\item + +Choose a $\hasdep$-maximal direct dependency $\pd$ of $\pc$. + +\item + +Use $\alg{Create Base}$ with $L$ = $\pdy,\; \pq = \pc$ to generate $C$ +and set $W \iassign C$. (Recreate Base Beginning.) + +\item + +Execute the subalgorithm $\alg{Recreate-Recurse}(\pc)$. \item +Declare that we contain all of the relevant information from the +sources. That is, use $\alg{Pseudo-merge}$ with $L = W, \; +\set R = \{ W \} \cup \set S^{\pcn}$. +(Recreate Base Final Declaration.) + +\end{enumerate} + +\subsubsection{$\alg{Recreate-Recurse}(\pd)$} + +\begin{enumerate} + +\item Is $W \haspatch \pd$ ? If so, there is nothing to do: return. + +\item TODO what about non-Topbloke base branches + +\item Use $\alg{Pseudo-Merge}$ with $L = W,\; \set R = \{ \tipdn \}$. +(Recreate Base Dependency Base Declaration.) + +\item For all $\hasdep$-maximal $\pd' \isdirdep \pd$, +execute $\alg{Recreate-Recurse}(\pd')$. + +\item Use $\alg{Merge}$ to apply $\pd$ to $W$. That is, +$L = W, \; R = \tipdy, \; M = \baseof{R} = \tipdn$. +(Recreate Reapply.) + \end{enumerate} +\subsection{$\alg{Merge-Tip}(\pc)$} + +\begin{enumerate} + +\item TODO CHOOSE/REFINE W AND S as was done during Ranking for bases + +\item $\alg{Merge}$ from $\tipcn$. That is, $L = W, \; +R = \tipcn$ and choose any suitable $M$. (Tip Base Merge.) + +\item For each source $S \in \set S^{\pcy}$, +$\alg{Merge}$ with $L = W, \; R = S$ and any suitable $M$. +(Tip Source Merge.) + +\end{enumerate} + + +\section{Traversal phase --- proofs} + +For each operation called for by the traversal algorithms, we prove +that the commit generation preconditions are met. + +\subsection{Tip Base Merge}