X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke.git;a=blobdiff_plain;f=DESIGN;h=44650578a3d5473243481e8022e6ce395453f25e;hp=0d5215ff78431c0cc0a1b9b69000e6785ece8396;hb=c98691988623c62686b36ad0c42d4a958a306a5d;hpb=3e8d721402b8e907a2658ef86ce9c05756f85c56 diff --git a/DESIGN b/DESIGN index 0d5215f..4465057 100644 --- a/DESIGN +++ b/DESIGN @@ -22,7 +22,7 @@ Basic update algorithm: 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 @@ -40,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 @@ -109,29 +112,8 @@ 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: - - This is tracked explicitly in .topbloke/included, one branch per - line. For compatibility with older versions, every time we think - about a base, branch or source above, we check whether - .topbloke/included is present. - If it isn't then we calculate a child commit which has a - .topbloke/included. In the case of a remote branch or base, we - substitute this child commit for the relevant remote ref but do - not record it in the remote ref; in the case of a local branch or - base, we advance the local branch or base accordingly. - - When .topbloke/included is calculated in this way, it always gets - the list of desired included deps. (topgit, - which does not support dependency deletion, always has exactly the - desired deps actually included.) - - Foreign branches cannot be removed from included and cannot - therefore be removed from dependency lists. +"Recency" refers to the order from git-rev-list --date-order. Patch removal: @@ -222,7 +204,7 @@ 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. @@ -242,3 +224,99 @@ Strategies for each metadata file merge: +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.. + + + + OUR BASE SOURCE OUR IT TIP + | | | + | | | + ADD DEP WH/ inc rm | + NEEDS IT /| /\ | + / | rm \ | + / | ______________'/ \ | + inc |' / \ | IT tip + / inc REMOVAL rm \ | elsewhere + / | / \ | | | + / | inc \ | | | + some IT | / | | | | + | inc | | | | + / | | | | | + / inc | | | | + | / | | | | | + / / inc | | | | + / | | `------------ | ----<-------- | -.| | + / inc inc | | *2 | + | |`- | ------------- | ----<--------.| | | + | `---inc | 1* / | + | | | | / | + | RE-INCLUDE inc rm REMOVAL |' | + inc \ | | | | + | * REMOVAL rm | | | + | | / | | + |`-------------- | ----------. / | | + | | inc ANC2 | | + inc inc / | | + |`.____________ | / | | + | `inc ANC1 / | | + | | /`--------<----------- | ---. | + without inc / | \/ + | | / | / + \ RE-INCLUDE inc / | / + \ \ | / | / + \ * REMOVAL rm / | / + \ | / | / + \ inc FIRST ADD DEP |/ + \ | \ *3 + \ | `------------<-------------.| + \ | | + \ without | + \_____ | | + `without | + | | + IT + + + Merge 1* and 2*, diff against some relevant base branch commit + or something, and apply to proposed. ??? + + +After we are done: + source tip is included in our base + +Each time: + * pick common ancestor + * compute whether merge from common anc would unwantedly remove + * if so we arrange that the common anc is a "rm" but our branch + actually contains IT