X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke-formulae.git;a=blobdiff_plain;f=article.tex;h=ad68c2ca763c9f9efd2ce59f75301dde9eae624e;hp=992f0d46204d5007e96878b888bf084b01d57dbc;hb=1bd4718fef57ea9276c2b38a27848b036d43963d;hpb=456d92924b93b80e43c32b9a5046b5a47600be2d diff --git a/article.tex b/article.tex index 992f0d4..ad68c2c 100644 --- a/article.tex +++ b/article.tex @@ -59,7 +59,12 @@ {\hbox{\scriptsize$\forall$}}}% } -\newcommand{\proof}[1]{{\it Proof.} #1 $\square$} + +\newcommand{\qed}{\square} +\newcommand{\proof}[1]{{\it Proof.} #1 $\qed$} + +\newcommand{\gathbegin}{\begin{gather} \tag*{}} +\newcommand{\gathnext}{\\ \tag*{}} \begin{document} @@ -81,11 +86,11 @@ $ D \in \set X $ where $ C \hasparents \set X $. \item[ $ C \has D $ ] Informally, the tree at commit $C$ contains the change made in commit $D$. Does not take account of deliberate reversions by -the user or in non-Topbloke-controlled branches; these are considered -normal, forward, commits. For merges and Topbloke-generated -anticommits, the ``change made'' is only to be thought of as any -conflict resolution. This is not a partial order because it is not -transitive. +the user or reversion, rebasing or rewinding in +non-Topbloke-controlled branches. For merges and Topbloke-generated +anticommits or re-commits, the ``change made'' is only to be thought +of as any conflict resolution. This is not a partial order because it +is not transitive. \item[ $ \p, \py, \pn $ ] A patch $\p$ consists of two sets of commits $\pn$ and $\py$, which @@ -112,7 +117,7 @@ i.e. all $\le$-maximal commits in $\pancsof{C}{\set P}$. \item[ $ \baseof{C} $ ] $ \pendsof{C}{\pn} = \{ \baseof{C} \} $ where $ C \in \py $. A partial function from commits to commits. -See ``unique base'', below. +See Unique Base, below. \item[ $ C \haspatch \p $ ] $\displaystyle \bigforall_{D \in \py} D \isin C \equiv D \le C $. @@ -122,14 +127,16 @@ $\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 patch is merged into a non-Topbloke branch and we inherit -it, we hope that git's merge algorithm will DTRT. +Non-Topbloke commits are $\nothaspatch \p$ for all $\p$; 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. \end{basedescript} - +\newpage \section{Invariants} +We maintain these each time we construct a new commit. \\ \[ \eqn{No Replay:}{ C \has D \implies C \ge D }\] @@ -147,13 +154,16 @@ it, we hope that git's merge algorithm will DTRT. \[\eqn{Coherence:}{ \bigforall_{C,\p} C \haspatch \p \lor C \nothaspatch \p }\] +\[\eqn{Foreign Inclusion:}{ + \bigforall_{D \text{ s.t. } \patchof{D} = \bot} D \isin C \equiv D \leq C +}\] \section{Some lemmas} \[ \eqn{Exclusive Tip Contents:}{ \bigforall_{C \in \py} - \neg \left[ D \isin \baseof{C} \land (D \in \py \land D \le C - \right )] + \neg \Bigl[ D \isin \baseof{C} \land ( D \in \py \land D \le C ) + \Bigr] }\] Ie, the two limbs of the RHS of Tip Contents are mutually exclusive. @@ -198,7 +208,8 @@ $ \pends() \subset \pancs() $. For the implication from left to right: by the definition of $\mathcal E$, for every such $A$, either $A \in \pends()$ which implies -$A \le C$, or $\exists_{A' \in \pancs()} \; A' \neq A \land A \le A' $ +$A \le M$ by the LHS directly, +or $\exists_{A' \in \pancs()} \; A' \neq A \land A \le A' $ 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''$. @@ -207,18 +218,70 @@ by the LHS. And $A \le A''$. \section{Commit annotation} We annotate each Topbloke commit $C$ with: -\begin{gather} -\tag*{} \patchof{C} \\ -\tag*{} \baseof{C}, \text{ if } C \in \py \\ -\tag*{} \bigforall_{\pa{Q}} - \text{ either } C \haspatch \pa{Q} \text{ or } C \nothaspatch \pa{Q} \\ -\tag*{} \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}} +\gathbegin + \patchof{C} +\gathnext + \baseof{C}, \text{ if } C \in \py +\gathnext + \bigforall_{\pa{Q}} + \text{ either } C \haspatch \pa{Q} \text{ or } C \nothaspatch \pa{Q} +\gathnext + \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}} \end{gather} -We do not annotate $\pendsof{C}{\py}$ for $C \in \py$ doing so would -break making plain commits with git because the recorded $\pends$ +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\}$. +$\forall_{\py \ni C} \; \pendsof{C}{\py} = \{C\}$. + +\section{Simple commit} + +A simple single-parent forward commit $C$ as made by git-commit. +\begin{gather} +\tag*{} C \hasparents \{ A \} \\ +\tag*{} \patchof{C} = \patchof{A} \\ +\tag*{} D \isin C \equiv D \isin A \lor D = C +\end{gather} + +\subsection{No Replay} +Trivial. + +\subsection{Unique Base} +If $A, C \in \py$ then $\baseof{C} = \baseof{A}$. $\qed$ + +\subsection{Tip Contents} +We need to consider only $A, C \in \py$. From Tip Contents for $A$: +\[ D \isin A \equiv D \isin \baseof{A} \lor ( D \in \py \land D \le A ) \] +Substitute into the contents of $C$: +\[ D \isin C \equiv D \isin \baseof{A} \lor ( D \in \py \land D \le A ) + \lor D = C \] +Since $D = C \implies D \in \py$, +and substituting in $\baseof{C}$, this gives: +\[ D \isin C \equiv D \isin \baseof{C} \lor + (D \in \py \land D \le A) \lor + (D = C \land D \in \py) \] +\[ \equiv D \isin \baseof{C} \lor + [ D \in \py \land ( D \le A \lor D = C ) ] \] +So by Exact Ancestors: +\[ D \isin C \equiv D \isin \baseof{C} \lor ( D \in \py \land D \le C +) \] +$\qed$ + +\subsection{Base Acyclic} + +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$ + +\subsection{Coherence} + +\subsubsection{For $A \haspatch P, D = C$:} +\[ D \isin C \equiv \ldots \lor t \text{ so } D \haspatch C \] +\[ D \le C \] +OK \section{Test more symbols}