@ -8,6 +8,7 @@ import (
"math"
"net/http"
"strconv"
"time"
issues_model "code.gitea.io/gitea/models/issues"
user_model "code.gitea.io/gitea/models/user"
@ -116,6 +117,16 @@ func GetAllCommits(ctx *context.APIContext) {
// in: query
// description: filepath of a file/dir
// type: string
// - name: since
// in: query
// description: Only commits after this date will be returned (ISO 8601 format)
// type: string
// format: date-time
// - name: until
// in: query
// description: Only commits before this date will be returned (ISO 8601 format)
// type: string
// format: date-time
// - name: stat
// in: query
// description: include diff stats for every commit (disable for speedup, default 'true')
@ -148,6 +159,23 @@ func GetAllCommits(ctx *context.APIContext) {
// "409":
// "$ref": "#/responses/EmptyRepository"
since := ctx . FormString ( "since" )
until := ctx . FormString ( "until" )
// Validate since/until as ISO 8601 (RFC3339)
if since != "" {
if _ , err := time . Parse ( time . RFC3339 , since ) ; err != nil {
ctx . APIError ( http . StatusUnprocessableEntity , "invalid 'since' format, expected ISO 8601 (RFC3339)" )
return
}
}
if until != "" {
if _ , err := time . Parse ( time . RFC3339 , until ) ; err != nil {
ctx . APIError ( http . StatusUnprocessableEntity , "invalid 'until' format, expected ISO 8601 (RFC3339)" )
return
}
}
if ctx . Repo . Repository . IsEmpty {
ctx . JSON ( http . StatusConflict , api . APIError {
Message : "Git Repository is empty." ,
@ -198,6 +226,8 @@ func GetAllCommits(ctx *context.APIContext) {
RepoPath : ctx . Repo . GitRepo . Path ,
Not : not ,
Revision : [ ] string { baseCommit . ID . String ( ) } ,
Since : since ,
Until : until ,
} )
if err != nil {
ctx . APIErrorInternal ( err )
@ -205,7 +235,7 @@ func GetAllCommits(ctx *context.APIContext) {
}
// Query commits
commits , err = baseCommit . CommitsByRange ( listOptions . Page , listOptions . PageSize , not )
commits , err = baseCommit . CommitsByRange ( listOptions . Page , listOptions . PageSize , not , since , until )
if err != nil {
ctx . APIErrorInternal ( err )
return
@ -221,6 +251,8 @@ func GetAllCommits(ctx *context.APIContext) {
Not : not ,
Revision : [ ] string { sha } ,
RelPath : [ ] string { path } ,
Since : since ,
Until : until ,
} )
if err != nil {
@ -237,6 +269,8 @@ func GetAllCommits(ctx *context.APIContext) {
File : path ,
Not : not ,
Page : listOptions . Page ,
Since : since ,
Until : until ,
} )
if err != nil {
ctx . APIErrorInternal ( err )