code.gitea.io/gitea@v1.19.3/modules/git/tree_entry_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  //go:build gogit
     5  
     6  package git
     7  
     8  import (
     9  	"testing"
    10  
    11  	"github.com/go-git/go-git/v5/plumbing/filemode"
    12  	"github.com/go-git/go-git/v5/plumbing/object"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func getTestEntries() Entries {
    17  	return Entries{
    18  		&TreeEntry{gogitTreeEntry: &object.TreeEntry{Name: "v1.0", Mode: filemode.Dir}},
    19  		&TreeEntry{gogitTreeEntry: &object.TreeEntry{Name: "v2.0", Mode: filemode.Dir}},
    20  		&TreeEntry{gogitTreeEntry: &object.TreeEntry{Name: "v2.1", Mode: filemode.Dir}},
    21  		&TreeEntry{gogitTreeEntry: &object.TreeEntry{Name: "v2.12", Mode: filemode.Dir}},
    22  		&TreeEntry{gogitTreeEntry: &object.TreeEntry{Name: "v2.2", Mode: filemode.Dir}},
    23  		&TreeEntry{gogitTreeEntry: &object.TreeEntry{Name: "v12.0", Mode: filemode.Dir}},
    24  		&TreeEntry{gogitTreeEntry: &object.TreeEntry{Name: "abc", Mode: filemode.Regular}},
    25  		&TreeEntry{gogitTreeEntry: &object.TreeEntry{Name: "bcd", Mode: filemode.Regular}},
    26  	}
    27  }
    28  
    29  func TestEntriesSort(t *testing.T) {
    30  	entries := getTestEntries()
    31  	entries.Sort()
    32  	assert.Equal(t, "v1.0", entries[0].Name())
    33  	assert.Equal(t, "v12.0", entries[1].Name())
    34  	assert.Equal(t, "v2.0", entries[2].Name())
    35  	assert.Equal(t, "v2.1", entries[3].Name())
    36  	assert.Equal(t, "v2.12", entries[4].Name())
    37  	assert.Equal(t, "v2.2", entries[5].Name())
    38  	assert.Equal(t, "abc", entries[6].Name())
    39  	assert.Equal(t, "bcd", entries[7].Name())
    40  }
    41  
    42  func TestEntriesCustomSort(t *testing.T) {
    43  	entries := getTestEntries()
    44  	entries.CustomSort(func(s1, s2 string) bool {
    45  		return s1 > s2
    46  	})
    47  	assert.Equal(t, "v2.2", entries[0].Name())
    48  	assert.Equal(t, "v2.12", entries[1].Name())
    49  	assert.Equal(t, "v2.1", entries[2].Name())
    50  	assert.Equal(t, "v2.0", entries[3].Name())
    51  	assert.Equal(t, "v12.0", entries[4].Name())
    52  	assert.Equal(t, "v1.0", entries[5].Name())
    53  	assert.Equal(t, "bcd", entries[6].Name())
    54  	assert.Equal(t, "abc", entries[7].Name())
    55  }
    56  
    57  func TestFollowLink(t *testing.T) {
    58  	r, err := openRepositoryWithDefaultContext("tests/repos/repo1_bare")
    59  	assert.NoError(t, err)
    60  	defer r.Close()
    61  
    62  	commit, err := r.GetCommit("37991dec2c8e592043f47155ce4808d4580f9123")
    63  	assert.NoError(t, err)
    64  
    65  	// get the symlink
    66  	lnk, err := commit.Tree.GetTreeEntryByPath("foo/bar/link_to_hello")
    67  	assert.NoError(t, err)
    68  	assert.True(t, lnk.IsLink())
    69  
    70  	// should be able to dereference to target
    71  	target, err := lnk.FollowLink()
    72  	assert.NoError(t, err)
    73  	assert.Equal(t, "hello", target.Name())
    74  	assert.False(t, target.IsLink())
    75  	assert.Equal(t, "b14df6442ea5a1b382985a6549b85d435376c351", target.ID.String())
    76  
    77  	// should error when called on normal file
    78  	target, err = commit.Tree.GetTreeEntryByPath("file1.txt")
    79  	assert.NoError(t, err)
    80  	_, err = target.FollowLink()
    81  	assert.EqualError(t, err, "file1.txt: not a symlink")
    82  
    83  	// should error for broken links
    84  	target, err = commit.Tree.GetTreeEntryByPath("foo/broken_link")
    85  	assert.NoError(t, err)
    86  	assert.True(t, target.IsLink())
    87  	_, err = target.FollowLink()
    88  	assert.EqualError(t, err, "broken_link: broken link")
    89  
    90  	// should error for external links
    91  	target, err = commit.Tree.GetTreeEntryByPath("foo/outside_repo")
    92  	assert.NoError(t, err)
    93  	assert.True(t, target.IsLink())
    94  	_, err = target.FollowLink()
    95  	assert.EqualError(t, err, "outside_repo: points outside of repo")
    96  
    97  	// testing fix for short link bug
    98  	target, err = commit.Tree.GetTreeEntryByPath("foo/link_short")
    99  	assert.NoError(t, err)
   100  	_, err = target.FollowLink()
   101  	assert.EqualError(t, err, "link_short: broken link")
   102  }