Compare commits

..

No commits in common. "977627fe6e9a085c173e40cab03942f4c79da2a3" and "7bbc84ed5eeca5cd548605647f5cd9cc1d9258f9" have entirely different histories.

3 changed files with 17 additions and 23 deletions

View file

@ -152,7 +152,10 @@ func IsAnnexRepo(repo *git.Repository) bool {
return err == nil return err == nil
} }
var uuid2repoPathCache = make(map[string]string) var (
uuid2repoPathCache = make(map[string]string)
repoPath2uuidCache = make(map[string]string)
)
func Init() error { func Init() error {
if !setting.Annex.Enabled { if !setting.Annex.Enabled {
@ -176,6 +179,10 @@ func updateUUID2RepoPathCache() error {
} }
for _, configFile := range configFiles { for _, configFile := range configFiles {
repoPath := strings.TrimSuffix(configFile, "/config") repoPath := strings.TrimSuffix(configFile, "/config")
_, ok := repoPath2uuidCache[repoPath]
if ok {
continue
}
config, err := ini.Load(configFile) config, err := ini.Load(configFile)
if err != nil { if err != nil {
continue continue
@ -183,6 +190,7 @@ func updateUUID2RepoPathCache() error {
repoUUID := config.Section("annex").Key("uuid").Value() repoUUID := config.Section("annex").Key("uuid").Value()
if repoUUID != "" { if repoUUID != "" {
uuid2repoPathCache[repoUUID] = repoPath uuid2repoPathCache[repoUUID] = repoPath
repoPath2uuidCache[repoPath] = repoUUID
} }
} }
return nil return nil
@ -211,6 +219,11 @@ func checkValidity(uuid, repoPath string) (bool, error) {
return uuid == repoUUID, nil return uuid == repoUUID, nil
} }
func removeCachedEntries(uuid, repoPath string) {
delete(uuid2repoPathCache, uuid)
delete(repoPath2uuidCache, repoPath)
}
func UUID2RepoPath(uuid string) (string, error) { func UUID2RepoPath(uuid string) (string, error) {
// Get the current cache entry for the UUID // Get the current cache entry for the UUID
repoPath, err := repoPathFromUUIDCache(uuid) repoPath, err := repoPathFromUUIDCache(uuid)
@ -224,7 +237,7 @@ func UUID2RepoPath(uuid string) (string, error) {
} }
if !valid { if !valid {
// If it isn't, remove the cache entry and try again // If it isn't, remove the cache entry and try again
delete(uuid2repoPathCache, uuid) removeCachedEntries(uuid, repoPath)
return UUID2RepoPath(uuid) return UUID2RepoPath(uuid)
} }
// Otherwise just return the cached entry // Otherwise just return the cached entry

View file

@ -36,7 +36,6 @@ func AnnexP2PHTTP(ctx *services_context.Context) {
uuid := ctx.Params(":uuid") uuid := ctx.Params(":uuid")
repoPath, err := annex.UUID2RepoPath(uuid) repoPath, err := annex.UUID2RepoPath(uuid)
if err != nil { if err != nil {
log.Error("%v", err)
ctx.PlainText(http.StatusNotFound, "Repository not found") ctx.PlainText(http.StatusNotFound, "Repository not found")
return return
} }
@ -46,14 +45,12 @@ func AnnexP2PHTTP(ctx *services_context.Context) {
owner := parts[len(parts)-2] owner := parts[len(parts)-2]
repo, err := repo_model.GetRepositoryByOwnerAndName(ctx, owner, repoName) repo, err := repo_model.GetRepositoryByOwnerAndName(ctx, owner, repoName)
if err != nil { if err != nil {
log.Error("%v", err)
ctx.PlainText(http.StatusNotFound, "Repository not found") ctx.PlainText(http.StatusNotFound, "Repository not found")
return return
} }
p, err := access_model.GetUserRepoPermission(ctx, repo, ctx.Doer) p, err := access_model.GetUserRepoPermission(ctx, repo, ctx.Doer)
if err != nil { if err != nil {
log.Error("%v", err)
ctx.ServerError("GetUserRepoPermission", err) ctx.ServerError("GetUserRepoPermission", err)
return return
} }

View file

@ -243,9 +243,8 @@ func httpBase(ctx *context.Context) *serviceHandler {
} }
} }
isRequestToConfig := strings.HasSuffix(ctx.Req.URL.Path, "/config")
if !repoExist { if !repoExist {
if !receivePack && !isRequestToConfig { if !receivePack {
ctx.PlainText(http.StatusNotFound, "Repository not found") ctx.PlainText(http.StatusNotFound, "Repository not found")
return nil return nil
} }
@ -265,7 +264,7 @@ func httpBase(ctx *context.Context) *serviceHandler {
} }
// Return dummy payload if GET receive-pack // Return dummy payload if GET receive-pack
if ctx.Req.Method == http.MethodGet && !isRequestToConfig { if ctx.Req.Method == http.MethodGet {
dummyInfoRefs(ctx) dummyInfoRefs(ctx)
return nil return nil
} }
@ -552,21 +551,6 @@ func GetConfig(ctx *context.Context) {
h := httpBase(ctx) h := httpBase(ctx)
if h != nil { if h != nil {
setHeaderNoCache(ctx) setHeaderNoCache(ctx)
if setting.Annex.Enabled && strings.HasPrefix(ctx.Req.UserAgent(), "git-annex/") {
p, err := access_model.GetUserRepoPermission(ctx, h.repo, ctx.Doer)
if err != nil {
ctx.ServerError("GetUserRepoPermission", err)
return
}
if p.CanAccess(perm.AccessModeWrite, unit.TypeCode) {
_, _, err := git.NewCommand(ctx, "annex", "init").RunStdString(&git.RunOpts{Dir: h.getRepoDir()})
if err != nil {
ctx.Resp.WriteHeader(http.StatusInternalServerError)
return
}
}
}
config, err := os.ReadFile(filepath.Join(h.getRepoDir(), "config")) config, err := os.ReadFile(filepath.Join(h.getRepoDir(), "config"))
if err != nil { if err != nil {
log.Error("Failed to read git config file: %v", err) log.Error("Failed to read git config file: %v", err)