\section{Notation}
+xxx make all conditions be in conditions, not in (or also in) intro
+
\begin{basedescript}{
\desclabelwidth{5em}
\desclabelstyle{\nextlinelabel}
$\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 Topbloke
+Non-Topbloke commits are $\nothaspatch \p$ for all $\p$. This
+includes commits on plain git branches made by applying a Topbloke
+patch. 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.
+the relevant Topbloke branches, we hope that
+if the user still cares about the Topbloke patch,
+git's merge algorithm will DTRT when trying to re-apply the changes.
\item[ $\displaystyle \mergeof{C}{L}{M}{R} $ ]
The contents of a git merge result:
\end{cases}
$
-Some (overlapping) alternative formulations:
-
-$\displaystyle D \isin C \equiv
- \begin{cases}
- D \isin L \equiv D \isin R : & D = C \lor D \isin L \\
- D \isin L \equiv D \isin R : & D = C \lor D \isin R \\
- D \isin L \nequiv D \isin R : & D = C \lor D \not\isin M \\
- D \isin M \equiv D \isin L : & D = C \lor D \isin R \\
- D \isin M \equiv D \isin R : & D = C \lor D \isin L \\
- \end{cases}
-$
-
\end{basedescript}
\newpage
\section{Invariants}
\section{Some lemmas}
+\[ \eqn{Alternative (overlapping) formulations defining
+ $\mergeof{C}{L}{M}{R}$:}{
+ D \isin C \equiv
+ \begin{cases}
+ D \isin L \equiv D \isin R : & D = C \lor D \isin L \\
+ D \isin L \nequiv D \isin R : & D = C \lor D \not\isin M \\
+ D \isin L \equiv D \isin M : & D = C \lor D \isin R \\
+ D \isin L \nequiv D \isin M : & D = C \lor D \isin L \\
+ \text{as above with L and R exchanged}
+ \end{cases}
+}\]
+\proof{
+ Truth table xxx
+
+ Original definition is symmetrical in $L$ and $R$.
+}
+
\[ \eqn{Exclusive Tip Contents:}{
\bigforall_{C \in \py}
\neg \Bigl[ D \isin \baseof{C} \land ( D \in \py \land D \le C )
\tag*{} \patchof{C} = \patchof{A} \\
\tag*{} D \isin C \equiv D \isin A \lor D = C
\end{gather}
+This also covers Topbloke-generated commits on plain git branches:
+Topbloke strips the metadata when exporting.
\subsection{No Replay}
Trivial.
\subsection{Conditions}
+\[ \eqn{ Into Base }{
+ L \in \pn
+}\]
\[ \eqn{ Unique Tip }{
\pendsof{L}{\pry} = \{ R^+ \}
}\]
\[ \eqn{ Currently Included }{
L \haspatch \pry
}\]
-\[ \eqn{ Not Self }{
- L \not\in \{ R^+ \}
-}\]
-\subsection{No Replay}
+\subsection{Ordering of ${L, R^+, R^-}$:}
By Unique Tip, $R^+ \le L$. By definition of $\base$, $R^- \le R^+$
-so $R^- \le L$. So $R^+ \le C$ and $R^- \le C$ and No Replay for
-Merge Results applies. $\qed$
+so $R^- \le L$. So $R^+ \le C$ and $R^- \le C$.
+
+(Note that the merge base $R^+ \not\le R^-$, i.e. the merge base is
+later than one of the branches to be merged.)
+
+\subsection{No Replay}
+
+No Replay for Merge Results applies. $\qed$
\subsection{Desired Contents}
\subsection{Unique Base}
-Need to consider only $C \in \py$, ie $L \in \py$.
+Into Base means that $C \in \pn$, so Unique Base is not
+applicable. $\qed$
-xxx tbd
+\subsection{Tip Contents}
+
+Again, not applicable. $\qed$
+
+\subsection{Base Acyclic}
+
+By Base Acyclic for $L$, $D \isin L \implies D \not\in \py$.
+And by Into Base $C \not\in \py$.
+Now from Desired Contents, above, $D \isin C
+\implies D \isin L \lor D = C$, which thus
+$\implies D \not\in \py$. $\qed$.
+
+\subsection{Coherence and Patch Inclusion}
+
+Need to consider some $D \in \py$. By Into Base, $D \neq C$.
+
+\subsubsection{For $\p = \pr$:}
+By Desired Contents, above, $D \not\isin C$.
+So $C \nothaspatch \pr$.
+
+\subsubsection{For $\p \neq \pr$:}
+By Desired Contents, $D \isin C \equiv D \isin L$
+(since $D \in \py$ so $D \not\in \pry$).
+
+If $L \nothaspatch \p$, $D \not\isin L$ so $D \not\isin C$.
+So $L \nothaspatch \p \implies C \nothaspatch \p$.
-xxx need to finish anticommit
+Whereas if $L \haspatch \p$, $D \isin L \equiv D \le L$.
+so $L \haspatch \p \implies C \haspatch \p$.
+
+\section{Foreign Inclusion}
+
+Consider some $D$ s.t. $\patchof{D} = \bot$. $D \neq C$.
+So by Desired Contents $D \isin C \equiv D \isin L$.
+By Foreign Inclusion of $D$ in $L$, $D \isin L \equiv D \le L$.
+So $D \isin C \equiv D \le L$.
+
+xxx up to here
+
+By Tip Contents of $R^+$, $D \isin R^+ \equiv D \isin \baseof{R^+}$
+i.e. $\equiv D \isin R^-$.
+So by $\merge$, $D \isin C \equiv D \isin L$.
+
+Thus $D \isin C \equiv $
\section{Merge}
\right]
}\]
+\subsection{Non-Topbloke merges}
+
+We require both $\patchof{L} = \bot$ and $\patchof{R} = \bot$.
+I.e. not only is it forbidden to merge into a Topbloke-controlled
+branch without Topbloke's assistance, it is also forbidden to
+merge any Topbloke-controlled branch into any plain git branch.
+
+Given those conditions, Tip Merge and Merge Acyclic do not apply.
+And $Y \not\in \py$ so $\neg [ Y \haspatch \p ]$ so neither
+Merge Ends condition applies. Good.
+
\subsection{No Replay}
-See No Replay for Merge Results.
+No Replay for Merge Results applies. $\qed$
\subsection{Unique Base}
\subsubsection{For (wlog) $X \not\haspatch \p, Y \haspatch \p$:}
-$C \haspatch \p \equiv M \nothaspatch \p$.
+$M \haspatch \p \implies C \nothaspatch \p$.
+$M \nothaspatch \p \implies C \haspatch \p$.
\proofstarts
$\qed$
-xxx junk after here
-
-%D \in \py$:}
+\subsection{Foreign Inclusion}
+Consider some $D$ s.t. $\patchof{D} = \bot$.
+By Foreign Inclusion of $L, M, R$:
+$D \isin L \equiv D \le L$;
+$D \isin M \equiv D \le M$;
+$D \isin R \equiv D \le R$.
+\subsubsection{For $D = C$:}
-xxx the coherence is not that useful ?
+$D \isin C$ and $D \le C$. OK.
-$L \haspatch \p$ by
+\subsubsection{For $D \neq C, D \isin M$:}
-xxx need to recheck this
+Thus $D \le M$ so $D \le L$ and $D \le R$ so $D \isin L$ and $D \isin
+R$. So by $\merge$, $D \isin C$. And $D \le C$. OK.
-$C \in \py$ $C \haspatch P$ so $D \isin C \equiv D \le C$. OK.
+\subsubsection{For $D \neq C, D \not\isin M, D \isin X$:}
-\subsubsection{For $L \in \py, D \not\in \py, R \in \py$:}
+By $\merge$, $D \isin C$.
+And $D \isin X$ means $D \le X$ so $D \le C$.
+OK.
-Tip Contents for $L$: $D \isin L \equiv D \isin \baseof{L}$.
+\subsubsection{For $D \neq C, D \not\isin M, D \not\isin L, D \not\isin R$:}
-Tip Contents for $R$: $D \isin R \equiv D \isin \baseof{R}$.
+By $\merge$, $D \not\isin C$.
+And $D \not\le L, D \not\le R$ so $D \not\le C$.
+OK
-But by Tip Merge, $\baseof{R} \ge \baseof{L}$
+$\qed$
\end{document}