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