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

tustvold pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs-object-store.git


The following commit(s) were added to refs/heads/main by this push:
     new 994d607  GCP: fix copy (no) overwrite semantics (#713)
994d607 is described below

commit 994d60732c3379bc98982f5c4638996be0ee0d2f
Author: james-rms <[email protected]>
AuthorDate: Thu May 21 02:21:36 2026 +1000

    GCP: fix copy (no) overwrite semantics (#713)
---
 src/gcp/client.rs | 16 ++++++++--------
 src/gcp/mod.rs    |  7 ++-----
 2 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/src/gcp/client.rs b/src/gcp/client.rs
index 00d3168..4a246d2 100644
--- a/src/gcp/client.rs
+++ b/src/gcp/client.rs
@@ -32,8 +32,8 @@ use crate::multipart::PartId;
 use crate::path::Path;
 use crate::util::hex_encode;
 use crate::{
-    Attribute, Attributes, ClientOptions, GetOptions, MultipartId, PutMode, 
PutMultipartOptions,
-    PutOptions, PutPayload, PutResult, Result, RetryConfig,
+    Attribute, Attributes, ClientOptions, CopyMode, GetOptions, MultipartId, 
PutMode,
+    PutMultipartOptions, PutOptions, PutPayload, PutResult, Result, 
RetryConfig,
 };
 use async_trait::async_trait;
 use base64::Engine;
@@ -566,12 +566,7 @@ impl GoogleCloudStorageClient {
     }
 
     /// Perform a copy request 
<https://cloud.google.com/storage/docs/xml-api/put-object-copy>
-    pub(crate) async fn copy_request(
-        &self,
-        from: &Path,
-        to: &Path,
-        if_not_exists: bool,
-    ) -> Result<()> {
+    pub(crate) async fn copy_request(&self, from: &Path, to: &Path, mode: 
CopyMode) -> Result<()> {
         let credential = self.get_credential().await?;
         let url = self.object_url(to);
 
@@ -583,6 +578,11 @@ impl GoogleCloudStorageClient {
             .request(Method::PUT, url)
             .header("x-goog-copy-source", source);
 
+        let if_not_exists = match mode {
+            CopyMode::Create => true,
+            CopyMode::Overwrite => false,
+        };
+
         if if_not_exists {
             builder = builder.header(&VERSION_MATCH, 0);
         }
diff --git a/src/gcp/mod.rs b/src/gcp/mod.rs
index 8d7b26c..51e85ae 100644
--- a/src/gcp/mod.rs
+++ b/src/gcp/mod.rs
@@ -37,10 +37,10 @@
 use std::sync::Arc;
 use std::time::Duration;
 
+use crate::CopyOptions;
 use crate::client::CredentialProvider;
 use crate::gcp::credential::GCSAuthorizer;
 use crate::signer::Signer;
-use crate::{CopyMode, CopyOptions};
 use crate::{
     GetOptions, GetResult, ListResult, MultipartId, MultipartUpload, 
ObjectMeta, ObjectStore,
     PutMultipartOptions, PutOptions, PutPayload, PutResult, Result, 
UploadPart, multipart::PartId,
@@ -221,10 +221,7 @@ impl ObjectStore for GoogleCloudStorage {
             extensions: _,
         } = options;
 
-        match mode {
-            CopyMode::Overwrite => self.client.copy_request(from, to, 
true).await,
-            CopyMode::Create => self.client.copy_request(from, to, 
false).await,
-        }
+        self.client.copy_request(from, to, mode).await
     }
 }
 

Reply via email to