chiark / gitweb /
anticommit - split out ordering
[topbloke-formulae.git] / article.tex
index 25946fa8b789b313d36523473ec7bbf1cfbad406..7f55e4fea15e0ba20f05978cfe052a2f5dee1101 100644 (file)
@@ -152,10 +152,13 @@ $\displaystyle \bigforall_{D \in \py} D \isin C \equiv D \le C $.
 $\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:
@@ -168,18 +171,6 @@ $\displaystyle D \isin C \equiv
   \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}
@@ -208,6 +199,23 @@ We maintain these each time we construct a new commit. \\
 
 \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 )
@@ -332,6 +340,8 @@ A simple single-parent forward commit $C$ as made by git-commit.
 \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.
@@ -419,21 +429,24 @@ Used for removing a branch dependency.
 
 \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$.
+
+\subsection{No Replay}
+
+No Replay for Merge Results applies.  $\qed$
 
 \subsection{Desired Contents}
 
@@ -471,11 +484,38 @@ $\qed$
 
 \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$
+
+\subsection{Tip Contents}
+
+Again, not applicable. $\qed$
 
-xxx tbd
+\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$.
 
-xxx need to finish anticommit
+\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$.
+
+Whereas if $L \haspatch \p$, $D \isin L \equiv D \le L$.
+so $L \haspatch \p \implies C \haspatch \p$.
 
 \section{Merge}
 
@@ -521,6 +561,17 @@ We will occasionally use $X,Y$ s.t. $\{X,Y\} = \{L,R\}$.
    \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.
@@ -597,7 +648,8 @@ So indeed $L \haspatch \p \land R \haspatch \p \implies C \haspatch \p$.
 
 \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
 
@@ -690,6 +742,35 @@ $\baseof{C} = R$ so $D \isin C \equiv D \isin \baseof{C}$.  OK.
 
 $\qed$
 
-xxx up to here, need to prove other things about merges
+\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$:}
+
+$D \isin C$ and $D \le C$.  OK.
+
+\subsubsection{For $D \neq C, D \isin M$:}
+
+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.
+
+\subsubsection{For $D \neq C, D \not\isin M, D \isin X$:}
+
+By $\merge$, $D \isin C$.
+And $D \isin X$ means $D \le X$ so $D \le C$.
+OK.
+
+\subsubsection{For $D \neq C, D \not\isin M, D \not\isin L, D \not\isin R$:}
+
+By $\merge$, $D \not\isin C$.
+And $D \not\le L, D \not\le R$ so $D \not\le C$.
+OK
+
+$\qed$
 
 \end{document}