Ejemplo n.º 1
0
    def set_real_version(self):
        path = os.path.join(self.path, "tmp")

        try:
            os.path.isfile(self.path + "/PKGBUILD")
            output("source " + self.path +
                   "/PKGBUILD; type pkgver &> /dev/null")
        except:
            return

        exit_code = self._execute(f"""
        mkdir -p ./tmp;
        makepkg \
            SRCDEST=./tmp \
            --nobuild \
            --nodeps \
            --nocheck \
            --nocolor \
            --noconfirm \
            --skipinteg; \
        """)

        shutil.rmtree(path)

        if exit_code > 0:
            self.errors.append("An error append when executing makepkg")
def _check_ssh_connection():
    script = "ssh -i ./deploy_key -p %i -q %s@%s [[ -d %s ]] && echo 1 || echo 0" % (
        conf.ssh_port, conf.ssh_user, conf.ssh_host, conf.ssh_path)

    validate(error="ssh connection could not be established.",
             target="ssh address",
             valid=(output(script) is "1"))
Ejemplo n.º 3
0
def _check_git_branch():
    branch = output("git rev-parse --abbrev-ref HEAD")

    validate(
        error="This program needs to be on master branch before to build.",
        target="git repository",
        valid=(branch == "master"))
Ejemplo n.º 4
0
    def _get_schema(self, name):
        schema = {}
        is_package = False
        lines = output("pacman -Si %s" % name).split("\n")
        keys = {
            "repository": "Repository",
            "description": "Description",
            "version": "Version",
            "date": "Build Date",
        }

        for line in lines:
            if is_package is False:
                if line.startswith(keys["repository"]) and  self._strip_key(line) == conf.db:
                    is_package = True
            else:
                for key in keys:
                    if line.startswith(keys[key]):
                        schema[key] = self._strip_key(line)

                        if key == "date":
                            parameters = schema[key].split(" ")
                            schema[key] = parameters[1] + " " + parameters[2] + " " + parameters[3]

                if line == "":
                    is_package = False

        return schema
Ejemplo n.º 5
0
    def pull_main_repository(self):
        if IS_DEVELOPMENT or update_disabled("bot"):
            return

        print("Updating repository bot:")

        try:
            output("git remote | grep upstream")
        except:
            self._execute(f"git remote add upstream {UPSTREAM_REPOSITORY}")

        self._execute(
            "git fetch upstream; "
            "git pull --no-ff --no-commit -X theirs upstream master; "
            "git reset HEAD README.md; "
            "git checkout -- README.md; "
            "git commit -m 'Core: Pull main repository project';")

        print("  [ ✓ ] up to date")
Ejemplo n.º 6
0
    def deploy(self):
        if output(
                "git branch -r --contains $(git log --pretty=format:'%h' -n 1) | sed s/^...//"
        ):
            return

        if remote_repository() and len(conf.updated) > 0:
            self._deploy_ssh()

        self._deploy_git()
Ejemplo n.º 7
0
    def verify_dependencies(self):
        self.depends = extract(self.path, "depends")
        self.makedepends = extract(self.path, "makedepends")
        self._dependencies = (self.depends + " " + self.makedepends).strip()

        if self._dependencies == "":
            return

        for dependency in self._dependencies.split(" "):
            try:
                output("pacman -Sp '" + dependency + "' &>/dev/null")
                continue
            except:
                if dependency not in conf.packages:
                    sys.exit(
                        "\nError: %s is not part of the official package and can't be found in pkg directory."
                        % dependency)

                if dependency not in conf.updated:
                    repository.build_package(dependency, True)
Ejemplo n.º 8
0
    def verify_dependencies(self):
        redirect = False

        self.depends = extract(self.path, "depends")
        self.makedepends = extract(self.path, "makedepends")
        self._dependencies = (self.depends + " " + self.makedepends).strip()

        if self._dependencies == "":
            return

        for dependency in self._dependencies.split(" "):
            try:
                output("pacman -Sp '" + dependency + "' &>/dev/null")
                continue
            except:
                redirect = False

                if dependency not in conf.packages:
                    dependency = dependency.split(">")[0].split("<")[0]

                    if output(
                            "git ls-remote https://aur.archlinux.org/%s.git" %
                            dependency):
                        redirect = True
                        self._add_to_pkg(dependency)
                    else:
                        sys.exit(
                            "\nError: %s is not part of the official package and can't be found in pkg directory."
                            % dependency)

                if redirect or dependency not in conf.updated:
                    if (len(conf.updated) > 0 and IS_TRAVIS):
                        return

                    print("Install missing dependencies before to build it.")

                    redirect = True
                    repository.build_package(dependency, True, self.is_testing)

        if redirect is True and IS_TRAVIS is False:
            self.separator()
Ejemplo n.º 9
0
    def create(self):
        if IS_DEVELOPMENT:
            return

        packages = output("pacman -Slq %s | sort" % conf.db)

        if packages.startswith("error: repository"):
            return
        else:
            packages = packages.split("\n")

        for name in packages:
            schema = self._get_schema(name)
            description = schema["description"]
            version = schema["version"]
            date = schema["date"]
            path = self._get_file_location(name, version)

            for prefix in ["html", "markdown"]:
                tr = getattr(self, prefix + "_table_tr")
                tr = tr.replace("$path", path)
                tr = tr.replace("$name", name)
                tr = tr.replace("$date", date)
                tr = tr.replace("$version", version)

                if prefix == "markdown":
                    description = description.replace("\\", "\\\\")
                    description = description.replace("*", "\*")
                    description = description.replace("_", "\_")
                    description = description.replace("|", "\|")

                tr = tr.replace("$description", description)

                tbody = getattr(self, prefix + "_table_tbody")
                setattr(self, prefix + "_table_tbody", tbody + tr)

        # Create html mirror
        if remote_repository():
            self._move_to_mirror()
            self._replace_html_variables()
            self._compress()

        # Creade README.md
        if update_disabled("readme"):
            return

        self._move_to_root()
        self._replace_markdown_variables()
        self._commit_readme()
def _check_github_token():
    valid = False
    user = git_remote_path().split("/")[1]
    response = output("curl -su %s:%s https://api.github.com/user" %
                      (user, conf.github_token))
    content = json.loads(response)

    if "login" in content:
        valid = True

    validate(
        error=
        "An error occured while trying to connect to your github repository with your encrypted token.\nPlease make sure that your token is working.",
        target="github token api",
        valid=valid)
    def clean_mirror(self):
        if not os.path.exists(f"{paths.mirror}/{conf.db}.db"):
            return

        database = output(f"pacman -Sl {conf.db}")
        files = self._get_mirror_packages()
        packages = []

        for package in database.split("\n"):
            split = package.split(" ")
            packages.append(split[1] + "-" + split[2] + "-")

        for fp in files:
            if self._in_mirror(packages, fp) is False:
                os.remove(paths.mirror + "/" + fp)
Ejemplo n.º 12
0
    def clean_database(self):
        in_directory = []
        in_database = output("pacman -Slq %s | sort" % conf.db)

        if in_database.startswith("error: repository"):
            return
        else:
            in_database = in_database.split("\n")

        for name in conf.packages:
            directory = paths.pkg + "/" + name

            try:
                open(directory + "/PKGBUILD")
            except FileNotFoundError:
                continue

            in_directory = in_directory + extract(directory,
                                                  "pkgname").split(" ")

        os.chdir(paths.mirror)
        useless_packages = set(in_database) - set(in_directory)

        if len(useless_packages) == 0:
            return

        print("Remove packages in database:")

        for name in (set(in_database) - set(in_directory)):
            schema = self._get_schema(name)
            path = name + "-" + schema["version"]

            strict_execute(f"""
            repo-remove \
                --nocolor \
                --remove \
                {paths.mirror}/{conf.db}.db.tar.gz \
                {name}
            """)
Ejemplo n.º 13
0
    def _get_schema(self, name):
        schema = {}
        is_package = False

        path = paths.mirror + "/" + conf.db + ".db"
        execute_quietly("cp %s /var/lib/pacman/sync/{conf.db}" % path)

        try:
            lines = output("pacman -Si %s" % name).split("\n")
        except:
            return

        keys = {
            "repository": "Repository",
            "description": "Description",
            "version": "Version",
            "date": "Build Date",
        }

        for line in lines:
            if is_package is False:
                if line.startswith(keys["repository"]) and self._strip_key(
                        line) == conf.db:
                    is_package = True
            else:
                for key in keys:
                    if line.startswith(keys[key]):
                        schema[key] = self._strip_key(line)

                        if key == "date":
                            parameters = schema[key].split(" ")
                            schema[key] = parameters[1] + " " + parameters[
                                2] + " " + parameters[3]

                if line == "":
                    is_package = False

        return schema
Ejemplo n.º 14
0
    def prepare_mirror(self):
        remote = output("git ls-files " + paths.mirror +
                        " | awk -F / '{print $2}'").split("\n")
        files = os.listdir(paths.mirror)

        for f in ["validation_token", "packages_checked"]:
            if f in files:
                files.remove(f)

        if len(files) != len(remote) or not remote_repository():
            return

        print(bold("Pull remote mirror directory files:"))

        strict_execute(f"""
        scp -i {paths.base}/deploy_key -P {conf.ssh_port} \
            {conf.ssh_user}@{conf.ssh_host}:{conf.ssh_path}/* \
            {paths.mirror}/;

        ssh -i {paths.base}/deploy_key -p {conf.ssh_port} \
            {conf.ssh_user}@{conf.ssh_host} \
            touch {conf.ssh_path}/*;
        """)
Ejemplo n.º 15
0
def title(text):
    column = int(output("tput cols")) - 4
    line = "── %s " % text.capitalize()
    line += "─" * (column - len(text))

    return bold(line)
Ejemplo n.º 16
0
 def get_last_change(self, path):
     last_change = output("git log -1 --format='%at' -- " + path)
     timestamp = datetime.fromtimestamp(int(last_change))
     return timestamp.strftime("%d %h %Y")