def _createBranch(self, registrant, branch_path): """The guts of the create branch method. Raises exceptions on error conditions. """ to_link = None if branch_path.startswith(BRANCH_ALIAS_PREFIX + '/'): branch_path = branch_path[len(BRANCH_ALIAS_PREFIX) + 1:] if branch_path.startswith('~'): data, branch_name = self._parseUniqueName(branch_path) else: tokens = branch_path.split('/') data = { 'person': registrant.name, 'product': tokens[0], } branch_name = 'trunk' # check the series product = self._product_set.getByName(data['product']) if product is not None: if len(tokens) > 1: series = product.getSeries(tokens[1]) if series is None: raise faults.NotFound( "No such product series: '%s'." % tokens[1]) else: to_link = ICanHasLinkedBranch(series) else: to_link = ICanHasLinkedBranch(product) # don't forget the link. else: data, branch_name = self._parseUniqueName(branch_path) owner = self._person_set.getByName(data['person']) if owner is None: raise faults.NotFound( "User/team '%s' does not exist." % (data['person'],)) # The real code consults the branch creation policy of the product. We # don't need to do so here, since the tests above this layer never # encounter that behaviour. If they *do* change to rely on the branch # creation policy, the observed behaviour will be failure to raise # exceptions. if not registrant.inTeam(owner): raise faults.PermissionDenied( ('%s cannot create branches owned by %s' % (registrant.displayname, owner.displayname))) product = sourcepackage = None if data['product'] == '+junk': product = None elif data['product'] is not None: if not valid_name(data['product']): raise faults.InvalidProductName(escape(data['product'])) product = self._product_set.getByName(data['product']) if product is None: raise faults.NotFound( "Project '%s' does not exist." % (data['product'],)) elif data['distribution'] is not None: distro = self._distribution_set.getByName(data['distribution']) if distro is None: raise faults.NotFound( "No such distribution: '%s'." % (data['distribution'],)) distroseries = self._distroseries_set.getByName( data['distroseries']) if distroseries is None: raise faults.NotFound( "No such distribution series: '%s'." % (data['distroseries'],)) sourcepackagename = self._sourcepackagename_set.getByName( data['sourcepackagename']) if sourcepackagename is None: try: sourcepackagename = self._sourcepackagename_set.new( data['sourcepackagename']) except InvalidName: raise faults.InvalidSourcePackageName( data['sourcepackagename']) sourcepackage = self._factory.makeSourcePackage( distroseries, sourcepackagename) else: raise faults.PermissionDenied( "Cannot create branch at '%s'" % branch_path) branch = self._factory.makeBranch( owner=owner, name=branch_name, product=product, sourcepackage=sourcepackage, registrant=registrant, branch_type=BranchType.HOSTED) if to_link is not None: if registrant.inTeam(to_link.product.owner): to_link.branch = branch else: self._branch_set._delete(branch) raise faults.PermissionDenied( "Cannot create linked branch at '%s'." % branch_path) return branch.id