mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-07-31 14:24:25 +03:00
Make Node.path private
This is in preparation for changing the meaning of path in the next commit.
This commit is contained in:
@ -41,7 +41,7 @@ func BuildTreeFromFiles(files []*models.File) *Node[models.File] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
newChild := &Node[models.File]{
|
newChild := &Node[models.File]{
|
||||||
Path: path,
|
path: path,
|
||||||
File: setFile,
|
File: setFile,
|
||||||
}
|
}
|
||||||
curr.Children = append(curr.Children, newChild)
|
curr.Children = append(curr.Children, newChild)
|
||||||
@ -83,14 +83,14 @@ func BuildTreeFromCommitFiles(files []*models.CommitFile) *Node[models.CommitFil
|
|||||||
path := join(splitPath[:i+1])
|
path := join(splitPath[:i+1])
|
||||||
|
|
||||||
for _, existingChild := range curr.Children {
|
for _, existingChild := range curr.Children {
|
||||||
if existingChild.Path == path {
|
if existingChild.path == path {
|
||||||
curr = existingChild
|
curr = existingChild
|
||||||
continue outer
|
continue outer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newChild := &Node[models.CommitFile]{
|
newChild := &Node[models.CommitFile]{
|
||||||
Path: path,
|
path: path,
|
||||||
File: setFile,
|
File: setFile,
|
||||||
}
|
}
|
||||||
curr.Children = append(curr.Children, newChild)
|
curr.Children = append(curr.Children, newChild)
|
||||||
|
@ -17,7 +17,7 @@ func TestBuildTreeFromFiles(t *testing.T) {
|
|||||||
name: "no files",
|
name: "no files",
|
||||||
files: []*models.File{},
|
files: []*models.File{},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: nil,
|
Children: nil,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -32,18 +32,18 @@ func TestBuildTreeFromFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
Path: "dir1",
|
path: "dir1",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "dir1/a"},
|
File: &models.File{Path: "dir1/a"},
|
||||||
Path: "dir1/a",
|
path: "dir1/a",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "dir1/b"},
|
File: &models.File{Path: "dir1/b"},
|
||||||
Path: "dir1/b",
|
path: "dir1/b",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -61,24 +61,24 @@ func TestBuildTreeFromFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
Path: "dir1/dir3",
|
path: "dir1/dir3",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "dir1/dir3/a"},
|
File: &models.File{Path: "dir1/dir3/a"},
|
||||||
Path: "dir1/dir3/a",
|
path: "dir1/dir3/a",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
CompressionLevel: 1,
|
CompressionLevel: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Path: "dir2/dir4",
|
path: "dir2/dir4",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "dir2/dir4/b"},
|
File: &models.File{Path: "dir2/dir4/b"},
|
||||||
Path: "dir2/dir4/b",
|
path: "dir2/dir4/b",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
CompressionLevel: 1,
|
CompressionLevel: 1,
|
||||||
@ -97,15 +97,15 @@ func TestBuildTreeFromFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "a"},
|
File: &models.File{Path: "a"},
|
||||||
Path: "a",
|
path: "a",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "b"},
|
File: &models.File{Path: "b"},
|
||||||
Path: "b",
|
path: "b",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -125,21 +125,21 @@ func TestBuildTreeFromFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
// it is a little strange that we're not bubbling up our merge conflict
|
// it is a little strange that we're not bubbling up our merge conflict
|
||||||
// here but we are technically still in tree mode and that's the rule
|
// here but we are technically still in tree mode and that's the rule
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "a"},
|
File: &models.File{Path: "a"},
|
||||||
Path: "a",
|
path: "a",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "b"},
|
File: &models.File{Path: "b"},
|
||||||
Path: "b",
|
path: "b",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "z", HasMergeConflicts: true},
|
File: &models.File{Path: "z", HasMergeConflicts: true},
|
||||||
Path: "z",
|
path: "z",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -164,7 +164,7 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
|
|||||||
name: "no files",
|
name: "no files",
|
||||||
files: []*models.File{},
|
files: []*models.File{},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{},
|
Children: []*Node[models.File]{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -179,16 +179,16 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "dir1/a"},
|
File: &models.File{Path: "dir1/a"},
|
||||||
Path: "dir1/a",
|
path: "dir1/a",
|
||||||
CompressionLevel: 0,
|
CompressionLevel: 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "dir1/b"},
|
File: &models.File{Path: "dir1/b"},
|
||||||
Path: "dir1/b",
|
path: "dir1/b",
|
||||||
CompressionLevel: 0,
|
CompressionLevel: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -205,16 +205,16 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "dir1/a"},
|
File: &models.File{Path: "dir1/a"},
|
||||||
Path: "dir1/a",
|
path: "dir1/a",
|
||||||
CompressionLevel: 0,
|
CompressionLevel: 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "dir2/b"},
|
File: &models.File{Path: "dir2/b"},
|
||||||
Path: "dir2/b",
|
path: "dir2/b",
|
||||||
CompressionLevel: 0,
|
CompressionLevel: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -231,15 +231,15 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "a"},
|
File: &models.File{Path: "a"},
|
||||||
Path: "a",
|
path: "a",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "b"},
|
File: &models.File{Path: "b"},
|
||||||
Path: "b",
|
path: "b",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -273,31 +273,31 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "c1", HasMergeConflicts: true},
|
File: &models.File{Path: "c1", HasMergeConflicts: true},
|
||||||
Path: "c1",
|
path: "c1",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "c2", HasMergeConflicts: true},
|
File: &models.File{Path: "c2", HasMergeConflicts: true},
|
||||||
Path: "c2",
|
path: "c2",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "b1", Tracked: true},
|
File: &models.File{Path: "b1", Tracked: true},
|
||||||
Path: "b1",
|
path: "b1",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "b2", Tracked: true},
|
File: &models.File{Path: "b2", Tracked: true},
|
||||||
Path: "b2",
|
path: "b2",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "a1", Tracked: false},
|
File: &models.File{Path: "a1", Tracked: false},
|
||||||
Path: "a1",
|
path: "a1",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "a2", Tracked: false},
|
File: &models.File{Path: "a2", Tracked: false},
|
||||||
Path: "a2",
|
path: "a2",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -322,7 +322,7 @@ func TestBuildTreeFromCommitFiles(t *testing.T) {
|
|||||||
name: "no files",
|
name: "no files",
|
||||||
files: []*models.CommitFile{},
|
files: []*models.CommitFile{},
|
||||||
expected: &Node[models.CommitFile]{
|
expected: &Node[models.CommitFile]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: nil,
|
Children: nil,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -337,18 +337,18 @@ func TestBuildTreeFromCommitFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.CommitFile]{
|
expected: &Node[models.CommitFile]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
Path: "dir1",
|
path: "dir1",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "dir1/a"},
|
File: &models.CommitFile{Path: "dir1/a"},
|
||||||
Path: "dir1/a",
|
path: "dir1/a",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "dir1/b"},
|
File: &models.CommitFile{Path: "dir1/b"},
|
||||||
Path: "dir1/b",
|
path: "dir1/b",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -366,24 +366,24 @@ func TestBuildTreeFromCommitFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.CommitFile]{
|
expected: &Node[models.CommitFile]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
Path: "dir1/dir3",
|
path: "dir1/dir3",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "dir1/dir3/a"},
|
File: &models.CommitFile{Path: "dir1/dir3/a"},
|
||||||
Path: "dir1/dir3/a",
|
path: "dir1/dir3/a",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
CompressionLevel: 1,
|
CompressionLevel: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Path: "dir2/dir4",
|
path: "dir2/dir4",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "dir2/dir4/b"},
|
File: &models.CommitFile{Path: "dir2/dir4/b"},
|
||||||
Path: "dir2/dir4/b",
|
path: "dir2/dir4/b",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
CompressionLevel: 1,
|
CompressionLevel: 1,
|
||||||
@ -402,15 +402,15 @@ func TestBuildTreeFromCommitFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.CommitFile]{
|
expected: &Node[models.CommitFile]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "a"},
|
File: &models.CommitFile{Path: "a"},
|
||||||
Path: "a",
|
path: "a",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "b"},
|
File: &models.CommitFile{Path: "b"},
|
||||||
Path: "b",
|
path: "b",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -435,7 +435,7 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) {
|
|||||||
name: "no files",
|
name: "no files",
|
||||||
files: []*models.CommitFile{},
|
files: []*models.CommitFile{},
|
||||||
expected: &Node[models.CommitFile]{
|
expected: &Node[models.CommitFile]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.CommitFile]{},
|
Children: []*Node[models.CommitFile]{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -450,16 +450,16 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.CommitFile]{
|
expected: &Node[models.CommitFile]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "dir1/a"},
|
File: &models.CommitFile{Path: "dir1/a"},
|
||||||
Path: "dir1/a",
|
path: "dir1/a",
|
||||||
CompressionLevel: 0,
|
CompressionLevel: 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "dir1/b"},
|
File: &models.CommitFile{Path: "dir1/b"},
|
||||||
Path: "dir1/b",
|
path: "dir1/b",
|
||||||
CompressionLevel: 0,
|
CompressionLevel: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -476,16 +476,16 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.CommitFile]{
|
expected: &Node[models.CommitFile]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "dir1/a"},
|
File: &models.CommitFile{Path: "dir1/a"},
|
||||||
Path: "dir1/a",
|
path: "dir1/a",
|
||||||
CompressionLevel: 0,
|
CompressionLevel: 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "dir2/b"},
|
File: &models.CommitFile{Path: "dir2/b"},
|
||||||
Path: "dir2/b",
|
path: "dir2/b",
|
||||||
CompressionLevel: 0,
|
CompressionLevel: 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -502,15 +502,15 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.CommitFile]{
|
expected: &Node[models.CommitFile]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.CommitFile]{
|
Children: []*Node[models.CommitFile]{
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "a"},
|
File: &models.CommitFile{Path: "a"},
|
||||||
Path: "a",
|
path: "a",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.CommitFile{Path: "b"},
|
File: &models.CommitFile{Path: "b"},
|
||||||
Path: "b",
|
path: "b",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -27,7 +27,7 @@ type CommitFileTree struct {
|
|||||||
|
|
||||||
func (self *CommitFileTree) CollapseAll() {
|
func (self *CommitFileTree) CollapseAll() {
|
||||||
dirPaths := lo.FilterMap(self.GetAllItems(), func(file *CommitFileNode, index int) (string, bool) {
|
dirPaths := lo.FilterMap(self.GetAllItems(), func(file *CommitFileNode, index int) (string, bool) {
|
||||||
return file.Path, !file.IsFile()
|
return file.path, !file.IsFile()
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, path := range dirPaths {
|
for _, path := range dirPaths {
|
||||||
|
@ -148,12 +148,12 @@ func (self *CommitFileTreeViewModel) ToggleShowTree() {
|
|||||||
if selectedNode == nil {
|
if selectedNode == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
path := selectedNode.Path
|
path := selectedNode.path
|
||||||
|
|
||||||
if self.InTreeMode() {
|
if self.InTreeMode() {
|
||||||
self.ExpandToPath(path)
|
self.ExpandToPath(path)
|
||||||
} else if len(selectedNode.Children) > 0 {
|
} else if len(selectedNode.Children) > 0 {
|
||||||
path = selectedNode.GetLeaves()[0].Path
|
path = selectedNode.GetLeaves()[0].path
|
||||||
}
|
}
|
||||||
|
|
||||||
index, found := self.GetIndexForPath(path)
|
index, found := self.GetIndexForPath(path)
|
||||||
@ -170,7 +170,7 @@ func (self *CommitFileTreeViewModel) CollapseAll() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
topLevelPath := strings.Split(selectedNode.Path, "/")[0]
|
topLevelPath := strings.Split(selectedNode.path, "/")[0]
|
||||||
index, found := self.GetIndexForPath(topLevelPath)
|
index, found := self.GetIndexForPath(topLevelPath)
|
||||||
if found {
|
if found {
|
||||||
self.SetSelectedLineIdx(index)
|
self.SetSelectedLineIdx(index)
|
||||||
@ -186,7 +186,7 @@ func (self *CommitFileTreeViewModel) ExpandAll() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
index, found := self.GetIndexForPath(selectedNode.Path)
|
index, found := self.GetIndexForPath(selectedNode.path)
|
||||||
if found {
|
if found {
|
||||||
self.SetSelectedLineIdx(index)
|
self.SetSelectedLineIdx(index)
|
||||||
}
|
}
|
||||||
|
@ -21,54 +21,54 @@ func TestCompress(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "leaf node",
|
name: "leaf node",
|
||||||
root: &Node[models.File]{
|
root: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{File: &models.File{Path: "test", ShortStatus: " M", HasStagedChanges: true}, Path: "test"},
|
{File: &models.File{Path: "test", ShortStatus: " M", HasStagedChanges: true}, path: "test"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{File: &models.File{Path: "test", ShortStatus: " M", HasStagedChanges: true}, Path: "test"},
|
{File: &models.File{Path: "test", ShortStatus: " M", HasStagedChanges: true}, path: "test"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "big example",
|
name: "big example",
|
||||||
root: &Node[models.File]{
|
root: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
Path: "dir1",
|
path: "dir1",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file2", ShortStatus: "M ", HasUnstagedChanges: true},
|
File: &models.File{Path: "file2", ShortStatus: "M ", HasUnstagedChanges: true},
|
||||||
Path: "dir1/file2",
|
path: "dir1/file2",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Path: "dir2",
|
path: "dir2",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file3", ShortStatus: " M", HasStagedChanges: true},
|
File: &models.File{Path: "file3", ShortStatus: " M", HasStagedChanges: true},
|
||||||
Path: "dir2/file3",
|
path: "dir2/file3",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file4", ShortStatus: "M ", HasUnstagedChanges: true},
|
File: &models.File{Path: "file4", ShortStatus: "M ", HasUnstagedChanges: true},
|
||||||
Path: "dir2/file4",
|
path: "dir2/file4",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Path: "dir3",
|
path: "dir3",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
Path: "dir3/dir3-1",
|
path: "dir3/dir3-1",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file5", ShortStatus: "M ", HasUnstagedChanges: true},
|
File: &models.File{Path: "file5", ShortStatus: "M ", HasUnstagedChanges: true},
|
||||||
Path: "dir3/dir3-1/file5",
|
path: "dir3/dir3-1/file5",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -76,48 +76,48 @@ func TestCompress(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file1", ShortStatus: "M ", HasUnstagedChanges: true},
|
File: &models.File{Path: "file1", ShortStatus: "M ", HasUnstagedChanges: true},
|
||||||
Path: "file1",
|
path: "file1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expected: &Node[models.File]{
|
expected: &Node[models.File]{
|
||||||
Path: "",
|
path: "",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
Path: "dir1",
|
path: "dir1",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file2", ShortStatus: "M ", HasUnstagedChanges: true},
|
File: &models.File{Path: "file2", ShortStatus: "M ", HasUnstagedChanges: true},
|
||||||
Path: "dir1/file2",
|
path: "dir1/file2",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Path: "dir2",
|
path: "dir2",
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file3", ShortStatus: " M", HasStagedChanges: true},
|
File: &models.File{Path: "file3", ShortStatus: " M", HasStagedChanges: true},
|
||||||
Path: "dir2/file3",
|
path: "dir2/file3",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file4", ShortStatus: "M ", HasUnstagedChanges: true},
|
File: &models.File{Path: "file4", ShortStatus: "M ", HasUnstagedChanges: true},
|
||||||
Path: "dir2/file4",
|
path: "dir2/file4",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Path: "dir3/dir3-1",
|
path: "dir3/dir3-1",
|
||||||
CompressionLevel: 1,
|
CompressionLevel: 1,
|
||||||
Children: []*Node[models.File]{
|
Children: []*Node[models.File]{
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file5", ShortStatus: "M ", HasUnstagedChanges: true},
|
File: &models.File{Path: "file5", ShortStatus: "M ", HasUnstagedChanges: true},
|
||||||
Path: "dir3/dir3-1/file5",
|
path: "dir3/dir3-1/file5",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
File: &models.File{Path: "file1", ShortStatus: "M ", HasUnstagedChanges: true},
|
File: &models.File{Path: "file1", ShortStatus: "M ", HasUnstagedChanges: true},
|
||||||
Path: "file1",
|
path: "file1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -185,7 +185,7 @@ func (self *FileTree) ToggleCollapsed(path string) {
|
|||||||
|
|
||||||
func (self *FileTree) CollapseAll() {
|
func (self *FileTree) CollapseAll() {
|
||||||
dirPaths := lo.FilterMap(self.GetAllItems(), func(file *FileNode, index int) (string, bool) {
|
dirPaths := lo.FilterMap(self.GetAllItems(), func(file *FileNode, index int) (string, bool) {
|
||||||
return file.Path, !file.IsFile()
|
return file.path, !file.IsFile()
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, path := range dirPaths {
|
for _, path := range dirPaths {
|
||||||
|
@ -103,7 +103,7 @@ func (self *FileTreeViewModel) SetTree() {
|
|||||||
|
|
||||||
// for when you stage the old file of a rename and the new file is in a collapsed dir
|
// for when you stage the old file of a rename and the new file is in a collapsed dir
|
||||||
for _, file := range newFiles {
|
for _, file := range newFiles {
|
||||||
if selectedNode != nil && selectedNode.Path != "" && file.PreviousPath == selectedNode.Path {
|
if selectedNode != nil && selectedNode.path != "" && file.PreviousPath == selectedNode.path {
|
||||||
self.ExpandToPath(file.Path)
|
self.ExpandToPath(file.Path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -139,7 +139,7 @@ func (self *FileTreeViewModel) findNewSelectedIdx(prevNodes []*FileNode, currNod
|
|||||||
if node.File != nil && node.File.IsRename() {
|
if node.File != nil && node.File.IsRename() {
|
||||||
return node.File.Names()
|
return node.File.Names()
|
||||||
} else {
|
} else {
|
||||||
return []string{node.Path}
|
return []string{node.path}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,7 +151,7 @@ func (self *FileTreeViewModel) findNewSelectedIdx(prevNodes []*FileNode, currNod
|
|||||||
|
|
||||||
// If you started off with a rename selected, and now it's broken in two, we want you to jump to the new file, not the old file.
|
// If you started off with a rename selected, and now it's broken in two, we want you to jump to the new file, not the old file.
|
||||||
// This is because the new should be in the same position as the rename was meaning less cursor jumping
|
// This is because the new should be in the same position as the rename was meaning less cursor jumping
|
||||||
foundOldFileInRename := prevNode.File != nil && prevNode.File.IsRename() && node.Path == prevNode.File.PreviousPath
|
foundOldFileInRename := prevNode.File != nil && prevNode.File.IsRename() && node.path == prevNode.File.PreviousPath
|
||||||
foundNode := utils.StringArraysOverlap(paths, selectedPaths) && !foundOldFileInRename
|
foundNode := utils.StringArraysOverlap(paths, selectedPaths) && !foundOldFileInRename
|
||||||
if foundNode {
|
if foundNode {
|
||||||
return idx
|
return idx
|
||||||
@ -178,12 +178,12 @@ func (self *FileTreeViewModel) ToggleShowTree() {
|
|||||||
if selectedNode == nil {
|
if selectedNode == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
path := selectedNode.Path
|
path := selectedNode.path
|
||||||
|
|
||||||
if self.InTreeMode() {
|
if self.InTreeMode() {
|
||||||
self.ExpandToPath(path)
|
self.ExpandToPath(path)
|
||||||
} else if len(selectedNode.Children) > 0 {
|
} else if len(selectedNode.Children) > 0 {
|
||||||
path = selectedNode.GetLeaves()[0].Path
|
path = selectedNode.GetLeaves()[0].path
|
||||||
}
|
}
|
||||||
|
|
||||||
index, found := self.GetIndexForPath(path)
|
index, found := self.GetIndexForPath(path)
|
||||||
@ -200,7 +200,7 @@ func (self *FileTreeViewModel) CollapseAll() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
topLevelPath := strings.Split(selectedNode.Path, "/")[0]
|
topLevelPath := strings.Split(selectedNode.path, "/")[0]
|
||||||
index, found := self.GetIndexForPath(topLevelPath)
|
index, found := self.GetIndexForPath(topLevelPath)
|
||||||
if found {
|
if found {
|
||||||
self.SetSelectedLineIdx(index)
|
self.SetSelectedLineIdx(index)
|
||||||
@ -216,7 +216,7 @@ func (self *FileTreeViewModel) ExpandAll() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
index, found := self.GetIndexForPath(selectedNode.Path)
|
index, found := self.GetIndexForPath(selectedNode.path)
|
||||||
if found {
|
if found {
|
||||||
self.SetSelectedLineIdx(index)
|
self.SetSelectedLineIdx(index)
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,8 @@ type Node[T any] struct {
|
|||||||
Children []*Node[T]
|
Children []*Node[T]
|
||||||
|
|
||||||
// path of the file/directory
|
// path of the file/directory
|
||||||
Path string
|
// private; use GetPath() to access
|
||||||
|
path string
|
||||||
|
|
||||||
// rather than render a tree as:
|
// rather than render a tree as:
|
||||||
// a/
|
// a/
|
||||||
@ -47,7 +48,7 @@ func (self *Node[T]) GetFile() *T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *Node[T]) GetPath() string {
|
func (self *Node[T]) GetPath() string {
|
||||||
return self.Path
|
return self.path
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Node[T]) Sort() {
|
func (self *Node[T]) Sort() {
|
||||||
@ -89,7 +90,7 @@ func (self *Node[T]) SortChildren() {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Compare(a.Path, b.Path)
|
return strings.Compare(a.path, b.path)
|
||||||
})
|
})
|
||||||
|
|
||||||
// TODO: think about making this in-place
|
// TODO: think about making this in-place
|
||||||
@ -159,7 +160,7 @@ func (self *Node[T]) EveryFile(test func(*T) bool) bool {
|
|||||||
func (self *Node[T]) Flatten(collapsedPaths *CollapsedPaths) []*Node[T] {
|
func (self *Node[T]) Flatten(collapsedPaths *CollapsedPaths) []*Node[T] {
|
||||||
result := []*Node[T]{self}
|
result := []*Node[T]{self}
|
||||||
|
|
||||||
if len(self.Children) > 0 && !collapsedPaths.IsCollapsed(self.Path) {
|
if len(self.Children) > 0 && !collapsedPaths.IsCollapsed(self.path) {
|
||||||
result = append(result, lo.FlatMap(self.Children, func(child *Node[T], _ int) []*Node[T] {
|
result = append(result, lo.FlatMap(self.Children, func(child *Node[T], _ int) []*Node[T] {
|
||||||
return child.Flatten(collapsedPaths)
|
return child.Flatten(collapsedPaths)
|
||||||
})...)
|
})...)
|
||||||
@ -185,7 +186,7 @@ func (self *Node[T]) getNodeAtIndexAux(index int, collapsedPaths *CollapsedPaths
|
|||||||
return self, offset
|
return self, offset
|
||||||
}
|
}
|
||||||
|
|
||||||
if !collapsedPaths.IsCollapsed(self.Path) {
|
if !collapsedPaths.IsCollapsed(self.path) {
|
||||||
for _, child := range self.Children {
|
for _, child := range self.Children {
|
||||||
foundNode, offsetChange := child.getNodeAtIndexAux(index-offset, collapsedPaths)
|
foundNode, offsetChange := child.getNodeAtIndexAux(index-offset, collapsedPaths)
|
||||||
offset += offsetChange
|
offset += offsetChange
|
||||||
@ -201,11 +202,11 @@ func (self *Node[T]) getNodeAtIndexAux(index int, collapsedPaths *CollapsedPaths
|
|||||||
func (self *Node[T]) GetIndexForPath(path string, collapsedPaths *CollapsedPaths) (int, bool) {
|
func (self *Node[T]) GetIndexForPath(path string, collapsedPaths *CollapsedPaths) (int, bool) {
|
||||||
offset := 0
|
offset := 0
|
||||||
|
|
||||||
if self.Path == path {
|
if self.path == path {
|
||||||
return offset, true
|
return offset, true
|
||||||
}
|
}
|
||||||
|
|
||||||
if !collapsedPaths.IsCollapsed(self.Path) {
|
if !collapsedPaths.IsCollapsed(self.path) {
|
||||||
for _, child := range self.Children {
|
for _, child := range self.Children {
|
||||||
offsetChange, found := child.GetIndexForPath(path, collapsedPaths)
|
offsetChange, found := child.GetIndexForPath(path, collapsedPaths)
|
||||||
offset += offsetChange + 1
|
offset += offsetChange + 1
|
||||||
@ -225,7 +226,7 @@ func (self *Node[T]) Size(collapsedPaths *CollapsedPaths) int {
|
|||||||
|
|
||||||
output := 1
|
output := 1
|
||||||
|
|
||||||
if !collapsedPaths.IsCollapsed(self.Path) {
|
if !collapsedPaths.IsCollapsed(self.path) {
|
||||||
for _, child := range self.Children {
|
for _, child := range self.Children {
|
||||||
output += child.Size(collapsedPaths)
|
output += child.Size(collapsedPaths)
|
||||||
}
|
}
|
||||||
@ -309,5 +310,5 @@ func (self *Node[T]) Description() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *Node[T]) Name() string {
|
func (self *Node[T]) Name() string {
|
||||||
return path.Base(self.Path)
|
return path.Base(self.path)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user