# withr 3.0.1

* Fixes for CRAN checks.


# withr 3.0.0

## Performance of withr

* `defer()` is now a thin wrapper around `base::on.exit()`. This is
  possible thanks to two contributions that we made to R 3.5:

  - We added an argument for LIFO cleanup: `on.exit(after = FALSE)`.
  - Calling `sys.on.exit()` elsewhere than top-level didn't work. This
    is needed for manual invocation with `deferred_run()`.

  Following this change, `defer()` is now much faster (although still
  slower than `on.exit()` which is a primitive function and about as
  fast as it gets). This also increases the compatibility of `defer()`
  with `on.exit()` (all handlers are now run in the expected order
  even if they are registered with `on.exit()`) and standalone
  versions of `defer()`.


## Breaking change

* When `source()` is used with a local environment, as opposed to
  `globalenv()` (the default), you now need to set
  `options(withr.hook_source = TRUE)` to get proper withr support
  (running `defer()` or `local_` functions at top-level of a script).
  This support is disabled by default in local environments to avoid a
  performance penalty in normal usage of withr features.


## Other features and bugfixes

* `deferred_run()` now reports the number of executed expressions with
  a message.

* `deferred_run()` can now be run at any point in a knitr file (#235).

* `local_tempfile()` now writes `lines` in UTF-8 (#210) and always uses 
  `\n` for newlines (#216).

* `local_pdf()` and friends now correctly restore to the previously 
  active device (#138).

* `local_()` now works even if withr isn't attached (#207).

* `local_par()` and `with_par()` now work if you don't set any parameters
  (#238).

* `with_language()` now properly resets the translation cache (#213).

* Fixes for Debian packaging.


# withr 2.5.2

* Fixes for CRAN checks.


# withr 2.5.1

* Fixes for CRAN checks.


# withr 2.5.0

* `defer()` and all `local_*()` functions now work when run inside of
  a `.Rmd`. The deferred expressions are executed when knitr exits.

* `defer()` and `local_` functions now work within `source()`.
  The deferred expressions are executed when `source()` exits.

* `with_()` and `local_()` gain a `get` argument. Supply a getter
  function to create `with` and `local` functions that are robust to
  early exits.

  When supplied, this restoration pattern is used:

  ```
  old <- get()
  on.exit(set(old))
  set(new)
  action()
  ```

  Instead of:

  ```
  old <- set(new)
  on.exit(set(old))
  action()
  ```

  This ensures proper restoration of the old state when an early exit
  occurs during `set()` (for instance when a deprecation warning is
  caught, see #191).

* These `with_` and `local_` functions are now robust to early exits (see next bullet):

  - `_locale()`
  - `_envvar()`
  - `_libpaths()`
  - `_options()`
  - `_par()`
  - `_path()`
  - `_seed()`

* `with_namespace()` and `local_namespace()` now pass `warn.conflicts`
  to `attach()` (@kyleam, #185).

* `local_rng_version()` and `local_seed()` no longer warn when
  restoring `sample.kind` to `"Rounding"` (#167).

* `with_seed()` now preserves the current values of `RNGkind()` (#167).

* `with_collate()` is no longer affected by the `LC_COLLATE`
  environment variable set to "C" (#179).

* Local evaluations in the `globalenv()` (as opposed to top-level
  ones) are now unwound in the same way as regular environments.

* `local_tempfile()` gains a lines argument so, if desired, you can pre-fill
  the temporary file with some data.


# withr 2.4.3

* Lionel Henry is the new maintainer.

* Handlers registered with the global environment (as happens when `local_()` 
  is run at the top-level, outside a function) are now automatically run
  when the R session ends (#173).

* New `with_language()` and `local_language()` to temporarily control the
  language used for translations (#180).

* `with_seed()` now caches the check for R version, so is now faster (#170)

* `with_makevars()` and `local_makevars()` now eagerly evaluate the `path` argument (#169)

# withr 2.4.2

- `local_options()` now lets you set an option to `NULL` as intended (#156)

- `local_tempfile()` argument `envir` is deprecated, in favor of `.local_envir`.
  All withr functions except `local_tempfile()` used `.local_envir` to specify environments, so this makes this function consistent with the rest. (#157)

- `with_environment()` now passing `pos` and `warn.conflicts` to `attach()`, as intended (#161).

- `with_seed()` now also sets the RNG via new arguments `.rng_kind`, `.rng_normal_kind` and `.rng_sample_kind`
  (#162, @AshesITR).

- `with_timezone()` now works after recent changes to `Sys.timezone()` in R-devel (#165)

# withr 2.4.1

- Tests which require `capabilities("cairo")` are now skipped.

# withr 2.4.0

- withr is now licensed as MIT (#154).

- Tests for `with_cairo_pdf()` and `with_cairo_ps()` have been removed, as they fail if Cairo is not available, such as with M1 macOS systems (#158)

- `local_seed()` is now exported (#153)

# withr 2.3.0

## Deprecations

- `local_tempfile()` argument `new` is deprecated, in favor of returning the path to the new tempfile.
  calls like `local_tempfile("xyz")` should be replaced with `xyx <- local_tempfile()` in your code (#141).

## New features

- New `local_seed()` function and `local_preserve_seed()` functions to correspond to `with_seed()` and `with_preserve_seed()` (#139).

- New `local_tempdir()` function added to create a temp directory (#140)

- `local_*()` functions now take dots (`...`), which can simplify calls in some cases, e.g. you can now use `local_options(foo = "bar")` rather than `local_options(c(foo = "bar"))`.

## Minor improvements and fixes

- `defer()` now throws an error if an error occurs in the deferred expression (#148)

- `with_file()` and `local_file()` can now work if the file is actually a directory (#144).

# withr 2.2.0

- `defer()` can set deferred events on `.GlobalEnv` to facilitate the interactive development of code inside a function or test.
  Helpers `deferred_run()` (and `deferred_clear()`) provide a way to explicity run and clear (or just clear) deferred events (#76, @jennybc).

- `with_connection()` now works when existing objects or connections exist with the same names (#120)

- `with_makevars()` now uses `tools::makevars_user()` to determine the default user makevars file (#77, @siddharthab).

- `with_options()` no longer uses `do.call()`, so optiosn are not evaluated on exit (#73, @mtmorgan).

- `with_package()` no longer has the `help` argument (#94, @wendtke).

- `with_package()` now does not try to detach the package if it is already attached before calling `with_package()` (#107)

- `with_preserve_seed()` now restores `.Random.seed` if it is not set
  originally (#124).

- Add `with_rng_version()` and `local_rng_version()` functions to change the version of the RNG (#90, @gaborcsardi).

- `with_svg()` documentation now is consistent across R versions (#129)

- Add `with_timezone()` and `local_timezone()` functions to change the time zone (#92, @gaborcsardi).

- `with_tempfile()` and `local_tempfile()` now delete recursively directories on exit (#84, @meta00).

# withr 2.1.2

- `set_makevars()` is now exported (#68, @gaborcsardi).

- `with_temp_libpaths()` gains an `action` argument, to specify how the
  temporary library path will be added (#66, @krlmlr).

# withr 2.1.1

- Fixes test failures with testthat 2.0.0

- `with_file()` function to automatically remove files.

# withr 2.1.0

- `with_connection()` function to automatically close R file connections.

- `with_db_connection()` function to automatically disconnect from DBI database
  connections.

- `with_gctorture2` command to run code with gctorture2, useful for testing
  (#47).

- `with_package()`, `with_namespace()` and `with_environment()` (and equivalent
  locals) functions added, to run code with a modified object search path (#38,
  #48).

- Add `with_tempfile()` and `local_tempfile()` functions to create temporary
  files which are cleanup up afterwards. (#32)

- Remove the `code` argument from `local_` functions (#50).

# withr 2.0.0

- Each `with_` function now has a `local_` variant, which reset at the end of
  their local scope, generally at the end of the function body.

- New functions `with_seed()` and `with_preserve_seed()` for running code with
  a given random seed (#45, @krlmlr).

# withr 1.0.2
- `with_makevars()` gains an `assignment` argument to allow specifying
  additional assignment types.

# withr 1.0.1
- Relaxed R version requirement to 3.0.2 (#35, #39).
- New `with_output_sink()` and `with_message_sink()` (#24).

# withr 1.0.0

- First Public Release
