\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.
+the user or reversion, rebasing or rewinding in
+non-Topbloke-controlled branches. For merges and Topbloke-generated
+anticommits or re-commits, 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
$\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.
+Non-Topbloke commits are $\nothaspatch \p$ for all $\p$; if a Topbloke
+patch is applied to a non-Topbloke branch and then bubbles back to
+the Topbloke patch itself, we hope that git's merge algorithm will
+DTRT or that the user will no longer care about the Topbloke patch.
\end{basedescript}
-
+\newpage
\section{Invariants}
+We maintain these each time we construct a new commit. \\
\[ \eqn{No Replay:}{
C \has D \implies C \ge D
}\]
\[\eqn{Coherence:}{
\bigforall_{C,\p} C \haspatch \p \lor C \nothaspatch \p
}\]
+\[\eqn{Foreign Inclusion:}{
+ \bigforall_{D \text{ s.t. } \patchof{D} = \bot} D \isin C \equiv D \leq C
+}\]
\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 )]
+ \neg \Bigl[ D \isin \baseof{C} \land ( D \in \py \land D \le C )
+ \Bigr]
}\]
Ie, the two limbs of the RHS of Tip Contents are mutually exclusive.
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' $
+$A \le M$ by the LHS directly,
+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''$.
\tag*{} \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}}
\end{gather}
-We do not annotate $\pendsof{C}{\py}$ for $C \in \py$ doing so would
-break making plain commits with git because the recorded $\pends$
+We do not annotate $\pendsof{C}{\py}$ for $C \in \py$. Doing so would
+make it wrong to make plain commits with git because the recorded $\pends$
would have to be updated. The annotation is not needed because
-$\forall_{\py \ni C} \pendsof{C}{\py} = \{C\}$.
+$\forall_{\py \ni C} \; \pendsof{C}{\py} = \{C\}$.
\section{Test more symbols}