There are two naming models that have emerged: * static - a branch name given at the time a cset is created. * dynamic - a floating tag naming the current tip of something. For discussion on a type of dynamic naming, see Notes/EVENT-STACK Naming revisions with new static branching model. ('I' == Wayne) The idea here is that every repository as has a symbolic branch name that is used to label all csets created in that repository. These names are attached to the cset and propagate, and are static. The current proposal is that the base name of the current repository becomes this branch name. The name will be stored in R0() part of the revision that currently contains the '1', as in 1.2.3.4. This will be compatible with older repositories because '1' will be considered the branch name and it is still a valid format. The above implies that if I intentionally force every repository to use '1' as the branch name it should have the same revision naming scheme as BK does now. Previously Rick has proposed that I use a revision name of NAME.<serial> where all csets with the same branch name or just numbered serially in time order. I am not sure this really works in a repository containing a mix of csets from multiple places. 1.0 --dev.1 -- dev.2 ----dev.3 --------------------------- dev-merge.1 -- dev.5 \ \------ dev.2.1.1 -- mydev.1 -- dev.4 -/ / \ 1.1 --- 1.2 ------ 1.3-------------------- 1.4 ------------------/ \ --------1.2.1.1 --------------/ Rule: version 1: any time your parent has a different branch name then the rev is BANME.N+1 were N is the last R1 used for this branch. version 2: if R0(parent) != R0: if R0(merge) == R0: increment R0(merge) rev else: BNAME.N+1 Kinda thinking #1 above is fine Rick didn't like this version because the 'dev' tree can have a non-trunk tip which is not bk-like. Yeah, version 2 can do that. #1 seems okay. I think it will be okay. I altered the example to show dev.4 on the branch, as that's what I understand a gap would do in numbering. [rick]Consistent with my view as well. There's some checks in slib that may fail, as far as seeing that numbering has some properties. I remembering fiddling to use merge and parent bookkeep what was local in a merge, and have renumber work topologically, and a bunch of checks got uppity. I can possibly have a hybrid solution where the '1' branch has one numbering scheme and other named branches has the simpler version. BTW in the ASCII sfile and the bk patch format the branch name is saved because the string 'dev.3' is the actual revision name in the file. (which of course enables an incompatible feature bit) [rick] renumber can be extended to work on many branches at the same time with two additions. One is a hash which tracks root node numbering. When a branch is hit, if no hash, then it is the first root. That hash has a val which is a struct of ser_t of the first node and u32 of the current R2 value. The R2 value can get swapped with the nextbranch[1] entry, and 1 used for the parent. That will cover naming of roots. Swap back the nextbranch[1] value when done, and update the entry in the hash. hash val: struct { ser_t first; u32 branch; } The other function is to compute the parent. Make another struct which is the ser_t entry out of the hash, and ser_t that will become parent. struct { ser_t stop; ser_t parent; } To compute parent struct.parent = d; range_walkrevs(s, 0, 0, d, WR_STOP, callback, &struct). The callback does something like: if (d < token->first) return (-1); // nothing older found; we are done // unless() then not same branch unless (R0(s, d) == R0(s, first) && (d != token->parent) return (0); token->parent = d; // get oldest return (1); This will give BK numbering over N branches with a cost of a bunch of walkrevs walking as little of the graph as possible. [wscott] Not sure I appreciate the complexity above. You certainly don't need that for generating the Rev numbers so I suspect it is needed for swapping parent/merge in which case the code seems like it should be unchanged from the current version. (but can't use REV in the calculation) parent merge is independent of numbering. -- Issues: Normalize base name with s/./_/g -rdev might be a branch name or a tag, we can prevent creating new tags with the same names as an existing branch, but not sure we can do the reverse. And naming a repository by the tag seems pretty natural. [ob] A couple of ideas: 1. Can tags have dots in them? If not, -rdev is a tag, -rdev.4 is a rev. [rick] sccs_badTag() - yes, just not two in a row. So 'dev.4' is legal. It does look to be legal to end a tag with a '.'. So dev.4..foo is ambiguous. A tag can't begin with a '.', so that helps. 2. Maybe have a notation for naming tags vs revs? Seems to me we'll have to tweak ranges as well. bk cmd -rdev.1..mydev.5 bk clone -r%tagname (or something other than %) [rick] nice! So if it looks like a rev, the rev space is searched, and if nothing, the tag space is searched, unless %, then search only the tagspace?