You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by gi...@apache.org on 2020/12/29 13:14:44 UTC

[buildstream] 15/16: ostree.py: Adapt to use of alias overrides

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch jonathan/mirror-client-sourcedownloader-tidy
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 97f3408bbca0d095dbd50bb9cf0cca12d7a26bd5
Author: Jonathan Maw <jo...@codethink.co.uk>
AuthorDate: Fri Jun 22 15:06:59 2018 +0100

    ostree.py: Adapt to use of alias overrides
    
    Because an OSTree repo may have its remote changed, the standard
    behaviour of using OSTree.RemoteRepoChange.ADD_IF_NOT_EXISTS isn't
    sufficient.
---
 buildstream/_ostree.py                |  9 +++++++-
 buildstream/plugins/sources/ostree.py | 40 ++++++++++++++++++-----------------
 2 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/buildstream/_ostree.py b/buildstream/_ostree.py
index e40df5f..6c6fadd 100644
--- a/buildstream/_ostree.py
+++ b/buildstream/_ostree.py
@@ -535,8 +535,15 @@ def configure_remote(repo, remote, url, key_url=None):
         options = vd.end()
 
     try:
+        # If it exists, we want to change it, so ADD_IF_NOT_EXISTS is insufficient
         repo.remote_change(None,      # Optional OSTree.Sysroot
-                           OSTree.RepoRemoteChange.ADD_IF_NOT_EXISTS,
+                           OSTree.RepoRemoteChange.DELETE_IF_EXISTS,
+                           remote,    # Remote name
+                           url,       # Remote url
+                           options,   # Remote options
+                           None)      # Optional Gio.Cancellable
+        repo.remote_change(None,      # Optional OSTree.Sysroot
+                           OSTree.RepoRemoteChange.ADD,
                            remote,    # Remote name
                            url,       # Remote url
                            options,   # Remote options
diff --git a/buildstream/plugins/sources/ostree.py b/buildstream/plugins/sources/ostree.py
index c77b3a7..5b03d90 100644
--- a/buildstream/plugins/sources/ostree.py
+++ b/buildstream/plugins/sources/ostree.py
@@ -67,11 +67,10 @@ class OSTreeSource(Source):
         self.node_validate(node, ['url', 'ref', 'track', 'gpg-key'] + Source.COMMON_CONFIG_KEYS)
 
         self.original_url = self.node_get_member(node, str, 'url')
-        self.url = self.translate_url(self.original_url)
         self.ref = self.node_get_member(node, str, 'ref', None)
         self.tracking = self.node_get_member(node, str, 'track', None)
         self.mirror = os.path.join(self.get_mirror_directory(),
-                                   utils.url_directory_name(self.url))
+                                   utils.url_directory_name(self.original_url))
 
         # (optional) Not all repos are signed. But if they are, get the gpg key
         self.gpg_key = self.node_get_member(node, str, 'gpg-key', None)
@@ -97,32 +96,34 @@ class OSTreeSource(Source):
     def set_ref(self, ref, node):
         node['ref'] = self.ref = ref
 
-    def track(self):
+    def track(self, alias_override=None):
         # If self.tracking is not specified its' not an error, just silently return
         if not self.tracking:
             return None
 
-        self.ensure()
+        url = self.translate_url(self.original_url, alias_override=alias_override)
+        self.ensure(url)
         with self.timed_activity("Fetching tracking ref '{}' from origin: {}"
-                                 .format(self.tracking, self.url)):
+                                 .format(self.tracking, url)):
             try:
                 _ostree.fetch(self.repo, ref=self.tracking, progress=self.progress)
             except OSTreeError as e:
                 raise SourceError("{}: Failed to fetch tracking ref '{}' from origin {}\n\n{}"
-                                  .format(self, self.tracking, self.url, e)) from e
+                                  .format(self, self.tracking, url, e)) from e
 
         return _ostree.checksum(self.repo, self.tracking)
 
-    def fetch(self):
-        self.ensure()
+    def fetch(self, alias_override=None):
+        url = self.translate_url(self.original_url, alias_override=alias_override)
+        self.ensure(url)
         if not _ostree.exists(self.repo, self.ref):
             with self.timed_activity("Fetching remote ref: {} from origin: {}"
-                                     .format(self.ref, self.url)):
+                                     .format(self.ref, url)):
                 try:
                     _ostree.fetch(self.repo, ref=self.ref, progress=self.progress)
                 except OSTreeError as e:
                     raise SourceError("{}: Failed to fetch ref '{}' from origin: {}\n\n{}"
-                                      .format(self, self.ref, self.url, e)) from e
+                                      .format(self, self.ref, url, e)) from e
 
     def stage(self, directory):
         self.ensure()
@@ -132,12 +133,12 @@ class OSTreeSource(Source):
             checkoutdir = os.path.join(tmpdir, 'checkout')
 
             with self.timed_activity("Staging ref: {} from origin: {}"
-                                     .format(self.ref, self.url)):
+                                     .format(self.ref, self.original_url)):
                 try:
                     _ostree.checkout(self.repo, checkoutdir, self.ref, user=True)
                 except OSTreeError as e:
                     raise SourceError("{}: Failed to checkout ref '{}' from origin: {}\n\n{}"
-                                      .format(self, self.ref, self.url, e)) from e
+                                      .format(self, self.ref, self.original_url, e)) from e
 
             # The target directory is guaranteed to exist, here we must move the
             # content of out checkout into the existing target directory.
@@ -151,7 +152,7 @@ class OSTreeSource(Source):
                     shutil.move(source_path, directory)
             except (shutil.Error, OSError) as e:
                 raise SourceError("{}: Failed to move ostree checkout {} from '{}' to '{}'\n\n{}"
-                                  .format(self, self.url, tmpdir, directory, e)) from e
+                                  .format(self, self.original_url, tmpdir, directory, e)) from e
 
     def get_consistency(self):
         if self.ref is None:
@@ -165,19 +166,20 @@ class OSTreeSource(Source):
     #
     # Local helpers
     #
-    def ensure(self):
+    def ensure(self, url=None):
         if not self.repo:
-            self.status("Creating local mirror for {}".format(self.url))
-
+            self.status("Creating local mirror")
             self.repo = _ostree.ensure(self.mirror, True)
+
+        if url:
+            self.status("Configuring local mirror for {}".format(url))
             gpg_key = None
             if self.gpg_key_path:
                 gpg_key = 'file://' + self.gpg_key_path
-
             try:
-                _ostree.configure_remote(self.repo, "origin", self.url, key_url=gpg_key)
+                _ostree.configure_remote(self.repo, "origin", url, key_url=gpg_key)
             except OSTreeError as e:
-                raise SourceError("{}: Failed to configure origin {}\n\n{}".format(self, self.url, e)) from e
+                raise SourceError("{}: Failed to configure origin {}\n\n{}".format(self, url, e)) from e
 
     def progress(self, percent, message):
         self.status(message)