Esempio n. 1
0
    def find_my_projects(cls, account, type):
        """Find projects for a user, based on hers/his needs: to practice or
        to learn. Save the data in the database.
        """
        connection = Github(login_or_token=account.github_token)

        # Find user Skills
        repos = connection.get_user().get_repos()
        cls.find_account_skills(account, repos)

        # Search for projects based on what skills he wants to practice
        wanted_skills = cls.get_account_wanted_skills(account, type)
        # If the user doesn't have any skills and she/he wants to practice,
        # return none, let him start a project on his own / learn.
        if len(wanted_skills) == 0 and type == ProjectTypes.PRACTICE:
            return

        # We need the names for the GH query.
        wanted_languages = [skill.name.lower() for skill in wanted_skills]

        # Set query to find an active project
        stars = '%d..%d' % (MIN_STARS, MAX_STARS)
        forks = '%d..%d' % (MIN_FORKS, MAX_FORKS)
        pushed = '>%s' % get_last_month()
        qualifiers = {'stars': stars, 'forks': forks, 'pushed': pushed}

        # Search GH API for projects per each language.
        repos = []
        for wanted_language in wanted_languages:
            query = 'language:%s' % wanted_language

            repos_per_lang = connection.search_repositories(
                query=query, sort='stars', order='desc', **qualifiers)

            repos.extend(repos_per_lang.get_page(0)[:MAX_PROJECTS])

        # Save the projects which are a match for the user.
        cls.find_account_projects(account, repos, type)
Esempio n. 2
0
class GitHub:

    def __init__(self, config: Config) -> None:
        self.__config: Config = config

        self.__authenticate_git_user()
        self.__initialize_repository_object()

    def __initialize_repository_object(self):
        self.__cache = GitHubCache()
        try:
            org = self.__github.get_organization(self.__config.git_repo_org)
            if self.__config.debug:
                log_debug("Organization found.")
        except UnknownObjectException:
            if self.__config.debug:
                log_debug("Organization not found. Try interpreting " + self.__config.git_repo_org + " as user...")
            org = self.__github.get_user(self.__config.git_repo_org)
            if self.__config.debug:
                log_debug("User found.")

        self.__repo: Repository = org.get_repo(self.__config.git_repo_name)

    # This script is responsible for the authentication of git user
    def __authenticate_git_user(self):
        while True:
            if not hasattr(self.__config, "two_factor_authentication"):
                self.__config.two_factor_authentication = prompt_yesno_question(
                    "Are you using two-factor authentication on GitHub?")
            if self.__config.two_factor_authentication:
                self.__config.git_token = getpass.getpass("> Please enter your token: ")
                while not self.__config.git_token:
                    self.__config.git_token = getpass.getpass("> Please enter your token: ")
            else:
                if not hasattr(self.__config, "git_username"):
                    self.__config.git_username = prompt_enter_value("your git user name")
                else:
                    log_info("The stored Github username is {}".format(self.__config.git_username))
                self.__config.git_password = getpass.getpass("> Please enter your password: "******"> Please enter your password: "******"Authenticated.")
                break
            except BadCredentialsException:
                log_info("Authentication error, please try again.")
                continue

    def __login(self):
        if hasattr(self.__config, "git_token") and self.__config.git_token:
            self.__github = Github(self.__config.git_token)
        else:
            self.__github = Github(self.__config.git_username, self.__config.git_password)

    def find_issue(self, issue_number: int) -> Issue:
        '''Search for the Release issue to be used, if not found, exit'''
        # caching!
        if issue_number in self.__cache.issues:
            log_info("Issue with number " + str(issue_number) + " found.")
            return self.__cache.issues[issue_number]
        else:
            log_debug("Issue not found in cache, retrieving from GitHub...")

        try:
            self.__cache.issues.update({issue_number: self.__repo.get_issue(issue_number)})
            log_info("Issue with number " + str(issue_number) + " found.")
            return self.__cache.issues[issue_number]
        except UnknownObjectException:
            return None

    def create_issue(self, title: str, milestone: Milestone, body: str) -> int:
        '''Function creates an issue in git hub with title,milestone,body,labels passed'''
        if self.__config.dry_run:
            log_info_dry('Skipping creation of issue with title ' + str(title))
            return 0
        if self.__config.debug and not prompt_yesno_question(
            '[DEBUG] Would now create GitHub issue with title="' + title + '", milestone=' + str(
                milestone) + '. Continue?'):
            sys.exit()

        log_info('Create GitHub issue with title "' + title + '"...')

        try:
            issue: Issue = self.__repo.create_issue(title=title, body=body, milestone=milestone,
                                                    labels=[self.__config.issue_label_name, "CI/CD"],
                                                    assignee=self.__github.get_user().login)
            self.__config.github_issue_no = issue.number
            self.__cache.issues.update({issue.number: issue})
            return self.__config.github_issue_no
        except GithubException as e:
            print(str(e))
            return 0

    def __request_milestone_list(self) -> PaginatedList:
        # caching!
        try:
            return self.__cache.milestones
        except AttributeError:
            log_debug("Milestones not found in cache, retrieving from GitHub...")

        try:
            milestones: PaginatedList = self.__repo.get_milestones(state="all")
            self.__cache.milestones = milestones
            return milestones
        except GithubException as e:
            log_error('Could not retrieve milestones')
            print(str(e))
            sys.exit()

    def find_release_milestone(self) -> Milestone:
        milestones: PaginatedList = self.__request_milestone_list()

        for milestone in milestones:
            milestone_title_in_git = milestone.title
            if self.__config.expected_milestone_name in milestone_title_in_git:
                return milestone
        return None

    def find_milestone(self, module: str, version: str) -> Milestone:
        milestones: PaginatedList = self.__request_milestone_list()

        search_title = self.__config.expected_raw_milestone_names.get(module) + version
        log_debug("Trying to search milestone: " + search_title)
        for milestone in milestones:
            if milestone.title == search_title:
                return milestone
        return None

    def create_next_release_milestone(self) -> Milestone:
        new_mile_title = self.__config.expected_milestone_name.replace(self.__config.release_version,
                                                                       self.__config.next_version)
        if self.__config.dry_run:
            log_info_dry("Would now create a new milestone with title '" + new_mile_title + "'.")
            return None

        log_info("Creating milestone '" + new_mile_title + "' for next release...")
        try:
            milestone: Milestone = self.__repo.create_milestone(title=new_mile_title, state="open")
            log_info("New milestone created!")
            return milestone
        except GithubException as e:
            log_info("Could not create milestone!")
            print(str(e))
            return None

    def create_release(self, closed_milestone: Milestone, core_version_in_eclipse_pom: str) -> GitRelease:
        if self.__config.dry_run:
            log_info_dry("Would create a new GitHub release")
            return None

        url_milestone = self.__config.github_closed_milestone_url(closed_milestone.number)
        release_title = self.__config.cobigenwiki_title_name + " v" + self.__config.release_version
        release_text = "[ChangeLog](" + url_milestone + ")"
        if "eclipse" in self.__config.branch_to_be_released and core_version_in_eclipse_pom:
            cobigen_core_milestone: Milestone = self.find_milestone("dev_core", core_version_in_eclipse_pom)
            if cobigen_core_milestone.state == "closed":
                core_url_milestone = self.__config.github_closed_milestone_url(cobigen_core_milestone.number)
                release_text = release_text + "\n also includes \n" + "[ChangeLog CobiGen Core](" + core_url_milestone + ")"
            else:
                log_info("Core version " + core_version_in_eclipse_pom +
                         " is not yet released. This should be released before releasing cobigen-eclipse")
                sys.exit()

        try:
            release: GitRelease = self.__repo.create_git_release(self.__config.tag_name, release_title,
                                                                 release_text, draft=False, prerelease=False,
                                                                 target_commitish="master")

            content_type = "application/java-archive"
            if self.__config.branch_to_be_released == self.__config.branch_eclipseplugin:
                content_type = "application/zip"

            for root, dirs, files in os.walk(
                os.path.join(self.__config.build_folder_abs, self.__config.build_artifacts_root_search_path)):
                dirs[:] = [d for d in dirs if
                           d not in [".settings", "src", "repository", "repository-upload", "classes", "apidocs"]]
                for fname in files:
                    fpath = os.path.join(root, fname)
                    # To prevent uploading of unnecessary zip/jar files.
                    if (fname.endswith("jar") or fname.endswith("zip")) and self.__config.release_version in fname and 'nexus-staging' in fpath:
                        log_info("Uploading file " + fname + " from " + fpath + " ...")
                        try:
                            asset: GitReleaseAsset = release.upload_asset(path=fpath, label=fname,
                                                                          content_type=content_type)
                            log_info("Uploaded " + str(asset.size) + "kb!")
                        except GithubException as e:
                            log_error("Upload failed!")
                            if self.__config.debug:
                                print(str(e))

            # workaround as of https://github.com/PyGithub/PyGithub/issues/779
            self.__login()
            self.__initialize_repository_object()

            return release
        except GithubException as e:
            log_error("Could not create release.")
            print(str(e))
            sys.exit()
Esempio n. 3
0
import sys
import os
from github.MainClass import Github

foldername = str(sys.argv[1])
path = os.environ.get('mp')  # add projects dirctory to the env vars
token = os.environ.get('gt')  # add github token to the env vars
_dir = path + '/' + foldername

g = Github(token)
user = g.get_user()
login = user.login
repo = user.create_repo(foldername)

commands = [
    f'echo "# {repo.name}" >> README.md', 'git init',
    f'git remote add origin https://github.com/{login}/{foldername}.git',
    'git add .', 'git commit -m "Initial commit"', 'git push -u origin master'
]

os.mkdir(_dir)
os.chdir(_dir)

for c in commands:
    os.system(c)

print(f'{foldername} created locally')
os.system('code .')