
----

## <a name="bz"></a> SonarQube

### <a name="sq_issues_blocker"></a> SonarQube blocker issues

**Download**: [`r file_sq_issues_blocker`.gz](https://download.eclipse.org/dataeggs/projects/", project_id, "/`r file_sq_issues_blocker`.gz)

```{r sq_issues_blocker}
data <- read.csv(file=file_sq_issues_blocker, header=T)
```

File is [``r file_sq_issues_blocker``](https://download.eclipse.org/dataeggs/projects/", project_id, "/`r file_sq_issues_blocker`), and has ``r ncol(data)`` columns for ``r nrow(data)`` issues.

```{r sq_issues_blocker_table, results='asis'}
data$last.update <- as.POSIXct(data$last_update, origin="1970-01-01")
issues.table <- head(data[,c('key', 'rule', 'sev', 'last.update', 'message')], 10)
issues.table$last.update <- as.character(issues.table$last.update)
names(issues.table) <- c('Key', 'Rule', 'Severity', 'Last update', 'Message')

print(
    xtable(issues.table,
        caption = paste('Extract of 10 SonarQube blocker issues for ', 
                        project_id, '.', sep=" "),
        digits=0, align="llllll"), type="html",
    html.table.attributes='class="table table-striped"',
    caption.placement='bottom',
    include.rownames=FALSE,
    sanitize.text.function=function(x) { x }
)
```

<br />

### <a name="sq_issues_critical"></a> SonarQube critical issues

**Download**: [`r file_sq_issues_critical`.gz](https://download.eclipse.org/dataeggs/projects/", project_id, "/`r file_sq_issues_critical`.gz)

```{r sq_issues_critical}
data <- read.csv(file=file_sq_issues_critical, header=T)
```

File is [``r file_sq_issues_critical``](https://download.eclipse.org/dataeggs/projects/", project_id, "/`r file_sq_issues_critical`), and has ``r ncol(data)`` columns for ``r nrow(data)`` issues.

<br />

### <a name="sq_issues_major"></a> SonarQube major issues

**Download**: [`r file_sq_issues_major`.gz](https://download.eclipse.org/dataeggs/projects/", project_id, "/`r file_sq_issues_major`.gz)

```{r sq_issues_major}
data <- read.csv(file=file_sq_issues_major, header=T)
```

File is [``r file_sq_issues_major``](https://download.eclipse.org/dataeggs/projects/", project_id, "/`r file_sq_issues_major`), and has ``r ncol(data)`` columns for ``r nrow(data)`` issues.

<br />

### <a name="sq_metrics"></a> SonarQube metrics

**Download**: [`r file_sq_metrics`.gz](https://download.eclipse.org/dataeggs/projects/", project_id, "/`r file_sq_metrics`.gz)

```{r sq_metrics}
data <- read.csv(file=file_sq_metrics, header=T)
```

File is [``r file_sq_metrics``](https://download.eclipse.org/dataeggs/projects/", project_id, "/`r file_sq_metrics`), and has ``r ncol(data)`` columns for ``r nrow(data)`` line.


```{r sq_metrics_table, results='asis'}
# Transform from wide to long format.
data <- t(data)
data_ <- data.frame(rownames(data), data[,1])
names(data_) <- c('Metric', 'Value')
# Remove NAs
data_  <- data_[complete.cases(data_$Value),]

print(
    xtable(data_,
        caption = paste('SonarQube metrics for ', 
                        project_id, '.', sep=" "),
        digits=0, align="lll"), type="html",
    html.table.attributes='class="table table-striped"',
    caption.placement='bottom',
    include.rownames=FALSE,
    sanitize.text.function=function(x) { x }
)
```


