From 5664447bcdbde451f4e5115e87020b9dd72ad617 Mon Sep 17 00:00:00 2001 From: Whovian9369 Date: Tue, 28 May 2024 23:43:52 -0400 Subject: [PATCH] I forgot that I need to patch `rclone`, whoops! --- flake.nix | 5 ++ ...e3e462cbf5688c37c54009db09d8dcb486860.diff | 50 +++++++++++++++++++ home/pkgs_and_programs.nix | 9 +++- 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 home/packages/new_rclone/patches/rclone_8ffe3e462cbf5688c37c54009db09d8dcb486860.diff diff --git a/flake.nix b/flake.nix index 86afd5d..2d68f24 100644 --- a/flake.nix +++ b/flake.nix @@ -138,6 +138,11 @@ ps3dec = pkgs.callPackage ./home/packages/ps3dec/package.nix {}; sabretools = pkgs.callPackage ./home/packages/sabretools/package.nix {}; rom-properties = pkgs.callPackage ./home/packages/rom-properties/package.nix {}; + new_rclone = pkgs.rclone.overrideAttrs ( + oldAttrs: { + patches = [ ./home/packages/new_rclone/patches/rclone_8ffe3e462cbf5688c37c54009db09d8dcb486860.diff ]; + } + ); }; }; } diff --git a/home/packages/new_rclone/patches/rclone_8ffe3e462cbf5688c37c54009db09d8dcb486860.diff b/home/packages/new_rclone/patches/rclone_8ffe3e462cbf5688c37c54009db09d8dcb486860.diff new file mode 100644 index 0000000..3606341 --- /dev/null +++ b/home/packages/new_rclone/patches/rclone_8ffe3e462cbf5688c37c54009db09d8dcb486860.diff @@ -0,0 +1,50 @@ +diff --git a/backend/webdav/chunking.go b/backend/webdav/chunking.go +index 4cea798389f73..379079cf9f015 100644 +--- a/backend/webdav/chunking.go ++++ b/backend/webdav/chunking.go +@@ -14,21 +14,30 @@ import ( + "io" + "net/http" + "path" ++ "time" + + "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/lib/readers" + "github.com/rclone/rclone/lib/rest" + ) + +-func (f *Fs) shouldRetryChunkMerge(ctx context.Context, resp *http.Response, err error) (bool, error) { ++func (f *Fs) shouldRetryChunkMerge(ctx context.Context, resp *http.Response, err error, sleepTime *time.Duration, wasLocked *bool) (bool, error) { + // Not found. Can be returned by NextCloud when merging chunks of an upload. + if resp != nil && resp.StatusCode == 404 { ++ if *wasLocked { ++ // Assume a 404 error after we've received a 423 error is actually a success ++ return false, nil ++ } + return true, err + } + + // 423 LOCKED + if resp != nil && resp.StatusCode == 423 { +- return false, fmt.Errorf("merging the uploaded chunks failed with 423 LOCKED. This usually happens when the chunks merging is still in progress on NextCloud, but it may also indicate a failed transfer: %w", err) ++ *wasLocked = true ++ fs.Logf(f, "Sleeping for %v to wait for chunks to be merged after 423 error", *sleepTime) ++ time.Sleep(*sleepTime) ++ *sleepTime *= 2 ++ return true, fmt.Errorf("merging the uploaded chunks failed with 423 LOCKED. This usually happens when the chunks merging is still in progress on NextCloud, but it may also indicate a failed transfer: %w", err) + } + + return f.shouldRetry(ctx, resp, err) +@@ -180,9 +189,11 @@ func (o *Object) mergeChunks(ctx context.Context, uploadDir string, options []fs + } + opts.ExtraHeaders = o.extraHeaders(ctx, src) + opts.ExtraHeaders["Destination"] = destinationURL.String() ++ sleepTime := 5 * time.Second ++ wasLocked := false + err = o.fs.pacer.Call(func() (bool, error) { + resp, err = o.fs.srv.Call(ctx, &opts) +- return o.fs.shouldRetryChunkMerge(ctx, resp, err) ++ return o.fs.shouldRetryChunkMerge(ctx, resp, err, &sleepTime, &wasLocked) + }) + if err != nil { + return fmt.Errorf("finalize chunked upload failed, destinationURL: \"%s\": %w", destinationURL, err) diff --git a/home/pkgs_and_programs.nix b/home/pkgs_and_programs.nix index be8a28c..10a17f7 100644 --- a/home/pkgs_and_programs.nix +++ b/home/pkgs_and_programs.nix @@ -14,8 +14,13 @@ let ps3dec = pkgs.callPackage ./packages/ps3dec/package.nix {}; sabretools = pkgs.callPackage ./packages/sabretools/package.nix {}; rom-properties = pkgs.callPackage ./packages/rom-properties/package.nix {}; + new_rclone = pkgs.rclone.overrideAttrs (oldAttrs: rec { + patches = [ ./packages/new_rclone/patches/rclone_8ffe3e462cbf5688c37c54009db09d8dcb486860.diff ]; + } + ); }; + in { programs = { @@ -107,7 +112,6 @@ in pkgs.pyrosimple pkgs.python3 pkgs.quickbms - pkgs.rclone pkgs.screen pkgs.sshfs pkgs.unrar-wrapper @@ -119,6 +123,7 @@ in my_packages.ird_tools my_packages.ps3dec my_packages.sabretools + my_packages.new_rclone # my_packages.rom-properties agenix.packages.${system}.default @@ -133,6 +138,8 @@ in # Not needed on WSL pkgs.p7zip # Replaced in favour of nixpkgs#_7zz + # pkgs.rclone + # my_packages.new_rclone is the version with the patched build. pkgs.terminator # Not needed on WSL, even though I'd like it on WSL sometimes. pkgs.yt-dlp