Beispiel #1
0
    def _load_configuration(self):
        self.p4_user = getattr(settings, 'P4USER')
        if self.p4_user == "NOTSPECIFIED":
            raise ProjectImportError("Perforce username must be configured")

        self.p4_pass = getattr(settings, 'P4PASSWD')
        if self.p4_pass == "NOTSPECIFIED":
            raise ProjectImportError(
                "Perforce user credentials must be configured")
Beispiel #2
0
 def _pull(self):
     retcode = self._run_command('hg', 'pull')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (hg pull): %s" % (self.repo_url, retcode)
         )
     retcode = self._run_command('hg', 'update', '-C')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (hg update): %s" % (self.repo_url, retcode)
         )
Beispiel #3
0
 def _up(self):
     retcode = self._run_command('svn', 'revert', '--recursive', '.')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (svn revert): %s" %
             (self.repo_url, retcode))
     retcode = self._run_command('svn', 'up', '--accept', 'theirs-full')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (svn up): %s" %
             (self.repo_url, retcode))
Beispiel #4
0
 def _up(self):
     retcode = self._run_command('bzr', 'revert')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (bzr revert): %s" %
             (self.repo_url, retcode))
     retcode = self._run_command('bzr', 'up')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (bzr up): %s" %
             (self.repo_url, retcode))
Beispiel #5
0
 def up(self):
     retcode = self.run('svn', 'revert', '--recursive', '.')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (svn revert): %s" %
             (self.repo_url, retcode))
     retcode = self.run('svn', 'up', '--accept', 'theirs-full',
                        '--trust-server-cert', '--non-interactive')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (svn up): %s" %
             (self.repo_url, retcode))
Beispiel #6
0
    def _sync(self):
        retcode = self._run_on_client('sync')[0]
        if retcode != 0:
            raise ProjectImportError(
                "Failed to sync client '{workspace}'".format(
                    workspace=self._get_workspace_name()))

        # Force sync conf files because they get modified by the doc builder
        retcode = self._run_on_client('sync', '-f', '//...conf.py')[0]

        if retcode != 0:
            raise ProjectImportError("Failed to force sync .conf files")
Beispiel #7
0
 def pull(self):
     pull_output = self.run('hg', 'pull')
     if pull_output[0] != 0:
         raise ProjectImportError(
             ("Failed to get code from '%s' (hg pull): %s" %
              (self.repo_url, pull_output[0])))
     update_output = self.run('hg', 'update', '-C')[0]
     if update_output[0] != 0:
         raise ProjectImportError(
             ("Failed to get code from '%s' (hg update): %s" %
              (self.repo_url, pull_output[0])))
     return update_output
Beispiel #8
0
 def up(self):
     retcode = self.run('bzr', 'revert')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (bzr revert): %s" % (self.repo_url, retcode)
         )
     up_output = self.run('bzr', 'up')
     if up_output[0] != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (bzr up): %s" % (self.repo_url, retcode)
         )
     return up_output
Beispiel #9
0
 def clone(self):
     self.make_clean_working_dir()
     retcode = self.run('bzr', 'checkout', self.repo_url, '.')[0]
     if retcode != 0:
         raise ProjectImportError(
             ("Failed to get code from '%s' (bzr checkout): %s" %
              (self.repo_url, retcode)))
Beispiel #10
0
 def _co(self):
     retcode = self._run_command('svn', 'checkout', '--quiet',
                                 self.repo_url, '.')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (svn checkout): %s" %
             (self.repo_url, retcode))
Beispiel #11
0
 def fetch(self):
     code, out, err = self.run('git', 'fetch', '--prune')
     if code != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (git fetch): %s\n\nStderr:\n\n%s\n\n" % (
                 self.repo_url, code, err)
         )
Beispiel #12
0
 def _pull(self):
     retcode = self._run_command('git', 'fetch')[0]
     retcode = self._run_command('git', 'fetch', '-t')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (git fetch): %s" % (self.repo_url, retcode)
         )
Beispiel #13
0
 def clone(self):
     output = self.run('hg', 'clone', self.repo_url, '.')
     if output[0] != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (hg clone): %s" %
             (self.repo_url, output[0]))
     return output
Beispiel #14
0
 def clone(self):
     code, out, err = self.run('git', 'clone', '--recursive', '--quiet',
                               self.repo_url, '.')
     if code != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (git clone): %s" %
             (self.repo_url, code))
Beispiel #15
0
 def conf_file(self, version=LATEST):
     if self.conf_py_file:
         conf_path = os.path.join(self.checkout_path(version),
                                  self.conf_py_file)
         if os.path.exists(conf_path):
             log.info('Inserting conf.py file path from model')
             return conf_path
         else:
             log.warning("Conf file specified on model doesn't exist")
     files = self.find('conf.py', version)
     print files
     if not files:
         files = self.full_find('conf.py', version)
     print files
     if len(files) == 1:
         return files[0]
     for file in files:
         if file.find('doc', 70) != -1:
             return file
     # Having this be translatable causes this odd error:
     # ProjectImportError(<django.utils.functional.__proxy__ object at
     # 0x1090cded0>,)
     raise ProjectImportError(
         u"Conf File Missing. Please make sure you have a conf.py in your project."
     )
Beispiel #16
0
 def pull(self):
     code, out, err = self.run('git', 'fetch')
     code, out, err = self.run('git', 'fetch', '-t')
     if code != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (git fetch): %s" %
             (self.repo_url, code))
Beispiel #17
0
 def _clone(self):
     retcode = self._run_command(
         'git', 'clone', '--quiet',
         '%s.git' % self.repo_url.replace('.git', ''), '.')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (git clone): %s" %
             (self.repo_url, retcode))
Beispiel #18
0
 def clone(self):
     self.make_clean_working_dir()
     output = self.run('hg', 'clone', self.repo_url, '.')
     if output[0] != 0:
         raise ProjectImportError(
             ("Failed to get code from '%s' (hg clone): %s" %
              (self.repo_url, output[0])))
     return output
Beispiel #19
0
 def _reset(self):
     branch = self.fallback_branch
     if self.project.default_branch:
         branch = self.project.default_branch
     retcode = self._run_command('git', 'reset', '--hard', 'origin/%s' % branch)[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (git reset): %s" % (self.repo_url, retcode)
         )
Beispiel #20
0
 def co(self, identifier=None):
     if identifier:
         url = self.base_url + identifier
     else:
         url = self.repo_url
     retcode = self.run('svn', 'checkout', '--quiet', url, '.')[0]
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (svn checkout): %s" %
             (url, retcode))
Beispiel #21
0
    def _update_client(self):
        try:
            # Change client root for current project
            client = self.p4.fetch_client()
            client['Root'] = self.working_dir

            self.p4.save_client(client)
        except P4Exception as err:
            raise ProjectImportError(
                'Failed to update client "{}".\n{}\n'.format(
                    self.p4.client, err))
Beispiel #22
0
    def __init__(self, project, version):
        super(Backend, self).__init__(project, version)

        p4 = P4()  # P4 Python API

        try:
            if not p4.connected():
                p4.connect()
        except P4Exception as err:
            raise ProjectImportError(
                'Cannot connect to Perforce server.\n{}'.format(err))

        try:
            p4.run_login()
        except P4Exception as err:
            # Oops... any problems о_О
            raise ProjectImportError(
                'Cannot login to Perforce server.\n{}'.format(err))

        self.p4 = p4
 def conf_file(self, version='latest'):
     files = self.find('conf.py', version)
     if not files:
         files = self.full_find('conf.py', version)
     if len(files) == 1:
         return files[0]
     elif len(files) > 1:
         for file in files:
             if file.find('doc', 70) != -1:
                 return file
     else:
         raise ProjectImportError("Conf File Missing.")
Beispiel #24
0
 def co(self, identifier=None):
     self.make_clean_working_dir()
     if identifier:
         url = self.base_url + identifier
     else:
         url = self.repo_url
     retcode, out, err = self.run('svn', 'checkout', '--quiet', url, '.')
     if retcode != 0:
         raise ProjectImportError(
             "Failed to get code from '%s' (svn checkout): %s" %
             (url, retcode))
     return retcode, out, err
Beispiel #25
0
 def conf_file(self, version='latest'):
     if self.conf_py_file:
         log.debug('Inserting conf.py file path from model')
         return os.path.join(self.checkout_path(version), self.conf_py_file)
     files = self.find('conf.py', version)
     if not files:
         files = self.full_find('conf.py', version)
     if len(files) == 1:
         return files[0]
     elif len(files) > 1:
         for file in files:
             if file.find('doc', 70) != -1:
                 return file
     else:
         raise ProjectImportError(_("Conf File Missing."))
Beispiel #26
0
 def conf_file(self, version='latest'):
     if self.conf_py_file:
         log.debug('Inserting conf.py file path from model')
         return os.path.join(self.checkout_path(version), self.conf_py_file)
     files = self.find('conf.py', version)
     if not files:
         files = self.full_find('conf.py', version)
     if len(files) == 1:
         return files[0]
     for file in files:
         if file.find('doc', 70) != -1:
             return file
     # Having this be translatable causes this odd error:
     # ProjectImportError(<django.utils.functional.__proxy__ object at
     # 0x1090cded0>,)
     raise ProjectImportError(
         u"Conf File Missing. Please make sure you have a conf.py in your project.")
Beispiel #27
0
    def _create_workspace(self):
        workspace_name = self._get_workspace_name()
        filled_template = WORKSPACE_TEMPLATE.format(client_name=workspace_name,
                                                    owner=self.p4_user,
                                                    depot_path=self.repo_url,
                                                    root=self.working_dir,
                                                    hostname=gethostname(),
                                                    project_name=self.name)

        ps = subprocess.Popen(
            ['p4', '-u', self.p4_user, '-P', self.p4_ticket, 'client', '-i'],
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
        log.debug(
            ['p4', '-u', self.p4_user, '-P', self.p4_ticket, 'client', '-i'])

        out, err = ps.communicate(filled_template)
        if err:
            raise ProjectImportError(err)
Beispiel #28
0
    def _sync(self, identifier):
        depot_url = self._get_depot_url()

        if identifier:
            # Use a specified changelist or label
            depot_url += identifier

        try:
            info = self.p4.run_sync('-f', depot_url)
        except P4Exception as err:
            raise ProjectImportError(
                "Failed to sync code from '{}'. Error:\n{}\n".format(
                    depot_url, err))

        for rootdir, dirnames, filenames in os.walk(self.working_dir):
            for fname in filenames:
                pname = os.path.join(rootdir, fname)
                os.chmod(pname, 0o777)

        return info
Beispiel #29
0
def update_imported_docs(version_pk, api=None):
    """
    Check out or update the given project's repository.
    """
    if api is None:
        api = tastyapi.api

    version_data = api.version(version_pk).get()
    version = make_api_version(version_data)
    project = version.project
    ret_dict = {}

    # Make Dirs
    if not os.path.exists(project.doc_path):
        os.makedirs(project.doc_path)

    if not project.vcs_repo():
        raise ProjectImportError(
            ("Repo type '{0}' unknown".format(project.repo_type)))

    with project.repo_nonblockinglock(version=version,
                                      max_lock_age=getattr(
                                          settings, 'REPO_LOCK_SECONDS', 30)):

        before_vcs.send(sender=version)
        # Get the actual code on disk
        if version:
            log.info(
                LOG_TEMPLATE.format(
                    project=project.slug,
                    version=version.slug,
                    msg='Checking out version {slug}: {identifier}'.format(
                        slug=version.slug, identifier=version.identifier)))
            version_slug = version.slug
            version_repo = project.vcs_repo(version_slug)
            ret_dict['checkout'] = version_repo.checkout(version.identifier, )
        else:
            # Does this ever get called?
            log.info(
                LOG_TEMPLATE.format(project=project.slug,
                                    version=version.slug,
                                    msg='Updating to latest revision'))
            version_slug = 'latest'
            version_repo = project.vcs_repo(version_slug)
            ret_dict['checkout'] = version_repo.update()

        after_vcs.send(sender=version)

        # Update tags/version

        version_post_data = {'repo': version_repo.repo_url}

        if version_repo.supports_tags:
            version_post_data['tags'] = [{
                'identifier': v.identifier,
                'verbose_name': v.verbose_name,
            } for v in version_repo.tags]

        if version_repo.supports_branches:
            version_post_data['branches'] = [{
                'identifier': v.identifier,
                'verbose_name': v.verbose_name,
            } for v in version_repo.branches]

        try:
            apiv2.project(project.pk).sync_versions.post(version_post_data)
        except Exception, e:
            print "Sync Versions Exception: %s" % e.message
Beispiel #30
0
    def append_conf(self, **kwargs):
        """Modify the given ``conf.py`` file from a whitelisted user's project.
        """

        # Pull config data
        try:
            conf_py_path = version_utils.get_conf_py_path(self.version)
        except ProjectImportError:
            self._write_config()
            self.create_index(extension='rst')

        project = self.version.project
        # Open file for appending.
        try:
            outfile = codecs.open(project.conf_file(self.version.slug),
                                  encoding='utf-8',
                                  mode='a')
        except IOError:
            trace = sys.exc_info()[2]
            raise ProjectImportError('Conf file not found'), None, trace
        outfile.write("\n")
        conf_py_path = version_utils.get_conf_py_path(self.version)
        remote_version = version_utils.get_vcs_version_slug(self.version)
        github_info = version_utils.get_github_username_repo(self.version)
        bitbucket_info = version_utils.get_bitbucket_username_repo(
            self.version)
        if github_info[0] is None:
            display_github = False
        else:
            display_github = True
        if bitbucket_info[0] is None:
            display_bitbucket = False
        else:
            display_bitbucket = True

        rtd_ctx = Context({
            'current_version':
            self.version.slug,
            'project':
            project,
            'settings':
            settings,
            'static_path':
            STATIC_DIR,
            'template_path':
            TEMPLATE_DIR,
            'conf_py_path':
            conf_py_path,
            'api_host':
            getattr(settings, 'SLUMBER_API_HOST', 'https://readthedocs.org'),
            # GitHub
            'github_user':
            github_info[0],
            'github_repo':
            github_info[1],
            'github_version':
            remote_version,
            'display_github':
            display_github,
            # BitBucket
            'bitbucket_user':
            bitbucket_info[0],
            'bitbucket_repo':
            bitbucket_info[1],
            'bitbucket_version':
            remote_version,
            'display_bitbucket':
            display_bitbucket,
            'commit':
            self.version.project.vcs_repo(self.version.slug).commit,
        })

        # Avoid hitting database and API if using Docker build environment
        if getattr(settings, 'DONT_HIT_API', False):
            rtd_ctx['versions'] = project.active_versions()
            rtd_ctx['downloads'] = self.version.get_downloads(pretty=True)
        else:
            rtd_ctx['versions'] = project.api_versions()
            rtd_ctx['downloads'] = (apiv2.version(
                self.version.pk).get()['downloads'])

        rtd_string = template_loader.get_template(
            'doc_builder/conf.py.tmpl').render(rtd_ctx)
        outfile.write(rtd_string)