Re: opencvs - fix revision lookups for branches

2016-06-22 Thread Michael W. Bombardieri
Yes please. As noted in older thread that XXX block in rcs.c produced side 
effects with cvs annotate.
https://marc.info/?l=openbsd-tech=144757775319206=2


On Wed, Jun 22, 2016 at 05:20:01PM +0200, Joris Vink wrote:
> On Wed, Jun 22, 2016 at 09:07:03AM -0600, Todd C. Miller wrote:
> > On Wed, 22 Jun 2016 12:21:56 +0200, Joris Vink wrote:
> > > Index: rcs.c
> > > ===
> > > RCS file: /cvs/src/usr.bin/cvs/rcs.c,v
> > > retrieving revision 1.313
> > > diff -u -p -r1.313 rcs.c
> > > --- rcs.c 5 Nov 2015 09:48:21 -   1.313
> > > +++ rcs.c 22 Jun 2016 09:52:04 -
> > > @@ -1796,17 +1796,13 @@ rcs_rev_getlines(RCSFILE *rfp, RCSNUM *f
> > >  
> > >  again:
> > >   for (;;) {
> > > + if (rdp == NULL)
> > > + break;
> > 
> > Wouldn't this be easier to read as:
> > 
> > while (rdp != NULL) {
> 
> Yes, updated diff below.
> 
> .joris
> 
> Index: rcs.c
> ===
> RCS file: /cvs/src/usr.bin/cvs/rcs.c,v
> retrieving revision 1.313
> diff -u -p -r1.313 rcs.c
> --- rcs.c 5 Nov 2015 09:48:21 -   1.313
> +++ rcs.c 22 Jun 2016 15:13:14 -
> @@ -1795,18 +1795,11 @@ rcs_rev_getlines(RCSFILE *rfp, RCSNUM *f
>   goto done;
>  
>  again:
> - for (;;) {
> + while (rdp != NULL) {
>   if (rdp->rd_next->rn_len != 0) {
>   trdp = rcs_findrev(rfp, rdp->rd_next);
>   if (trdp == NULL)
>   fatal("failed to grab next revision");
> - } else {
> - /*
> -  * XXX Fail, although the caller does not always do the
> -  * right thing (eg cvs diff when the tree is ahead of
> -  * the repository).
> -  */
> - break;
>   }
>  
>   if (rdp->rd_tlen == 0) {
> @@ -1857,7 +1850,7 @@ again:
>   }
>  
>  next:
> - if (!rcsnum_differ(rdp->rd_num, frev))
> + if (rdp == NULL || !rcsnum_differ(rdp->rd_num, frev))
>   done = 1;
>  
>   if (RCSNUM_ISBRANCHREV(frev) && done != 1) {
> @@ -2045,6 +2038,7 @@ rcs_rev_getbuf(RCSFILE *rfp, RCSNUM *rev
>   struct rcs_delta *rdp;
>   struct rcs_lines *lines;
>   struct rcs_line *lp, *nlp;
> + char version[RCSNUM_MAXSTR];
>   BUF *bp;
>  
>   rdp = NULL;
> @@ -2057,8 +2051,12 @@ rcs_rev_getbuf(RCSFILE *rfp, RCSNUM *rev
>   expmode = rcs_kwexp_get(rfp);
>  
>   if (!(expmode & RCS_KWEXP_NONE)) {
> - if ((rdp = rcs_findrev(rfp, rev)) == NULL)
> - fatal("could not fetch revision");
> + if ((rdp = rcs_findrev(rfp, rev)) == NULL) {
> + rcsnum_tostr(rev, version, sizeof(version));
> + fatal("could not find desired version %s in %s",
> + version, rfp->rf_path);
> + }
> +
>   expand = 1;
>   }
>   }
> 



Re: opencvs - fix revision lookups for branches

2016-06-22 Thread Joris Vink
On Wed, Jun 22, 2016 at 09:07:03AM -0600, Todd C. Miller wrote:
> On Wed, 22 Jun 2016 12:21:56 +0200, Joris Vink wrote:
> > Index: rcs.c
> > ===
> > RCS file: /cvs/src/usr.bin/cvs/rcs.c,v
> > retrieving revision 1.313
> > diff -u -p -r1.313 rcs.c
> > --- rcs.c   5 Nov 2015 09:48:21 -   1.313
> > +++ rcs.c   22 Jun 2016 09:52:04 -
> > @@ -1796,17 +1796,13 @@ rcs_rev_getlines(RCSFILE *rfp, RCSNUM *f
> >  
> >  again:
> > for (;;) {
> > +   if (rdp == NULL)
> > +   break;
> 
> Wouldn't this be easier to read as:
> 
>   while (rdp != NULL) {

Yes, updated diff below.

.joris

Index: rcs.c
===
RCS file: /cvs/src/usr.bin/cvs/rcs.c,v
retrieving revision 1.313
diff -u -p -r1.313 rcs.c
--- rcs.c   5 Nov 2015 09:48:21 -   1.313
+++ rcs.c   22 Jun 2016 15:13:14 -
@@ -1795,18 +1795,11 @@ rcs_rev_getlines(RCSFILE *rfp, RCSNUM *f
goto done;
 
 again:
-   for (;;) {
+   while (rdp != NULL) {
if (rdp->rd_next->rn_len != 0) {
trdp = rcs_findrev(rfp, rdp->rd_next);
if (trdp == NULL)
fatal("failed to grab next revision");
-   } else {
-   /*
-* XXX Fail, although the caller does not always do the
-* right thing (eg cvs diff when the tree is ahead of
-* the repository).
-*/
-   break;
}
 
if (rdp->rd_tlen == 0) {
@@ -1857,7 +1850,7 @@ again:
}
 
 next:
-   if (!rcsnum_differ(rdp->rd_num, frev))
+   if (rdp == NULL || !rcsnum_differ(rdp->rd_num, frev))
done = 1;
 
if (RCSNUM_ISBRANCHREV(frev) && done != 1) {
@@ -2045,6 +2038,7 @@ rcs_rev_getbuf(RCSFILE *rfp, RCSNUM *rev
struct rcs_delta *rdp;
struct rcs_lines *lines;
struct rcs_line *lp, *nlp;
+   char version[RCSNUM_MAXSTR];
BUF *bp;
 
rdp = NULL;
@@ -2057,8 +2051,12 @@ rcs_rev_getbuf(RCSFILE *rfp, RCSNUM *rev
expmode = rcs_kwexp_get(rfp);
 
if (!(expmode & RCS_KWEXP_NONE)) {
-   if ((rdp = rcs_findrev(rfp, rev)) == NULL)
-   fatal("could not fetch revision");
+   if ((rdp = rcs_findrev(rfp, rev)) == NULL) {
+   rcsnum_tostr(rev, version, sizeof(version));
+   fatal("could not find desired version %s in %s",
+   version, rfp->rf_path);
+   }
+
expand = 1;
}
}



Re: opencvs - fix revision lookups for branches

2016-06-22 Thread Todd C. Miller
On Wed, 22 Jun 2016 12:21:56 +0200, Joris Vink wrote:

> This diff below fixes a serious issue in opencvs when
> checking out revisions from a branch.
> 
> Properly perform a revision lookup so update -r actually
> works again, as a bonus throw a more correct error when
> the revision could not be found.
> 
> .joris
> 
> Index: rcs.c
> ===
> RCS file: /cvs/src/usr.bin/cvs/rcs.c,v
> retrieving revision 1.313
> diff -u -p -r1.313 rcs.c
> --- rcs.c 5 Nov 2015 09:48:21 -   1.313
> +++ rcs.c 22 Jun 2016 09:52:04 -
> @@ -1796,17 +1796,13 @@ rcs_rev_getlines(RCSFILE *rfp, RCSNUM *f
>  
>  again:
>   for (;;) {
> + if (rdp == NULL)
> + break;

Wouldn't this be easier to read as:

while (rdp != NULL) {

> +
>   if (rdp->rd_next->rn_len != 0) {
>   trdp = rcs_findrev(rfp, rdp->rd_next);
>   if (trdp == NULL)
>   fatal("failed to grab next revision");
> - } else {
> - /*
> -  * XXX Fail, although the caller does not always do the
> -  * right thing (eg cvs diff when the tree is ahead of
> -  * the repository).
> -  */
> - break;
>   }
>  
>   if (rdp->rd_tlen == 0) {



opencvs - fix revision lookups for branches

2016-06-22 Thread Joris Vink
Hi,

This diff below fixes a serious issue in opencvs when
checking out revisions from a branch.

Properly perform a revision lookup so update -r actually
works again, as a bonus throw a more correct error when
the revision could not be found.

.joris

Index: rcs.c
===
RCS file: /cvs/src/usr.bin/cvs/rcs.c,v
retrieving revision 1.313
diff -u -p -r1.313 rcs.c
--- rcs.c   5 Nov 2015 09:48:21 -   1.313
+++ rcs.c   22 Jun 2016 09:52:04 -
@@ -1796,17 +1796,13 @@ rcs_rev_getlines(RCSFILE *rfp, RCSNUM *f
 
 again:
for (;;) {
+   if (rdp == NULL)
+   break;
+
if (rdp->rd_next->rn_len != 0) {
trdp = rcs_findrev(rfp, rdp->rd_next);
if (trdp == NULL)
fatal("failed to grab next revision");
-   } else {
-   /*
-* XXX Fail, although the caller does not always do the
-* right thing (eg cvs diff when the tree is ahead of
-* the repository).
-*/
-   break;
}
 
if (rdp->rd_tlen == 0) {
@@ -1857,7 +1853,7 @@ again:
}
 
 next:
-   if (!rcsnum_differ(rdp->rd_num, frev))
+   if (rdp == NULL || !rcsnum_differ(rdp->rd_num, frev))
done = 1;
 
if (RCSNUM_ISBRANCHREV(frev) && done != 1) {
@@ -2045,6 +2041,7 @@ rcs_rev_getbuf(RCSFILE *rfp, RCSNUM *rev
struct rcs_delta *rdp;
struct rcs_lines *lines;
struct rcs_line *lp, *nlp;
+   char version[RCSNUM_MAXSTR];
BUF *bp;
 
rdp = NULL;
@@ -2057,8 +2054,12 @@ rcs_rev_getbuf(RCSFILE *rfp, RCSNUM *rev
expmode = rcs_kwexp_get(rfp);
 
if (!(expmode & RCS_KWEXP_NONE)) {
-   if ((rdp = rcs_findrev(rfp, rev)) == NULL)
-   fatal("could not fetch revision");
+   if ((rdp = rcs_findrev(rfp, rev)) == NULL) {
+   rcsnum_tostr(rev, version, sizeof(version));
+   fatal("could not find desired version %s in %s",
+   version, rfp->rf_path);
+   }
+
expand = 1;
}
}