X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke-formulae.git;a=blobdiff_plain;f=article.tex;h=008229a17c249447403c8039618b8914ffc6f224;hp=7f55e4fea15e0ba20f05978cfe052a2f5dee1101;hb=0fa67d5fbecdec4faf97bbfef6ec0ba27fa91548;hpb=ec87cbf422cc01bb1980544ba039692dadd60ca4 diff --git a/article.tex b/article.tex index 7f55e4f..008229a 100644 --- a/article.tex +++ b/article.tex @@ -252,6 +252,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 @@ -270,17 +271,23 @@ 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. +xxx proof tbd \subsection{No Replay for Merge Results} @@ -327,10 +334,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} @@ -347,7 +369,10 @@ Topbloke strips the metadata when exporting. Trivial. \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$: @@ -374,7 +399,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} @@ -413,10 +440,17 @@ $\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$ +\section{Create Base} + +xxx tbd + +\section{Create Tip} + +xxx tbd\ + \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 @@ -429,6 +463,9 @@ Used for removing a branch dependency. \subsection{Conditions} +\[ \eqn{ Ingredients }{ +R^+ \in \pry \land R^- = \baseof{R^+} +}\] \[ \eqn{ Into Base }{ L \in \pn }\] @@ -443,6 +480,10 @@ Used for removing a branch dependency. 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$. +$\qed$ + +(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} @@ -517,6 +558,19 @@ 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$ + +\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$. + +And $D \le C \equiv D \le L$. +Thus $D \isin C \equiv D \le C$. + +$\qed$ + \section{Merge} Merge commits $L$ and $R$ using merge base $M$ ($M < L, M < R$): @@ -574,7 +628,7 @@ Merge Ends condition applies. Good. \subsection{No Replay} -See No Replay for Merge Results. +No Replay for Merge Results applies. $\qed$ \subsection{Unique Base} @@ -693,7 +747,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}