@ -61,7 +61,7 @@ func (repo *Repository) getCommitByPathWithID(id SHA1, relpath string) (*Commit,
relpath = ` \ ` + relpath
relpath = ` \ ` + relpath
}
}
stdout , _ , runErr := NewCommand ( repo . Ctx , "log" , "-1" , prettyLogFormat , id . String ( ) , "--" , relpath ) . RunStdString ( & RunOpts { Dir : repo . Path } )
stdout , _ , runErr := NewCommand ( repo . Ctx , "log" , "-1" , prettyLogFormat ) . AddDynamicArguments ( id . String ( ) ) . AddDashesAndList ( relpath ) . RunStdString ( & RunOpts { Dir : repo . Path } )
if runErr != nil {
if runErr != nil {
return nil , runErr
return nil , runErr
}
}
@ -76,7 +76,7 @@ func (repo *Repository) getCommitByPathWithID(id SHA1, relpath string) (*Commit,
// GetCommitByPath returns the last commit of relative path.
// GetCommitByPath returns the last commit of relative path.
func ( repo * Repository ) GetCommitByPath ( relpath string ) ( * Commit , error ) {
func ( repo * Repository ) GetCommitByPath ( relpath string ) ( * Commit , error ) {
stdout , _ , runErr := NewCommand ( repo . Ctx , "log" , "-1" , prettyLogFormat , "--" , relpath ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , runErr := NewCommand ( repo . Ctx , "log" , "-1" , prettyLogFormat ) . AddDashesAndList ( relpath ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
if runErr != nil {
if runErr != nil {
return nil , runErr
return nil , runErr
}
}
@ -89,8 +89,10 @@ func (repo *Repository) GetCommitByPath(relpath string) (*Commit, error) {
}
}
func ( repo * Repository ) commitsByRange ( id SHA1 , page , pageSize int ) ( [ ] * Commit , error ) {
func ( repo * Repository ) commitsByRange ( id SHA1 , page , pageSize int ) ( [ ] * Commit , error ) {
stdout , _ , err := NewCommand ( repo . Ctx , "log" , id . String ( ) , "--skip=" + strconv . Itoa ( ( page - 1 ) * pageSize ) ,
stdout , _ , err := NewCommand ( repo . Ctx , "log" ) .
"--max-count=" + strconv . Itoa ( pageSize ) , prettyLogFormat ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
AddArguments ( CmdArg ( "--skip=" + strconv . Itoa ( ( page - 1 ) * pageSize ) ) , CmdArg ( "--max-count=" + strconv . Itoa ( pageSize ) ) , prettyLogFormat ) .
AddDynamicArguments ( id . String ( ) ) .
RunStdBytes ( & RunOpts { Dir : repo . Path } )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
@ -99,30 +101,30 @@ func (repo *Repository) commitsByRange(id SHA1, page, pageSize int) ([]*Commit,
func ( repo * Repository ) searchCommits ( id SHA1 , opts SearchCommitsOptions ) ( [ ] * Commit , error ) {
func ( repo * Repository ) searchCommits ( id SHA1 , opts SearchCommitsOptions ) ( [ ] * Commit , error ) {
// create new git log command with limit of 100 commis
// create new git log command with limit of 100 commis
cmd := NewCommand ( repo . Ctx , "log" , id . String ( ) , "-100" , prettyLogFormat )
cmd := NewCommand ( repo . Ctx , "log" , "-100" , prettyLogFormat ) . AddDynamicArguments ( id . String ( ) )
// ignore case
// ignore case
args := [ ] strin g{ "-i" }
args := [ ] CmdAr g{ "-i" }
// add authors if present in search query
// add authors if present in search query
if len ( opts . Authors ) > 0 {
if len ( opts . Authors ) > 0 {
for _ , v := range opts . Authors {
for _ , v := range opts . Authors {
args = append ( args , "--author=" + v )
args = append ( args , CmdArg ( "--author=" + v ) )
}
}
}
}
// add committers if present in search query
// add committers if present in search query
if len ( opts . Committers ) > 0 {
if len ( opts . Committers ) > 0 {
for _ , v := range opts . Committers {
for _ , v := range opts . Committers {
args = append ( args , "--committer=" + v )
args = append ( args , CmdArg ( "--committer=" + v ) )
}
}
}
}
// add time constraints if present in search query
// add time constraints if present in search query
if len ( opts . After ) > 0 {
if len ( opts . After ) > 0 {
args = append ( args , "--after=" + opts . After )
args = append ( args , CmdArg ( "--after=" + opts . After ) )
}
}
if len ( opts . Before ) > 0 {
if len ( opts . Before ) > 0 {
args = append ( args , "--before=" + opts . Before )
args = append ( args , CmdArg ( "--before=" + opts . Before ) )
}
}
// pretend that all refs along with HEAD were listed on command line as <commis>
// pretend that all refs along with HEAD were listed on command line as <commis>
@ -136,7 +138,7 @@ func (repo *Repository) searchCommits(id SHA1, opts SearchCommitsOptions) ([]*Co
// note this is done only for command created above
// note this is done only for command created above
if len ( opts . Keywords ) > 0 {
if len ( opts . Keywords ) > 0 {
for _ , v := range opts . Keywords {
for _ , v := range opts . Keywords {
cmd . AddArguments ( "--grep=" + v )
cmd . AddArguments ( CmdArg ( "--grep=" + v ) )
}
}
}
}
@ -178,7 +180,7 @@ func (repo *Repository) searchCommits(id SHA1, opts SearchCommitsOptions) ([]*Co
}
}
func ( repo * Repository ) getFilesChanged ( id1 , id2 string ) ( [ ] string , error ) {
func ( repo * Repository ) getFilesChanged ( id1 , id2 string ) ( [ ] string , error ) {
stdout , _ , err := NewCommand ( repo . Ctx , "diff" , "--name-only" , id1 , id2 ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , err := NewCommand ( repo . Ctx , "diff" , "--name-only" ) . AddDynamicArguments ( id1 , id2 ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
@ -188,7 +190,7 @@ func (repo *Repository) getFilesChanged(id1, id2 string) ([]string, error) {
// FileChangedBetweenCommits Returns true if the file changed between commit IDs id1 and id2
// FileChangedBetweenCommits Returns true if the file changed between commit IDs id1 and id2
// You must ensure that id1 and id2 are valid commit ids.
// You must ensure that id1 and id2 are valid commit ids.
func ( repo * Repository ) FileChangedBetweenCommits ( filename , id1 , id2 string ) ( bool , error ) {
func ( repo * Repository ) FileChangedBetweenCommits ( filename , id1 , id2 string ) ( bool , error ) {
stdout , _ , err := NewCommand ( repo . Ctx , "diff" , "--name-only" , "-z" , id1 , id2 , "--" , filename ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , err := NewCommand ( repo . Ctx , "diff" , "--name-only" , "-z" ) . AddDynamicArguments ( id1 , id2 ) . AddDashesAndList ( filename ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
if err != nil {
if err != nil {
return false , err
return false , err
}
}
@ -211,12 +213,11 @@ func (repo *Repository) CommitsByFileAndRange(revision, file string, page int) (
} ( )
} ( )
go func ( ) {
go func ( ) {
stderr := strings . Builder { }
stderr := strings . Builder { }
gitCmd := NewCommand ( repo . Ctx , "rev-list" ,
gitCmd := NewCommand ( repo . Ctx , "rev-list" ) .
"--max-count=" + strconv . Itoa ( setting . Git . CommitsRangeSize * page ) ,
AddArguments ( CmdArg ( "--max-count=" + strconv . Itoa ( setting . Git . CommitsRangeSize * page ) ) ) .
"--skip=" + strconv . Itoa ( skip ) ,
AddArguments ( CmdArg ( "--skip=" + strconv . Itoa ( skip ) ) )
)
gitCmd . AddDynamicArguments ( revision )
gitCmd . AddDynamicArguments ( revision )
gitCmd . AddArguments ( "--" , file )
gitCmd . AddDashesAndList ( file )
err := gitCmd . Run ( & RunOpts {
err := gitCmd . Run ( & RunOpts {
Dir : repo . Path ,
Dir : repo . Path ,
Stdout : stdoutWriter ,
Stdout : stdoutWriter ,
@ -257,11 +258,11 @@ func (repo *Repository) CommitsByFileAndRange(revision, file string, page int) (
// FilesCountBetween return the number of files changed between two commits
// FilesCountBetween return the number of files changed between two commits
func ( repo * Repository ) FilesCountBetween ( startCommitID , endCommitID string ) ( int , error ) {
func ( repo * Repository ) FilesCountBetween ( startCommitID , endCommitID string ) ( int , error ) {
stdout , _ , err := NewCommand ( repo . Ctx , "diff" , "--name-only" , startCommitID + "..." + endCommitID ) . RunStdString ( & RunOpts { Dir : repo . Path } )
stdout , _ , err := NewCommand ( repo . Ctx , "diff" , "--name-only" ) . AddDynamicArguments ( startCommitID + "..." + endCommitID ) . RunStdString ( & RunOpts { Dir : repo . Path } )
if err != nil && strings . Contains ( err . Error ( ) , "no merge base" ) {
if err != nil && strings . Contains ( err . Error ( ) , "no merge base" ) {
// git >= 2.28 now returns an error if startCommitID and endCommitID have become unrelated.
// git >= 2.28 now returns an error if startCommitID and endCommitID have become unrelated.
// previously it would return the results of git diff --name-only startCommitID endCommitID so let's try that...
// previously it would return the results of git diff --name-only startCommitID endCommitID so let's try that...
stdout , _ , err = NewCommand ( repo . Ctx , "diff" , "--name-only" , startCommitID , endCommitID ) . RunStdString ( & RunOpts { Dir : repo . Path } )
stdout , _ , err = NewCommand ( repo . Ctx , "diff" , "--name-only" ) . AddDynamicArguments ( startCommitID , endCommitID ) . RunStdString ( & RunOpts { Dir : repo . Path } )
}
}
if err != nil {
if err != nil {
return 0 , err
return 0 , err
@ -275,13 +276,13 @@ func (repo *Repository) CommitsBetween(last, before *Commit) ([]*Commit, error)
var stdout [ ] byte
var stdout [ ] byte
var err error
var err error
if before == nil {
if before == nil {
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" , last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" ) . AddDynamicArguments ( last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
} else {
} else {
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" , before . ID . String ( ) + ".." + last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" ) . AddDynamicArguments ( before . ID . String ( ) + ".." + last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
if err != nil && strings . Contains ( err . Error ( ) , "no merge base" ) {
if err != nil && strings . Contains ( err . Error ( ) , "no merge base" ) {
// future versions of git >= 2.28 are likely to return an error if before and last have become unrelated.
// future versions of git >= 2.28 are likely to return an error if before and last have become unrelated.
// previously it would return the results of git rev-list before last so let's try that...
// previously it would return the results of git rev-list before last so let's try that...
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" , before . ID . String ( ) , last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" ) . AddDynamicArguments ( before . ID . String ( ) , last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
}
}
}
}
if err != nil {
if err != nil {
@ -295,13 +296,22 @@ func (repo *Repository) CommitsBetweenLimit(last, before *Commit, limit, skip in
var stdout [ ] byte
var stdout [ ] byte
var err error
var err error
if before == nil {
if before == nil {
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" , "--max-count" , strconv . Itoa ( limit ) , "--skip" , strconv . Itoa ( skip ) , last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" ,
"--max-count" , CmdArg ( strconv . Itoa ( limit ) ) ,
"--skip" , CmdArg ( strconv . Itoa ( skip ) ) ) .
AddDynamicArguments ( last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
} else {
} else {
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" , "--max-count" , strconv . Itoa ( limit ) , "--skip" , strconv . Itoa ( skip ) , before . ID . String ( ) + ".." + last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" ,
"--max-count" , CmdArg ( strconv . Itoa ( limit ) ) ,
"--skip" , CmdArg ( strconv . Itoa ( skip ) ) ) .
AddDynamicArguments ( before . ID . String ( ) + ".." + last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
if err != nil && strings . Contains ( err . Error ( ) , "no merge base" ) {
if err != nil && strings . Contains ( err . Error ( ) , "no merge base" ) {
// future versions of git >= 2.28 are likely to return an error if before and last have become unrelated.
// future versions of git >= 2.28 are likely to return an error if before and last have become unrelated.
// previously it would return the results of git rev-list --max-count n before last so let's try that...
// previously it would return the results of git rev-list --max-count n before last so let's try that...
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" , "--max-count" , strconv . Itoa ( limit ) , "--skip" , strconv . Itoa ( skip ) , before . ID . String ( ) , last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , err = NewCommand ( repo . Ctx , "rev-list" ,
"--max-count" , CmdArg ( strconv . Itoa ( limit ) ) ,
"--skip" , CmdArg ( strconv . Itoa ( skip ) ) ) .
AddDynamicArguments ( before . ID . String ( ) , last . ID . String ( ) ) . RunStdBytes ( & RunOpts { Dir : repo . Path } )
}
}
}
}
if err != nil {
if err != nil {
@ -342,9 +352,9 @@ func (repo *Repository) CommitsCountBetween(start, end string) (int64, error) {
func ( repo * Repository ) commitsBefore ( id SHA1 , limit int ) ( [ ] * Commit , error ) {
func ( repo * Repository ) commitsBefore ( id SHA1 , limit int ) ( [ ] * Commit , error ) {
cmd := NewCommand ( repo . Ctx , "log" )
cmd := NewCommand ( repo . Ctx , "log" )
if limit > 0 {
if limit > 0 {
cmd . AddArguments ( "-" + strconv . Itoa ( limit ) , prettyLogFormat , id . String ( ) )
cmd . AddArguments ( CmdArg ( "-" + strconv . Itoa ( limit ) ) , prettyLogFormat ) . AddDynamicArguments ( id . String ( ) )
} else {
} else {
cmd . AddArguments ( prettyLogFormat , id . String ( ) )
cmd . AddArguments ( prettyLogFormat ) . AddDynamicArguments ( id . String ( ) )
}
}
stdout , _ , runErr := cmd . RunStdBytes ( & RunOpts { Dir : repo . Path } )
stdout , _ , runErr := cmd . RunStdBytes ( & RunOpts { Dir : repo . Path } )
@ -384,7 +394,11 @@ func (repo *Repository) getCommitsBeforeLimit(id SHA1, num int) ([]*Commit, erro
func ( repo * Repository ) getBranches ( commit * Commit , limit int ) ( [ ] string , error ) {
func ( repo * Repository ) getBranches ( commit * Commit , limit int ) ( [ ] string , error ) {
if CheckGitVersionAtLeast ( "2.7.0" ) == nil {
if CheckGitVersionAtLeast ( "2.7.0" ) == nil {
stdout , _ , err := NewCommand ( repo . Ctx , "for-each-ref" , "--count=" + strconv . Itoa ( limit ) , "--format=%(refname:strip=2)" , "--contains" , commit . ID . String ( ) , BranchPrefix ) . RunStdString ( & RunOpts { Dir : repo . Path } )
stdout , _ , err := NewCommand ( repo . Ctx , "for-each-ref" ,
CmdArg ( "--count=" + strconv . Itoa ( limit ) ) ,
"--format=%(refname:strip=2)" , "--contains" ) .
AddDynamicArguments ( commit . ID . String ( ) , BranchPrefix ) .
RunStdString ( & RunOpts { Dir : repo . Path } )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
@ -393,7 +407,7 @@ func (repo *Repository) getBranches(commit *Commit, limit int) ([]string, error)
return branches , nil
return branches , nil
}
}
stdout , _ , err := NewCommand ( repo . Ctx , "branch" , "--contains" , commit . ID . String ( ) ) . RunStdString ( & RunOpts { Dir : repo . Path } )
stdout , _ , err := NewCommand ( repo . Ctx , "branch" , "--contains" ) . AddDynamicArguments ( commit . ID . String ( ) ) . RunStdString ( & RunOpts { Dir : repo . Path } )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
@ -432,7 +446,7 @@ func (repo *Repository) GetCommitsFromIDs(commitIDs []string) []*Commit {
// IsCommitInBranch check if the commit is on the branch
// IsCommitInBranch check if the commit is on the branch
func ( repo * Repository ) IsCommitInBranch ( commitID , branch string ) ( r bool , err error ) {
func ( repo * Repository ) IsCommitInBranch ( commitID , branch string ) ( r bool , err error ) {
stdout , _ , err := NewCommand ( repo . Ctx , "branch" , "--contains" , commitID , branch ) . RunStdString ( & RunOpts { Dir : repo . Path } )
stdout , _ , err := NewCommand ( repo . Ctx , "branch" , "--contains" ) . AddDynamicArguments ( commitID , branch ) . RunStdString ( & RunOpts { Dir : repo . Path } )
if err != nil {
if err != nil {
return false , err
return false , err
}
}