Esempio n. 1
0
    def parsesplicemap(self, path):
        """check and validate the splicemap format and
        return a child/parents dictionary.
        Format checking has two parts.
        1. generic format which is same across all source types
        2. specific format checking which may be different for
           different source type.  This logic is implemented in
           checkrevformat function in source files like
           hg.py, subversion.py etc.
        """

        if not path:
            return {}
        m = {}
        try:
            fp = open(path, b'rb')
            for i, line in enumerate(util.iterfile(fp)):
                line = line.splitlines()[0].rstrip()
                if not line:
                    # Ignore blank lines
                    continue
                # split line
                lex = common.shlexer(data=line, whitespace=b',')
                line = list(lex)
                # check number of parents
                if not (2 <= len(line) <= 3):
                    raise error.Abort(
                        _(
                            b'syntax error in %s(%d): child parent1'
                            b'[,parent2] expected'
                        )
                        % (path, i + 1)
                    )
                for part in line:
                    self.source.checkrevformat(part)
                child, p1, p2 = line[0], line[1:2], line[2:]
                if p1 == p2:
                    m[child] = p1
                else:
                    m[child] = p1 + p2
        # if file does not exist or error reading, exit
        except IOError:
            raise error.Abort(
                _(b'splicemap file not found or error reading %s:') % path
            )
        return m
Esempio n. 2
0
 def _read(self):
     if not self.path:
         return
     try:
         fp = open(self.path, 'r')
     except IOError as err:
         if err.errno != errno.ENOENT:
             raise
         return
     for i, line in enumerate(util.iterfile(fp)):
         line = line.splitlines()[0].rstrip()
         if not line:
             # Ignore blank lines
             continue
         try:
             key, value = line.rsplit(' ', 1)
         except ValueError:
             raise error.Abort(
                 _('syntax error in %s(%d): key/value pair expected') %
                 (self.path, i + 1))
         if key not in self:
             self.order.append(key)
         super(mapfile, self).__setitem__(key, value)
     fp.close()