2020-12-17 14:00:47 +00:00
// Copyright 2015 The Gogs Authors. All rights reserved.
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2020-12-17 14:00:47 +00:00
2021-08-24 11:47:09 -05:00
//go:build gogit
2020-12-17 14:00:47 +00:00
package git
import (
"io"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
)
// Tree represents a flat directory listing.
type Tree struct {
ID SHA1
ResolvedID SHA1
repo * Repository
gogitTree * object . Tree
// parent tree
ptree * Tree
}
func ( t * Tree ) loadTreeObject ( ) error {
gogitTree , err := t . repo . gogitRepo . TreeObject ( t . ID )
if err != nil {
return err
}
t . gogitTree = gogitTree
return nil
}
// ListEntries returns all entries of current tree.
func ( t * Tree ) ListEntries ( ) ( Entries , error ) {
if t . gogitTree == nil {
err := t . loadTreeObject ( )
if err != nil {
return nil , err
}
}
entries := make ( [ ] * TreeEntry , len ( t . gogitTree . Entries ) )
for i , entry := range t . gogitTree . Entries {
entries [ i ] = & TreeEntry {
ID : entry . Hash ,
gogitTreeEntry : & t . gogitTree . Entries [ i ] ,
ptree : t ,
}
}
return entries , nil
}
2022-10-08 01:20:53 +08:00
// ListEntriesRecursiveWithSize returns all entries of current tree recursively including all subtrees
func ( t * Tree ) ListEntriesRecursiveWithSize ( ) ( Entries , error ) {
2020-12-17 14:00:47 +00:00
if t . gogitTree == nil {
err := t . loadTreeObject ( )
if err != nil {
return nil , err
}
}
var entries [ ] * TreeEntry
seen := map [ plumbing . Hash ] bool { }
walker := object . NewTreeWalker ( t . gogitTree , true , seen )
for {
fullName , entry , err := walker . Next ( )
if err == io . EOF {
break
}
if err != nil {
return nil , err
}
if seen [ entry . Hash ] {
continue
}
convertedEntry := & TreeEntry {
ID : entry . Hash ,
gogitTreeEntry : & entry ,
ptree : t ,
fullName : fullName ,
}
entries = append ( entries , convertedEntry )
}
return entries , nil
}
2022-10-08 01:20:53 +08:00
// ListEntriesRecursiveFast is the alias of ListEntriesRecursiveWithSize for the gogit version
func ( t * Tree ) ListEntriesRecursiveFast ( ) ( Entries , error ) {
return t . ListEntriesRecursiveWithSize ( )
}