diff options
author | Tobias Stoeckmann <tobias@cvs.openbsd.org> | 2008-05-17 21:06:45 +0000 |
---|---|---|
committer | Tobias Stoeckmann <tobias@cvs.openbsd.org> | 2008-05-17 21:06:45 +0000 |
commit | 650f53e0ab086f348050477f8fe236e8f101b6e9 (patch) | |
tree | ee361d18ac5acab6f91547b07fc2323cce669868 /usr.bin/cvs | |
parent | e1b18a7097567d73cba751bc4e522c1a7e72a4a7 (diff) |
Full support of branches added. We lacked proper support of multiple
branch entry points in one revision as well as branches which started from
other branches.
ok joris
Diffstat (limited to 'usr.bin/cvs')
-rw-r--r-- | usr.bin/cvs/commit.c | 17 | ||||
-rw-r--r-- | usr.bin/cvs/rcs.c | 89 |
2 files changed, 69 insertions, 37 deletions
diff --git a/usr.bin/cvs/commit.c b/usr.bin/cvs/commit.c index f785a425b6e..bcda61658d7 100644 --- a/usr.bin/cvs/commit.c +++ b/usr.bin/cvs/commit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: commit.c,v 1.132 2008/03/09 03:14:52 joris Exp $ */ +/* $OpenBSD: commit.c,v 1.133 2008/05/17 21:06:44 tobias Exp $ */ /* * Copyright (c) 2006 Joris Vink <joris@openbsd.org> * Copyright (c) 2006 Xavier Santolaria <xsa@openbsd.org> @@ -365,28 +365,31 @@ cvs_commit_local(struct cvs_file *cf) if (tag != NULL) { rcsnum_free(crev); + rcsnum_free(rrev); + brev = rcs_sym_getrev(cf->file_rcs, tag); crev = rcs_translate_tag(tag, cf->file_rcs); - if (crev == NULL) { + if (brev == NULL || crev == NULL) { fatal("failed to resolve existing tag: %s", tag); } - if (RCSNUM_ISBRANCHREV(crev)) { + rrev = rcsnum_alloc(); + rcsnum_cpy(brev, rrev, brev->rn_len - 1); + + if (RCSNUM_ISBRANCHREV(crev) && + rcsnum_cmp(crev, rrev, 0)) { nrev = rcsnum_alloc(); rcsnum_cpy(crev, nrev, 0); rcsnum_inc(nrev); } else if (!RCSNUM_ISBRANCH(crev)) { - brev = rcs_sym_getrev(cf->file_rcs, tag); - if (brev == NULL) - fatal("no more tag?"); nrev = rcsnum_brtorev(brev); if (nrev == NULL) fatal("failed to create branch rev"); - rcsnum_free(brev); } else { fatal("this isnt suppose to happen, honestly"); } + rcsnum_free(brev); rcsnum_free(rrev); rrev = rcsnum_branch_root(nrev); diff --git a/usr.bin/cvs/rcs.c b/usr.bin/cvs/rcs.c index eaba3379d52..dd3eaf0f11f 100644 --- a/usr.bin/cvs/rcs.c +++ b/usr.bin/cvs/rcs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcs.c,v 1.263 2008/05/11 12:13:41 tobias Exp $ */ +/* $OpenBSD: rcs.c,v 1.264 2008/05/17 21:06:44 tobias Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -1168,9 +1168,9 @@ rcs_rev_add(RCSFILE *rf, RCSNUM *rev, const char *msg, time_t date, const char *username) { time_t now; - RCSNUM *root; + RCSNUM *root = NULL; struct passwd *pw; - struct rcs_branch *brp; + struct rcs_branch *brp, *obrp; struct rcs_delta *ordp, *rdp; if (rev == RCS_HEAD_REV) { @@ -1220,26 +1220,45 @@ rcs_rev_add(RCSFILE *rf, RCSNUM *rev, const char *msg, time_t date, if (!(rf->rf_flags & RCS_CREATE)) { if (RCSNUM_ISBRANCHREV(rev)) { - root = rcsnum_branch_root(rev); - brp = xmalloc(sizeof(*brp)); - brp->rb_num = rcsnum_alloc(); - rcsnum_cpy(rdp->rd_num, brp->rb_num, 0); - if ((ordp = rcs_findrev(rf, root)) == NULL) - fatal("root node not found"); - if (TAILQ_EMPTY(&(ordp->rd_branches))) { - TAILQ_INSERT_TAIL(&(ordp->rd_branches), - brp, rb_list); - } + if (rev->rn_id[rev->rn_len - 1] == 1) { + /* a new branch */ + root = rcsnum_branch_root(rev); + brp = xmalloc(sizeof(*brp)); + brp->rb_num = rcsnum_alloc(); + rcsnum_cpy(rdp->rd_num, brp->rb_num, 0); + + if ((ordp = rcs_findrev(rf, root)) == NULL) + fatal("root node not found"); + + TAILQ_FOREACH(obrp, &(ordp->rd_branches), + rb_list) { + if (!rcsnum_cmp(obrp->rb_num, + brp->rb_num, + brp->rb_num->rn_len - 1)) + break; + } - ordp = TAILQ_PREV(rdp, rcs_dlist, rd_list); - if (RCSNUM_ISBRANCHREV(ordp->rd_num)) + if (obrp == NULL) { + TAILQ_INSERT_TAIL(&(ordp->rd_branches), + brp, rb_list); + } + } else { + root = rcsnum_alloc(); + rcsnum_cpy(rev, root, 0); + rcsnum_dec(root); + if ((ordp = rcs_findrev(rf, root)) == NULL) + fatal("previous revision not found"); rcsnum_cpy(rdp->rd_num, ordp->rd_next, 0); + } } else { ordp = TAILQ_NEXT(rdp, rd_list); rcsnum_cpy(ordp->rd_num, rdp->rd_next, 0); } } + if (root != NULL) + rcsnum_free(root); + /* not synced anymore */ rf->rf_flags &= ~RCS_SYNCED; @@ -3449,10 +3468,10 @@ rcs_translate_tag(const char *revstr, RCSFILE *rfp) int follow; time_t deltatime; char branch[CVS_REV_BUFSZ]; - RCSNUM *brev, *frev, *rev; + RCSNUM *brev, *frev, *rev, *rrev; struct rcs_delta *rdp, *trdp; - brev = frev = NULL; + brev = frev = rrev = NULL; if (revstr == NULL) { if (rfp->rf_branch != NULL) { @@ -3469,9 +3488,31 @@ rcs_translate_tag(const char *revstr, RCSFILE *rfp) if ((rdp = rcs_findrev(rfp, rev)) == NULL) fatal("rcs_translate_tag: cannot find revision"); + /* let's see if we must follow a branch */ + if (!strcmp(revstr, RCS_HEAD_BRANCH)) + follow = 1; + else { + frev = rcs_sym_getrev(rfp, revstr); + if (frev == NULL) + frev = rrev = rcsnum_parse(revstr); + + brev = rcsnum_alloc(); + rcsnum_cpy(rev, brev, rev->rn_len - 1); + + if (frev != NULL && RCSNUM_ISBRANCH(frev) && + !rcsnum_cmp(frev, brev, 0)) { + follow = 1; + } else + follow = 0; + + rcsnum_free(brev); + if (rrev != NULL) + rcsnum_free(rrev); + } + if (cvs_specified_date == -1) { /* XXX */ - if (rev->rn_len < 4) { + if (rev->rn_len < 4 || !follow) { return (rev); } @@ -3490,18 +3531,6 @@ rcs_translate_tag(const char *revstr, RCSFILE *rfp) return (rev); } - /* let's see if we must follow a branch */ - if (!strcmp(revstr, RCS_HEAD_BRANCH)) - follow = 1; - else { - frev = rcs_sym_getrev(rfp, revstr); - - if (frev != NULL && RCSNUM_ISBRANCH(frev)) - follow = 1; - else - follow = 0; - } - if (frev != NULL) rcsnum_tostr(frev, branch, sizeof(branch)); |