def iter(cls, owner=None, remote=False):
     """
     Yield the name of each blueprint.
     """
     if owner is None:
         owner = auth.login()
     gitname = cls.gitname(owner)
     with context_managers.breakout():
         if not os.path.isdir(gitname):
             return
         if remote:
             with context_managers.cd(gitname):
                 p = subprocess.Popen(
                     ['git', 'ls-remote', '--heads', 'origin'],
                     close_fds=True, stdout=subprocess.PIPE)
                 stdout, stderr = p.communicate()
                 if 0 != p.returncode:
                     return
                 for line in stdout.splitlines():
                     sha, refname = line.split()
                     if 'refs/heads' == os.path.dirname(refname):
                         yield os.path.basename(refname)
         else:
             repo = dulwich.repo.Repo(gitname)
             for refname in repo.refs.keys():
                 if 'refs/heads' == os.path.dirname(refname):
                     yield os.path.basename(refname)
    def repo(self):
        """
        Return a Dulwich Repo object pointing to the repository that belongs
        to the owner of this blueprint.

        Users of this property are responsible for ensuring they're in the
        base sandbox by using the `context_managers.breakout` context manager.
        """
        if hasattr(self, '_repo'):
            return self._repo
        gitname = self.gitname(self.owner)
        if not os.path.isdir(gitname):
            os.mkdir(gitname)
        try:
            self._repo = dulwich.repo.Repo.init_bare(gitname)
            with context_managers.cd(gitname):
                os.system(
                    'git remote add origin https://{0}:{1}@{2}/{3}'.format(
                        urllib.quote(self.owner, ''),
                        urllib.quote(auth.token(), ''),
                        'git.devstructure.com',
                        urllib.quote(os.path.basename(gitname), '')))
        except OSError:
            self._repo = dulwich.repo.Repo(gitname)
        return self._repo
 def push(cls, name, owner=None):
     """
     Push the named blueprint to the central Git repository.
     """
     if owner is None:
         owner = auth.login()
     gitname = cls.gitname(owner)
     with context_managers.breakout():
         with context_managers.cd(gitname):
             status = os.system('git push origin {0}'.format(name))
             if 0 != status:
                 raise KeyError(name)
 def pull(cls, name, owner=None):
     """
     Pull the named blueprint from the central Git repository.
     """
     if owner is None:
         owner = auth.login()
     gitname = cls.gitname(owner)
     with context_managers.breakout():
         with context_managers.cd(gitname):
             status = os.system('git remote update origin')
             if 0 != status:
                 raise KeyError(name)
             if os.path.exists('refs/heads/{0}'.format(name)):
                 return
             status = os.system(
                 'git branch {0} remotes/origin/{0}'.format(name))
             if 0 != status:
                 raise KeyError(name)
 def destroy(cls, name, owner=None, remote=False):
     """
     Destroy the named blueprint.
     """
     if owner is None:
         owner = auth.login()
     gitname = cls.gitname(owner)
     with context_managers.breakout():
         if remote:
             with context_managers.cd(gitname):
                 os.system('git push origin :{0}'.format(name))
         else:
             if not os.path.isdir(gitname):
                 raise KeyError(name)
             repo = dulwich.repo.Repo(gitname)
             refname = os.path.join('refs/heads', name)
             repo.refs[refname] # To induce KeyError.
             del repo.refs[refname]