def ensure_remote(self, url):
        if self.original_url == self.url:
            remote_name = "origin"
        else:
            remote_name = utils.url_directory_name(url)

        command = [
            self.ostree,
            "remote",
            "add",
            "--if-not-exists",
            "--repo",
            self.mirror,
            remote_name,
            url,
        ]

        if self.gpg_key_path:
            command.extend(["--gpg-import", self.gpg_key_path])
        else:
            command.extend(["--no-gpg-verify"])

        self.call(command, fail="Failed to configure origin {}".format(url))

        return remote_name
    def configure(self, node):

        node.validate_keys(
            ["url", "ref", "track", "gpg-key", *Source.COMMON_CONFIG_KEYS]
        )

        self.ostree = None

        self.original_url = node.get_str("url")
        self.url = self.translate_url(self.original_url)
        self.ref = node.get_str("ref", None)
        self.tracking = node.get_str("track", None)
        self.mirror = os.path.join(
            self.get_mirror_directory(),
            utils.url_directory_name(self.original_url),
        )

        # At this point we now know if the source has a ref and/or a track.
        # If it is missing both then we will be unable to track or build.
        if self.ref is None and self.tracking is None:
            raise SourceError(
                "{}: OSTree sources require a ref and/or track".format(self),
                reason="missing-track-and-ref",
            )

        # (optional) Not all repos are signed. But if they are, get the gpg key
        self.gpg_key_path = None
        gpg_key_node = node.get_scalar("gpg-key", None)
        if not gpg_key_node.is_none():
            self.gpg_key = self.node_get_project_path(
                gpg_key_node, check_is_file=True
            )
            self.gpg_key_path = os.path.join(
                self.get_project_directory(), self.gpg_key
            )
예제 #3
0
 def _get_mirror_dir(self):
     return os.path.join(
         self.cargo.get_mirror_directory(),
         utils.url_directory_name(self.cargo.url),
         self.name,
         self.version,
     )
예제 #4
0
    def configure(self, node):
        self.node_validate(node, ['match', 'path', 'url', 'ref', 'gpg'] + Source.COMMON_CONFIG_KEYS)

        self.original_url = self.node_get_member(node, str, 'url', None)
        if self.original_url:
            self.url = self.translate_url(self.original_url)
        else:
            path = self.node_get_project_path(node, 'path')
            fullpath = os.path.join(self.get_project_directory(), path)
            self.url = self.original_url = 'file://{}'.format(fullpath)
        self.ref = self.node_get_member(node, list, 'ref', None)
        if self.ref is not None:
            for r in self.ref:
                self.node_validate(r, ['ref', 'checksum'])
        self.mirror = os.path.join(self.get_mirror_directory(),
                                   utils.url_directory_name(self.original_url))

        gpg = self.node_get_project_path(node, 'gpg')
        self.gpg = os.path.join(self.get_project_directory(), gpg)
        self.match = self.node_get_member(node, str, 'match', None)

        self.repo = OSTree.Repo.new(Gio.File.new_for_path(self.mirror))
        if os.path.isdir(self.mirror):
            self.repo.open()
        else:
            os.makedirs(self.mirror)
            self.repo.create(OSTree.RepoMode.ARCHIVE)
            self.repo.remote_add('origin', self.url, None, None)
            gpgfile = Gio.File.new_for_path(self.gpg)
            self.repo.remote_gpg_import('origin', gpgfile.read(None), None, None)
예제 #5
0
    def _fetch(self, alias_override=None):
        url = self.source.translate_url(self.url,
                                        alias_override=alias_override,
                                        primary=self.primary)

        mirror = self.mirror_path()

        if alias_override:
            remote_name = utils.url_directory_name(alias_override)
            _, remotes = self.source.check_output(
                [self.source.host_git, 'remote'],
                fail="Failed to retrieve list of remotes in {}".format(mirror),
                cwd=mirror)
            if remote_name not in remotes:
                self.source.call(
                    [self.source.host_git, 'remote', 'add', remote_name, url],
                    fail="Failed to add remote {} with url {}".format(
                        remote_name, url),
                    cwd=mirror)
        else:
            remote_name = "origin"

        self.source.call(
            [
                self.source.host_git, 'fetch', remote_name, '--prune',
                '--tags', '--force'
            ],
            fail="Failed to fetch from remote git repository: {}".format(url),
            fail_temporarily=True,
            cwd=self.mirror)
예제 #6
0
파일: pip.py 프로젝트: wjt/buildstream
 def _mirror(self):
     if not self.ref:
         return None
     return os.path.join(
         self.get_mirror_directory(),
         utils.url_directory_name(self.original_url),
         hashlib.sha256(self.ref.encode()).hexdigest(),
     )
예제 #7
0
 def configure(self, node):
     self.original_url = node.get_str("url")
     self.ref = node.get_str("ref", None)
     self.url = self.translate_url(self.original_url)
     self._mirror_dir = os.path.join(
         self.get_mirror_directory(),
         utils.url_directory_name(self.original_url),
     )
     self._warn_deprecated_etag(node)
예제 #8
0
 def set_ref(self, ref):
     self.ref = ref
     if ref is None:
         self.fetch_mirror = None
     else:
         ref_dirname = utils.url_directory_name('{}#{}'.format(
             self.url, ref))
         self.fetch_mirror = os.path.join(
             self.source.get_mirror_directory(), ref_dirname)
예제 #9
0
    def __init__(self, source, path, url, ref, *, primary=False, tags=None):

        super().__init__()
        self.source = source
        self.path = path
        self.url = url
        self.ref = ref
        self.tags = tags or []
        self.primary = primary
        self.mirror = os.path.join(source.get_mirror_directory(),
                                   utils.url_directory_name(url))
예제 #10
0
 def _locked(self):
     lockdir = os.path.join(self.get_mirror_directory(), "locks")
     lockfile = os.path.join(
         lockdir,
         utils.url_directory_name(self.original_url) + ".lock")
     os.makedirs(lockdir, exist_ok=True)
     with open(lockfile, "w") as lock:
         fcntl.flock(lock, fcntl.LOCK_EX)
         try:
             yield
         finally:
             fcntl.flock(lock, fcntl.LOCK_UN)
예제 #11
0
    def __init__(self,
                 source,
                 path,
                 url,
                 ref,
                 *,
                 primary=False,
                 full_clone=False):

        super().__init__()
        self.source = source
        self.path = path
        self.url = url
        self.primary = primary
        self.mirror = os.path.join(source.get_mirror_directory(),
                                   utils.url_directory_name(url))

        self.mark_download_url(url)
        self.full_clone = full_clone
        self.set_ref(ref)
예제 #12
0
 def _get_mirror_dir(self):
     return os.path.join(self.get_mirror_directory(),
                         utils.url_directory_name(self.original_url))
예제 #13
0
 def dirpath(url, aliases):
     dirname = url_directory_name(resolve_url(url, aliases))
     return os.path.join(sourcedir, kind, dirname)