X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=article.tex;h=69f530a6c3395cf8b6e0e9462612b817ceb9360f;hb=75cfdcadb6d61aaa914e4ac7196b077812b2ad48;hp=7630745d41eaf60ca7369bd99e7ec29ea03cbe98;hpb=c2932ba812fa6fdf7b03615dd4a8709449cd8983;p=topbloke-formulae.git diff --git a/article.tex b/article.tex index 7630745..69f530a 100644 --- a/article.tex +++ b/article.tex @@ -34,6 +34,10 @@ \newcommand{\py}{\pay{P}} \newcommand{\pn}{\pan{P}} +\newcommand{\pq}{\pa{Q}} +\newcommand{\pqy}{\pay{Q}} +\newcommand{\pqn}{\pan{Q}} + \newcommand{\pr}{\pa{R}} \newcommand{\pry}{\pay{R}} \newcommand{\prn}{\pan{R}} @@ -293,6 +297,26 @@ by the LHS. And $A \le A''$. }\] 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$. +} + \[ \eqn{Totally Foreign Contents:}{ \bigforall_{C \hasparents \set A} \left[ @@ -301,43 +325,16 @@ xxx proof tbd \right] \implies \left[ - D \isin C + D \le C \implies \patchof{D} = \bot \right] }\] -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. - -$\qed$ +\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} @@ -347,10 +344,10 @@ We annotate each Topbloke commit $C$ with: \gathnext \baseof{C}, \text{ if } C \in \py \gathnext - \bigforall_{\pa{Q}} - \text{ either } C \haspatch \pa{Q} \text{ or } C \nothaspatch \pa{Q} + \bigforall_{\pq} + \text{ either } C \haspatch \pq \text{ or } C \nothaspatch \pq \gathnext - \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}} + \bigforall_{\pqy \not\ni C} \pendsof{C}{\pqy} \end{gather} $\patchof{C}$, for each kind of Topbloke-generated commit, is stated @@ -359,14 +356,14 @@ 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}$ +$C \haspatch \pq$ or $\nothaspatch \pq$ is represented as the +set $\{ \pq | C \haspatch \pq \}$. Whether $C \haspatch \pq$ is in stated -(in terms of $I \haspatch \pa{Q}$ or $I \nothaspatch \pa{Q}$ +(in terms of $I \haspatch \pq$ or $I \nothaspatch \pq$ 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, +$\pendsof{C}{\pq^+}$ 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$ @@ -385,7 +382,8 @@ 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 by Calculation of Ends for @@ -459,13 +457,18 @@ $\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} = \pa{B} + \patchof{B} = \pqn \gathnext D \isin B \equiv D \isin L \lor D = B \end{gather} @@ -475,35 +478,86 @@ Given $L$, create a Topbloke base branch initial commit $B$. \[ \eqn{ Ingredients }{ \patchof{L} = \pa{L} \lor \patchof{L} = \bot }\] -\[ \eqn{ Non-recursion }{ - L \not\in \pa{B} +\[ \eqn{ Create Acyclic }{ + L \not\haspatch \pq }\] \subsection{No Replay} -If $\patchof{L} = \pa{L}$, trivial by Base Acyclic for $L$. - -If $\patchof{L} = \bot$, xxx - -Trivial from Base Acyclic for $L$. $\qed$ +Ingredients Prevent Replay applies. $\qed$ \subsection{Unique Base} -Not applicable. $\qed$ +Not applicable. \subsection{Tip Contents} -Not applicable. $\qed$ +Not applicable. \subsection{Base Acyclic} -xxx +Consider some $D \isin B$. If $D = B$, $D \in \pqn$. +If $D \neq B$, $D \isin L$, and by Create Acyclic +$D \not\in \pqy$. $\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} -xxx unfinished +Not applicable. \section{Create Tip} -xxx tbd +Given a Topbloke base $B$, create a tip branch initial commit B. +\gathbegin + C \hasparents \{ B \} +\gathnext + \patchof{B} = \pqy +\gathnext + D \isin C \equiv D \isin B \lor D = C +\end{gather} + +\subsection{Conditions} + +\[ \eqn{ Ingredients }{ + \patchof{B} = \pqn +}\] + +\subsection{No Replay} + +Ingredients Prevent Replay applies. $\qed$ + +\subsection{Unique Base} + +Trivially, $\pendsof{C}{\pqn} = \{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 \pqy$. +So $D \isin C \equiv D \isin \baseof{B}$. + +$\qed$ + +xxx up to here \section{Anticommit} @@ -533,7 +587,7 @@ R^+ \in \pry \land R^- = \baseof{R^+} L \haspatch \pry }\] -\subsection{Ordering of ${L, R^+, R^-}$:} +\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$. @@ -544,7 +598,10 @@ is a descendant, not an ancestor, of the 2nd parent.) \subsection{No Replay} -No Replay for Merge Results applies. $\qed$ +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} @@ -628,6 +685,10 @@ 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$: @@ -673,21 +734,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$. +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. Good. +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} -No Replay for Merge Results applies. $\qed$ +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} @@ -888,4 +959,10 @@ 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}