## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", eval = FALSE)

## ----eval=FALSE---------------------------------------------------------------
# install.packages("courieR")

## ----eval=FALSE---------------------------------------------------------------
# pak::pkg_install("lennon-li/courieR")

## -----------------------------------------------------------------------------
# library(courieR)
# 
# routes <- find_routes()
# routes
# #>   version                                          rscript_path is_current
# #> 1   4.4.2        C:/Program Files/R/R-4.4.2/bin/x64/Rscript.exe       TRUE
# #> 2   4.3.1  C:/Users/you/AppData/Local/Programs/R/R-4.3.1/bin/...      FALSE
# #> 3   4.1.3            C:/Users/you/Documents/R/R-4.1.3/bin/...      FALSE

## -----------------------------------------------------------------------------
# routes <- find_routes(search_paths = "/opt/custom-r/bin/Rscript")

## -----------------------------------------------------------------------------
# # scan the first (newest) R
# src_pkgs <- manifest(rscript_path = routes$rscript_path[1])
# head(src_pkgs[, c("package", "version", "source")])
# #>     package version source
# #> 1     broom   1.0.7   CRAN
# #> 2    callr   3.7.6   CRAN
# #> 3   courieR   0.2.0 GitHub
# #> 4   ggplot2   3.5.1   CRAN
# #> 5      glue   1.8.0   CRAN
# #> 6   stringr   1.5.1   CRAN

## -----------------------------------------------------------------------------
# my_pkgs <- manifest()
# nrow(my_pkgs)
# #> [1] 312

## -----------------------------------------------------------------------------
# src_pkgs <- manifest(rscript_path = routes$rscript_path[2])  # old R
# tgt_pkgs <- manifest(rscript_path = routes$rscript_path[1])  # new R
# 
# comp <- inventory(src_pkgs, tgt_pkgs)

## -----------------------------------------------------------------------------
# # packages in source but missing from target
# nrow(comp$missing)
# #> [1] 47
# 
# # packages where source has a newer version
# nrow(comp$outdated)
# #> [1] 12
# 
# # packages at the same version in both
# nrow(comp$same)
# #> [1] 201

## -----------------------------------------------------------------------------
# comp$missing[, c("package", "version", "source")]
# #>       package version  source
# #>  1:    bookdown   0.39    CRAN
# #>  2:  brms   2.21.0    CRAN
# #>  3:   officer   0.6.6    CRAN
# #>  ...
# 
# comp$outdated[, c("package", "version.x", "version.y", "source")]
# #>    package version.x version.y source
# #> 1:  ggplot2     3.5.1     3.4.4   CRAN
# #> 2:   tibble     3.2.1     3.2.0   CRAN

## -----------------------------------------------------------------------------
# result <- ship(
#   source_path = routes$rscript_path[2],   # old R — package source
#   target_path = routes$rscript_path[1]    # new R — install destination
# )

## -----------------------------------------------------------------------------
# result <- ship(
#   source_path = routes$rscript_path[2],
#   target_path = routes$rscript_path[1],
#   dry_run = TRUE
# )
# 
# # review the plan before anything is installed
# print(result$plan)
# #>         package action  pak_spec
# #>  1:    bookdown install bookdown
# #>  2:        brms install     brms
# #>  3:     ggplot2 upgrade  ggplot2
# #>  ...

## -----------------------------------------------------------------------------
# result <- ship(
#   source_path = routes$rscript_path[2],
#   target_path = routes$rscript_path[1],
#   upgrade = TRUE
# )

## -----------------------------------------------------------------------------
# # per-package outcomes
# result$results
# #>     package  status                       message
# #>  1: bookdown success                     Installed
# #>  2:     brms success                     Installed
# #>  3:    rJava   error  installation of rJava failed...
# 
# # count by outcome
# table(result$results$status)
# #>   error success
# #>       1      58
# 
# # failed packages only
# result$results[result$results$status == "error", ]

## -----------------------------------------------------------------------------
# # mixed-source example — all handled automatically
# result$plan[, c("package", "source", "pak_spec")]
# #>    package   source        pak_spec
# #> 1:  ggplot2     CRAN         ggplot2
# #> 2:  courieR   GitHub  lennon-li/courieR
# #> 3:    DESeq2  Bioconductor  bioc::DESeq2

## -----------------------------------------------------------------------------
# # explicit mode
# ship(source_path = old_r, target_path = new_r, mode = "offline")

## -----------------------------------------------------------------------------
# library(courieR)
# 
# # dry run first
# migrate("4.5.2", "4.6.0", dry_run = TRUE)
# 
# # for real
# result <- migrate("4.5.2", "4.6.0")
# table(result$results$status)

## -----------------------------------------------------------------------------
# routes  <- find_routes()
# old_r   <- routes$rscript_path[!routes$is_current][1]
# new_r   <- routes$rscript_path[routes$is_current]
# 
# result <- ship(source_path = old_r, target_path = new_r, upgrade = TRUE)

## -----------------------------------------------------------------------------
# r_a <- routes$rscript_path[1]
# r_b <- routes$rscript_path[2]
# 
# # push everything A has into B
# ship(source_path = r_a, target_path = r_b, upgrade = TRUE)
# 
# # then push everything B has into A
# ship(source_path = r_b, target_path = r_a, upgrade = TRUE)

## -----------------------------------------------------------------------------
# src  <- manifest(rscript_path = old_r)
# tgt  <- manifest(rscript_path = new_r)
# comp <- inventory(src, tgt)
# 
# # only migrate CRAN packages — skip GitHub/unknown sources
# cran_missing <- comp$missing[comp$missing$source == "CRAN", ]
# cat(nrow(cran_missing), "CRAN packages to install\n")

## -----------------------------------------------------------------------------
# pkgs <- manifest(rscript_path = routes$rscript_path[1])
# write.csv(pkgs[, c("package", "version", "source")], "my_packages.csv", row.names = FALSE)

## -----------------------------------------------------------------------------
# saved <- read.csv("my_packages.csv", stringsAsFactors = FALSE)
# # pak installs from a character vector of package names
# pak::pkg_install(saved$package)

## -----------------------------------------------------------------------------
# library(courieR)
# hub()

## ----bulk-dispatch-gif, eval=TRUE, echo=FALSE, out.width="100%", fig.cap="Bulk Dispatch: detect R installations, click Compare, review the colour-coded summary chips and package table, then Ship. The log pane on the right shows real-time progress; a live hero panel counts delivered packages during the ship."----
knitr::include_graphics("figures/bulk_dispatch.gif")

## ----custom-dispatch-gif, eval=TRUE, echo=FALSE, out.width="100%", fig.cap="Custom Dispatch: colour-coded filter chips narrow the table to the statuses you care about; check individual packages and press Ship. The Repo column highlights packages with an unknown source in red."----
knitr::include_graphics("figures/custom_dispatch.gif")

