[cvsnt] Feature request: Commitable tags
Tuomas Huhtanen
tuomas.huhtanen at vertex.fi
Fri Apr 25 18:09:18 BST 2003
Tony Hoyle wrote:
> If you can change a tag it's a branch... A tag specifies a single revision
> only, as that's it's purpose. You can move tags (although that should be done
> as little as possible), but they can't hold more than one revision.
I know that tags are mostly used to specify a release/revision of the
system as it was at some specific time. But there are no technical
obstacles to use the tags differently. And that's what I'm suggesting
here, a little more flexible usage of the branches and tags.
I dont want a single tag to hold multiple revisions (altough i dont even
know what you mean by that), I just want a little more flexible way to
use the tags.
> If you want to commit a change to several branches that's what merging is
> for... There isn't another practical way to do it other than the way it's
> done now, because you're dealing with different code & have to merge
> differently in each branch (with possible conflict resolution).
I'm not talking about situations where you commit changes to different
branches. I'm talking about commiting a change to multiple
releases/revisions. And specifically about situations where the file
revision does not need to be different in the different releases.
I try to lay out a new example here. There is one file A in the
repository, and a need for three different releases, R1, R2, R3.
How we would do it today:
Create branches b_R1, b_R2, b_R3
edit file A in b_R1.
merge change to branches b_R2 and b_R3
(Now we have three different, but identical revisions (plus the original)
now edit A again in b_R1.
This is a change we want only to be in b_R1, so we wont merge it anywhere
and finally edit A in b_R2, and merge to b_R3
(Now we have three different revisions, of which two are identical (plus
previous revisions))
How I would like to do it:
Create commitable Tags ct_R1, ct_R2, ct_R3
edit the file A in the ct_R1 (meaning that I have checked out ct_R1, the
file actually resides in the main trunk)
update tags ct_r2 and ct_R3 to point to the same revisoin as ct_R1 does.
(Now we have single revision with three tags pointing to it (plus the
original revision))
now edit A again in ct_R1
This is a change we want only to be in ct_R1, so we wont do anything
else now.
and then we edit A in ct_R2. Now if we try to commit it, we cannot do
it, since ct_R2 is now outdated. Now we need to branch the A to b_R2 and
commit the change there. Also because we want the change to ct_R3, we
update the ct_R3 to point to the b_R2 revision.
(Now we have two revisions with two tags pointing to one and one tag
pointing to the other)
I know the philosophy how to use the branches and the tags differs from
the traditional way, but technically it does not differ that much.
I would still use branches as branches, but the difference is that the
branches are created only when needed, not when one file out of the
whole bunch needs the branch.
I think that the basic implementation in code wise is also very simple.
When commiting, instead of checking is the sticky tag branch:
if (status == T_MODIFIED && vers->tag &&
!RCS_isbranch (finfo->rcs, vers->tag))
we could check if it is a branch OR a writable tag.
Of course there are some other modifications needed also, e.g. when
creating the tag, the information needs to be stored that the tag is a
writable tag.
But that is pretty much it what is needed in the basic implementation.
Some additional nice-to-have features could be something like "update
writable tag", which could move the writable tag to the leaf revision of
the branch the file is in (if there is no branchpoints in between).
Hope this illustrated the idea a little further,
Tuomas
More information about the cvsnt
mailing list