示例#1
0
 def __new__(cls, name, validate=True):
     '''user/modname/branch
        ie: owner/[originalowner/name]/branch
     '''
     assert isinstance(name, basestring), '%s is not a string' % str(name)
     if not validate:
         obj = str.__new__(cls, name)
     else:
         name = name.strip().replace('\\', '/')
         tokens = name.split('/')
         if len(tokens) != 4:
             raise InvalidNameException(
                 "Invalid block name: %s, it should be in the form "
                 "owner/originalowner/name/branch" % name)
         user = tokens[0]
         block_name = '/'.join(tokens[1:3])
         obj = str.__new__(cls, '%s/%s/%s' % (user, block_name, tokens[3]))
         obj._user = BRLUser(user)
         obj._block_name = BlockName(block_name)
         obj._branch = ComplexName(tokens[3].lower())
     return obj
示例#2
0
def checkin_block_files(hive_holder, block_name, files, biiout):
    '''
    Params:
        hive_holder: HiveHolder
        block_name: BlockName
        files: {cell_name: content}
        processor_changes: ProcessorChanges
        biiout: biiout
    '''
    block_name = BlockName(block_name)
    types_blobs = obtain_types_blobs(
        files)  # {cell_name: (TYPE, Content/CellType/None)}
    # FIXME: What happens if merge result is larger than individual files, reject???
    changevalidator.remove_large_cells(types_blobs, biiout)
    try:
        block_holder = hive_holder[block_name]
    except KeyError:
        block_holder = BlockHolder(block_name, [])
        hive_holder.add_holder(block_holder)

    for cell_name, (biitype, blob) in types_blobs.iteritems():
        block_cell_name = block_name + cell_name
        cell = SimpleCell(block_cell_name, biitype)
        try:
            resource = block_holder[cell_name]
        except KeyError:
            content = Content(block_cell_name, load=blob)
        else:
            content = resource.content
            if content is None or blob != content.load:
                content = Content(block_cell_name, load=blob)
            else:
                content.set_blob(blob)

        resource = Resource(cell, content)
        block_holder.add_resource(resource)

    for cell_name, resource in block_holder.resources.items():
        if cell_name not in types_blobs:
            block_holder.delete_resource(cell_name)
示例#3
0
def parse_block_version_expression(text):
    '''Parse text and returns the components of a BlockVersion

    Valid text input examples:
        lasote/myblock
        lasote/myblock(master)
        lasote/myblock(master):1
        lasote/myblock(pepe/branch):33 @My cool version # Comment at the end
    '''

    text = text.strip().replace('\\', '/')
    group_values = [m.groupdict() for m in block_version_re.finditer(text)]
    if len(group_values) == 0:  # Not Match
        raise ValueError()

    group_values = group_values[0]

    # Get block_name
    block_name = BlockName(group_values["block_name"])

    # Get complete branch_name
    if group_values.get("branch", None) is None:  # If none => owner/master
        branch_user = block_name.user
        branch_name = "master"
    elif "/" in group_values["branch"]:
        branch_user, branch_name = group_values["branch"].split("/")
    else:  # Only branch_name, so owner/branch_name
        branch_user = block_name.user
        branch_name = group_values["branch"]
    branch = BranchName('%s/%s' % (branch_user, branch_name))
    brl_block = BRLBlock(
        '%s/%s/%s/%s' %
        (branch.user, block_name.user, block_name.name, branch.name))
    # Get time
    version = group_values.get("time", None)
    time = int(version) if version else None
    version_tag = group_values.get("tag", None)

    return brl_block, time, version_tag
示例#4
0
 def disk_blocks(self):
     """Get the blocks based on disk, not in processed hive"""
     result = {}
     root_block = self._bii_paths.root_block
     if os.path.exists(self._bii_paths.blocks):
         for username in os.listdir(self._bii_paths.blocks):
             for name in os.listdir(
                     os.path.join(self._bii_paths.blocks, username)):
                 tmp_path = os.path.join(self._bii_paths.blocks, username,
                                         name)
                 if (os.path.isdir(tmp_path)):
                     block_name = BlockName("%s/%s" % (username, name))
                     if root_block == block_name:
                         self._biiout.warn(
                             "Skipping %s, it exists as root block" %
                             root_block)
                     elif (os.listdir(tmp_path)
                           ):  # If there is any file inside
                         result[block_name] = os.path.join(
                             self._bii_paths.blocks, block_name)
     if root_block:
         result[root_block] = self._bii_paths.project_root
     return result
示例#5
0
    def parent_update_test(self):
        block_name = BlockName("user/block")
        text = "[parent]\n # My comment\n"
        config = BiiConfig(text)
        self.assertEqual(config.dumps(), None)

        version = BlockVersion(block_name.default_block(), 0)
        config.parent = version
        dumped = config.dumps()
        self.assertEqual(dumped, "[parent]\n\tuser/block: 0\n")
        # Dump again, no changes
        self.assertEqual(config.dumps(), None)
        config2 = BiiConfig(dumped)
        self.assertEqual(config2.parent, config.parent)

        version2 = BlockVersion.loads("user/block(track): 2")
        config.parent = version2
        dumped = config.dumps()
        self.assertEqual(dumped, "[parent]\n\tuser/block(track): 2\n")
        # Dump again, no changes
        self.assertEqual(config.dumps(), None)
        config3 = BiiConfig(dumped)
        self.assertEqual(config3.parent, config.parent)
示例#6
0
    def testComputeLevels(self):
        g = DirectedGraph()
        for i in range(13):
            g.add_node(BlockName("user/mod%d" % i))

        g.add_edge(BlockName("user/mod0"), BlockName("user/mod2"))
        g.add_edge(BlockName("user/mod0"), BlockName("user/mod3"))
        g.add_edge(BlockName("user/mod0"), BlockName("user/mod4"))
        g.add_edge(BlockName("user/mod3"), BlockName("user/mod6"))
        g.add_edge(BlockName("user/mod4"), BlockName("user/mod7"))
        g.add_edge(BlockName("user/mod6"), BlockName("user/mod9"))
        g.add_edge(BlockName("user/mod7"), BlockName("user/mod9"))
        g.add_edge(BlockName("user/mod9"), BlockName("user/mod12"))

        g.add_edge(BlockName("user/mod1"), BlockName("user/mod5"))
        g.add_edge(BlockName("user/mod5"), BlockName("user/mod8"))
        g.add_edge(BlockName("user/mod8"), BlockName("user/mod10"))
        g.add_edge(BlockName("user/mod8"), BlockName("user/mod11"))

        g.add_edge(BlockName("user/mod10"), BlockName("user/mod12"))
        g.add_edge(BlockName("user/mod7"), BlockName("user/mod10"))

        result = g.get_levels()

        self.assertEquals(5, len(result))
        self.assertEquals(
            result[0],
            set([
                BlockName("user/mod12"),
                BlockName("user/mod11"),
                BlockName("user/mod2")
            ]))

        self.assertEquals(
            result[1], set([BlockName("user/mod9"),
                            BlockName("user/mod10")]))

        self.assertEquals(
            result[2],
            set([
                BlockName("user/mod6"),
                BlockName("user/mod7"),
                BlockName("user/mod8")
            ]))

        self.assertEquals(
            result[3],
            set([
                BlockName("user/mod3"),
                BlockName("user/mod4"),
                BlockName("user/mod5")
            ]))

        self.assertEquals(
            result[4], set([BlockName("user/mod0"),
                            BlockName("user/mod1")]))
 def block_test(self):
     self.assertEquals(self.sut.block(), BlockName("user/wizard"))
示例#8
0
 def long_blockname_test(self):
     wrong_bn = "dummy/dummy/block/master"
     with self.assertRaisesRegexp(InvalidNameException,
                                  '%s is not a valid BlockName.' % wrong_bn):
         BlockName(wrong_bn)
示例#9
0
 def blockname_underscore_test(self):
     bn = BlockName("user_1/block_1")
示例#10
0
 def setUp(self):
     self.testuser = BRLUser('user')
     self.edition_api = TestEditionAPI()
     self.hive_manager = HiveManager(self.edition_api, None, OutputStream())
     self.block_name = BlockName('dummy/myblock')
示例#11
0
def block_name(argument):
    try:
        return BlockName(argument)
    except InvalidNameException as e:
        raise BiiException('%s, e.g.: my_user/my_block' % e.message)
示例#12
0
 def _parse(self):
     # Data must be already validated
     tokens = self.split('/', 2)
     self._block = BlockName('/'.join(tokens[:2]), False)
     self._cell = CellName(tokens[2], False)
示例#13
0
 def _parse(self):
     tokens = self.split('/')
     self._user = BRLUser(tokens[0], False)
     self._block_name = BlockName('/'.join(tokens[1:3]), False)
     self._branch = tokens[3]