aboutsummaryrefslogtreecommitdiffstats
path: root/services/repository/archiver/archiver.go
diff options
context:
space:
mode:
Diffstat (limited to 'services/repository/archiver/archiver.go')
-rw-r--r--services/repository/archiver/archiver.go57
1 files changed, 19 insertions, 38 deletions
diff --git a/services/repository/archiver/archiver.go b/services/repository/archiver/archiver.go
index e1addbed33..a657e3884c 100644
--- a/services/repository/archiver/archiver.go
+++ b/services/repository/archiver/archiver.go
@@ -31,19 +31,20 @@ import (
// handle elsewhere.
type ArchiveRequest struct {
RepoID int64
- refName string
Type git.ArchiveType
CommitID string
+
+ archiveRefShortName string // the ref short name to download the archive, for example: "master", "v1.0.0", "commit id"
}
// ErrUnknownArchiveFormat request archive format is not supported
type ErrUnknownArchiveFormat struct {
- RequestFormat string
+ RequestNameType string
}
// Error implements error
func (err ErrUnknownArchiveFormat) Error() string {
- return fmt.Sprintf("unknown format: %s", err.RequestFormat)
+ return "unknown format: " + err.RequestNameType
}
// Is implements error
@@ -54,12 +55,12 @@ func (ErrUnknownArchiveFormat) Is(err error) bool {
// RepoRefNotFoundError is returned when a requested reference (commit, tag) was not found.
type RepoRefNotFoundError struct {
- RefName string
+ RefShortName string
}
// Error implements error.
func (e RepoRefNotFoundError) Error() string {
- return fmt.Sprintf("unrecognized repository reference: %s", e.RefName)
+ return "unrecognized repository reference: " + e.RefShortName
}
func (e RepoRefNotFoundError) Is(err error) bool {
@@ -67,43 +68,23 @@ func (e RepoRefNotFoundError) Is(err error) bool {
return ok
}
-func ParseFileName(uri string) (ext string, tp git.ArchiveType, err error) {
- switch {
- case strings.HasSuffix(uri, ".zip"):
- ext = ".zip"
- tp = git.ZIP
- case strings.HasSuffix(uri, ".tar.gz"):
- ext = ".tar.gz"
- tp = git.TARGZ
- case strings.HasSuffix(uri, ".bundle"):
- ext = ".bundle"
- tp = git.BUNDLE
- default:
- return "", 0, ErrUnknownArchiveFormat{RequestFormat: uri}
- }
- return ext, tp, nil
-}
-
// NewRequest creates an archival request, based on the URI. The
// resulting ArchiveRequest is suitable for being passed to Await()
// if it's determined that the request still needs to be satisfied.
-func NewRequest(repoID int64, repo *git.Repository, refName string, fileType git.ArchiveType) (*ArchiveRequest, error) {
- if fileType < git.ZIP || fileType > git.BUNDLE {
- return nil, ErrUnknownArchiveFormat{RequestFormat: fileType.String()}
- }
-
- r := &ArchiveRequest{
- RepoID: repoID,
- refName: refName,
- Type: fileType,
+func NewRequest(repoID int64, repo *git.Repository, archiveRefExt string) (*ArchiveRequest, error) {
+ // here the archiveRefShortName is not a clear ref, it could be a tag, branch or commit id
+ archiveRefShortName, archiveType := git.SplitArchiveNameType(archiveRefExt)
+ if archiveType == git.ArchiveUnknown {
+ return nil, ErrUnknownArchiveFormat{archiveRefExt}
}
// Get corresponding commit.
- commitID, err := repo.ConvertToGitID(r.refName)
+ commitID, err := repo.ConvertToGitID(archiveRefShortName)
if err != nil {
- return nil, RepoRefNotFoundError{RefName: r.refName}
+ return nil, RepoRefNotFoundError{RefShortName: archiveRefShortName}
}
+ r := &ArchiveRequest{RepoID: repoID, archiveRefShortName: archiveRefShortName, Type: archiveType}
r.CommitID = commitID.String()
return r, nil
}
@@ -111,11 +92,11 @@ func NewRequest(repoID int64, repo *git.Repository, refName string, fileType git
// GetArchiveName returns the name of the caller, based on the ref used by the
// caller to create this request.
func (aReq *ArchiveRequest) GetArchiveName() string {
- return strings.ReplaceAll(aReq.refName, "/", "-") + "." + aReq.Type.String()
+ return strings.ReplaceAll(aReq.archiveRefShortName, "/", "-") + "." + aReq.Type.String()
}
// Await awaits the completion of an ArchiveRequest. If the archive has
-// already been prepared the method returns immediately. Otherwise an archiver
+// already been prepared the method returns immediately. Otherwise, an archiver
// process will be started and its completion awaited. On success the returned
// RepoArchiver may be used to download the archive. Note that even if the
// context is cancelled/times out a started archiver will still continue to run
@@ -208,8 +189,8 @@ func doArchive(ctx context.Context, r *ArchiveRequest) (*repo_model.RepoArchiver
rd, w := io.Pipe()
defer func() {
- w.Close()
- rd.Close()
+ _ = w.Close()
+ _ = rd.Close()
}()
done := make(chan error, 1) // Ensure that there is some capacity which will ensure that the goroutine below can always finish
repo, err := repo_model.GetRepositoryByID(ctx, archiver.RepoID)
@@ -230,7 +211,7 @@ func doArchive(ctx context.Context, r *ArchiveRequest) (*repo_model.RepoArchiver
}
}()
- if archiver.Type == git.BUNDLE {
+ if archiver.Type == git.ArchiveBundle {
err = gitRepo.CreateBundle(
ctx,
archiver.CommitID,