chiark / gitweb /
50fc96c526c2153a95b57546a828beedfec2e297
[topbloke-formulae.git] / article.tex
1 \documentclass[a4paper,leqno]{strayman}
2 \errorcontextlines=50
3 \let\numberwithin=\notdef
4 \usepackage{amsmath}
5 \usepackage{mathabx}
6 \usepackage{txfonts}
7 \usepackage{amsfonts}
8 \usepackage{mdwlist}
9 %\usepackage{accents}
10
11 \renewcommand{\ge}{\geqslant}
12 \renewcommand{\le}{\leqslant}
13 \newcommand{\nge}{\ngeqslant}
14 \newcommand{\nle}{\nleqslant}
15
16 \newcommand{\has}{\sqsupseteq}
17 \newcommand{\isin}{\sqsubseteq}
18
19 \newcommand{\nothaspatch}{\mathrel{\,\not\!\not\relax\haspatch}}
20 \newcommand{\notpatchisin}{\mathrel{\,\not\!\not\relax\patchisin}}
21 \newcommand{\haspatch}{\sqSupset}
22 \newcommand{\patchisin}{\sqSubset}
23
24         \newif\ifhidehack\hidehackfalse
25         \DeclareRobustCommand\hidefromedef[2]{%
26           \hidehacktrue\ifhidehack#1\else#2\fi\hidehackfalse}
27         \newcommand{\pa}[1]{\hidefromedef{\varmathbb{#1}}{#1}}
28
29 \newcommand{\set}[1]{\mathbb{#1}}
30 \newcommand{\pay}[1]{\pa{#1}^+}
31 \newcommand{\pan}[1]{\pa{#1}^-}
32
33 \newcommand{\p}{\pa{P}}
34 \newcommand{\py}{\pay{P}}
35 \newcommand{\pn}{\pan{P}}
36
37 \newcommand{\pr}{\pa{R}}
38 \newcommand{\pry}{\pay{R}}
39 \newcommand{\prn}{\pan{R}}
40
41 %\newcommand{\hasparents}{\underaccent{1}{>}}
42 %\newcommand{\hasparents}{{%
43 %  \declareslashed{}{_{_1}}{0}{-0.8}{>}\slashed{>}}}
44 \newcommand{\hasparents}{>_{\mkern-7.0mu _1}}
45 \newcommand{\areparents}{<_{\mkern-14.0mu _1\mkern+5.0mu}}
46
47 \renewcommand{\implies}{\Rightarrow}
48 \renewcommand{\equiv}{\Leftrightarrow}
49 \renewcommand{\nequiv}{\nLeftrightarrow}
50 \renewcommand{\land}{\wedge}
51 \renewcommand{\lor}{\vee}
52
53 \newcommand{\pancs}{{\mathcal A}}
54 \newcommand{\pends}{{\mathcal E}}
55
56 \newcommand{\pancsof}[2]{\pancs ( #1 , #2 ) }
57 \newcommand{\pendsof}[2]{\pends ( #1 , #2 ) }
58
59 \newcommand{\merge}{{\mathcal M}}
60 \newcommand{\mergeof}[4]{\merge(#1,#2,#3,#4)}
61 %\newcommand{\merge}[4]{{#2 {{\frac{ #1 }{ #3 } #4}}}}
62
63 \newcommand{\patch}{{\mathcal P}}
64 \newcommand{\base}{{\mathcal B}}
65
66 \newcommand{\patchof}[1]{\patch ( #1 ) }
67 \newcommand{\baseof}[1]{\base ( #1 ) }
68
69 \newcommand{\eqntag}[2]{ #2 \tag*{\mbox{#1}} }
70 \newcommand{\eqn}[2]{ #2 \tag*{\mbox{\bf #1}} }
71
72 %\newcommand{\bigforall}{\mathop{\hbox{\huge$\forall$}}}
73 \newcommand{\bigforall}{%
74   \mathop{\mathchoice%
75     {\hbox{\huge$\forall$}}%
76     {\hbox{\Large$\forall$}}%
77     {\hbox{\normalsize$\forall$}}%
78     {\hbox{\scriptsize$\forall$}}}%
79 }
80
81 \newcommand{\Largeexists}{\mathop{\hbox{\Large$\exists$}}}
82 \newcommand{\Largenexists}{\mathop{\hbox{\Large$\nexists$}}}
83
84 \newcommand{\qed}{\square}
85 \newcommand{\proofstarts}{{\it Proof:}}
86 \newcommand{\proof}[1]{\proofstarts #1 $\qed$}
87
88 \newcommand{\gathbegin}{\begin{gather} \tag*{}}
89 \newcommand{\gathnext}{\\ \tag*{}}
90
91 \newcommand{\true}{t}
92 \newcommand{\false}{f}
93
94 \begin{document}
95
96 \section{Notation}
97
98 \begin{basedescript}{
99 \desclabelwidth{5em}
100 \desclabelstyle{\nextlinelabel}
101 }
102 \item[ $ C \hasparents \set X $ ]
103 The parents of commit $C$ are exactly the set
104 $\set X$.
105
106 \item[ $ C \ge D $ ]
107 $C$ is a descendant of $D$ in the git commit
108 graph.  This is a partial order, namely the transitive closure of 
109 $ D \in \set X $ where $ C \hasparents \set X $.
110
111 \item[ $ C \has D $ ]
112 Informally, the tree at commit $C$ contains the change
113 made in commit $D$.  Does not take account of deliberate reversions by
114 the user or reversion, rebasing or rewinding in
115 non-Topbloke-controlled branches.  For merges and Topbloke-generated
116 anticommits or re-commits, the ``change made'' is only to be thought
117 of as any conflict resolution.  This is not a partial order because it
118 is not transitive.
119
120 \item[ $ \p, \py, \pn $ ]
121 A patch $\p$ consists of two sets of commits $\pn$ and $\py$, which
122 are respectively the base and tip git branches.  $\p$ may be used
123 where the context requires a set, in which case the statement
124 is to be taken as applying to both $\py$ and $\pn$.
125 None of these sets overlap.  Hence:
126
127 \item[ $ \patchof{ C } $ ]
128 Either $\p$ s.t. $ C \in \p $, or $\bot$.  
129 A function from commits to patches' sets $\p$.
130
131 \item[ $ \pancsof{C}{\set P} $ ]
132 $ \{ A \; | \; A \le C \land A \in \set P \} $ 
133 i.e. all the ancestors of $C$
134 which are in $\set P$.
135
136 \item[ $ \pendsof{C}{\set P} $ ]
137 $ \{ E \; | \; E \in \pancsof{C}{\set P}
138   \land \mathop{\not\exists}_{A \in \pancsof{C}{\set P}}
139   E \neq A \land E \le A \} $ 
140 i.e. all $\le$-maximal commits in $\pancsof{C}{\set P}$.
141
142 \item[ $ \baseof{C} $ ]
143 $ \pendsof{C}{\pn} = \{ \baseof{C} \} $ where $ C \in \py $.
144 A partial function from commits to commits.
145 See Unique Base, below.
146
147 \item[ $ C \haspatch \p $ ]
148 $\displaystyle \bigforall_{D \in \py} D \isin C \equiv D \le C $.
149 ~ Informally, $C$ has the contents of $\p$.
150
151 \item[ $ C \nothaspatch \p $ ]
152 $\displaystyle \bigforall_{D \in \py} D \not\isin C $.
153 ~ Informally, $C$ has none of the contents of $\p$.  
154
155 Non-Topbloke commits are $\nothaspatch \p$ for all $\p$.  This
156 includes commits on plain git branches made by applying a Topbloke
157 patch.  If a Topbloke
158 patch is applied to a non-Topbloke branch and then bubbles back to
159 the relevant Topbloke branches, we hope that 
160 if the user still cares about the Topbloke patch,
161 git's merge algorithm will DTRT when trying to re-apply the changes.
162
163 \item[ $\displaystyle \mergeof{C}{L}{M}{R} $ ]
164 The contents of a git merge result:
165
166 $\displaystyle D \isin C \equiv
167   \begin{cases}
168     (D \isin L \land D \isin R) \lor D = C : & \true \\
169     (D \not\isin L \land D \not\isin R) \land D \neq C : & \false \\
170     \text{otherwise} : & D \not\isin M
171   \end{cases}
172
173
174 \end{basedescript}
175 \newpage
176 \section{Invariants}
177
178 We maintain these each time we construct a new commit. \\
179 \[ \eqn{No Replay:}{
180   C \has D \implies C \ge D
181 }\]
182 \[\eqn{Unique Base:}{
183  \bigforall_{C \in \py} \pendsof{C}{\pn} = \{ B \}
184 }\]
185 \[\eqn{Tip Contents:}{
186   \bigforall_{C \in \py} D \isin C \equiv
187     { D \isin \baseof{C} \lor \atop
188       (D \in \py \land D \le C) }
189 }\]
190 \[\eqn{Base Acyclic:}{
191   \bigforall_{B \in \pn} D \isin B \implies D \notin \py
192 }\]
193 \[\eqn{Coherence:}{
194   \bigforall_{C,\p} C \haspatch \p \lor C \nothaspatch \p
195 }\]
196 \[\eqn{Foreign Inclusion:}{
197   \bigforall_{D \text{ s.t. } \patchof{D} = \bot} D \isin C \equiv D \leq C
198 }\]
199 \[\eqn{Foreign Contents:}{
200   \bigforall_{C \text{ s.t. } \patchof{C} = \bot}
201     D \le C \implies \patchof{D} = \bot
202 }\]
203
204 \section{Some lemmas}
205
206 \[ \eqn{Alternative (overlapping) formulations defining
207   $\mergeof{C}{L}{M}{R}$:}{
208  D \isin C \equiv
209   \begin{cases}
210     D \isin L  \equiv D \isin R  : & D = C \lor D \isin L     \\
211     D \isin L \nequiv D \isin R  : & D = C \lor D \not\isin M \\
212     D \isin L  \equiv D \isin M  : & D = C \lor D \isin R     \\
213     D \isin L \nequiv D \isin M  : & D = C \lor D \isin L     \\
214     \text{as above with L and R exchanged}
215   \end{cases}
216 }\]
217 \proof{
218   Truth table xxx
219
220   Original definition is symmetrical in $L$ and $R$.
221 }
222
223 \[ \eqn{Exclusive Tip Contents:}{
224   \bigforall_{C \in \py} 
225     \neg \Bigl[ D \isin \baseof{C} \land ( D \in \py \land D \le C )
226       \Bigr]
227 }\]
228 Ie, the two limbs of the RHS of Tip Contents are mutually exclusive.
229
230 \proof{
231 Let $B = \baseof{C}$ in $D \isin \baseof{C}$.  Now $B \in \pn$.
232 So by Base Acyclic $D \isin B \implies D \notin \py$.
233 }
234 \[ \eqntag{{\it Corollary - equivalent to Tip Contents}}{
235   \bigforall_{C \in \py} D \isin C \equiv
236   \begin{cases}
237     D \in \py : & D \le C \\
238     D \not\in \py : & D \isin \baseof{C}
239   \end{cases}
240 }\]
241
242 \[ \eqn{Tip Self Inpatch:}{
243   \bigforall_{C \in \py} C \haspatch \p
244 }\]
245 Ie, tip commits contain their own patch.
246
247 \proof{
248 Apply Exclusive Tip Contents to some $D \in \py$:
249 $ \bigforall_{C \in \py}\bigforall_{D \in \py}
250   D \isin C \equiv D \le C $
251 }
252
253 \[ \eqn{Exact Ancestors:}{
254   \bigforall_{ C \hasparents \set{R} }
255   D \le C \equiv
256     ( \mathop{\hbox{\huge{$\vee$}}}_{R \in \set R} D \le R )
257     \lor D = C
258 }\]
259 xxx proof tbd
260
261 \[ \eqn{Transitive Ancestors:}{
262   \left[ \bigforall_{ E \in \pendsof{C}{\set P} } E \le M \right] \equiv
263   \left[ \bigforall_{ A \in \pancsof{C}{\set P} } A \le M \right]
264 }\]
265
266 \proof{
267 The implication from right to left is trivial because
268 $ \pends() \subset \pancs() $.
269 For the implication from left to right: 
270 by the definition of $\mathcal E$,
271 for every such $A$, either $A \in \pends()$ which implies
272 $A \le M$ by the LHS directly,
273 or $\exists_{A' \in \pancs()} \; A' \neq A \land A \le A' $
274 in which case we repeat for $A'$.  Since there are finitely many
275 commits, this terminates with $A'' \in \pends()$, ie $A'' \le M$
276 by the LHS.  And $A \le A''$.
277 }
278
279 \[ \eqn{Calculation Of Ends:}{
280   \bigforall_{C \hasparents \set A}
281     \pendsof{C}{\set P} =
282       \begin{cases}
283        C \in \p : & \{ C \}
284       \\
285        C \not\in \p : & \displaystyle
286        \left\{ E \Big|
287            \Bigl[ \Largeexists_{A \in \set A} 
288                        E \in \pendsof{A}{\set P} \Bigr] \land
289            \Bigl[ \Largenexists_{B \in \set A} 
290                        E \neq B \land E \le B \Bigr]
291        \right\}
292       \end{cases}
293 }\]
294 xxx proof tbd
295
296 \[ \eqn{Ingredients Prevent Replay:}{
297   \left[
298     {C \hasparents \set A} \land
299    \\
300     \left(
301       D \isin C \implies
302        D = C \lor
303        \Largeexists_{A \in \set A} D \isin A
304     \right)
305   \right] \implies \left[
306     D \isin C \implies D \le C
307   \right]
308 }\]
309 \proof{
310   Trivial for $D = C$.  Consider some $D \neq C$, $D \isin C$.
311   By the preconditions, there is some $A$ s.t. $D \in \set A$
312   and $D \isin A$.  By No Replay for $A$, $D \le A$.  And
313   $A \le C$ so $D \le C$.
314 }
315
316 \[ \eqn{Totally Foreign Contents:}{
317   \bigforall_{C \hasparents \set A}
318    \left[
319     \patchof{C} = \bot \land
320       \bigforall_{A \in \set A} \patchof{A} = \bot
321    \right]
322   \implies
323    \left[
324     D \le C
325    \implies
326     \patchof{D} = \bot
327    \right]
328 }\]
329 \proof{
330 Consider some $D \le C$.  If $D = C$, $\patchof{D} = \bot$ trivially.
331 If $D \neq C$ then $D \le A$ where $A \in \set A$.  By Foreign
332 Contents of $A$, $\patchof{D} = \bot$.
333 }
334
335 \section{Commit annotation}
336
337 We annotate each Topbloke commit $C$ with:
338 \gathbegin
339  \patchof{C}
340 \gathnext
341  \baseof{C}, \text{ if } C \in \py
342 \gathnext
343  \bigforall_{\pa{Q}} 
344    \text{ either } C \haspatch \pa{Q} \text{ or } C \nothaspatch \pa{Q}
345 \gathnext
346  \bigforall_{\pay{Q} \not\ni C} \pendsof{C}{\pay{Q}}
347 \end{gather}
348
349 $\patchof{C}$, for each kind of Topbloke-generated commit, is stated
350 in the summary in the section for that kind of commit.
351
352 Whether $\baseof{C}$ is required, and if so what the value is, is
353 stated in the proof of Unique Base for each kind of commit.
354
355 $C \haspatch \pa{Q}$ or $\nothaspatch \pa{Q}$ is represented as the
356 set $\{ \pa{Q} | C \haspatch \pa{Q} \}$.  Whether $C \haspatch \pa{Q}$
357 is in stated
358 (in terms of $I \haspatch \pa{Q}$ or $I \nothaspatch \pa{Q}$
359 for the ingredients $I$),
360 in the proof of Coherence for each kind of commit.
361
362 $\pendsof{C}{\pa{Q}^+}$ is computed, for all Topbloke-generated commits,
363 using the lemma Calculation of Ends, above.
364 We do not annotate $\pendsof{C}{\py}$ for $C \in \py$.  Doing so would
365 make it wrong to make plain commits with git because the recorded $\pends$
366 would have to be updated.  The annotation is not needed in that case
367 because $\forall_{\py \ni C} \; \pendsof{C}{\py} = \{C\}$.
368
369 \section{Simple commit}
370
371 A simple single-parent forward commit $C$ as made by git-commit.
372 \begin{gather}
373 \tag*{} C \hasparents \{ A \} \\
374 \tag*{} \patchof{C} = \patchof{A} \\
375 \tag*{} D \isin C \equiv D \isin A \lor D = C
376 \end{gather}
377 This also covers Topbloke-generated commits on plain git branches:
378 Topbloke strips the metadata when exporting.
379
380 \subsection{No Replay}
381
382 Ingredients Prevent Replay applies.  $\qed$
383
384 \subsection{Unique Base}
385 If $A, C \in \py$ then by Calculation of Ends for
386 $C, \py, C \not\in \py$:
387 $\pendsof{C}{\pn} = \pendsof{A}{\pn}$ so
388 $\baseof{C} = \baseof{A}$. $\qed$
389
390 \subsection{Tip Contents}
391 We need to consider only $A, C \in \py$.  From Tip Contents for $A$:
392 \[ D \isin A \equiv D \isin \baseof{A} \lor ( D \in \py \land D \le A ) \]
393 Substitute into the contents of $C$:
394 \[ D \isin C \equiv D \isin \baseof{A} \lor ( D \in \py \land D \le A )
395     \lor D = C \]
396 Since $D = C \implies D \in \py$, 
397 and substituting in $\baseof{C}$, this gives:
398 \[ D \isin C \equiv D \isin \baseof{C} \lor
399     (D \in \py \land D \le A) \lor
400     (D = C \land D \in \py) \]
401 \[ \equiv D \isin \baseof{C} \lor
402    [ D \in \py \land ( D \le A \lor D = C ) ] \]
403 So by Exact Ancestors:
404 \[ D \isin C \equiv D \isin \baseof{C} \lor ( D \in \py \land D \le C
405 ) \]
406 $\qed$
407
408 \subsection{Base Acyclic}
409
410 Need to consider only $A, C \in \pn$.  
411
412 For $D = C$: $D \in \pn$ so $D \not\in \py$. OK.
413
414 For $D \neq C$: $D \isin C \equiv D \isin A$, so by Base Acyclic for
415 $A$, $D \isin C \implies D \not\in \py$.
416
417 $\qed$
418
419 \subsection{Coherence and patch inclusion}
420
421 Need to consider $D \in \py$
422
423 \subsubsection{For $A \haspatch P, D = C$:}
424
425 Ancestors of $C$:
426 $ D \le C $.
427
428 Contents of $C$:
429 $ D \isin C \equiv \ldots \lor \true \text{ so } D \haspatch C $.
430
431 \subsubsection{For $A \haspatch P, D \neq C$:}
432 Ancestors: $ D \le C \equiv D \le A $.
433
434 Contents: $ D \isin C \equiv D \isin A \lor f $
435 so $ D \isin C \equiv D \isin A $.
436
437 So:
438 \[ A \haspatch P \implies C \haspatch P \]
439
440 \subsubsection{For $A \nothaspatch P$:}
441
442 Firstly, $C \not\in \py$ since if it were, $A \in \py$.  
443 Thus $D \neq C$.
444
445 Now by contents of $A$, $D \notin A$, so $D \notin C$.
446
447 So:
448 \[ A \nothaspatch P \implies C \nothaspatch P \]
449 $\qed$
450
451 \subsection{Foreign inclusion:}
452
453 If $D = C$, trivial.  For $D \neq C$:
454 $D \isin C \equiv D \isin A \equiv D \le A \equiv D \le C$.  $\qed$
455
456 \subsection{Foreign Contents:}
457
458 Only relevant if $\patchof{C} = \bot$, and in that case Totally
459 Foreign Contents applies. $\qed$
460
461 \section{Create Base}
462
463 Given $L$, create a Topbloke base branch initial commit $B$.
464 \gathbegin
465  B \hasparents \{ L \}
466 \gathnext
467  \patchof{B} = \pan{Q}
468 \gathnext
469  D \isin B \equiv D \isin L \lor D = B
470 \end{gather}
471
472 \subsection{Conditions}
473
474 \[ \eqn{ Ingredients }{
475  \patchof{L} = \pa{L} \lor \patchof{L} = \bot
476 }\]
477 \[ \eqn{ Non-recursion }{
478  L \not\in \pa{Q}
479 }\]
480
481 \subsection{No Replay}
482
483 Ingredients Prevent Replay applies.  $\qed$
484
485 \subsection{Unique Base}
486
487 Not applicable.
488
489 \subsection{Tip Contents}
490
491 Not applicable.
492
493 \subsection{Base Acyclic}
494
495 Consider some $D \isin B$.  If $D = B$, $D \in \pn$, OK.
496
497 If $D \neq B$, $D \isin L$.  By No Replay of $D$ in $L$, $D \le L$.
498 Thus by Foreign Contents of $L$, $\patchof{D} = \bot$.  OK.
499
500 xxx this is wrong
501
502 $\qed$
503
504 \subsection{Coherence and Patch Inclusion}
505
506 Consider some $D \in \p$.
507 $B \not\in \py$ so $D \neq B$.  So $D \isin B \equiv D \isin L$.
508
509 Thus $L \haspatch \p \implies B \haspatch P$
510 and $L \nothaspatch \p \implies B \nothaspatch P$.
511
512 $\qed$.
513
514 \subsection{Foreign Inclusion}
515
516 Consider some $D$ s.t. $\patchof{D} = \bot$.  $D \neq B$
517 so $D \isin B \equiv D \isin L$.
518 By Foreign Inclusion of $D$ in $L$, $D \isin L \equiv D \le L$.
519 And by Exact Ancestors $D \le L \equiv D \le B$.
520 So $D \isin B \equiv D \le B$.  $\qed$
521
522 \subsection{Foreign Contents}
523
524 Not applicable.
525
526 \section{Create Tip}
527
528 xxx tbd
529
530 \section{Anticommit}
531
532 Given $L$ and $\pr$ as represented by $R^+, R^-$.
533 Construct $C$ which has $\pr$ removed.
534 Used for removing a branch dependency.
535 \gathbegin
536  C \hasparents \{ L \}
537 \gathnext
538  \patchof{C} = \patchof{L}
539 \gathnext
540  \mergeof{C}{L}{R^+}{R^-}
541 \end{gather}
542
543 \subsection{Conditions}
544
545 \[ \eqn{ Ingredients }{
546 R^+ \in \pry \land R^- = \baseof{R^+}
547 }\]
548 \[ \eqn{ Into Base }{
549  L \in \pn
550 }\]
551 \[ \eqn{ Unique Tip }{
552  \pendsof{L}{\pry} = \{ R^+ \}
553 }\]
554 \[ \eqn{ Currently Included }{
555  L \haspatch \pry
556 }\]
557
558 \subsection{Ordering of Ingredients:}
559
560 By Unique Tip, $R^+ \le L$.  By definition of $\base$, $R^- \le R^+$
561 so $R^- \le L$.  So $R^+ \le C$ and $R^- \le C$.
562 $\qed$
563
564 (Note that $R^+ \not\le R^-$, i.e. the merge base
565 is a descendant, not an ancestor, of the 2nd parent.)
566
567 \subsection{No Replay}
568
569 By definition of $\merge$,
570 $D \isin C \implies D \isin L \lor D \isin R^- \lor D = C$.
571 So, by Ordering of Ingredients,
572 Ingredients Prevent Replay applies.  $\qed$
573
574 \subsection{Desired Contents}
575
576 \[ D \isin C \equiv [ D \notin \pry \land D \isin L ] \lor D = C \]
577 \proofstarts
578
579 \subsubsection{For $D = C$:}
580
581 Trivially $D \isin C$.  OK.
582
583 \subsubsection{For $D \neq C, D \not\le L$:}
584
585 By No Replay $D \not\isin L$.  Also $D \not\le R^-$ hence
586 $D \not\isin R^-$.  Thus $D \not\isin C$.  OK.
587
588 \subsubsection{For $D \neq C, D \le L, D \in \pry$:}
589
590 By Currently Included, $D \isin L$.
591
592 By Tip Self Inpatch, $D \isin R^+ \equiv D \le R^+$, but by
593 by Unique Tip, $D \le R^+ \equiv D \le L$.  
594 So $D \isin R^+$.
595
596 By Base Acyclic, $D \not\isin R^-$.
597
598 Apply $\merge$: $D \not\isin C$.  OK.
599
600 \subsubsection{For $D \neq C, D \le L, D \notin \pry$:}
601
602 By Tip Contents for $R^+$, $D \isin R^+ \equiv D \isin R^-$.
603
604 Apply $\merge$: $D \isin C \equiv D \isin L$.  OK.
605
606 $\qed$
607
608 \subsection{Unique Base}
609
610 Into Base means that $C \in \pn$, so Unique Base is not
611 applicable. $\qed$
612
613 \subsection{Tip Contents}
614
615 Again, not applicable. $\qed$
616
617 \subsection{Base Acyclic}
618
619 By Base Acyclic for $L$, $D \isin L \implies D \not\in \py$.
620 And by Into Base $C \not\in \py$.
621 Now from Desired Contents, above, $D \isin C
622 \implies D \isin L \lor D = C$, which thus
623 $\implies D \not\in \py$.  $\qed$.
624
625 \subsection{Coherence and Patch Inclusion}
626
627 Need to consider some $D \in \py$.  By Into Base, $D \neq C$.
628
629 \subsubsection{For $\p = \pr$:}
630 By Desired Contents, above, $D \not\isin C$.
631 So $C \nothaspatch \pr$.
632
633 \subsubsection{For $\p \neq \pr$:}
634 By Desired Contents, $D \isin C \equiv D \isin L$
635 (since $D \in \py$ so $D \not\in \pry$).
636
637 If $L \nothaspatch \p$, $D \not\isin L$ so $D \not\isin C$.
638 So $L \nothaspatch \p \implies C \nothaspatch \p$.
639
640 Whereas if $L \haspatch \p$, $D \isin L \equiv D \le L$.
641 so $L \haspatch \p \implies C \haspatch \p$.
642
643 $\qed$
644
645 \subsection{Foreign Inclusion}
646
647 Consider some $D$ s.t. $\patchof{D} = \bot$.  $D \neq C$.
648 So by Desired Contents $D \isin C \equiv D \isin L$.
649 By Foreign Inclusion of $D$ in $L$, $D \isin L \equiv D \le L$.
650
651 And $D \le C \equiv D \le L$.
652 Thus $D \isin C \equiv D \le C$.
653
654 $\qed$
655
656 \subsection{Foreign Contents}
657
658 Not applicable.
659
660 \section{Merge}
661
662 Merge commits $L$ and $R$ using merge base $M$:
663 \gathbegin
664  C \hasparents \{ L, R \}
665 \gathnext
666  \patchof{C} = \patchof{L}
667 \gathnext
668  \mergeof{C}{L}{M}{R}
669 \end{gather}
670 We will occasionally use $X,Y$ s.t. $\{X,Y\} = \{L,R\}$.
671
672 \subsection{Conditions}
673 \[ \eqn{ Ingredients }{
674  M \le L, M \le R
675 }\]
676 \[ \eqn{ Tip Merge }{
677  L \in \py \implies
678    \begin{cases}
679       R \in \py : & \baseof{R} \ge \baseof{L}
680               \land [\baseof{L} = M \lor \baseof{L} = \baseof{M}] \\
681       R \in \pn : & M = \baseof{L} \\
682       \text{otherwise} : & \false
683    \end{cases}
684 }\]
685 \[ \eqn{ Merge Acyclic }{
686     L \in \pn
687    \implies
688     R \nothaspatch \p
689 }\]
690 \[ \eqn{ Removal Merge Ends }{
691     X \not\haspatch \p \land
692     Y \haspatch \p \land
693     M \haspatch \p
694   \implies
695     \pendsof{Y}{\py} = \pendsof{M}{\py}
696 }\]
697 \[ \eqn{ Addition Merge Ends }{
698     X \not\haspatch \p \land
699     Y \haspatch \p \land
700     M \nothaspatch \p
701    \implies \left[
702     \bigforall_{E \in \pendsof{X}{\py}} E \le Y
703    \right]
704 }\]
705 \[ \eqn{ Foreign Merges }{
706     \patchof{L} = \bot \equiv \patchof{R} = \bot
707 }\]
708
709 \subsection{Non-Topbloke merges}
710
711 We require both $\patchof{L} = \bot$ and $\patchof{R} = \bot$
712 (Foreign Merges, above).
713 I.e. not only is it forbidden to merge into a Topbloke-controlled
714 branch without Topbloke's assistance, it is also forbidden to
715 merge any Topbloke-controlled branch into any plain git branch.
716
717 Given those conditions, Tip Merge and Merge Acyclic do not apply.
718 And $Y \not\in \py$ so $\neg [ Y \haspatch \p ]$ so neither
719 Merge Ends condition applies.
720
721 So a plain git merge of non-Topbloke branches meets the conditions and
722 is therefore consistent with our scheme.
723
724 \subsection{No Replay}
725
726 By definition of $\merge$,
727 $D \isin C \implies D \isin L \lor D \isin R \lor D = C$.
728 So, by Ingredients,
729 Ingredients Prevent Replay applies.  $\qed$
730
731 \subsection{Unique Base}
732
733 Need to consider only $C \in \py$, ie $L \in \py$,
734 and calculate $\pendsof{C}{\pn}$.  So we will consider some
735 putative ancestor $A \in \pn$ and see whether $A \le C$.
736
737 By Exact Ancestors for C, $A \le C \equiv A \le L \lor A \le R \lor A = C$.
738 But $C \in py$ and $A \in \pn$ so $A \neq C$.  
739 Thus $A \le C \equiv A \le L \lor A \le R$.
740
741 By Unique Base of L and Transitive Ancestors,
742 $A \le L \equiv A \le \baseof{L}$.
743
744 \subsubsection{For $R \in \py$:}
745
746 By Unique Base of $R$ and Transitive Ancestors,
747 $A \le R \equiv A \le \baseof{R}$.
748
749 But by Tip Merge condition on $\baseof{R}$,
750 $A \le \baseof{L} \implies A \le \baseof{R}$, so
751 $A \le \baseof{R} \lor A \le \baseof{L} \equiv A \le \baseof{R}$.
752 Thus $A \le C \equiv A \le \baseof{R}$.  
753 That is, $\baseof{C} = \baseof{R}$.
754
755 \subsubsection{For $R \in \pn$:}
756
757 By Tip Merge condition on $R$ and since $M \le R$,
758 $A \le \baseof{L} \implies A \le R$, so
759 $A \le R \lor A \le \baseof{L} \equiv A \le R$.  
760 Thus $A \le C \equiv A \le R$.  
761 That is, $\baseof{C} = R$.
762
763 $\qed$
764
765 \subsection{Coherence and Patch Inclusion}
766
767 Need to determine $C \haspatch \p$ based on $L,M,R \haspatch \p$.
768 This involves considering $D \in \py$.  
769
770 \subsubsection{For $L \nothaspatch \p, R \nothaspatch \p$:}
771 $D \not\isin L \land D \not\isin R$.  $C \not\in \py$ (otherwise $L
772 \in \py$ ie $L \haspatch \p$ by Tip Self Inpatch).  So $D \neq C$.
773 Applying $\merge$ gives $D \not\isin C$ i.e. $C \nothaspatch \p$.
774
775 \subsubsection{For $L \haspatch \p, R \haspatch \p$:}
776 $D \isin L \equiv D \le L$ and $D \isin R \equiv D \le R$.
777 (Likewise $D \isin X \equiv D \le X$ and $D \isin Y \equiv D \le Y$.)
778
779 Consider $D = C$: $D \isin C$, $D \le C$, OK for $C \haspatch \p$.
780
781 For $D \neq C$: $D \le C \equiv D \le L \lor D \le R
782  \equiv D \isin L \lor D \isin R$.  
783 (Likewise $D \le C \equiv D \le X \lor D \le Y$.)
784
785 Consider $D \neq C, D \isin X \land D \isin Y$:
786 By $\merge$, $D \isin C$.  Also $D \le X$ 
787 so $D \le C$.  OK for $C \haspatch \p$.
788
789 Consider $D \neq C, D \not\isin X \land D \not\isin Y$:
790 By $\merge$, $D \not\isin C$.  
791 And $D \not\le X \land D \not\le Y$ so $D \not\le C$.  
792 OK for $C \haspatch \p$.
793
794 Remaining case, wlog, is $D \not\isin X \land D \isin Y$.
795 $D \not\le X$ so $D \not\le M$ so $D \not\isin M$.  
796 Thus by $\merge$, $D \isin C$.  And $D \le Y$ so $D \le C$.
797 OK for $C \haspatch \p$.
798
799 So indeed $L \haspatch \p \land R \haspatch \p \implies C \haspatch \p$.
800
801 \subsubsection{For (wlog) $X \not\haspatch \p, Y \haspatch \p$:}
802
803 $M \haspatch \p \implies C \nothaspatch \p$.
804 $M \nothaspatch \p \implies C \haspatch \p$.
805
806 \proofstarts
807
808 One of the Merge Ends conditions applies.  
809 Recall that we are considering $D \in \py$.
810 $D \isin Y \equiv D \le Y$.  $D \not\isin X$.
811 We will show for each of
812 various cases that $D \isin C \equiv M \nothaspatch \p \land D \le C$
813 (which suffices by definition of $\haspatch$ and $\nothaspatch$).
814
815 Consider $D = C$:  Thus $C \in \py, L \in \py$, and by Tip
816 Self Inpatch $L \haspatch \p$, so $L=Y, R=X$.  By Tip Merge,
817 $M=\baseof{L}$.  So by Base Acyclic $D \not\isin M$, i.e.
818 $M \nothaspatch \p$.  And indeed $D \isin C$ and $D \le C$.  OK.
819
820 Consider $D \neq C, M \nothaspatch P, D \isin Y$:
821 $D \le Y$ so $D \le C$.  
822 $D \not\isin M$ so by $\merge$, $D \isin C$.  OK.
823
824 Consider $D \neq C, M \nothaspatch P, D \not\isin Y$:
825 $D \not\le Y$.  If $D \le X$ then
826 $D \in \pancsof{X}{\py}$, so by Addition Merge Ends and 
827 Transitive Ancestors $D \le Y$ --- a contradiction, so $D \not\le X$.
828 Thus $D \not\le C$.  By $\merge$, $D \not\isin C$.  OK.
829
830 Consider $D \neq C, M \haspatch P, D \isin Y$:
831 $D \le Y$ so $D \in \pancsof{Y}{\py}$ so by Removal Merge Ends
832 and Transitive Ancestors $D \in \pancsof{M}{\py}$ so $D \le M$.
833 Thus $D \isin M$.  By $\merge$, $D \not\isin C$.  OK.
834
835 Consider $D \neq C, M \haspatch P, D \not\isin Y$:
836 By $\merge$, $D \not\isin C$.  OK.
837
838 $\qed$
839
840 \subsection{Base Acyclic}
841
842 This applies when $C \in \pn$.
843 $C \in \pn$ when $L \in \pn$ so by Merge Acyclic, $R \nothaspatch \p$.
844
845 Consider some $D \in \py$.
846
847 By Base Acyclic of $L$, $D \not\isin L$.  By the above, $D \not\isin
848 R$.  And $D \neq C$.  So $D \not\isin C$.
849
850 $\qed$
851
852 \subsection{Tip Contents}
853
854 We need worry only about $C \in \py$.  
855 And $\patchof{C} = \patchof{L}$
856 so $L \in \py$ so $L \haspatch \p$.  We will use the Unique Base
857 of $C$, and its Coherence and Patch Inclusion, as just proved.
858
859 Firstly we show $C \haspatch \p$: If $R \in \py$, then $R \haspatch
860 \p$ and by Coherence/Inclusion $C \haspatch \p$ .  If $R \not\in \py$
861 then by Tip Merge $M = \baseof{L}$ so by Base Acyclic and definition
862 of $\nothaspatch$, $M \nothaspatch \p$.  So by Coherence/Inclusion $C
863 \haspatch \p$ (whether $R \haspatch \p$ or $\nothaspatch$).
864
865 We will consider an arbitrary commit $D$
866 and prove the Exclusive Tip Contents form.
867
868 \subsubsection{For $D \in \py$:}
869 $C \haspatch \p$ so by definition of $\haspatch$, $D \isin C \equiv D
870 \le C$.  OK.
871
872 \subsubsection{For $D \not\in \py, R \not\in \py$:}
873
874 $D \neq C$.  By Tip Contents of $L$,
875 $D \isin L \equiv D \isin \baseof{L}$, and by Tip Merge condition,
876 $D \isin L \equiv D \isin M$.  So by definition of $\merge$, $D \isin
877 C \equiv D \isin R$.  And $R = \baseof{C}$ by Unique Base of $C$.
878 Thus $D \isin C \equiv D \isin \baseof{C}$.  OK.
879
880 \subsubsection{For $D \not\in \py, R \in \py$:}
881
882 $D \neq C$.
883
884 By Tip Contents
885 $D \isin L \equiv D \isin \baseof{L}$ and
886 $D \isin R \equiv D \isin \baseof{R}$.
887
888 If $\baseof{L} = M$, trivially $D \isin M \equiv D \isin \baseof{L}.$
889 Whereas if $\baseof{L} = \baseof{M}$, by definition of $\base$,
890 $\patchof{M} = \patchof{L} = \py$, so by Tip Contents of $M$,
891 $D \isin M \equiv D \isin \baseof{M} \equiv D \isin \baseof{L}$.
892
893 So $D \isin M \equiv D \isin L$ and by $\merge$,
894 $D \isin C \equiv D \isin R$.  But from Unique Base,
895 $\baseof{C} = R$ so $D \isin C \equiv D \isin \baseof{C}$.  OK.
896
897 $\qed$
898
899 \subsection{Foreign Inclusion}
900
901 Consider some $D$ s.t. $\patchof{D} = \bot$.
902 By Foreign Inclusion of $L, M, R$:
903 $D \isin L \equiv D \le L$;
904 $D \isin M \equiv D \le M$;
905 $D \isin R \equiv D \le R$.
906
907 \subsubsection{For $D = C$:}
908
909 $D \isin C$ and $D \le C$.  OK.
910
911 \subsubsection{For $D \neq C, D \isin M$:}
912
913 Thus $D \le M$ so $D \le L$ and $D \le R$ so $D \isin L$ and $D \isin
914 R$.  So by $\merge$, $D \isin C$.  And $D \le C$.  OK.
915
916 \subsubsection{For $D \neq C, D \not\isin M, D \isin X$:}
917
918 By $\merge$, $D \isin C$.
919 And $D \isin X$ means $D \le X$ so $D \le C$.
920 OK.
921
922 \subsubsection{For $D \neq C, D \not\isin M, D \not\isin L, D \not\isin R$:}
923
924 By $\merge$, $D \not\isin C$.
925 And $D \not\le L, D \not\le R$ so $D \not\le C$.
926 OK
927
928 $\qed$
929
930 \subsection{Foreign Contents}
931
932 Only relevant if $\patchof{L} = \bot$, in which case
933 $\patchof{C} = \bot$ and by Foreign Merges $\patchof{R} = \bot$,
934 so Totally Foreign Contents applies.  $\qed$
935
936 \end{document}