chiark / gitweb /
 author Ian Jackson Thu, 1 Mar 2012 03:22:24 +0000 (03:22 +0000) committer Ian Jackson Thu, 1 Mar 2012 03:22:24 +0000 (03:22 +0000)
 article.tex patch | blob | history

index 9ca8012..992f0d4 100644 (file)
\renewcommand{\land}{\wedge}
\renewcommand{\lor}{\vee}

-\newcommand{\pancs}[2]{{\mathcal A} ( #1 , #2 ) }
-\newcommand{\pends}[2]{{\mathcal E} ( #1 , #2 ) }
+\newcommand{\pancs}{{\mathcal A}}
+\newcommand{\pends}{{\mathcal E}}
+
+\newcommand{\pancsof}[2]{\pancs ( #1 , #2 ) }
+\newcommand{\pendsof}[2]{\pends ( #1 , #2 ) }

\newcommand{\patchof}[1]{{\mathcal P} ( #1 ) }
\newcommand{\baseof}[1]{{\mathcal B} ( #1 ) }
@@ -93,21 +96,21 @@ All these sets are distinct.  Hence:

\item[ $\patchof{ C }$ ]
Either $\p$ s.t. $C \in \p$, or $\bot$.
-A function from commits to sets $\p$.
+A function from commits to patches' sets $\p$.

-\item[ $\pancs{C}{\set P}$ ]
+\item[ $\pancsof{C}{\set P}$ ]
$\{ A \; | \; A \le C \land A \in \set P \}$
i.e. all the ancestors of $C$
which are in $\set P$.

-\item[ $\pends{C}{\set P}$ ]
-$\{ E \; | \; E \in \pancs{C}{\set P} - \land \mathop{\not\exists}_{A \in \pancs{C}{\set P}} +\item[$ \pendsof{C}{\set P} $] +$ \{ E \; | \; E \in \pancsof{C}{\set P}
+  \land \mathop{\not\exists}_{A \in \pancsof{C}{\set P}}
A \neq E \land E \le A \} $-i.e. all$\le$-maximal commits in$\pancs{C}{\set P}$. +i.e. all$\le$-maximal commits in$\pancsof{C}{\set P}$. \item[$ \baseof{C} $] -$ \pends{C}{\pn} = \{ \baseof{C} \} $where$ C \in \py $. +$ \pendsof{C}{\pn} = \{ \baseof{C} \} $where$ C \in \py $. A partial function from commits to commits. See unique base'', below. @@ -131,7 +134,7 @@ it, we hope that git's merge algorithm will DTRT. C \has D \implies C \ge D }\] $\eqn{Unique Base:}{ - \bigforall_{C \in \py} \pends{C}{\pn} = \{ B \} + \bigforall_{C \in \py} \pendsof{C}{\pn} = \{ B \} }$ $\eqn{Tip Contents:}{ \bigforall_{C \in \py} D \isin C \equiv @@ -141,6 +144,9 @@ it, we hope that git's merge algorithm will DTRT. \[\eqn{Base Acyclic:}{ \bigforall_{B \in \pn} D \isin B \implies D \notin \py }$ +$\eqn{Coherence:}{ + \bigforall_{C,\p} C \haspatch \p \lor C \nothaspatch \p +}$ \section{Some lemmas} @@ -182,18 +188,38 @@$ \bigforall_{C \in \py}\bigforall_{D \in \py}
}\]

$\eqn{Transitive Ancestors:}{ - \left[ \bigforall_{ E \in \pends{C}{\set P} } E \le C \right] \implies - \left[ \bigforall_{ A \in \pancs{C}{\set P} } A \le C \right] + \left[ \bigforall_{ E \in \pendsof{C}{\set P} } E \le M \right] \equiv + \left[ \bigforall_{ A \in \pancsof{C}{\set P} } A \le M \right] }$

\proof{
-By the definition of $\mathcal E$,
-for every such $A$, either $A \in \pends{C}{\set P}$ which implies
-$A \le C$, or $\exists_{A' \in \pancs{C}{\set P}} \; A' \neq A \land A \le C$
+The implication from right to left is trivial because
+$\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'$
in which case we repeat for $A'$.  Since there are finitely many
-commits, this terminates.
+commits, this terminates with $A'' \in \pends()$, ie $A'' \le M$
+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}}
+\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$
+would have to be updated.  The annotation is not needed because
+$\forall_{\py \ni C} \pendsof{C}{\py} = \{C\}$.
+
\section{Test more symbols}

$C \haspatch \p$