mercurial/obsolete.py
changeset 45474 145cfe84d3e4
parent 44470 9d2b2df2c2ba
child 45957 89a2afe31e82
equal deleted inserted replaced
45473:c1d6e930ac8a 45474:145cfe84d3e4
   326 #
   326 #
   327 # - M*(uint8, uint8): size of all metadata entries (key and value)
   327 # - M*(uint8, uint8): size of all metadata entries (key and value)
   328 #
   328 #
   329 # - remaining bytes: the metadata, each (key, value) pair after the other.
   329 # - remaining bytes: the metadata, each (key, value) pair after the other.
   330 _fm1version = 1
   330 _fm1version = 1
   331 _fm1fixed = b'>IdhHBBB20s'
   331 _fm1fixed = b'>IdhHBBB'
   332 _fm1nodesha1 = b'20s'
   332 _fm1nodesha1 = b'20s'
   333 _fm1nodesha256 = b'32s'
   333 _fm1nodesha256 = b'32s'
   334 _fm1nodesha1size = _calcsize(_fm1nodesha1)
   334 _fm1nodesha1size = _calcsize(_fm1nodesha1)
   335 _fm1nodesha256size = _calcsize(_fm1nodesha256)
   335 _fm1nodesha256size = _calcsize(_fm1nodesha256)
   336 _fm1fsize = _calcsize(_fm1fixed)
   336 _fm1fsize = _calcsize(_fm1fixed)
   358     ufixed = struct.Struct(_fm1fixed).unpack
   358     ufixed = struct.Struct(_fm1fixed).unpack
   359 
   359 
   360     while off < stop:
   360     while off < stop:
   361         # read fixed part
   361         # read fixed part
   362         o1 = off + fsize
   362         o1 = off + fsize
   363         t, secs, tz, flags, numsuc, numpar, nummeta, prec = ufixed(data[off:o1])
   363         t, secs, tz, flags, numsuc, numpar, nummeta = ufixed(data[off:o1])
   364 
   364 
   365         if flags & sha2flag:
   365         if flags & sha2flag:
   366             # FIXME: prec was read as a SHA1, needs to be amended
   366             nodefmt = sha2fmt
   367 
   367             nodesize = sha2size
   368             # read 0 or more successors
       
   369             if numsuc == 1:
       
   370                 o2 = o1 + sha2size
       
   371                 sucs = (data[o1:o2],)
       
   372             else:
       
   373                 o2 = o1 + sha2size * numsuc
       
   374                 sucs = unpack(sha2fmt * numsuc, data[o1:o2])
       
   375 
       
   376             # read parents
       
   377             if numpar == noneflag:
       
   378                 o3 = o2
       
   379                 parents = None
       
   380             elif numpar == 1:
       
   381                 o3 = o2 + sha2size
       
   382                 parents = (data[o2:o3],)
       
   383             else:
       
   384                 o3 = o2 + sha2size * numpar
       
   385                 parents = unpack(sha2fmt * numpar, data[o2:o3])
       
   386         else:
   368         else:
   387             # read 0 or more successors
   369             nodefmt = sha1fmt
   388             if numsuc == 1:
   370             nodesize = sha1size
   389                 o2 = o1 + sha1size
   371 
   390                 sucs = (data[o1:o2],)
   372         (prec,) = unpack(nodefmt, data[o1 : o1 + nodesize])
   391             else:
   373         o1 += nodesize
   392                 o2 = o1 + sha1size * numsuc
   374 
   393                 sucs = unpack(sha1fmt * numsuc, data[o1:o2])
   375         # read 0 or more successors
   394 
   376         if numsuc == 1:
   395             # read parents
   377             o2 = o1 + nodesize
   396             if numpar == noneflag:
   378             sucs = (data[o1:o2],)
   397                 o3 = o2
   379         else:
   398                 parents = None
   380             o2 = o1 + nodesize * numsuc
   399             elif numpar == 1:
   381             sucs = unpack(nodefmt * numsuc, data[o1:o2])
   400                 o3 = o2 + sha1size
   382 
   401                 parents = (data[o2:o3],)
   383         # read parents
   402             else:
   384         if numpar == noneflag:
   403                 o3 = o2 + sha1size * numpar
   385             o3 = o2
   404                 parents = unpack(sha1fmt * numpar, data[o2:o3])
   386             parents = None
       
   387         elif numpar == 1:
       
   388             o3 = o2 + nodesize
       
   389             parents = (data[o2:o3],)
       
   390         else:
       
   391             o3 = o2 + nodesize * numpar
       
   392             parents = unpack(nodefmt * numpar, data[o2:o3])
   405 
   393 
   406         # read metadata
   394         # read metadata
   407         off = o3 + metasize * nummeta
   395         off = o3 + metasize * nummeta
   408         metapairsize = unpack(b'>' + (metafmt * nummeta), data[o3:off])
   396         metapairsize = unpack(b'>' + (metafmt * nummeta), data[o3:off])
   409         metadata = []
   397         metadata = []
   421     # determine node size
   409     # determine node size
   422     _fm1node = _fm1nodesha1
   410     _fm1node = _fm1nodesha1
   423     if flags & usingsha256:
   411     if flags & usingsha256:
   424         _fm1node = _fm1nodesha256
   412         _fm1node = _fm1nodesha256
   425     numsuc = len(sucs)
   413     numsuc = len(sucs)
   426     numextranodes = numsuc
   414     numextranodes = 1 + numsuc
   427     if parents is None:
   415     if parents is None:
   428         numpar = _fm1parentnone
   416         numpar = _fm1parentnone
   429     else:
   417     else:
   430         numpar = len(parents)
   418         numpar = len(parents)
   431         numextranodes += numpar
   419         numextranodes += numpar
   622         `createmarkers` function in this module instead.
   610         `createmarkers` function in this module instead.
   623 
   611 
   624         return True if a new marker have been added, False if the markers
   612         return True if a new marker have been added, False if the markers
   625         already existed (no op).
   613         already existed (no op).
   626         """
   614         """
       
   615         flag = int(flag)
   627         if metadata is None:
   616         if metadata is None:
   628             metadata = {}
   617             metadata = {}
   629         if date is None:
   618         if date is None:
   630             if b'date' in metadata:
   619             if b'date' in metadata:
   631                 # as a courtesy for out-of-tree extensions
   620                 # as a courtesy for out-of-tree extensions
   634                 date = ui.configdate(b'devel', b'default-date')
   623                 date = ui.configdate(b'devel', b'default-date')
   635                 if date is None:
   624                 if date is None:
   636                     date = dateutil.makedate()
   625                     date = dateutil.makedate()
   637             else:
   626             else:
   638                 date = dateutil.makedate()
   627                 date = dateutil.makedate()
   639         if len(prec) != 20:
   628         if flag & usingsha256:
   640             raise ValueError(prec)
   629             if len(prec) != 32:
   641         for succ in succs:
   630                 raise ValueError(prec)
   642             if len(succ) != 20:
   631             for succ in succs:
   643                 raise ValueError(succ)
   632                 if len(succ) != 32:
       
   633                     raise ValueError(succ)
       
   634         else:
       
   635             if len(prec) != 20:
       
   636                 raise ValueError(prec)
       
   637             for succ in succs:
       
   638                 if len(succ) != 20:
       
   639                     raise ValueError(succ)
   644         if prec in succs:
   640         if prec in succs:
   645             raise ValueError(
   641             raise ValueError(
   646                 'in-marker cycle with %s' % pycompat.sysstr(node.hex(prec))
   642                 'in-marker cycle with %s' % pycompat.sysstr(node.hex(prec))
   647             )
   643             )
   648 
   644 
   657                     b'obsstore metadata must be valid UTF-8 sequence '
   653                     b'obsstore metadata must be valid UTF-8 sequence '
   658                     b'(key = %r, value = %r)'
   654                     b'(key = %r, value = %r)'
   659                     % (pycompat.bytestr(k), pycompat.bytestr(v))
   655                     % (pycompat.bytestr(k), pycompat.bytestr(v))
   660                 )
   656                 )
   661 
   657 
   662         marker = (bytes(prec), tuple(succs), int(flag), metadata, date, parents)
   658         marker = (bytes(prec), tuple(succs), flag, metadata, date, parents)
   663         return bool(self.add(transaction, [marker]))
   659         return bool(self.add(transaction, [marker]))
   664 
   660 
   665     def add(self, transaction, markers):
   661     def add(self, transaction, markers):
   666         """Add new markers to the store
   662         """Add new markers to the store
   667 
   663