def addrevision(self, text, transaction, linkrev, p1, p2, node=None, flags=revlog.REVIDX_DEFAULT_FLAGS, cachedelta=None): validatenode(p1) validatenode(p2) if flags: node = node or revlog.hash(text, p1, p2) rawtext, validatehash = self._processflags(text, flags, 'write') node = node or revlog.hash(text, p1, p2) if node in self._indexbynode: return node if validatehash: self.checkhash(rawtext, node, p1=p1, p2=p2) return self._addrawrevision(node, rawtext, transaction, linkrev, p1, p2, flags)
def chash(manifest, files, desc, p1, p2, user, date, extra): """Compute changeset hash from the changeset pieces.""" user = user.strip() if "\n" in user: raise error.RevlogError( _("username %s contains a newline") % repr(user)) # strip trailing whitespace and leading and trailing empty lines desc = '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n') user, desc = encoding.fromlocal(user), encoding.fromlocal(desc) if date: parseddate = "%d %d" % util.parsedate(date) else: parseddate = "%d %d" % util.makedate() extra = extra.copy() if 'signature' in extra: del extra['signature'] if extra.get("branch") in ("default", ""): del extra["branch"] if extra: extra = changelog.encodeextra(extra) parseddate = "%s %s" % (parseddate, extra) l = [hex(manifest), user, parseddate] + sorted(files) + ["", desc] text = "\n".join(l) return revlog.hash(text, p1, p2)
def chash(manifest, files, desc, p1, p2, user, date, extra): """Compute changeset hash from the changeset pieces.""" user = user.strip() if "\n" in user: raise error.RevlogError(_("username %s contains a newline") % repr(user)) # strip trailing whitespace and leading and trailing empty lines desc = '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n') user, desc = encoding.fromlocal(user), encoding.fromlocal(desc) if date: parseddate = "%d %d" % util.parsedate(date) else: parseddate = "%d %d" % util.makedate() extra = extra.copy() if 'signature' in extra: del extra['signature'] if extra.get("branch") in ("default", ""): del extra["branch"] if extra: extra = changelog.encodeextra(extra) parseddate = "%s %s" % (parseddate, extra) l = [hex(manifest), user, parseddate] + sorted(files) + ["", desc] text = "\n".join(l) return revlog.hash(text, p1, p2)
def filelogadd(orig, self, text, meta, transaction, link, p1, p2): if isinstance(link, int): pendingfilecommits.append((self, text, meta, transaction, link, p1, p2)) hashtext = remotefilelog._createrevlogtext(text, meta.get('copy'), meta.get('copyrev')) node = revlog.hash(hashtext, p1, p2) return node else: return orig(self, text, meta, transaction, link, p1, p2)
def add(self, text, meta, transaction, linknode, p1=None, p2=None): hashtext = text # hash with the metadata, like in vanilla filelogs hashtext = shallowutil.createrevlogtext(text, meta.get('copy'), meta.get('copyrev')) node = revlog.hash(hashtext, p1, p2) return self.addrevision(hashtext, transaction, linknode, p1, p2, node=node)
def filelogadd(orig, self, text, meta, transaction, link, p1, p2): if isinstance(link, int): pendingfilecommits.append( (self, text, meta, transaction, link, p1, p2)) hashtext = remotefilelog._createrevlogtext(text, meta.get('copy'), meta.get('copyrev')) node = revlog.hash(hashtext, p1, p2) return node else: return orig(self, text, meta, transaction, link, p1, p2)
def addrevision(self, text, transaction, linknode, p1, p2, cachedelta=None, node=None, flags=revlog.REVIDX_DEFAULT_FLAGS): # text passed to "addrevision" includes hg filelog metadata header if node is None: node = revlog.hash(text, p1, p2) meta, metaoffset = _parsemeta(text) rawtext, validatehash = self._processflags(text, flags, 'write') return self.addrawrevision(rawtext, transaction, linknode, p1, p2, node, flags, cachedelta, _metatuple=(meta, metaoffset))
def cmp(self, node, text): validatenode(node) t = text if text.startswith(b'\1\n'): t = b'\1\n\1\n' + text p1, p2 = self.parents(node) if revlog.hash(t, p1, p2) == node: return False if self.iscensored(self.rev(node)): return text != b'' if self.renamed(node): t2 = self.read(node) return t2 != text return True
def checkhash(self, text, node, p1=None, p2=None, rev=None): if p1 is None and p2 is None: p1, p2 = self.parents(node) if node != revlog.hash(text, p1, p2): raise error.RevlogError( _("integrity check failed on %s") % self._path)
def add(self, text, meta, transaction, linknode, p1=None, p2=None): hashtext = text # hash with the metadata, like in vanilla filelogs hashtext = _createrevlogtext(text, meta.get('copy'), meta.get('copyrev')) node = revlog.hash(hashtext, p1, p2) def _createfileblob(): data = "%s\0%s" % (len(text), text) realp1 = p1 copyfrom = "" if 'copy' in meta: copyfrom = meta['copy'] realp1 = bin(meta['copyrev']) data += "%s%s%s%s%s\0" % (node, realp1, p2, linknode, copyfrom) pancestors = {} queue = [] if realp1 != nullid: p1flog = self if copyfrom: p1flog = remotefilelog(self.opener, copyfrom, self.repo) pancestors.update( p1flog.ancestormap(realp1, relativeto=linknode)) queue.append(realp1) if p2 != nullid: pancestors.update(self.ancestormap(p2, relativeto=linknode)) queue.append(p2) visited = set() ancestortext = "" # add the ancestors in topological order while queue: c = queue.pop(0) visited.add(c) pa1, pa2, ancestorlinknode, pacopyfrom = pancestors[c] ancestortext += "%s%s%s%s%s\0" % (c, pa1, pa2, ancestorlinknode, pacopyfrom) if pa1 != nullid and pa1 not in visited: queue.append(pa1) if pa2 != nullid and pa2 not in visited: queue.append(pa2) data += ancestortext return data key = fileserverclient.getlocalkey(self.filename, hex(node)) path = os.path.join(self.localpath, key) # if this node already exists, save the old version in case # we ever delete this new commit in the future oldumask = os.umask(0o002) try: if os.path.exists(path): filename = os.path.basename(path) directory = os.path.dirname(path) files = [ f for f in os.listdir(directory) if f.startswith(filename) ] shutil.copyfile(path, path + str(len(files))) _writefile(path, _createfileblob()) finally: os.umask(oldumask) return node
def add(self, text, meta, transaction, linknode, p1=None, p2=None): hashtext = text # hash with the metadata, like in vanilla filelogs hashtext = _createrevlogtext(text, meta.get('copy'), meta.get('copyrev')) node = revlog.hash(hashtext, p1, p2) def _createfileblob(): data = "%s\0%s" % (len(text), text) realp1 = p1 copyfrom = "" if 'copy' in meta: copyfrom = meta['copy'] realp1 = bin(meta['copyrev']) data += "%s%s%s%s%s\0" % (node, realp1, p2, linknode, copyfrom) pancestors = {} queue = [] if realp1 != nullid: p1flog = self if copyfrom: p1flog = remotefilelog(self.opener, copyfrom, self.repo) pancestors.update(p1flog.ancestormap(realp1, relativeto=linknode)) queue.append(realp1) if p2 != nullid: pancestors.update(self.ancestormap(p2, relativeto=linknode)) queue.append(p2) visited = set() ancestortext = "" # add the ancestors in topological order while queue: c = queue.pop(0) visited.add(c) pa1, pa2, ancestorlinknode, pacopyfrom = pancestors[c] ancestortext += "%s%s%s%s%s\0" % ( c, pa1, pa2, ancestorlinknode, pacopyfrom) if pa1 != nullid and pa1 not in visited: queue.append(pa1) if pa2 != nullid and pa2 not in visited: queue.append(pa2) data += ancestortext return data key = fileserverclient.getlocalkey(self.filename, hex(node)) path = os.path.join(self.localpath, key) # if this node already exists, save the old version in case # we ever delete this new commit in the future oldumask = os.umask(0o002) try: if os.path.exists(path): filename = os.path.basename(path) directory = os.path.dirname(path) files = [f for f in os.listdir(directory) if f.startswith(filename)] shutil.copyfile(path, path + str(len(files))) _writefile(path, _createfileblob()) finally: os.umask(oldumask) return node