@ -5,7 +5,11 @@
package gitgraph
package gitgraph
import (
import (
"bufio"
"bytes"
"context"
"fmt"
"fmt"
"os"
"strings"
"strings"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/git"
@ -31,37 +35,72 @@ type GraphItems []GraphItem
// GetCommitGraph return a list of commit (GraphItems) from all branches
// GetCommitGraph return a list of commit (GraphItems) from all branches
func GetCommitGraph ( r * git . Repository , page int ) ( GraphItems , error ) {
func GetCommitGraph ( r * git . Repository , page int ) ( GraphItems , error ) {
var CommitGraph [ ] GraphItem
format := "DATA:|%d|%H|%ad|%an|%ae|%h|%s"
format := "DATA:|%d|%H|%ad|%an|%ae|%h|%s"
if page == 0 {
page = 1
}
graphCmd := git . NewCommand ( "log" )
graphCmd := git . NewCommand ( "log" )
graphCmd . AddArguments ( "--graph" ,
graphCmd . AddArguments ( "--graph" ,
"--date-order" ,
"--date-order" ,
"--all" ,
"--all" ,
"-C" ,
"-C" ,
"-M" ,
"-M" ,
fmt . Sprintf ( "-n %d" , setting . UI . GraphMaxCommitNum ) ,
fmt . Sprintf ( "-n %d" , setting . UI . GraphMaxCommitNum * page ) ,
fmt . Sprintf ( "--skip=%d" , setting . UI . GraphMaxCommitNum * ( page - 1 ) ) ,
"--date=iso" ,
"--date=iso" ,
fmt . Sprintf ( "--pretty=format:%s" , format ) ,
fmt . Sprintf ( "--pretty=format:%s" , format ) ,
)
)
graph , err := graphCmd . RunInDir ( r . Path )
commitGraph := make ( [ ] GraphItem , 0 , 100 )
stderr := new ( strings . Builder )
stdoutReader , stdoutWriter , err := os . Pipe ( )
if err != nil {
if err != nil {
return CommitGraph , err
return nil , err
}
}
commitsToSkip := setting . UI . GraphMaxCommitNum * ( page - 1 )
scanner := bufio . NewScanner ( stdoutReader )
if err := graphCmd . RunInDirTimeoutEnvFullPipelineFunc ( nil , - 1 , r . Path , stdoutWriter , stderr , nil , func ( ctx context . Context , cancel context . CancelFunc ) error {
_ = stdoutWriter . Close ( )
defer stdoutReader . Close ( )
for commitsToSkip > 0 && scanner . Scan ( ) {
line := scanner . Bytes ( )
dataIdx := bytes . Index ( line , [ ] byte ( "DATA:" ) )
starIdx := bytes . IndexByte ( line , '*' )
if starIdx >= 0 && starIdx < dataIdx {
commitsToSkip --
}
}
// Skip initial non-commit lines
for scanner . Scan ( ) {
if bytes . IndexByte ( scanner . Bytes ( ) , '*' ) >= 0 {
line := scanner . Text ( )
graphItem , err := graphItemFromString ( line , r )
if err != nil {
cancel ( )
return err
}
commitGraph = append ( commitGraph , graphItem )
break
}
}
CommitGraph = make ( [ ] GraphItem , 0 , 100 )
for scanner . Scan ( ) {
for _ , s := range strings . Split ( graph , "\n" ) {
line := scanner . Text ( )
GraphItem , err := graphItemFromString ( s , r )
graphItem , err := graphItemFromString ( line , r )
if err != nil {
if err != nil {
return CommitGraph , err
cancel ( )
return err
}
commitGraph = append ( commitGraph , graphItem )
}
}
CommitGraph = append ( CommitGraph , GraphItem )
return scanner . Err ( )
} ) ; err != nil {
return commitGraph , err
}
}
return CommitGraph , nil
return c ommitGraph, nil
}
}
func graphItemFromString ( s string , r * git . Repository ) ( GraphItem , error ) {
func graphItemFromString ( s string , r * git . Repository ) ( GraphItem , error ) {