2019-03-15 23:12:44 -04:00
|
|
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
2022-11-27 13:20:29 -05:00
|
|
|
// SPDX-License-Identifier: MIT
|
2019-03-15 23:12:44 -04:00
|
|
|
|
|
|
|
package setting
|
|
|
|
|
|
|
|
import (
|
2022-01-30 11:33:36 -05:00
|
|
|
"os/exec"
|
2019-03-15 23:12:44 -04:00
|
|
|
"path"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
|
|
)
|
|
|
|
|
|
|
|
// enumerates all the policy repository creating
|
|
|
|
const (
|
|
|
|
RepoCreatingLastUserVisibility = "last"
|
|
|
|
RepoCreatingPrivate = "private"
|
|
|
|
RepoCreatingPublic = "public"
|
|
|
|
)
|
|
|
|
|
2022-06-12 11:51:54 -04:00
|
|
|
// ItemsPerPage maximum items per page in forks, watchers and stars of a repo
|
|
|
|
const ItemsPerPage = 40
|
|
|
|
|
2019-03-15 23:12:44 -04:00
|
|
|
// Repository settings
|
|
|
|
var (
|
|
|
|
Repository = struct {
|
2020-06-02 18:20:19 -04:00
|
|
|
DetectedCharsetsOrder []string
|
|
|
|
DetectedCharsetScore map[string]int `ini:"-"`
|
2019-03-15 23:12:44 -04:00
|
|
|
AnsiCharset string
|
|
|
|
ForcePrivate bool
|
|
|
|
DefaultPrivate string
|
2020-09-27 15:20:52 -04:00
|
|
|
DefaultPushCreatePrivate bool
|
2019-03-15 23:12:44 -04:00
|
|
|
MaxCreationLimit int
|
|
|
|
PreferredLicenses []string
|
|
|
|
DisableHTTPGit bool
|
|
|
|
AccessControlAllowOrigin string
|
|
|
|
UseCompatSSHURI bool
|
2023-05-12 05:44:37 -04:00
|
|
|
GoGetCloneURLProtocol string
|
2019-03-15 23:12:44 -04:00
|
|
|
DefaultCloseIssuesViaCommitsInAnyBranch bool
|
2019-12-14 21:49:52 -05:00
|
|
|
EnablePushCreateUser bool
|
|
|
|
EnablePushCreateOrg bool
|
2020-01-17 02:34:37 -05:00
|
|
|
DisabledRepoUnits []string
|
|
|
|
DefaultRepoUnits []string
|
2023-02-04 01:48:38 -05:00
|
|
|
DefaultForkRepoUnits []string
|
2020-01-22 18:46:46 -05:00
|
|
|
PrefixArchiveFiles bool
|
2020-12-21 09:39:41 -05:00
|
|
|
DisableMigrations bool
|
2021-04-15 12:53:57 -04:00
|
|
|
DisableStars bool `ini:"DISABLE_STARS"`
|
2020-06-17 16:53:55 -04:00
|
|
|
DefaultBranch string
|
2020-09-25 00:09:23 -04:00
|
|
|
AllowAdoptionOfUnadoptedRepositories bool
|
|
|
|
AllowDeleteOfUnadoptedRepositories bool
|
2022-07-31 12:57:02 -04:00
|
|
|
DisableDownloadSourceArchives bool
|
2022-12-27 16:21:14 -05:00
|
|
|
AllowForkWithoutMaximumLimit bool
|
2019-03-15 23:12:44 -04:00
|
|
|
|
|
|
|
// Repository editor settings
|
|
|
|
Editor struct {
|
2023-03-24 02:12:23 -04:00
|
|
|
LineWrapExtensions []string
|
2019-03-15 23:12:44 -04:00
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Repository upload settings
|
|
|
|
Upload struct {
|
|
|
|
Enabled bool
|
|
|
|
TempPath string
|
2020-10-05 01:49:33 -04:00
|
|
|
AllowedTypes string
|
2019-03-15 23:12:44 -04:00
|
|
|
FileMaxSize int64
|
|
|
|
MaxFiles int
|
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Repository local settings
|
|
|
|
Local struct {
|
|
|
|
LocalCopyPath string
|
|
|
|
} `ini:"-"`
|
|
|
|
|
|
|
|
// Pull request settings
|
|
|
|
PullRequest struct {
|
2019-12-30 18:34:11 -05:00
|
|
|
WorkInProgressPrefixes []string
|
|
|
|
CloseKeywords []string
|
|
|
|
ReopenKeywords []string
|
2022-06-02 23:45:54 -04:00
|
|
|
DefaultMergeStyle string
|
2019-12-30 18:34:11 -05:00
|
|
|
DefaultMergeMessageCommitsLimit int
|
|
|
|
DefaultMergeMessageSize int
|
|
|
|
DefaultMergeMessageAllAuthors bool
|
|
|
|
DefaultMergeMessageMaxApprovers int
|
|
|
|
DefaultMergeMessageOfficialApproversOnly bool
|
2021-06-18 18:08:22 -04:00
|
|
|
PopulateSquashCommentWithCommitMessages bool
|
2021-11-29 02:09:55 -05:00
|
|
|
AddCoCommitterTrailers bool
|
2022-12-19 06:37:15 -05:00
|
|
|
TestConflictingPatchesWithGitApply bool
|
2024-01-16 19:44:56 -05:00
|
|
|
RetargetChildrenOnMerge bool
|
2019-03-15 23:12:44 -04:00
|
|
|
} `ini:"repository.pull-request"`
|
|
|
|
|
|
|
|
// Issue Setting
|
|
|
|
Issue struct {
|
|
|
|
LockReasons []string
|
2023-05-25 09:17:19 -04:00
|
|
|
MaxPinned int
|
2019-03-15 23:12:44 -04:00
|
|
|
} `ini:"repository.issue"`
|
2019-10-16 09:42:42 -04:00
|
|
|
|
2020-10-05 01:49:33 -04:00
|
|
|
Release struct {
|
2021-08-29 12:25:16 -04:00
|
|
|
AllowedTypes string
|
|
|
|
DefaultPagingNum int
|
2020-10-05 01:49:33 -04:00
|
|
|
} `ini:"repository.release"`
|
|
|
|
|
2019-10-16 09:42:42 -04:00
|
|
|
Signing struct {
|
2020-09-19 12:44:55 -04:00
|
|
|
SigningKey string
|
|
|
|
SigningName string
|
|
|
|
SigningEmail string
|
|
|
|
InitialCommit []string
|
|
|
|
CRUDActions []string `ini:"CRUD_ACTIONS"`
|
|
|
|
Merges []string
|
|
|
|
Wiki []string
|
|
|
|
DefaultTrustModel string
|
2019-10-16 09:42:42 -04:00
|
|
|
} `ini:"repository.signing"`
|
2019-03-15 23:12:44 -04:00
|
|
|
}{
|
2020-06-02 18:20:19 -04:00
|
|
|
DetectedCharsetsOrder: []string{
|
|
|
|
"UTF-8",
|
|
|
|
"UTF-16BE",
|
|
|
|
"UTF-16LE",
|
|
|
|
"UTF-32BE",
|
|
|
|
"UTF-32LE",
|
|
|
|
"ISO-8859-1",
|
|
|
|
"windows-1252",
|
|
|
|
"ISO-8859-2",
|
|
|
|
"windows-1250",
|
|
|
|
"ISO-8859-5",
|
|
|
|
"ISO-8859-6",
|
|
|
|
"ISO-8859-7",
|
|
|
|
"windows-1253",
|
|
|
|
"ISO-8859-8-I",
|
|
|
|
"windows-1255",
|
|
|
|
"ISO-8859-8",
|
|
|
|
"windows-1251",
|
|
|
|
"windows-1256",
|
|
|
|
"KOI8-R",
|
|
|
|
"ISO-8859-9",
|
|
|
|
"windows-1254",
|
|
|
|
"Shift_JIS",
|
|
|
|
"GB18030",
|
|
|
|
"EUC-JP",
|
|
|
|
"EUC-KR",
|
|
|
|
"Big5",
|
|
|
|
"ISO-2022-JP",
|
|
|
|
"ISO-2022-KR",
|
|
|
|
"ISO-2022-CN",
|
|
|
|
"IBM424_rtl",
|
|
|
|
"IBM424_ltr",
|
|
|
|
"IBM420_rtl",
|
|
|
|
"IBM420_ltr",
|
|
|
|
},
|
|
|
|
DetectedCharsetScore: map[string]int{},
|
2019-03-15 23:12:44 -04:00
|
|
|
AnsiCharset: "",
|
|
|
|
ForcePrivate: false,
|
|
|
|
DefaultPrivate: RepoCreatingLastUserVisibility,
|
2020-09-27 15:20:52 -04:00
|
|
|
DefaultPushCreatePrivate: true,
|
2019-03-15 23:12:44 -04:00
|
|
|
MaxCreationLimit: -1,
|
2020-11-13 22:17:58 -05:00
|
|
|
PreferredLicenses: []string{"Apache License 2.0", "MIT License"},
|
2019-03-15 23:12:44 -04:00
|
|
|
DisableHTTPGit: false,
|
|
|
|
AccessControlAllowOrigin: "",
|
|
|
|
UseCompatSSHURI: false,
|
|
|
|
DefaultCloseIssuesViaCommitsInAnyBranch: false,
|
2019-12-14 21:49:52 -05:00
|
|
|
EnablePushCreateUser: false,
|
|
|
|
EnablePushCreateOrg: false,
|
2020-01-17 02:34:37 -05:00
|
|
|
DisabledRepoUnits: []string{},
|
|
|
|
DefaultRepoUnits: []string{},
|
2023-02-04 01:48:38 -05:00
|
|
|
DefaultForkRepoUnits: []string{},
|
2020-01-22 18:46:46 -05:00
|
|
|
PrefixArchiveFiles: true,
|
2020-12-21 09:39:41 -05:00
|
|
|
DisableMigrations: false,
|
2021-04-15 12:53:57 -04:00
|
|
|
DisableStars: false,
|
2022-04-09 00:26:48 -04:00
|
|
|
DefaultBranch: "main",
|
2022-12-27 16:21:14 -05:00
|
|
|
AllowForkWithoutMaximumLimit: true,
|
2019-03-15 23:12:44 -04:00
|
|
|
|
|
|
|
// Repository editor settings
|
|
|
|
Editor: struct {
|
2023-03-24 02:12:23 -04:00
|
|
|
LineWrapExtensions []string
|
2019-03-15 23:12:44 -04:00
|
|
|
}{
|
2023-04-26 11:22:54 -04:00
|
|
|
LineWrapExtensions: strings.Split(".txt,.md,.markdown,.mdown,.mkd,.livemd,", ","),
|
2019-03-15 23:12:44 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
// Repository upload settings
|
|
|
|
Upload: struct {
|
|
|
|
Enabled bool
|
|
|
|
TempPath string
|
2020-10-05 01:49:33 -04:00
|
|
|
AllowedTypes string
|
2019-03-15 23:12:44 -04:00
|
|
|
FileMaxSize int64
|
|
|
|
MaxFiles int
|
|
|
|
}{
|
|
|
|
Enabled: true,
|
|
|
|
TempPath: "data/tmp/uploads",
|
2020-10-05 01:49:33 -04:00
|
|
|
AllowedTypes: "",
|
2023-11-17 06:42:00 -05:00
|
|
|
FileMaxSize: 50,
|
2019-03-15 23:12:44 -04:00
|
|
|
MaxFiles: 5,
|
|
|
|
},
|
|
|
|
|
|
|
|
// Repository local settings
|
|
|
|
Local: struct {
|
|
|
|
LocalCopyPath string
|
|
|
|
}{
|
|
|
|
LocalCopyPath: "tmp/local-repo",
|
|
|
|
},
|
|
|
|
|
|
|
|
// Pull request settings
|
|
|
|
PullRequest: struct {
|
2019-12-30 18:34:11 -05:00
|
|
|
WorkInProgressPrefixes []string
|
|
|
|
CloseKeywords []string
|
|
|
|
ReopenKeywords []string
|
2022-06-02 23:45:54 -04:00
|
|
|
DefaultMergeStyle string
|
2019-12-30 18:34:11 -05:00
|
|
|
DefaultMergeMessageCommitsLimit int
|
|
|
|
DefaultMergeMessageSize int
|
|
|
|
DefaultMergeMessageAllAuthors bool
|
|
|
|
DefaultMergeMessageMaxApprovers int
|
|
|
|
DefaultMergeMessageOfficialApproversOnly bool
|
2021-06-18 18:08:22 -04:00
|
|
|
PopulateSquashCommentWithCommitMessages bool
|
2021-11-29 02:09:55 -05:00
|
|
|
AddCoCommitterTrailers bool
|
2022-12-19 06:37:15 -05:00
|
|
|
TestConflictingPatchesWithGitApply bool
|
2024-01-16 19:44:56 -05:00
|
|
|
RetargetChildrenOnMerge bool
|
2019-03-15 23:12:44 -04:00
|
|
|
}{
|
|
|
|
WorkInProgressPrefixes: []string{"WIP:", "[WIP]"},
|
2019-10-30 08:43:59 -04:00
|
|
|
// Same as GitHub. See
|
|
|
|
// https://help.github.com/articles/closing-issues-via-commit-messages
|
2019-12-30 18:34:11 -05:00
|
|
|
CloseKeywords: strings.Split("close,closes,closed,fix,fixes,fixed,resolve,resolves,resolved", ","),
|
|
|
|
ReopenKeywords: strings.Split("reopen,reopens,reopened", ","),
|
2022-06-02 23:45:54 -04:00
|
|
|
DefaultMergeStyle: "merge",
|
2019-12-30 18:34:11 -05:00
|
|
|
DefaultMergeMessageCommitsLimit: 50,
|
|
|
|
DefaultMergeMessageSize: 5 * 1024,
|
|
|
|
DefaultMergeMessageAllAuthors: false,
|
|
|
|
DefaultMergeMessageMaxApprovers: 10,
|
|
|
|
DefaultMergeMessageOfficialApproversOnly: true,
|
2021-06-18 18:08:22 -04:00
|
|
|
PopulateSquashCommentWithCommitMessages: false,
|
2021-11-29 02:09:55 -05:00
|
|
|
AddCoCommitterTrailers: true,
|
2024-01-16 19:44:56 -05:00
|
|
|
RetargetChildrenOnMerge: true,
|
2019-03-15 23:12:44 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
// Issue settings
|
|
|
|
Issue: struct {
|
|
|
|
LockReasons []string
|
2023-05-25 09:17:19 -04:00
|
|
|
MaxPinned int
|
2019-03-15 23:12:44 -04:00
|
|
|
}{
|
|
|
|
LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","),
|
2023-05-25 09:17:19 -04:00
|
|
|
MaxPinned: 3,
|
2019-03-15 23:12:44 -04:00
|
|
|
},
|
2019-10-16 09:42:42 -04:00
|
|
|
|
2020-10-05 01:49:33 -04:00
|
|
|
Release: struct {
|
2021-08-29 12:25:16 -04:00
|
|
|
AllowedTypes string
|
|
|
|
DefaultPagingNum int
|
2020-10-05 01:49:33 -04:00
|
|
|
}{
|
2021-08-29 12:25:16 -04:00
|
|
|
AllowedTypes: "",
|
|
|
|
DefaultPagingNum: 10,
|
2020-10-05 01:49:33 -04:00
|
|
|
},
|
|
|
|
|
2019-10-16 09:42:42 -04:00
|
|
|
// Signing settings
|
|
|
|
Signing: struct {
|
2020-09-19 12:44:55 -04:00
|
|
|
SigningKey string
|
|
|
|
SigningName string
|
|
|
|
SigningEmail string
|
|
|
|
InitialCommit []string
|
|
|
|
CRUDActions []string `ini:"CRUD_ACTIONS"`
|
|
|
|
Merges []string
|
|
|
|
Wiki []string
|
|
|
|
DefaultTrustModel string
|
2019-10-16 09:42:42 -04:00
|
|
|
}{
|
2020-09-19 12:44:55 -04:00
|
|
|
SigningKey: "default",
|
|
|
|
SigningName: "",
|
|
|
|
SigningEmail: "",
|
|
|
|
InitialCommit: []string{"always"},
|
|
|
|
CRUDActions: []string{"pubkey", "twofa", "parentsigned"},
|
|
|
|
Merges: []string{"pubkey", "twofa", "basesigned", "commitssigned"},
|
|
|
|
Wiki: []string{"never"},
|
|
|
|
DefaultTrustModel: "collaborator",
|
2019-10-16 09:42:42 -04:00
|
|
|
},
|
2019-03-15 23:12:44 -04:00
|
|
|
}
|
|
|
|
RepoRootPath string
|
|
|
|
ScriptType = "bash"
|
|
|
|
)
|
|
|
|
|
2023-02-19 11:12:01 -05:00
|
|
|
func loadRepositoryFrom(rootCfg ConfigProvider) {
|
2020-12-15 16:52:59 -05:00
|
|
|
var err error
|
2019-03-15 23:12:44 -04:00
|
|
|
// Determine and create root git repository path.
|
2023-02-19 11:12:01 -05:00
|
|
|
sec := rootCfg.Section("repository")
|
2019-03-15 23:12:44 -04:00
|
|
|
Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool()
|
|
|
|
Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool()
|
2023-05-12 05:44:37 -04:00
|
|
|
Repository.GoGetCloneURLProtocol = sec.Key("GO_GET_CLONE_URL_PROTOCOL").MustString("https")
|
2019-03-15 23:12:44 -04:00
|
|
|
Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1)
|
2020-09-25 00:09:23 -04:00
|
|
|
Repository.DefaultBranch = sec.Key("DEFAULT_BRANCH").MustString(Repository.DefaultBranch)
|
2020-12-15 16:52:59 -05:00
|
|
|
RepoRootPath = sec.Key("ROOT").MustString(path.Join(AppDataPath, "gitea-repositories"))
|
2019-03-15 23:12:44 -04:00
|
|
|
if !filepath.IsAbs(RepoRootPath) {
|
|
|
|
RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath)
|
|
|
|
} else {
|
|
|
|
RepoRootPath = filepath.Clean(RepoRootPath)
|
|
|
|
}
|
2020-06-02 18:20:19 -04:00
|
|
|
defaultDetectedCharsetsOrder := make([]string, 0, len(Repository.DetectedCharsetsOrder))
|
|
|
|
for _, charset := range Repository.DetectedCharsetsOrder {
|
|
|
|
defaultDetectedCharsetsOrder = append(defaultDetectedCharsetsOrder, strings.ToLower(strings.TrimSpace(charset)))
|
|
|
|
}
|
2019-03-15 23:12:44 -04:00
|
|
|
ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash")
|
|
|
|
|
2022-01-30 11:33:36 -05:00
|
|
|
if _, err := exec.LookPath(ScriptType); err != nil {
|
|
|
|
log.Warn("SCRIPT_TYPE %q is not on the current PATH. Are you sure that this is the correct SCRIPT_TYPE?", ScriptType)
|
|
|
|
}
|
|
|
|
|
2023-02-19 11:12:01 -05:00
|
|
|
if err = sec.MapTo(&Repository); err != nil {
|
2019-04-02 03:48:31 -04:00
|
|
|
log.Fatal("Failed to map Repository settings: %v", err)
|
2023-02-19 11:12:01 -05:00
|
|
|
} else if err = rootCfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil {
|
2019-04-02 03:48:31 -04:00
|
|
|
log.Fatal("Failed to map Repository.Editor settings: %v", err)
|
2023-02-19 11:12:01 -05:00
|
|
|
} else if err = rootCfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil {
|
2019-04-02 03:48:31 -04:00
|
|
|
log.Fatal("Failed to map Repository.Upload settings: %v", err)
|
2023-02-19 11:12:01 -05:00
|
|
|
} else if err = rootCfg.Section("repository.local").MapTo(&Repository.Local); err != nil {
|
2019-04-02 03:48:31 -04:00
|
|
|
log.Fatal("Failed to map Repository.Local settings: %v", err)
|
2023-02-19 11:12:01 -05:00
|
|
|
} else if err = rootCfg.Section("repository.pull-request").MapTo(&Repository.PullRequest); err != nil {
|
2019-04-02 03:48:31 -04:00
|
|
|
log.Fatal("Failed to map Repository.PullRequest settings: %v", err)
|
2019-03-15 23:12:44 -04:00
|
|
|
}
|
|
|
|
|
2023-05-19 07:35:12 -04:00
|
|
|
if !rootCfg.Section("packages").Key("ENABLED").MustBool(Packages.Enabled) {
|
2022-05-08 11:51:50 -04:00
|
|
|
Repository.DisabledRepoUnits = append(Repository.DisabledRepoUnits, "repo.packages")
|
|
|
|
}
|
|
|
|
|
2023-05-19 07:35:12 -04:00
|
|
|
if !rootCfg.Section("actions").Key("ENABLED").MustBool(Actions.Enabled) {
|
2023-05-05 08:02:30 -04:00
|
|
|
Repository.DisabledRepoUnits = append(Repository.DisabledRepoUnits, "repo.actions")
|
|
|
|
}
|
|
|
|
|
2020-09-19 12:44:55 -04:00
|
|
|
// Handle default trustmodel settings
|
|
|
|
Repository.Signing.DefaultTrustModel = strings.ToLower(strings.TrimSpace(Repository.Signing.DefaultTrustModel))
|
|
|
|
if Repository.Signing.DefaultTrustModel == "default" {
|
|
|
|
Repository.Signing.DefaultTrustModel = "collaborator"
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle preferred charset orders
|
2020-06-02 18:20:19 -04:00
|
|
|
preferred := make([]string, 0, len(Repository.DetectedCharsetsOrder))
|
|
|
|
for _, charset := range Repository.DetectedCharsetsOrder {
|
|
|
|
canonicalCharset := strings.ToLower(strings.TrimSpace(charset))
|
|
|
|
preferred = append(preferred, canonicalCharset)
|
|
|
|
// remove it from the defaults
|
|
|
|
for i, charset := range defaultDetectedCharsetsOrder {
|
|
|
|
if charset == canonicalCharset {
|
|
|
|
defaultDetectedCharsetsOrder = append(defaultDetectedCharsetsOrder[:i], defaultDetectedCharsetsOrder[i+1:]...)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
i := 0
|
|
|
|
for _, charset := range preferred {
|
|
|
|
// Add the defaults
|
|
|
|
if charset == "defaults" {
|
|
|
|
for _, charset := range defaultDetectedCharsetsOrder {
|
|
|
|
canonicalCharset := strings.ToLower(strings.TrimSpace(charset))
|
|
|
|
if _, has := Repository.DetectedCharsetScore[canonicalCharset]; !has {
|
|
|
|
Repository.DetectedCharsetScore[canonicalCharset] = i
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if _, has := Repository.DetectedCharsetScore[charset]; !has {
|
|
|
|
Repository.DetectedCharsetScore[charset] = i
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-15 23:12:44 -04:00
|
|
|
if !filepath.IsAbs(Repository.Upload.TempPath) {
|
|
|
|
Repository.Upload.TempPath = path.Join(AppWorkPath, Repository.Upload.TempPath)
|
|
|
|
}
|
2021-06-23 17:12:38 -04:00
|
|
|
|
2023-06-13 23:42:38 -04:00
|
|
|
if err := loadRepoArchiveFrom(rootCfg); err != nil {
|
|
|
|
log.Fatal("loadRepoArchiveFrom: %v", err)
|
|
|
|
}
|
2019-03-15 23:12:44 -04:00
|
|
|
}
|