chiark / gitweb /
wip merge content
[topbloke-formulae.git] / article.tex
index f712ba63fc0e7fdb37b78598eb1f192d357a634b..0018429e2a80618059f63b2189d3a4103d3b8994 100644 (file)
@@ -10,6 +10,8 @@
 
 \renewcommand{\ge}{\geqslant}
 \renewcommand{\le}{\leqslant}
+\newcommand{\nge}{\ngeqslant}
+\newcommand{\nle}{\nleqslant}
 
 \newcommand{\has}{\sqsupseteq}
 \newcommand{\isin}{\sqsubseteq}
 \newcommand{\pancsof}[2]{\pancs ( #1 , #2 ) }
 \newcommand{\pendsof}[2]{\pends ( #1 , #2 ) }
 
-\newcommand{\merge}[4]{{\mathcal M}(#1,#2,#3,#4)}
+\newcommand{\merge}{{\mathcal M}}
+\newcommand{\mergeof}[4]{\merge(#1,#2,#3,#4)}
 %\newcommand{\merge}[4]{{#2 {{\frac{ #1 }{ #3 } #4}}}}
 
-\newcommand{\patchof}[1]{{\mathcal P} ( #1 ) }
-\newcommand{\baseof}[1]{{\mathcal B} ( #1 ) }
+\newcommand{\patch}{{\mathcal P}}
+\newcommand{\base}{{\mathcal B}}
+
+\newcommand{\patchof}[1]{\patch ( #1 ) }
+\newcommand{\baseof}[1]{\base ( #1 ) }
 
 \newcommand{\eqn}[2]{ #2 \tag*{\mbox{\bf #1}} }
 \newcommand{\corrolary}[1]{ #1 \tag*{\mbox{\it Corrolary.}} }
@@ -149,7 +155,7 @@ 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.
 
-\item[ $\displaystyle \merge{C}{L}{M}{R} $ ]
+\item[ $\displaystyle \mergeof{C}{L}{M}{R} $ ]
 The contents of a git merge result:
 
 $\displaystyle D \isin C \equiv
@@ -245,15 +251,46 @@ by the LHS.  And $A \le A''$.
 \[ \eqn{Calculation Of Ends:}{
   \bigforall_{C \hasparents \set A}
     \pendsof{C}{\set P} =
-       \Bigl\{ E \Big|
+       \left\{ E \Big|
            \Bigl[ \Largeexists_{A \in \set A} 
                        E \in \pendsof{A}{\set P} \Bigr] \land
            \Bigl[ \Largenexists_{B \in \set A} 
                        E \neq B \land E \le B \Bigr]
-       \Bigr\}
+       \right\}
 }\]
 XXX proof TBD.
 
+\subsection{No Replay for Merge Results}
+
+If we are constructing $C$, given
+\gathbegin
+  \mergeof{C}{L}{M}{R}
+\gathnext
+  L \le C
+\gathnext
+  R \le C
+\end{gather}
+No Replay is preserved.  {\it Proof:}
+
+\subsubsection{For $D=C$:} $D \isin C, D \le C$.  OK.
+
+\subsubsection{For $D \isin L \land D \isin R$:}
+$D \isin C$.  And $D \isin L \implies D \le L \implies D \le C$.  OK.
+
+\subsubsection{For $D \neq C \land D \not\isin L \land D \not\isin R$:}
+$D \not\isin C$.  OK.
+
+\subsubsection{For $D \neq C \land (D \isin L \equiv D \not\isin R)
+ \land D \not\isin M$:}
+$D \isin C$.  Also $D \isin L \lor D \isin R$ so $D \le L \lor D \le
+R$ so $D \le C$.  OK.
+
+\subsubsection{For $D \neq C \land (D \isin L \equiv D \not\isin R)
+ \land D \isin M$:}
+$D \not\isin C$.  OK.
+
+$\qed$
+
 \section{Commit annotation}
 
 We annotate each Topbloke commit $C$ with:
@@ -355,7 +392,7 @@ $D \isin C \equiv D \isin A \equiv D \le A \equiv D \le C$.  $\qed$
 \section{Anticommit}
 
 Given $L, R^+, R^-$ where
-$\patchof{R^+} = \pry, \patchof{R^-} = \prn$.  
+$R^+ \in \pry, R^- = \baseof{R^+}$.  
 Construct $C$ which has $\pr$ removed.
 Used for removing a branch dependency.
 \gathbegin
@@ -363,7 +400,7 @@ Used for removing a branch dependency.
 \gathnext
  \patchof{C} = \patchof{L}
 \gathnext
- \merge{C}{L}{R^+}{R^-}
+ \mergeof{C}{L}{R^+}{R^-}
 \end{gather}
 
 \subsection{Conditions}
@@ -371,16 +408,60 @@ Used for removing a branch dependency.
 \[ \eqn{ Unique Tip }{
  \pendsof{L}{\pry} = \{ R^+ \}
 }\]
-\[ \eqn{ Correct Base }{
- \baseof{R^+} = R^-
-}\]
 \[ \eqn{ Currently Included }{
  L \haspatch \pry
 }\]
+\[ \eqn{ Not Self }{
+ L \not\in \{ R^+ \}
+}\]
+
+\subsection{No Replay}
+
+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$
+
+\subsection{Desired Contents}
+
+\[ D \isin C \equiv [ D \notin \pry \land D \isin L ] \lor D = C \]
+{\it Proof.}
+
+\subsubsection{For $D = C$:}
+
+Trivially $D \isin C$.  OK.
+
+\subsubsection{For $D \neq C, D \not\le L$:}
+
+By No Replay $D \not\isin L$.  Also $D \not\le R^-$ hence
+$D \not\isin R^-$.  Thus $D \not\isin C$.  OK.
+
+\subsubsection{For $D \neq C, D \le L, D \in \pry$:}
+
+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$.  
+So $D \isin R^+$.
+
+By Base Acyclic, $D \not\isin R^-$.
 
+Apply $\merge$: $D \not\isin C$.  OK.
 
+\subsubsection{For $D \neq C, D \le L, D \notin \pry$:}
 
-xxx want to prove $D \isin C \equiv D \not\in \pry \land D \isin L$.
+By Tip Contents for $R^+$, $D \isin R^+ \equiv D \isin R^-$.
+
+Apply $\merge$: $D \isin C \equiv D \isin L$.  OK.
+
+$\qed$
+
+\subsection{Unique Base}
+
+Need to consider only $C \in \py$, ie $L \in \py$.
+
+xxx tbd
+
+xxx need to finish anticommit
 
 \section{Merge}
 
@@ -390,7 +471,7 @@ Merge commits $L$ and $R$ using merge base $M$ ($M < L, M < R$):
 \gathnext
  \patchof{C} = \patchof{L}
 \gathnext
- \merge{C}{L}{M}{R}
+ \mergeof{C}{L}{M}{R}
 \end{gather}
 
 \subsection{Conditions}
@@ -408,28 +489,7 @@ Merge commits $L$ and $R$ using merge base $M$ ($M < L, M < R$):
 
 \subsection{No Replay}
 
-\subsubsection{For $D=C$:} $D \isin C, D \le C$.  OK.
-
-\subsubsection{For $D \isin L \land D \isin R$:}
-$D \isin C$.  And $D \isin L \implies D \le L \implies D \le C$.  OK.
-
-\subsubsection{For $D \neq C \land D \not\isin L \land D \not\isin R$:}
-$D \not\isin C$.  OK.
-
-\subsubsection{For $D \neq C \land D \not\isin L \land D \not\isin R$:}
-$D \not\isin C$.  OK.
-
-\subsubsection{For $D \neq C \land (D \isin L \equiv D \not\isin R)
- \land D \not\isin M$:}
-$D \isin C$.  Also $D \isin L \lor D \isin R$ so $D \le L \lor D \le
-R$ so $D \le C$.  OK.
-
-\subsubsection{For $D \neq C \land (D \isin L \equiv D \not\isin R)
- \land D \isin M$:}
-$D \not\isin C$.  Also $D \isin L \lor D \isin R$ so $D \le L \lor D \le
-R$ so $D \le C$.  OK.
-
-$\qed$
+See No Replay for Merge Results.
 
 \subsection{Unique Base}
 
@@ -465,4 +525,42 @@ 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$.  
+
+We will use $X,Y$ s.t. $\{X,Y\} = \{L,R\}$.
+
+\subsubsection{For $L \nothaspatch P, R \nothaspatch P$:}
+$D \not\isin L \land D \not\isin R$.  $C \not\in \py$ (otherwise $L
+\in \py$ ie $L \haspatch P$ by Tip Self Inpatch).  So $D \neq C$.
+Applying $\merge$ gives $D \not\isin C$ i.e. $C \nothaspatch P$.
+
+\subsubsection{For $L \haspatch P, R \haspatch P$:}
+$D \isin L \equiv D \le L$ and $D \isin R \equiv D \le R$.
+(Likewise $D \isin X \equiv D \le X$ and $D \isin Y \equiv D \le Y$.)
+
+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$.  
+(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$ 
+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$.  
+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$.  
+Thus by $\merge$, $D \isin C$.  And $D \le Y$ so $D \le C$.
+OK for $C \haspatch P$.
+
+So indeed $L \haspatch P \land R \haspatch P \implies C \haspatch P$.
+
 \end{document}