Seems like a lot of duplication with `install_github`.  Could you pull out into a separate function?  I think it would have an interface like this (untested):

```R
update_description <- function(prefix, ...) {  
  function(bundle, pkg_path) {
    # Ensure the DESCRIPTION ends with a newline
    desc <- file.path(pkg_path, "DESCRIPTION")
    if (!ends_with_newline(desc))
      cat("\n", sep="", file = desc, append = TRUE)

    # Function to append a field to the DESCRIPTION if it's not null
    append_field <- function(name, value) {
      if (!is.null(value)) {
        cat(prefix, name, ":", value, "\n", sep = "", file = desc, append = TRUE)
      }
    }
    
    fields <- list(...)
    Map(append_field, names(fields), fields)    
  }

}
```