X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke.git;a=blobdiff_plain;f=DESIGN;h=1569517b0634542925d0ed6b76b05529099e4761;hp=036cbec757ab4ee966798c1fd2ffb9cc36b001fc;hb=ed5261298c2cc3e7488e8b85946cdc9d5fd46794;hpb=4a54766a2027a9c9bdeacc84e1a645a4ad60b571;ds=sidebyside diff --git a/DESIGN b/DESIGN index 036cbec..1569517 100644 --- a/DESIGN +++ b/DESIGN @@ -17,11 +17,12 @@ Basic update algorithm: ii. For each source in the best order, do the following merge: (Our base has sources: - the branch for each direct dep - - the remote base) + - the remote base + - the topgit base, if this is a topgit import) Find the (latest) common ancestor. - Check for unwanted dependency removals. + Check for unwanted dependency removals. An unwanted dependency removal is A branch in the desired included deps Which exists in the common ancestor's actual included deps @@ -39,6 +40,9 @@ Basic update algorithm: stops us looking into the hitory of non-topbloke-controlled branches). This can be done with git-rev-list --remove-empty. + * It also stops at any point where we meet a commit which + does have the dep in the actual included deps. We have + to do this by hand. * The the relevant unwanted removal commit for that dep is the most recent unwanted removal commit, as defined. Select the unwantedly removed dep whose relevant unwanted @@ -61,6 +65,10 @@ Basic update algorithm: from the source. iii. + Check whether our list of dependencies has changed. If so + we need to restart the whole base update. + + iv. Check for missing or unwanted dependency inclusions. Compare our base's desired included deps with our base's actual included deps. In exceptional conditions, they will not @@ -86,12 +94,14 @@ Basic update algorithm: * Attempt to apply the appropriate diff to add (resp. remove) the contents of the relevant patch (adjusted appropriately for metadata, XXX??? particularly the actual inclusion list) + XXX if we want to add a dep we need to update the dep first * Go round again looking for another discrepancy. 3. Update our branch. Our branch has sources: - our base - the remote for our branch + - the topgit branch, if this is a topgit import For each source in the best order, do the merge. Double-check the actual dependency inclusions. In @@ -102,7 +112,7 @@ Basic update algorithm: The "best order" for merges is in order of recency of common ancestor, most recent first, and if that does not distinguish, merging from local branches first. - + "Recency" refers to the order from git-rev-list --date-order. Actual included deps: @@ -215,8 +225,96 @@ OK so here is a plan: Check for merge success in the index and compare to exit status from git-merge (which is 1 if the merge failed). Adjust the metadata. - Print appropriate big fat warnings if we have merge conflicts in our + Print appropriate big fat warnings if we have merge conflicts in our metadata. Commit, adjusting the parents of the new commit to the original parents if we made the merge with special massaged parents. We may still need to have custom merge drivers for metadata. + + +Strategies for each metadata file merge: + + in base/tip same patch & branch dep -> base base -> tip + + msg T textual merge rm from src not in src + deps B list merge rm from src rm from src + deleted T std existence merge rm from src not in src + patch- BT must be same rm from src must be same + topgit- B std exist/text merge rm from src rm from src + [^+]*- ?? textual merge rm from src rm from src + +included BT list merge rm from non-tb src list merge + +*- ?? textual merge rm from non-tb src textual merge + *[^-] ?? die, aborting all ops, if found in any tb src or branch + + + + + +Unwanted removal search subgraphs: + + rm relevant removal + inc + + rm impossible to undo removal, arrgh, terminates search +inc inc.. +/ ??? \ + + rm +inc.. rm.. merge of a removal, search down the rm path +/ [inc] \ + + inc ??? call it an inclusion, terminate the search + rm + + inc merge of an inclusion, terminates search +inc.. rm.. +/ [rm] \ + + inc ??? call it an inclusion, terminate search +rm.. rm.. +/ ??? \ + + + rm inc inc rm irrelevant + rm inc inc inc.. rm rm.. + + + + proposed (elsewhere) + / \ | | + / \ | | + / | | | + REMOVAL rm | | | + | | | | + inc | | | + / | | | | + / inc | | | + | | `------------ | ----<-------- | -.| + inc inc | | *2 + |`- | ------------- | ----<--------.| | + `---inc | 1* / + | | | / + RE-INCLUDE inc rm REMOVAL |' + \ | / | + * REMOVAL rm / | + | inc | + inc / | + | / | + inc / | + | /`--------<-----------.| + inc / | + | / | + RE-INCLUDE inc / | + \ | / | + * REMOVAL rm / | + | / | + inc | + \ | + `------------<-------------.| + | + | + IT + + + Merge 1* and 2*, diff against some relevant base branch commit + or something, and apply to proposed.