Skip to content

Commit 8135254

Browse files
authored
Refactor context RefName and RepoAssignment (#33226)
The `ctx.Repo.RefName` was used to be a "short name", it causes a lot of ambiguity. This PR does some refactoring and use `RefFullName` to replace the legacy `RefName`, and simplify RepoAssignment
1 parent 604365e commit 8135254

File tree

20 files changed

+187
-219
lines changed

20 files changed

+187
-219
lines changed

models/repo/archiver.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,11 @@ func repoArchiverForRelativePath(relativePath string) (*RepoArchiver, error) {
5656
if err != nil {
5757
return nil, util.SilentWrap{Message: fmt.Sprintf("invalid storage path: %s", relativePath), Err: util.ErrInvalidArgument}
5858
}
59-
nameExts := strings.SplitN(parts[2], ".", 2)
60-
if len(nameExts) != 2 {
59+
commitID, archiveType := git.SplitArchiveNameType(parts[2])
60+
if archiveType == git.ArchiveUnknown {
6161
return nil, util.SilentWrap{Message: fmt.Sprintf("invalid storage path: %s", relativePath), Err: util.ErrInvalidArgument}
6262
}
63-
64-
return &RepoArchiver{
65-
RepoID: repoID,
66-
CommitID: parts[1] + nameExts[0],
67-
Type: git.ToArchiveType(nameExts[1]),
68-
}, nil
63+
return &RepoArchiver{RepoID: repoID, CommitID: commitID, Type: archiveType}, nil
6964
}
7065

7166
// GetRepoArchiver get an archiver

modules/git/ref.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ func RefNameFromTag(shortName string) RefName {
8080
return RefName(TagPrefix + shortName)
8181
}
8282

83+
func RefNameFromCommit(shortName string) RefName {
84+
return RefName(shortName)
85+
}
86+
8387
func (ref RefName) String() string {
8488
return string(ref)
8589
}

modules/git/repo_archive.go

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,37 +16,35 @@ import (
1616
type ArchiveType int
1717

1818
const (
19-
// ZIP zip archive type
20-
ZIP ArchiveType = iota + 1
21-
// TARGZ tar gz archive type
22-
TARGZ
23-
// BUNDLE bundle archive type
24-
BUNDLE
19+
ArchiveUnknown ArchiveType = iota
20+
ArchiveZip // 1
21+
ArchiveTarGz // 2
22+
ArchiveBundle // 3
2523
)
2624

27-
// String converts an ArchiveType to string
25+
// String converts an ArchiveType to string: the extension of the archive file without prefix dot
2826
func (a ArchiveType) String() string {
2927
switch a {
30-
case ZIP:
28+
case ArchiveZip:
3129
return "zip"
32-
case TARGZ:
30+
case ArchiveTarGz:
3331
return "tar.gz"
34-
case BUNDLE:
32+
case ArchiveBundle:
3533
return "bundle"
3634
}
3735
return "unknown"
3836
}
3937

40-
func ToArchiveType(s string) ArchiveType {
41-
switch s {
42-
case "zip":
43-
return ZIP
44-
case "tar.gz":
45-
return TARGZ
46-
case "bundle":
47-
return BUNDLE
38+
func SplitArchiveNameType(s string) (string, ArchiveType) {
39+
switch {
40+
case strings.HasSuffix(s, ".zip"):
41+
return strings.TrimSuffix(s, ".zip"), ArchiveZip
42+
case strings.HasSuffix(s, ".tar.gz"):
43+
return strings.TrimSuffix(s, ".tar.gz"), ArchiveTarGz
44+
case strings.HasSuffix(s, ".bundle"):
45+
return strings.TrimSuffix(s, ".bundle"), ArchiveBundle
4846
}
49-
return 0
47+
return s, ArchiveUnknown
5048
}
5149

5250
// CreateArchive create archive content to the target path

modules/git/repo_archive_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package git
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestArchiveType(t *testing.T) {
13+
name, archiveType := SplitArchiveNameType("test.tar.gz")
14+
assert.Equal(t, "test", name)
15+
assert.Equal(t, "tar.gz", archiveType.String())
16+
17+
name, archiveType = SplitArchiveNameType("a/b/test.zip")
18+
assert.Equal(t, "a/b/test", name)
19+
assert.Equal(t, "zip", archiveType.String())
20+
21+
name, archiveType = SplitArchiveNameType("1234.bundle")
22+
assert.Equal(t, "1234", name)
23+
assert.Equal(t, "bundle", archiveType.String())
24+
25+
name, archiveType = SplitArchiveNameType("test")
26+
assert.Equal(t, "test", name)
27+
assert.Equal(t, "unknown", archiveType.String())
28+
29+
name, archiveType = SplitArchiveNameType("test.xz")
30+
assert.Equal(t, "test.xz", name)
31+
assert.Equal(t, "unknown", archiveType.String())
32+
}

options/locale/locale_en-US.ini

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,9 +1115,7 @@ blame.ignore_revs = Ignoring revisions in <a href="%s">.git-blame-ignore-revs</a
11151115
blame.ignore_revs.failed = Failed to ignore revisions in <a href="%s">.git-blame-ignore-revs</a>.
11161116
user_search_tooltip = Shows a maximum of 30 users
11171117
1118-
tree_path_not_found_commit = Path %[1]s doesn't exist in commit %[2]s
1119-
tree_path_not_found_branch = Path %[1]s doesn't exist in branch %[2]s
1120-
tree_path_not_found_tag = Path %[1]s doesn't exist in tag %[2]s
1118+
tree_path_not_found = Path %[1]s doesn't exist in %[2]s
11211119

11221120
transfer.accept = Accept Transfer
11231121
transfer.accept_desc = Transfer to "%s"

routers/api/v1/repo/download.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ func DownloadArchive(ctx *context.APIContext) {
1717
var tp git.ArchiveType
1818
switch ballType := ctx.PathParam("ball_type"); ballType {
1919
case "tarball":
20-
tp = git.TARGZ
20+
tp = git.ArchiveTarGz
2121
case "zipball":
22-
tp = git.ZIP
22+
tp = git.ArchiveZip
2323
case "bundle":
24-
tp = git.BUNDLE
24+
tp = git.ArchiveBundle
2525
default:
2626
ctx.Error(http.StatusBadRequest, "", fmt.Sprintf("Unknown archive type: %s", ballType))
2727
return
@@ -36,7 +36,7 @@ func DownloadArchive(ctx *context.APIContext) {
3636
}
3737
}
3838

39-
r, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, ctx.PathParam("*"), tp)
39+
r, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, ctx.PathParam("*")+"."+tp.String())
4040
if err != nil {
4141
ctx.ServerError("NewRequest", err)
4242
return

routers/api/v1/repo/file.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -293,14 +293,7 @@ func GetArchive(ctx *context.APIContext) {
293293
}
294294

295295
func archiveDownload(ctx *context.APIContext) {
296-
uri := ctx.PathParam("*")
297-
ext, tp, err := archiver_service.ParseFileName(uri)
298-
if err != nil {
299-
ctx.Error(http.StatusBadRequest, "ParseFileName", err)
300-
return
301-
}
302-
303-
aReq, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, strings.TrimSuffix(uri, ext), tp)
296+
aReq, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, ctx.PathParam("*"))
304297
if err != nil {
305298
if errors.Is(err, archiver_service.ErrUnknownArchiveFormat{}) {
306299
ctx.Error(http.StatusBadRequest, "unknown archive format", err)

routers/web/feed/file.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func ShowFileFeed(ctx *context.Context, repo *repo.Repository, formatType string
2424
}
2525
commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(
2626
git.CommitsByFileAndRangeOptions{
27-
Revision: ctx.Repo.RefName,
27+
Revision: ctx.Repo.RefFullName.ShortName(), // FIXME: legacy code used ShortName
2828
File: fileName,
2929
Page: 1,
3030
})

routers/web/repo/commit.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ func FileHistory(ctx *context.Context) {
222222
return
223223
}
224224

225-
commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(ctx.Repo.RefName, fileName)
225+
commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(ctx.Repo.RefFullName.ShortName(), fileName) // FIXME: legacy code used ShortName
226226
if err != nil {
227227
ctx.ServerError("FileCommitsCount", err)
228228
return
@@ -238,7 +238,7 @@ func FileHistory(ctx *context.Context) {
238238

239239
commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(
240240
git.CommitsByFileAndRangeOptions{
241-
Revision: ctx.Repo.RefName,
241+
Revision: ctx.Repo.RefFullName.ShortName(), // FIXME: legacy code used ShortName
242242
File: fileName,
243243
Page: page,
244244
})

routers/web/repo/helper.go

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,14 @@
44
package repo
55

66
import (
7-
"net/url"
8-
97
"code.gitea.io/gitea/modules/git"
108
"code.gitea.io/gitea/services/context"
119
)
1210

1311
func HandleGitError(ctx *context.Context, msg string, err error) {
1412
if git.IsErrNotExist(err) {
15-
refType := ""
16-
switch {
17-
case ctx.Repo.IsViewBranch:
18-
refType = "branch"
19-
case ctx.Repo.IsViewTag:
20-
refType = "tag"
21-
case ctx.Repo.IsViewCommit:
22-
refType = "commit"
23-
}
24-
ctx.Data["NotFoundPrompt"] = ctx.Locale.Tr("repo.tree_path_not_found_"+refType, ctx.Repo.TreePath, url.PathEscape(ctx.Repo.RefName))
25-
ctx.Data["NotFoundGoBackURL"] = ctx.Repo.RepoLink + "/src/" + refType + "/" + url.PathEscape(ctx.Repo.RefName)
13+
ctx.Data["NotFoundPrompt"] = ctx.Locale.Tr("repo.tree_path_not_found", ctx.Repo.TreePath, ctx.Repo.RefTypeNameSubURL())
14+
ctx.Data["NotFoundGoBackURL"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.RefTypeNameSubURL()
2615
ctx.NotFound(msg, err)
2716
} else {
2817
ctx.ServerError(msg, err)

routers/web/repo/repo.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -463,13 +463,7 @@ func RedirectDownload(ctx *context.Context) {
463463

464464
// Download an archive of a repository
465465
func Download(ctx *context.Context) {
466-
uri := ctx.PathParam("*")
467-
ext, tp, err := archiver_service.ParseFileName(uri)
468-
if err != nil {
469-
ctx.ServerError("ParseFileName", err)
470-
return
471-
}
472-
aReq, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, strings.TrimSuffix(uri, ext), tp)
466+
aReq, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, ctx.PathParam("*"))
473467
if err != nil {
474468
if errors.Is(err, archiver_service.ErrUnknownArchiveFormat{}) {
475469
ctx.Error(http.StatusBadRequest, err.Error())
@@ -527,15 +521,9 @@ func download(ctx *context.Context, archiveName string, archiver *repo_model.Rep
527521
// a request that's already in-progress, but the archiver service will just
528522
// kind of drop it on the floor if this is the case.
529523
func InitiateDownload(ctx *context.Context) {
530-
uri := ctx.PathParam("*")
531-
ext, tp, err := archiver_service.ParseFileName(uri)
532-
if err != nil {
533-
ctx.ServerError("ParseFileName", err)
534-
return
535-
}
536-
aReq, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, strings.TrimSuffix(uri, ext), tp)
524+
aReq, err := archiver_service.NewRequest(ctx.Repo.Repository.ID, ctx.Repo.GitRepo, ctx.PathParam("*"))
537525
if err != nil {
538-
ctx.ServerError("archiver_service.NewRequest", err)
526+
ctx.Error(http.StatusBadRequest, "invalid archive request")
539527
return
540528
}
541529
if aReq == nil {

routers/web/repo/view_file.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) {
4242
}
4343
defer dataRc.Close()
4444

45-
ctx.Data["Title"] = ctx.Tr("repo.file.title", ctx.Repo.Repository.Name+"/"+path.Base(ctx.Repo.TreePath), ctx.Repo.RefName)
45+
ctx.Data["Title"] = ctx.Tr("repo.file.title", ctx.Repo.Repository.Name+"/"+path.Base(ctx.Repo.TreePath), ctx.Repo.RefFullName.ShortName())
4646
ctx.Data["FileIsSymlink"] = entry.IsLink()
4747
ctx.Data["FileName"] = blob.Name()
4848
ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/raw/" + ctx.Repo.RefTypeNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath)

routers/web/repo/view_home.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func prepareToRenderDirectory(ctx *context.Context) {
135135

136136
if ctx.Repo.TreePath != "" {
137137
ctx.Data["HideRepoInfo"] = true
138-
ctx.Data["Title"] = ctx.Tr("repo.file.title", ctx.Repo.Repository.Name+"/"+path.Base(ctx.Repo.TreePath), ctx.Repo.RefName)
138+
ctx.Data["Title"] = ctx.Tr("repo.file.title", ctx.Repo.Repository.Name+"/"+path.Base(ctx.Repo.TreePath), ctx.Repo.RefFullName.ShortName())
139139
}
140140

141141
subfolder, readmeFile, err := findReadmeFileInEntries(ctx, entries, true)

0 commit comments

Comments
 (0)