code.gitea.io/gitea@v1.22.3/modules/git/repo_tag_test.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package git
     5  
     6  import (
     7  	"path/filepath"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestRepository_GetTags(t *testing.T) {
    15  	bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
    16  	bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path)
    17  	if err != nil {
    18  		assert.NoError(t, err)
    19  		return
    20  	}
    21  	defer bareRepo1.Close()
    22  
    23  	tags, total, err := bareRepo1.GetTagInfos(0, 0)
    24  	if err != nil {
    25  		assert.NoError(t, err)
    26  		return
    27  	}
    28  	assert.Len(t, tags, 2)
    29  	assert.Len(t, tags, total)
    30  	assert.EqualValues(t, "signed-tag", tags[0].Name)
    31  	assert.EqualValues(t, "36f97d9a96457e2bab511db30fe2db03893ebc64", tags[0].ID.String())
    32  	assert.EqualValues(t, "tag", tags[0].Type)
    33  	assert.EqualValues(t, "test", tags[1].Name)
    34  	assert.EqualValues(t, "3ad28a9149a2864384548f3d17ed7f38014c9e8a", tags[1].ID.String())
    35  	assert.EqualValues(t, "tag", tags[1].Type)
    36  }
    37  
    38  func TestRepository_GetTag(t *testing.T) {
    39  	bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
    40  
    41  	clonedPath, err := cloneRepo(t, bareRepo1Path)
    42  	if err != nil {
    43  		assert.NoError(t, err)
    44  		return
    45  	}
    46  
    47  	bareRepo1, err := openRepositoryWithDefaultContext(clonedPath)
    48  	if err != nil {
    49  		assert.NoError(t, err)
    50  		return
    51  	}
    52  	defer bareRepo1.Close()
    53  
    54  	// LIGHTWEIGHT TAGS
    55  	lTagCommitID := "6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1"
    56  	lTagName := "lightweightTag"
    57  
    58  	// Create the lightweight tag
    59  	err = bareRepo1.CreateTag(lTagName, lTagCommitID)
    60  	if err != nil {
    61  		assert.NoError(t, err, "Unable to create the lightweight tag: %s for ID: %s. Error: %v", lTagName, lTagCommitID, err)
    62  		return
    63  	}
    64  
    65  	// and try to get the Tag for lightweight tag
    66  	lTag, err := bareRepo1.GetTag(lTagName)
    67  	if err != nil {
    68  		assert.NoError(t, err)
    69  		return
    70  	}
    71  	if lTag == nil {
    72  		assert.NotNil(t, lTag)
    73  		assert.FailNow(t, "nil lTag: %s", lTagName)
    74  	}
    75  	assert.EqualValues(t, lTagName, lTag.Name)
    76  	assert.EqualValues(t, lTagCommitID, lTag.ID.String())
    77  	assert.EqualValues(t, lTagCommitID, lTag.Object.String())
    78  	assert.EqualValues(t, "commit", lTag.Type)
    79  
    80  	// ANNOTATED TAGS
    81  	aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0"
    82  	aTagName := "annotatedTag"
    83  	aTagMessage := "my annotated message \n - test two line"
    84  
    85  	// Create the annotated tag
    86  	err = bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID)
    87  	if err != nil {
    88  		assert.NoError(t, err, "Unable to create the annotated tag: %s for ID: %s. Error: %v", aTagName, aTagCommitID, err)
    89  		return
    90  	}
    91  
    92  	// Now try to get the tag for the annotated Tag
    93  	aTagID, err := bareRepo1.GetTagID(aTagName)
    94  	if err != nil {
    95  		assert.NoError(t, err)
    96  		return
    97  	}
    98  
    99  	aTag, err := bareRepo1.GetTag(aTagName)
   100  	if err != nil {
   101  		assert.NoError(t, err)
   102  		return
   103  	}
   104  	if aTag == nil {
   105  		assert.NotNil(t, aTag)
   106  		assert.FailNow(t, "nil aTag: %s", aTagName)
   107  	}
   108  	assert.EqualValues(t, aTagName, aTag.Name)
   109  	assert.EqualValues(t, aTagID, aTag.ID.String())
   110  	assert.NotEqual(t, aTagID, aTag.Object.String())
   111  	assert.EqualValues(t, aTagCommitID, aTag.Object.String())
   112  	assert.EqualValues(t, "tag", aTag.Type)
   113  
   114  	// RELEASE TAGS
   115  
   116  	rTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0"
   117  	rTagName := "release/" + lTagName
   118  
   119  	err = bareRepo1.CreateTag(rTagName, rTagCommitID)
   120  	if err != nil {
   121  		assert.NoError(t, err, "Unable to create the  tag: %s for ID: %s. Error: %v", rTagName, rTagCommitID, err)
   122  		return
   123  	}
   124  
   125  	rTagID, err := bareRepo1.GetTagID(rTagName)
   126  	if err != nil {
   127  		assert.NoError(t, err)
   128  		return
   129  	}
   130  	assert.EqualValues(t, rTagCommitID, rTagID)
   131  
   132  	oTagID, err := bareRepo1.GetTagID(lTagName)
   133  	if err != nil {
   134  		assert.NoError(t, err)
   135  		return
   136  	}
   137  	assert.EqualValues(t, lTagCommitID, oTagID)
   138  }
   139  
   140  func TestRepository_GetAnnotatedTag(t *testing.T) {
   141  	bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
   142  
   143  	clonedPath, err := cloneRepo(t, bareRepo1Path)
   144  	if err != nil {
   145  		assert.NoError(t, err)
   146  		return
   147  	}
   148  
   149  	bareRepo1, err := openRepositoryWithDefaultContext(clonedPath)
   150  	if err != nil {
   151  		assert.NoError(t, err)
   152  		return
   153  	}
   154  	defer bareRepo1.Close()
   155  
   156  	lTagCommitID := "6fbd69e9823458e6c4a2fc5c0f6bc022b2f2acd1"
   157  	lTagName := "lightweightTag"
   158  	bareRepo1.CreateTag(lTagName, lTagCommitID)
   159  
   160  	aTagCommitID := "8006ff9adbf0cb94da7dad9e537e53817f9fa5c0"
   161  	aTagName := "annotatedTag"
   162  	aTagMessage := "my annotated message"
   163  	bareRepo1.CreateAnnotatedTag(aTagName, aTagMessage, aTagCommitID)
   164  	aTagID, _ := bareRepo1.GetTagID(aTagName)
   165  
   166  	// Try an annotated tag
   167  	tag, err := bareRepo1.GetAnnotatedTag(aTagID)
   168  	if err != nil {
   169  		assert.NoError(t, err)
   170  		return
   171  	}
   172  	assert.NotNil(t, tag)
   173  	assert.EqualValues(t, aTagName, tag.Name)
   174  	assert.EqualValues(t, aTagID, tag.ID.String())
   175  	assert.EqualValues(t, "tag", tag.Type)
   176  
   177  	// Annotated tag's Commit ID should fail
   178  	tag2, err := bareRepo1.GetAnnotatedTag(aTagCommitID)
   179  	assert.Error(t, err)
   180  	assert.True(t, IsErrNotExist(err))
   181  	assert.Nil(t, tag2)
   182  
   183  	// Annotated tag's name should fail
   184  	tag3, err := bareRepo1.GetAnnotatedTag(aTagName)
   185  	assert.Error(t, err)
   186  	assert.Errorf(t, err, "Length must be 40: %d", len(aTagName))
   187  	assert.Nil(t, tag3)
   188  
   189  	// Lightweight Tag should fail
   190  	tag4, err := bareRepo1.GetAnnotatedTag(lTagCommitID)
   191  	assert.Error(t, err)
   192  	assert.True(t, IsErrNotExist(err))
   193  	assert.Nil(t, tag4)
   194  }
   195  
   196  func TestRepository_parseTagRef(t *testing.T) {
   197  	tests := []struct {
   198  		name string
   199  
   200  		givenRef map[string]string
   201  
   202  		want        *Tag
   203  		wantErr     bool
   204  		expectedErr error
   205  	}{
   206  		{
   207  			name: "lightweight tag",
   208  
   209  			givenRef: map[string]string{
   210  				"objecttype":       "commit",
   211  				"refname:lstrip=2": "v1.9.1",
   212  				// object will be empty for lightweight tags
   213  				"object":     "",
   214  				"objectname": "ab23e4b7f4cd0caafe0174c0e7ef6d651ba72889",
   215  				"creator":    "Foo Bar <foo@bar.com> 1565789218 +0300",
   216  				"contents": `Add changelog of v1.9.1 (#7859)
   217  
   218  * add changelog of v1.9.1
   219  * Update CHANGELOG.md
   220  `,
   221  				"contents:signature": "",
   222  			},
   223  
   224  			want: &Tag{
   225  				Name:      "v1.9.1",
   226  				ID:        MustIDFromString("ab23e4b7f4cd0caafe0174c0e7ef6d651ba72889"),
   227  				Object:    MustIDFromString("ab23e4b7f4cd0caafe0174c0e7ef6d651ba72889"),
   228  				Type:      "commit",
   229  				Tagger:    parseSignatureFromCommitLine("Foo Bar <foo@bar.com> 1565789218 +0300"),
   230  				Message:   "Add changelog of v1.9.1 (#7859)\n\n* add changelog of v1.9.1\n* Update CHANGELOG.md\n",
   231  				Signature: nil,
   232  			},
   233  		},
   234  
   235  		{
   236  			name: "annotated tag",
   237  
   238  			givenRef: map[string]string{
   239  				"objecttype":       "tag",
   240  				"refname:lstrip=2": "v0.0.1",
   241  				// object will refer to commit hash for annotated tag
   242  				"object":     "3325fd8a973321fd59455492976c042dde3fd1ca",
   243  				"objectname": "8c68a1f06fc59c655b7e3905b159d761e91c53c9",
   244  				"creator":    "Foo Bar <foo@bar.com> 1565789218 +0300",
   245  				"contents": `Add changelog of v1.9.1 (#7859)
   246  
   247  * add changelog of v1.9.1
   248  * Update CHANGELOG.md
   249  `,
   250  				"contents:signature": "",
   251  			},
   252  
   253  			want: &Tag{
   254  				Name:      "v0.0.1",
   255  				ID:        MustIDFromString("8c68a1f06fc59c655b7e3905b159d761e91c53c9"),
   256  				Object:    MustIDFromString("3325fd8a973321fd59455492976c042dde3fd1ca"),
   257  				Type:      "tag",
   258  				Tagger:    parseSignatureFromCommitLine("Foo Bar <foo@bar.com> 1565789218 +0300"),
   259  				Message:   "Add changelog of v1.9.1 (#7859)\n\n* add changelog of v1.9.1\n* Update CHANGELOG.md\n",
   260  				Signature: nil,
   261  			},
   262  		},
   263  
   264  		{
   265  			name: "annotated tag with signature",
   266  
   267  			givenRef: map[string]string{
   268  				"objecttype":       "tag",
   269  				"refname:lstrip=2": "v0.0.1",
   270  				"object":           "3325fd8a973321fd59455492976c042dde3fd1ca",
   271  				"objectname":       "8c68a1f06fc59c655b7e3905b159d761e91c53c9",
   272  				"creator":          "Foo Bar <foo@bar.com> 1565789218 +0300",
   273  				"contents": `Add changelog of v1.9.1 (#7859)
   274  
   275  * add changelog of v1.9.1
   276  * Update CHANGELOG.md
   277  -----BEGIN PGP SIGNATURE-----
   278  
   279  aBCGzBAABCgAdFiEEyWRwv/q1Q6IjSv+D4IPOwzt33PoFAmI8jbIACgkQ4IPOwzt3
   280  3PoRuAv9FVSbPBXvzECubls9KQd7urwEvcfG20Uf79iBwifQJUv+egNQojrs6APT
   281  T4CdIXeGRpwJZaGTUX9RWnoDO1SLXAWnc82CypWraNwrHq8Go2YeoVu0Iy3vb0EU
   282  REdob/tXYZecMuP8AjhUR0XfdYaERYAvJ2dYsH/UkFrqDjM3V4kPXWG+R5DCaZiE
   283  slB5U01i4Dwb/zm/ckzhUGEcOgcnpOKX8SnY5kYRVDY47dl/yJZ1u2XWir3mu60G
   284  1geIitH7StBddHi/8rz+sJwTfcVaLjn2p59p/Dr9aGbk17GIaKq1j0pZA2lKT0Xt
   285  f9jDqU+9vCxnKgjSDhrwN69LF2jT47ZFjEMGV/wFPOa1EBxVWpgQ/CfEolBlbUqx
   286  yVpbxi/6AOK2lmG130e9jEZJcu+WeZUeq851WgKSEkf2d5f/JpwtSTEOlOedu6V6
   287  kl845zu5oE2nKM4zMQ7XrYQn538I31ps+VGQ0H8R07WrZP8WKUWugL2cU8KmXFwg
   288  qbHDASXl
   289  =2yGi
   290  -----END PGP SIGNATURE-----
   291  
   292  `,
   293  				"contents:signature": `-----BEGIN PGP SIGNATURE-----
   294  
   295  aBCGzBAABCgAdFiEEyWRwv/q1Q6IjSv+D4IPOwzt33PoFAmI8jbIACgkQ4IPOwzt3
   296  3PoRuAv9FVSbPBXvzECubls9KQd7urwEvcfG20Uf79iBwifQJUv+egNQojrs6APT
   297  T4CdIXeGRpwJZaGTUX9RWnoDO1SLXAWnc82CypWraNwrHq8Go2YeoVu0Iy3vb0EU
   298  REdob/tXYZecMuP8AjhUR0XfdYaERYAvJ2dYsH/UkFrqDjM3V4kPXWG+R5DCaZiE
   299  slB5U01i4Dwb/zm/ckzhUGEcOgcnpOKX8SnY5kYRVDY47dl/yJZ1u2XWir3mu60G
   300  1geIitH7StBddHi/8rz+sJwTfcVaLjn2p59p/Dr9aGbk17GIaKq1j0pZA2lKT0Xt
   301  f9jDqU+9vCxnKgjSDhrwN69LF2jT47ZFjEMGV/wFPOa1EBxVWpgQ/CfEolBlbUqx
   302  yVpbxi/6AOK2lmG130e9jEZJcu+WeZUeq851WgKSEkf2d5f/JpwtSTEOlOedu6V6
   303  kl845zu5oE2nKM4zMQ7XrYQn538I31ps+VGQ0H8R07WrZP8WKUWugL2cU8KmXFwg
   304  qbHDASXl
   305  =2yGi
   306  -----END PGP SIGNATURE-----
   307  
   308  `,
   309  			},
   310  
   311  			want: &Tag{
   312  				Name:    "v0.0.1",
   313  				ID:      MustIDFromString("8c68a1f06fc59c655b7e3905b159d761e91c53c9"),
   314  				Object:  MustIDFromString("3325fd8a973321fd59455492976c042dde3fd1ca"),
   315  				Type:    "tag",
   316  				Tagger:  parseSignatureFromCommitLine("Foo Bar <foo@bar.com> 1565789218 +0300"),
   317  				Message: "Add changelog of v1.9.1 (#7859)\n\n* add changelog of v1.9.1\n* Update CHANGELOG.md",
   318  				Signature: &CommitSignature{
   319  					Signature: `-----BEGIN PGP SIGNATURE-----
   320  
   321  aBCGzBAABCgAdFiEEyWRwv/q1Q6IjSv+D4IPOwzt33PoFAmI8jbIACgkQ4IPOwzt3
   322  3PoRuAv9FVSbPBXvzECubls9KQd7urwEvcfG20Uf79iBwifQJUv+egNQojrs6APT
   323  T4CdIXeGRpwJZaGTUX9RWnoDO1SLXAWnc82CypWraNwrHq8Go2YeoVu0Iy3vb0EU
   324  REdob/tXYZecMuP8AjhUR0XfdYaERYAvJ2dYsH/UkFrqDjM3V4kPXWG+R5DCaZiE
   325  slB5U01i4Dwb/zm/ckzhUGEcOgcnpOKX8SnY5kYRVDY47dl/yJZ1u2XWir3mu60G
   326  1geIitH7StBddHi/8rz+sJwTfcVaLjn2p59p/Dr9aGbk17GIaKq1j0pZA2lKT0Xt
   327  f9jDqU+9vCxnKgjSDhrwN69LF2jT47ZFjEMGV/wFPOa1EBxVWpgQ/CfEolBlbUqx
   328  yVpbxi/6AOK2lmG130e9jEZJcu+WeZUeq851WgKSEkf2d5f/JpwtSTEOlOedu6V6
   329  kl845zu5oE2nKM4zMQ7XrYQn538I31ps+VGQ0H8R07WrZP8WKUWugL2cU8KmXFwg
   330  qbHDASXl
   331  =2yGi
   332  -----END PGP SIGNATURE-----
   333  
   334  `,
   335  					Payload: `object 3325fd8a973321fd59455492976c042dde3fd1ca
   336  type commit
   337  tag v0.0.1
   338  tagger Foo Bar <foo@bar.com> 1565789218 +0300
   339  
   340  Add changelog of v1.9.1 (#7859)
   341  
   342  * add changelog of v1.9.1
   343  * Update CHANGELOG.md
   344  `,
   345  				},
   346  			},
   347  		},
   348  	}
   349  
   350  	for _, test := range tests {
   351  		tc := test // don't close over loop variable
   352  		t.Run(tc.name, func(t *testing.T) {
   353  			got, err := parseTagRef(tc.givenRef)
   354  
   355  			if tc.wantErr {
   356  				require.Error(t, err)
   357  				require.ErrorIs(t, err, tc.expectedErr)
   358  			} else {
   359  				require.NoError(t, err)
   360  				require.Equal(t, tc.want, got)
   361  			}
   362  		})
   363  	}
   364  }