-\newcommand{\proof}[1]{{\it Proof.} #1 $\square$}
-
-\begin{document}
-
-\section{Notation}
-
-\begin{basedescript}{
-\desclabelwidth{5em}
-\desclabelstyle{\nextlinelabel}
-}
-\item[ $ C \hasparents \set X $ ]
-The parents of commit $C$ are exactly the set
-$\set X$.
-
-\item[ $ C \ge D $ ]
-$C$ is a descendant of $D$ in the git commit
-graph. This is a partial order, namely the transitive closure of
-$ D \in \set X $ where $ C \hasparents \set X $.
-
-\item[ $ C \has D $ ]
-Informally, the tree at commit $C$ contains the change
-made in commit $D$. Does not take account of deliberate reversions by
-the user or in non-Topbloke-controlled branches; these are considered
-normal, forward, commits. For merges and Topbloke-generated
-anticommits, the ``change made'' is only to be thought of as any
-conflict resolution. This is not a partial order because it is not
-transitive.
-
-\item[ $ \p, \py, \pn $ ]
-A patch $\p$ consists of two sets of commits $\pn$ and $\py$, which
-are respectively the base and tip git branches. $\p$ may be used
-where the context requires a set, in which case the statement
-is to be taken as applying to both $\py$ and $\pn$.
-All these sets are distinct. Hence:
-
-\item[ $ \patchof{ C } $ ]
-Either $\p$ s.t. $ C \in \p $, or $\bot$.
-A function from commits to patches' sets $\p$.
-
-\item[ $ \pancsof{C}{\set P} $ ]
-$ \{ A \; | \; A \le C \land A \in \set P \} $
-i.e. all the ancestors of $C$
-which are in $\set P$.
-
-\item[ $ \pendsof{C}{\set P} $ ]
-$ \{ E \; | \; E \in \pancsof{C}{\set P}
- \land \mathop{\not\exists}_{A \in \pancsof{C}{\set P}}
- A \neq E \land E \le A \} $
-i.e. all $\le$-maximal commits in $\pancsof{C}{\set P}$.
-
-\item[ $ \baseof{C} $ ]
-$ \pendsof{C}{\pn} = \{ \baseof{C} \} $ where $ C \in \py $.
-A partial function from commits to commits.
-See ``unique base'', below.
-
-\item[ $ C \haspatch \p $ ]
-$\displaystyle \bigforall_{D \in \py} D \isin C \equiv D \le C $.
-~ Informally, $C$ has the contents of $\p$.
-
-\item[ $ C \nothaspatch \p $ ]
-$\displaystyle \bigforall_{D \in \py} D \not\isin C $.
-~ Informally, $C$ has none of the contents of $\p$.
-
-Non-Topbloke commits are $\nothaspatch \p$ for all $\p$; if
-a patch is merged into a non-Topbloke branch and we inherit
-it, we hope that git's merge algorithm will DTRT.
-
-\end{basedescript}
-
-\section{Invariants}
-
-\[ \eqn{No Replay:}{
- C \has D \implies C \ge D
-}\]
-\[\eqn{Unique Base:}{
- \bigforall_{C \in \py} \pendsof{C}{\pn} = \{ B \}
-}\]
-\[\eqn{Tip Contents:}{
- \bigforall_{C \in \py} D \isin C \equiv
- { D \isin \baseof{C} \lor \atop
- (D \in \py \land D \le C) }
-}\]
-\[\eqn{Base Acyclic:}{
- \bigforall_{B \in \pn} D \isin B \implies D \notin \py
-}\]
-\[\eqn{Coherence:}{
- \bigforall_{C,\p} C \haspatch \p \lor C \nothaspatch \p
-}\]
-
-\section{Some lemmas}
-
-\[ \eqn{Exclusive Tip Contents:}{
- \bigforall_{C \in \py}
- \neg \left[ D \isin \baseof{C} \land (D \in \py \land D \le C
- \right )]
-}\]
-Ie, the two limbs of the RHS of Tip Contents are mutually exclusive.
-
-\proof{
-Let $B = \baseof{C}$ in $D \isin \baseof{C}$. Now $B \in \pn$.
-So by Base Acyclic $D \isin B \implies D \notin \py$.
-}
-\[ \corrolary{
- \bigforall_{C \in \py} D \isin C \equiv
- \begin{cases}
- D \in \py : & D \le C \\
- D \not\in \py : & D \isin \baseof{C}
- \end{cases}
-}\]
-
-\[ \eqn{Tip Self Inpatch:}{
- \bigforall_{C \in \py} C \haspatch \p
-}\]
-Ie, tip commits contain their own patch.
-
-\proof{
-Apply Exclusive Tip Contents to some $D \in \py$:
-$ \bigforall_{C \in \py}\bigforall_{D \in \py}
- D \isin C \equiv D \le C $
-}
-
-\[ \eqn{Exact Ancestors:}{
- \bigforall_{ C \hasparents \set{R} }
- D \le C \equiv
- ( \mathop{\hbox{\huge{$\vee$}}}_{R \in \set R} D \le R )
- \lor D = C
-}\]
-
-\[ \eqn{Transitive Ancestors:}{
- \left[ \bigforall_{ E \in \pendsof{C}{\set P} } E \le M \right] \equiv
- \left[ \bigforall_{ A \in \pancsof{C}{\set P} } A \le M \right]
-}\]
-
-\proof{
-The implication from right to left is trivial because
-$ \pends() \subset \pancs() $.
-For the implication from left to right:
-by the definition of $\mathcal E$,
-for every such $A$, either $A \in \pends()$ which implies
-$A \le C$, or $\exists_{A' \in \pancs()} \; A' \neq A \land A \le A' $
-in which case we repeat for $A'$. Since there are finitely many
-commits, this terminates with $A'' \in \pends()$, ie $A'' \le M$
-by the LHS. And $A \le A''$.
-}
-
-\section{Commit annotation}
-
-We annotate each Topbloke commit $C$ with:
-\begin{gather}
-\tag*{} \patchof{C} \\
-\tag*{} \baseof{C}, \text{ if } C \in \py \\
-\tag*{} \bigforall_{\pa{Q}}
- \text{ either } C \haspatch \pa{Q} \text{ or } C \nothaspatch \pa{Q} \\
-\tag*{} \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}}
-\end{gather}