[PATCH 2 of 3] obsolete: append new markers to obsstore file instead of rewriting everything

Pierre-Yves David pierre-yves.david at ens-lyon.org
Sun Jul 15 07:38:04 CDT 2012


On Sun, Jul 15, 2012 at 01:40:58PM +0200, Adrian Buehlmann wrote:
> On 2012-07-04 02:26, Pierre-Yves David wrote:
> > diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
> > --- a/mercurial/obsolete.py
> > +++ b/mercurial/obsolete.py
> > @@ -209,12 +209,14 @@
> >          """Write all markers on disk
> >  
> >          After this operation, "new" markers are considered "known"."""
> > +        # XXX: transaction logic should be used
> >          if self._new:
> > -            # XXX: transaction logic should be used here. But for
> > -            # now rewriting the whole file is good enough.
> > -            f = self.sopener('obsstore', 'wb', atomictemp=True)
> > +            f = self.sopener('obsstore', 'ab')
> >              try:
> > -                self._writemarkers(f)
> > +                if f.tell() == 0:
> > +                    # plain new obsstore
> > +                    f.write(_pack('>B', _fmversion))
> > +                _writemarkers(f.write, self._new)
> >                  f.close()
> >                  self._new[:] = []
> >              except: # re-raises
> 
> This was pushed as http://selenic.com/repo/hg/rev/95d785ccb4e5
> 
> Bisecting reveals that it is the first changeset that causes test-obsolete.t to
> fail on Windows with:
> 
> --- C:\Users\adi\hgrepos\hg-main\tests\test-obsolete.t
> +++ C:\Users\adi\hgrepos\hg-main\tests\test-obsolete.t.err
> @@ -43,8 +43,8 @@
>    created new head
>    $ hg debugobsolete -d '1337 0' `getid new_c` `getid new_2_c`
>    $ hg debugobsolete
> -  245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
> -  cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
> +  abort: parsing obsolete marker: metadata is too short, 42 bytes expected, got 16777216
> +  [255]
> 
> See also
> 
> http://hgbuildbot.kublai.com/builders/Windows%202008%20R2%20hg%20tests/builds/148/steps/run-tests.py%20%28python2.6%29/logs/stdio
> 

Looking at the error message, it seems that the version headers where not
written. Is there any specific behavion windows regarding open(xxx, 'ab') or
f.tell() ?

-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list