\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
+graph. This is a partial order, namely the transitive closure of
$ D \in \set X $ where $ C \hasparents \set X $.
\item[ $ C \has D $ ]
None of these sets overlap. Hence:
\item[ $ \patchof{ C } $ ]
-Either $\p$ s.t. $ C \in \p $, or $\bot$.
+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 \} $
+$ \{ 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}}
- E \neq A \land E \le A \} $
+ E \neq A \land E \le A \} $
i.e. all $\le$-maximal commits in $\pancsof{C}{\set P}$.
\item[ $ \baseof{C} $ ]
\item[ $ C \nothaspatch \p $ ]
$\displaystyle \bigforall_{D \in \py} D \not\isin C $.
-~ Informally, $C$ has none of the contents of $\p$.
+~ Informally, $C$ has none of the contents of $\p$.
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 relevant Topbloke branches, we hope that
+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.
(D \not\isin L \land D \not\isin R) \land D \neq C : & \false \\
\text{otherwise} : & D \not\isin M
\end{cases}
-$
+$
\end{basedescript}
\newpage
\text{as above with L and R exchanged}
\end{cases}
}\]
-\proof{
- Truth table xxx
-
- Original definition is symmetrical in $L$ and $R$.
+\proof{ ~ Truth table (ordered by original definition): \\
+ \begin{tabular}{cccc|c|cc}
+ $D = C$ &
+ $\isin L$ &
+ $\isin M$ &
+ $\isin R$ & $\isin C$ &
+ $L$ vs. $R$ & $L$ vs. $M$
+ \\\hline
+ y & ? & ? & ? & y & ? & ? \\
+ n & y & y & y & y & $\equiv$ & $\equiv$ \\
+ n & y & n & y & y & $\equiv$ & $\nequiv$ \\
+ n & n & y & n & n & $\equiv$ & $\nequiv$ \\
+ n & n & n & n & n & $\equiv$ & $\equiv$ \\
+ n & y & y & n & n & $\nequiv$ & $\equiv$ \\
+ n & n & y & y & n & $\nequiv$ & $\nequiv$ \\
+ n & y & n & n & y & $\nequiv$ & $\nequiv$ \\
+ n & n & n & y & y & $\nequiv$ & $\equiv$ \\
+ \end{tabular} \\
+ And original definition is symmetrical in $L$ and $R$.
}
\[ \eqn{Exclusive Tip Contents:}{
- \bigforall_{C \in \py}
+ \bigforall_{C \in \py}
\neg \Bigl[ D \isin \baseof{C} \land ( D \in \py \land D \le C )
\Bigr]
}\]
( \mathop{\hbox{\huge{$\vee$}}}_{R \in \set R} D \le R )
\lor D = C
}\]
-xxx proof tbd
+\proof{ ~ Trivial.}
\[ \eqn{Transitive Ancestors:}{
\left[ \bigforall_{ E \in \pendsof{C}{\set P} } E \le M \right] \equiv
\proof{
The implication from right to left is trivial because
$ \pends() \subset \pancs() $.
-For the implication from left to right:
+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 M$ by the LHS directly,
\\
C \not\in \p : & \displaystyle
\left\{ E \Big|
- \Bigl[ \Largeexists_{A \in \set A}
+ \Bigl[ \Largeexists_{A \in \set A}
E \in \pendsof{A}{\set P} \Bigr] \land
- \Bigl[ \Largenexists_{B \in \set A}
+ \Bigl[ \Largenexists_{B \in \set A}
E \neq B \land E \le B \Bigr]
\right\}
\end{cases}
Substitute into the contents of $C$:
\[ D \isin C \equiv D \isin \baseof{A} \lor ( D \in \py \land D \le A )
\lor D = C \]
-Since $D = C \implies D \in \py$,
+Since $D = C \implies D \in \py$,
and substituting in $\baseof{C}$, this gives:
\[ D \isin C \equiv D \isin \baseof{C} \lor
(D \in \py \land D \le A) \lor
\subsection{Base Acyclic}
-Need to consider only $A, C \in \pn$.
+Need to consider only $A, C \in \pn$.
For $D = C$: $D \in \pn$ so $D \not\in \py$. OK.
\subsubsection{For $A \nothaspatch P$:}
-Firstly, $C \not\in \py$ since if it were, $A \in \py$.
+Firstly, $C \not\in \py$ since if it were, $A \in \py$.
Thus $D \neq C$.
Now by contents of $A$, $D \notin A$, so $D \notin C$.
\[ A \nothaspatch P \implies C \nothaspatch P \]
$\qed$
-\subsection{Foreign inclusion:}
+\subsection{Foreign Inclusion:}
-If $D = C$, trivial. For $D \neq C$:
-$D \isin C \equiv D \isin A \equiv D \le A \equiv D \le C$. $\qed$
+Simple Foreign Inclusion applies. $\qed$
\subsection{Foreign Contents:}
$\qed$
-xxx up to here
+\subsection{Foreign Inclusion}
+
+Simple Foreign Inclusion applies. $\qed$
+
+\subsection{Foreign Contents}
+
+Not applicable.
\section{Anticommit}
By Currently Included, $D \isin L$.
By Tip Self Inpatch, $D \isin R^+ \equiv D \le R^+$, but by
-by Unique Tip, $D \le R^+ \equiv D \le L$.
+by Unique Tip, $D \le R^+ \equiv D \le L$.
So $D \isin R^+$.
By Base Acyclic, $D \not\isin R^-$.
putative ancestor $A \in \pn$ and see whether $A \le C$.
By Exact Ancestors for C, $A \le C \equiv A \le L \lor A \le R \lor A = C$.
-But $C \in py$ and $A \in \pn$ so $A \neq C$.
+But $C \in py$ and $A \in \pn$ so $A \neq C$.
Thus $A \le C \equiv A \le L \lor A \le R$.
By Unique Base of L and Transitive Ancestors,
But by Tip Merge condition on $\baseof{R}$,
$A \le \baseof{L} \implies A \le \baseof{R}$, so
$A \le \baseof{R} \lor A \le \baseof{L} \equiv A \le \baseof{R}$.
-Thus $A \le C \equiv A \le \baseof{R}$.
+Thus $A \le C \equiv A \le \baseof{R}$.
That is, $\baseof{C} = \baseof{R}$.
\subsubsection{For $R \in \pn$:}
By Tip Merge condition on $R$ and since $M \le R$,
$A \le \baseof{L} \implies A \le R$, so
-$A \le R \lor A \le \baseof{L} \equiv A \le R$.
-Thus $A \le C \equiv A \le R$.
+$A \le R \lor A \le \baseof{L} \equiv A \le R$.
+Thus $A \le C \equiv A \le R$.
That is, $\baseof{C} = R$.
$\qed$
\subsection{Coherence and Patch Inclusion}
Need to determine $C \haspatch \p$ based on $L,M,R \haspatch \p$.
-This involves considering $D \in \py$.
+This involves considering $D \in \py$.
\subsubsection{For $L \nothaspatch \p, R \nothaspatch \p$:}
$D \not\isin L \land D \not\isin R$. $C \not\in \py$ (otherwise $L
Consider $D = C$: $D \isin C$, $D \le C$, OK for $C \haspatch \p$.
For $D \neq C$: $D \le C \equiv D \le L \lor D \le R
- \equiv D \isin L \lor D \isin R$.
+ \equiv D \isin L \lor D \isin R$.
(Likewise $D \le C \equiv D \le X \lor D \le Y$.)
Consider $D \neq C, D \isin X \land D \isin Y$:
-By $\merge$, $D \isin C$. Also $D \le X$
+By $\merge$, $D \isin C$. Also $D \le X$
so $D \le C$. OK for $C \haspatch \p$.
Consider $D \neq C, D \not\isin X \land D \not\isin Y$:
-By $\merge$, $D \not\isin C$.
-And $D \not\le X \land D \not\le Y$ so $D \not\le C$.
+By $\merge$, $D \not\isin C$.
+And $D \not\le X \land D \not\le Y$ so $D \not\le C$.
OK for $C \haspatch \p$.
Remaining case, wlog, is $D \not\isin X \land D \isin Y$.
-$D \not\le X$ so $D \not\le M$ so $D \not\isin M$.
+$D \not\le X$ so $D \not\le M$ so $D \not\isin M$.
Thus by $\merge$, $D \isin C$. And $D \le Y$ so $D \le C$.
OK for $C \haspatch \p$.
\proofstarts
-One of the Merge Ends conditions applies.
+One of the Merge Ends conditions applies.
Recall that we are considering $D \in \py$.
$D \isin Y \equiv D \le Y$. $D \not\isin X$.
We will show for each of
$M \nothaspatch \p$. And indeed $D \isin C$ and $D \le C$. OK.
Consider $D \neq C, M \nothaspatch P, D \isin Y$:
-$D \le Y$ so $D \le C$.
+$D \le Y$ so $D \le C$.
$D \not\isin M$ so by $\merge$, $D \isin C$. OK.
Consider $D \neq C, M \nothaspatch P, D \not\isin Y$:
$D \not\le Y$. If $D \le X$ then
-$D \in \pancsof{X}{\py}$, so by Addition Merge Ends and
+$D \in \pancsof{X}{\py}$, so by Addition Merge Ends and
Transitive Ancestors $D \le Y$ --- a contradiction, so $D \not\le X$.
Thus $D \not\le C$. By $\merge$, $D \not\isin C$. OK.
\subsection{Tip Contents}
-We need worry only about $C \in \py$.
+We need worry only about $C \in \py$.
And $\patchof{C} = \patchof{L}$
so $L \in \py$ so $L \haspatch \p$. We will use the Unique Base
of $C$, and its Coherence and Patch Inclusion, as just proved.