---
title: "Get package host"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Get package host}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

## Overview

This vignette demonstrates how to use a set of R functions to programmatically retrieve the URL and code host package hosted on CRAN, Bioconductor and Github.

We will walk through each step, from checking if a package exists on CRAN to fetching its version history and constructing an appropriate download URL.

## CRAN

```{r setup}
library(DT)
library(risk.assessr)
```

### Check if the Package Exists on CRAN

```{r, eval=FALSE}
risk.assessr:::check_cran_package("here")
```

### Parse Package Archive HTML from CRAN database

fetch information from "https://cran.r-project.org/src/contrib/Archive/here/"

```{r, eval=FALSE}
html <- risk.assessr:::parse_package_info("here")
html
```

![](assets/Picture1.png)

### Extract Version Information from the Archive Page

Create table with `package_name`, `package_version`, `link`, `date`, `size` from CRAN website

```{r, echo=FALSE, eval=FALSE}
table <- risk.assessr:::parse_html_version(html, "here")
pkg_df <- do.call(rbind, lapply(table, as.data.frame))
datatable(pkg_df)
```


### Get All Versions and the Latest Version

```{r, eval=FALSE}
version_info <- risk.assessr:::get_versions(table, "here")
version_info$last_version
```

```{r, echo=FALSE, eval=FALSE}
pkg_df <- do.call(rbind, lapply(version_info$all_versions, as.data.frame))
datatable(pkg_df)
```

### Get CRAN package URL source code

```{r, eval=FALSE}
url <- risk.assessr:::get_cran_package_url(
  package_name = "here",
  version = NULL,
  last_version = version_info$last_version,
  all_versions = version_info$all_versions
)
url
```

## Internal R package

`risk.assessr` can also provide similar information from Internal mirror

```{r, eval=FALSE}
result_intern <- risk.assessr:::get_internal_package_url("herald")
```

```{r, eval=FALSE}
result_intern$url
```

```{r, eval=FALSE}
result_intern$last_version
```

```{r, echo=FALSE, eval=FALSE}
pkg_df <- do.call(rbind, lapply(result_intern$all_versions, as.data.frame))
datatable(pkg_df)
```

## Bioconductor package

Steps to get an R package stored on Bioconductor

```{r, message=FALSE, warning=FALSE, eval=FALSE}
html_content <- fetch_bioconductor_releases()
release_data <- parse_bioconductor_releases(html_content)
result_bio <- get_bioconductor_package_url("flowCore", "2.18.0", release_data)
```

```{r, eval=FALSE}
result_bio$url
```

## Github repository

R packages stored on Github are assess by looking at BugReports or URL in DESCRIPTION file to find a owner. github link are then created such as below and used to request Github API.

```{r, eval=FALSE}
urls <- c(
  "https://github.com/tidyverse/ggplot2"
)
bug_reports <- c(
  "https://github.com/tidyverse/ggplot2/issues"
)

all_links <- c(urls, bug_reports)

github_pattern <- "https://github.com/([^/]+)/([^/]+).*"
matching_links <- grep(github_pattern, all_links, value = TRUE)
owner_names <- sub(github_pattern, "\\1", matching_links)
package_names_github <- sub(github_pattern, "\\2", matching_links)

valid <- which(owner_names != "" & package_names_github != "")

  if (length(valid) > 0) {
    github_links <- unique(paste0("https://github.com/", owner_names[valid], "/", package_names_github[valid]))
  } else {
    github_links <- NULL
  }

github_links
```