X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=article.tex;h=85e09e1c470a695becbf92bfa58fcaad0dc000e8;hb=9a2630dee8213479147c4b6a60973c4533de4c32;hp=afefebd90d7aaf60e5de2f8da98c4fee810a4aa8;hpb=71f18d98f82d4ba454e875c79119879d3dc957ed;p=topbloke-formulae.git diff --git a/article.tex b/article.tex index afefebd..85e09e1 100644 --- a/article.tex +++ b/article.tex @@ -171,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,9 +196,30 @@ We maintain these each time we construct a new commit. \\ \[\eqn{Foreign Inclusion:}{ \bigforall_{D \text{ s.t. } \patchof{D} = \bot} D \isin C \equiv D \leq C }\] +\[\eqn{Foreign Contents:}{ + \bigforall_{C \text{ s.t. } \patchof{C} = \bot} + D \le C \implies \patchof{D} = \bot +}\] \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 ) @@ -247,6 +256,7 @@ $ \bigforall_{C \in \py}\bigforall_{D \in \py} ( \mathop{\hbox{\huge{$\vee$}}}_{R \in \set R} D \le R ) \lor D = C }\] +xxx proof tbd \[ \eqn{Transitive Ancestors:}{ \left[ \bigforall_{ E \in \pendsof{C}{\set P} } E \le M \right] \equiv @@ -265,48 +275,62 @@ 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''$. } + \[ \eqn{Calculation Of Ends:}{ \bigforall_{C \hasparents \set A} \pendsof{C}{\set P} = + \begin{cases} + C \in \p : & \{ C \} + \\ + C \not\in \p : & \displaystyle \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] \right\} + \end{cases} }\] -XXX proof TBD. - -\subsection{No Replay for Merge Results} - -If we are constructing $C$, with, -\gathbegin - \mergeof{C}{L}{M}{R} -\gathnext - L \le C -\gathnext - R \le C -\end{gather} -No Replay is preserved. \proofstarts - -\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. +xxx proof tbd + +\[ \eqn{Ingredients Prevent Replay:}{ + \left[ + {C \hasparents \set A} \land + \\ + \left( + D \isin C \implies + D = C \lor + \Largeexists_{A \in \set A} D \isin A + \right) + \right] \implies \left[ + D \isin C \implies D \le C + \right] +}\] +\proof{ + Trivial for $D = C$. Consider some $D \neq C$, $D \isin C$. + By the preconditions, there is some $A$ s.t. $D \in \set A$ + and $D \isin A$. By No Replay for $A$, $D \le A$. And + $A \le C$ so $D \le C$. +} -$\qed$ +\[ \eqn{Totally Foreign Contents:}{ + \bigforall_{C \hasparents \set A} + \left[ + \patchof{C} = \bot \land + \bigforall_{A \in \set A} \patchof{A} = \bot + \right] + \implies + \left[ + D \le C + \implies + \patchof{D} = \bot + \right] +}\] +\proof{ +Consider some $D \le C$. If $D = C$, $\patchof{D} = \bot$ trivially. +If $D \neq C$ then $D \le A$ where $A \in \set A$. By Foreign +Contents of $A$, $\patchof{D} = \bot$. +} \section{Commit annotation} @@ -322,10 +346,25 @@ We annotate each Topbloke commit $C$ with: \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}} \end{gather} +$\patchof{C}$, for each kind of Topbloke-generated commit, is stated +in the summary in the section for that kind of commit. + +Whether $\baseof{C}$ is required, and if so what the value is, is +stated in the proof of Unique Base for each kind of commit. + +$C \haspatch \pa{Q}$ or $\nothaspatch \pa{Q}$ is represented as the +set $\{ \pa{Q} | C \haspatch \pa{Q} \}$. Whether $C \haspatch \pa{Q}$ +is in stated +(in terms of $I \haspatch \pa{Q}$ or $I \nothaspatch \pa{Q}$ +for the ingredients $I$), +in the proof of Coherence for each kind of commit. + +$\pendsof{C}{\pa{Q}^+}$ is computed, for all Topbloke-generated commits, +using the lemma Calculation of Ends, above. 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\}$. +would have to be updated. The annotation is not needed in that case +because $\forall_{\py \ni C} \; \pendsof{C}{\py} = \{C\}$. \section{Simple commit} @@ -339,10 +378,14 @@ This also covers Topbloke-generated commits on plain git branches: Topbloke strips the metadata when exporting. \subsection{No Replay} -Trivial. + +Ingredients Prevent Replay applies. $\qed$ \subsection{Unique Base} -If $A, C \in \py$ then $\baseof{C} = \baseof{A}$. $\qed$ +If $A, C \in \py$ then by Calculation of Ends for +$C, \py, C \not\in \py$: +$\pendsof{C}{\pn} = \pendsof{A}{\pn}$ so +$\baseof{C} = \baseof{A}$. $\qed$ \subsection{Tip Contents} We need to consider only $A, C \in \py$. From Tip Contents for $A$: @@ -369,7 +412,9 @@ Need to consider only $A, C \in \pn$. For $D = C$: $D \in \pn$ so $D \not\in \py$. OK. For $D \neq C$: $D \isin C \equiv D \isin A$, so by Base Acyclic for -$A$, $D \isin C \implies D \not\in \py$. $\qed$ +$A$, $D \isin C \implies D \not\in \py$. + +$\qed$ \subsection{Coherence and patch inclusion} @@ -408,10 +453,111 @@ $\qed$ If $D = C$, trivial. For $D \neq C$: $D \isin C \equiv D \isin A \equiv D \le A \equiv D \le C$. $\qed$ +\subsection{Foreign Contents:} + +Only relevant if $\patchof{C} = \bot$, and in that case Totally +Foreign Contents applies. $\qed$ + +\section{Create Base} + +Given $L$, create a Topbloke base branch initial commit $B$. +\gathbegin + B \hasparents \{ L \} +\gathnext + \patchof{B} = \pan{Q} +\gathnext + D \isin B \equiv D \isin L \lor D = B +\end{gather} + +\subsection{Conditions} + +\[ \eqn{ Ingredients }{ + \patchof{L} = \pa{L} \lor \patchof{L} = \bot +}\] +\[ \eqn{ Non-recursion }{ + L \not\haspatch \pa{Q} +}\] + +\subsection{No Replay} + +Ingredients Prevent Replay applies. $\qed$ + +\subsection{Unique Base} + +Not applicable. + +\subsection{Tip Contents} + +Not applicable. + +\subsection{Base Acyclic} + +Consider some $D \isin B$. If $D = B$, $D \in \pan{Q}$. +If $D \neq B$, $D \isin L$, and by Non-recursion +$D \not\in \pay{Q}$. $\qed$ + +\subsection{Coherence and Patch Inclusion} + +Consider some $D \in \p$. +$B \not\in \py$ so $D \neq B$. So $D \isin B \equiv D \isin L$. + +Thus $L \haspatch \p \implies B \haspatch P$ +and $L \nothaspatch \p \implies B \nothaspatch P$. + +$\qed$. + +\subsection{Foreign Inclusion} + +Consider some $D$ s.t. $\patchof{D} = \bot$. $D \neq B$ +so $D \isin B \equiv D \isin L$. +By Foreign Inclusion of $D$ in $L$, $D \isin L \equiv D \le L$. +And by Exact Ancestors $D \le L \equiv D \le B$. +So $D \isin B \equiv D \le B$. $\qed$ + +\subsection{Foreign Contents} + +Not applicable. + +\section{Create Tip} + +Given a Topbloke base $B$, create a tip branch initial commit B. +\gathbegin + C \hasparents \{ B \} +\gathnext + \patchof{B} = \pay{Q} +\gathnext + D \isin C \equiv D \isin B \lor D = C +\end{gather} + +\subsection{Conditions} + +\[ \eqn{ Ingredients }{ + \patchof{B} = \pan{Q} +}\] + +\subsection{No Replay} + +Ingredients Prevent Replay applies. $\qed$ + +\subsection{Unique Base} + +Trivially, $\pendsof{C}{\pan{Q}} = \{B\}$ so $\baseof{C} = B$. + +\subsection{Tip Contents} + +Consider some arbitrary commit $D$. If $D = C$, trivially satisfied. + +If $D \neq C$, $D \isin C \equiv D \isin B$. +By Base Acyclic of $B$, $D \isin B \implies D \not\in \pay{Q}$. +So $D \isin C \equiv D \isin \baseof{B}$. + +$\qed$ + +xxx up to here + \section{Anticommit} -Given $L, R^+, R^-$ where -$R^+ \in \pry, R^- = \baseof{R^+}$. +Given $L$ and $\pr$ as represented by $R^+, R^-$. Construct $C$ which has $\pr$ removed. Used for removing a branch dependency. \gathbegin @@ -424,21 +570,34 @@ Used for removing a branch dependency. \subsection{Conditions} +\[ \eqn{ Ingredients }{ +R^+ \in \pry \land R^- = \baseof{R^+} +}\] +\[ \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 Ingredients:} 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$. +$\qed$ + +(Note that $R^+ \not\le R^-$, i.e. the merge base +is a descendant, not an ancestor, of the 2nd parent.) + +\subsection{No Replay} + +By definition of $\merge$, +$D \isin C \implies D \isin L \lor D \isin R^- \lor D = C$. +So, by Ordering of Ingredients, +Ingredients Prevent Replay applies. $\qed$ \subsection{Desired Contents} @@ -476,15 +635,59 @@ $\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$ -xxx tbd +\subsection{Tip Contents} -xxx need to finish anticommit +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$. + +Whereas if $L \haspatch \p$, $D \isin L \equiv D \le L$. +so $L \haspatch \p \implies C \haspatch \p$. + +$\qed$ + +\subsection{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$. + +And $D \le C \equiv D \le L$. +Thus $D \isin C \equiv D \le C$. + +$\qed$ + +\subsection{Foreign Contents} + +Not applicable. \section{Merge} -Merge commits $L$ and $R$ using merge base $M$ ($M < L, M < R$): +Merge commits $L$ and $R$ using merge base $M$: \gathbegin C \hasparents \{ L, R \} \gathnext @@ -495,7 +698,9 @@ Merge commits $L$ and $R$ using merge base $M$ ($M < L, M < R$): We will occasionally use $X,Y$ s.t. $\{X,Y\} = \{L,R\}$. \subsection{Conditions} - +\[ \eqn{ Ingredients }{ + M \le L, M \le R +}\] \[ \eqn{ Tip Merge }{ L \in \py \implies \begin{cases} @@ -525,10 +730,31 @@ We will occasionally use $X,Y$ s.t. $\{X,Y\} = \{L,R\}$. \bigforall_{E \in \pendsof{X}{\py}} E \le Y \right] }\] +\[ \eqn{ Foreign Merges }{ + \patchof{L} = \bot \equiv \patchof{R} = \bot +}\] + +\subsection{Non-Topbloke merges} + +We require both $\patchof{L} = \bot$ and $\patchof{R} = \bot$ +(Foreign Merges, above). +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. + +So a plain git merge of non-Topbloke branches meets the conditions and +is therefore consistent with our scheme. \subsection{No Replay} -See No Replay for Merge Results. +By definition of $\merge$, +$D \isin C \implies D \isin L \lor D \isin R \lor D = C$. +So, by Ingredients, +Ingredients Prevent Replay applies. $\qed$ \subsection{Unique Base} @@ -602,7 +828,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 @@ -646,7 +873,9 @@ $C \in \pn$ when $L \in \pn$ so by Merge Acyclic, $R \nothaspatch \p$. Consider some $D \in \py$. By Base Acyclic of $L$, $D \not\isin L$. By the above, $D \not\isin -R$. And $D \neq C$. So $D \not\isin C$. $\qed$ +R$. And $D \neq C$. So $D \not\isin C$. + +$\qed$ \subsection{Tip Contents} @@ -695,6 +924,41 @@ $\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$ + +\subsection{Foreign Contents} + +Only relevant if $\patchof{L} = \bot$, in which case +$\patchof{C} = \bot$ and by Foreign Merges $\patchof{R} = \bot$, +so Totally Foreign Contents applies. $\qed$ \end{document}