1 % Copyright (C) 2002-2003 David Roundy 2 % 3 % This program is free software; you can redistribute it and/or modify 4 % it under the terms of the GNU General Public License as published by 5 % the Free Software Foundation; either version 2, or (at your option) 6 % any later version. 7 % 8 % This program is distributed in the hope that it will be useful, 9 % but WITHOUT ANY WARRANTY; without even the implied warranty of 10 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 % GNU General Public License for more details. 12 % 13 % You should have received a copy of the GNU General Public License 14 % along with this program; see the file COPYING. If not, write to 15 % the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 16 % Boston, MA 02110-1301, USA. 17 18 \chapter{Theory of patches} 19 \label{Patch} 20 21 \newtheorem{thm}{Theorem} 22 \newtheorem{dfn}{Definition} 23 24 \section{Background} 25 26 I think a little background on the author is in order. I am a physicist, 27 and think like a physicist. The proofs and theorems given here are what I 28 would call ``physicist'' proofs and theorems, which is to say that while 29 the proofs may not be rigorous, they are practical, and the theorems are 30 intended to give physical insight. It would be great to have a 31 mathematician work on this to give patch theory better formalized 32 foundations. 33 34 From the beginning of this theory, which originated as the result of a 35 series of email discussions with Tom Lord, I have looked at patches as 36 being analogous to the operators of quantum mechanics. I include in this 37 appendix footnotes explaining the theory of patches in terms of the theory 38 of quantum mechanics. I advise against taking this analogy too seriously, 39 although it could provide some insight into how a physicist might think 40 about darcs. 41 42 \begin{code} 43 {-# OPTIONS_GHC -cpp -fno-warn-orphans #-} 44 #include "gadts.h" 45 module Darcs.Patch ( RepoPatch, Prim, Patch, RealPatch, Named, Patchy, 46 flattenFL, joinPatches, 47 fromPrim, fromPrims, 48 is_null_patch, nullP, 49 rmfile, addfile, rmdir, adddir, move, 50 hunk, tokreplace, namepatch, anonymous, 51 binary, 52 description, 53 showContextPatch, showPatch, showNicely, 54 infopatch, changepref, 55 thing, things, 56 is_similar, is_addfile, is_hunk, is_setpref, 57 #ifndef GADT_WITNESSES 58 merger, is_merger, merge, 59 commute, commutex, list_touched_files, 60 -- for PatchTest 61 unravel, elegant_merge, 62 #else 63 Commute(..), 64 #endif 65 resolve_conflicts, 66 Effect, effect, 67 is_binary, gzWritePatch, writePatch, is_adddir, 68 invert, invertFL, invertRL, identity, 69 commuteFL, commuteRL, 70 readPatch, 71 canonize, sort_coalesceFL, 72 try_to_shrink, 73 apply_to_slurpy, patchname, patchcontents, 74 apply_to_filepaths, force_replace_slurpy, apply, 75 patch2patchinfo, 76 LineMark(AddedLine, RemovedLine, AddedRemovedLine, None), 77 MarkedUpFile, markup_file, empty_markedup_file, 78 summary, summarize, xml_summary, 79 adddeps, getdeps, 80 list_conflicted_files, 81 modernize_patch, 82 -- for Population 83 DirMark(..), patchChanges, applyToPop, 84 ) where 85 import Darcs.PopulationData ( DirMark(..) ) 86 import Darcs.Patch.Core ( Patch, Named, 87 flattenFL, 88 adddeps, namepatch, 89 anonymous, 90 #ifndef GADT_WITNESSES 91 is_merger, 92 #endif 93 getdeps, 94 is_null_patch, nullP, infopatch, 95 patch2patchinfo, patchname, patchcontents ) 96 import Darcs.Patch.Read ( readPatch ) 97 import Darcs.Patch.Patchy ( Patchy, writePatch, gzWritePatch, 98 showPatch, showNicely, showContextPatch, 99 invert, invertRL, invertFL, identity, 100 thing, things, 101 commuteFL, commuteRL, apply, 102 description, summary, 103 #ifndef GADT_WITNESSES 104 commute, commutex, list_touched_files, 105 #else 106 Commute(..) 107 #endif 108 ) 109 import Darcs.Patch.Viewing ( xml_summary, summarize ) 110 import Darcs.Patch.Apply ( applyToPop, patchChanges, empty_markedup_file, 111 markup_file, force_replace_slurpy, 112 apply_to_filepaths, apply_to_slurpy, 113 LineMark(..), MarkedUpFile ) 114 import Darcs.Patch.Commute ( modernize_patch, 115 #ifndef GADT_WITNESSES 116 unravel, 117 merger, merge, elegant_merge, 118 #endif 119 ) 120 import Darcs.Patch.Prim ( FromPrims, fromPrims, joinPatches, FromPrim, fromPrim, 121 Conflict, Effect(effect), list_conflicted_files, resolve_conflicts, 122 Prim, canonize, 123 sort_coalesceFL, 124 rmdir, rmfile, tokreplace, adddir, addfile, 125 binary, changepref, hunk, move, 126 is_adddir, is_addfile, 127 is_hunk, is_binary, is_setpref, 128 is_similar, 129 try_to_shrink ) 130 import Darcs.Ordered ( FL ) 131 import Darcs.Patch.Real ( RealPatch ) 132 133 instance Patchy Patch 134 instance (Conflict p, Effect p, Patchy p) => Patchy (Named p) 135 136 class (Patchy p, Effect p, FromPrim p, Conflict p) => RepoPatchBase p 137 instance RepoPatchBase Patch 138 instance RepoPatchBase RealPatch 139 140 class (Patchy p, Effect p, FromPrims p, Conflict p) => RepoPatch p 141 instance RepoPatch Patch 142 instance RepoPatchBase p => RepoPatch (FL p) 143 144 \end{code} 145 146 \input{Darcs/Patch/Apply.lhs} 147 \input{Darcs/Patch/Core.lhs} 148 \input{Darcs/Patch/Prim.lhs} 149 \input{Darcs/Patch/Commute.lhs} 150 \input{Darcs/Patch/Show.lhs} 151