From 1e2ad32d549bf978dc9a71b45e7b5228535618a0 Mon Sep 17 00:00:00 2001
From: mappu
diff --git a/sync.go b/sync.go index cfdc12b..e3b9d0b 100644 --- a/sync.go +++ b/sync.go @@ -8,6 +8,71 @@ import ( "time" ) +// rearrangeOrder applies rearrangements from the OverrideOrder configuration. +func (this *Application) rearrangeOrder(repos []gitea.Repo) []gitea.Repo { + + if len(this.cfg.OverrideOrder) == 0 { + return repos // nothing to do + } + + // Collect pre-existing positions for repos + reposByName := make(map[string]gitea.Repo, len(repos)) + for _, repo := range repos { + reposByName[repo.Name] = repo + } + + // Sort target insertion positions by lowest-first + type insertionPosition struct { + pos int + repoName string + } + insertAt := make([]insertionPosition, 0, len(this.cfg.OverrideOrder)) + + for rn, rpos := range this.cfg.OverrideOrder { + insertAt = append(insertAt, insertionPosition{len(repos) - rpos - 1, rn}) + } + sort.Slice(insertAt, func(i, j int) bool { + return insertAt[i].pos < insertAt[j].pos + }) + + log.Printf("insertAt=%#v\n", insertAt) + + // Walking-insertion loop + ret := make([]gitea.Repo, 0, len(repos)) + nextRepo := 0 + nextOverride := 0 + for { + if nextOverride < len(insertAt) && insertAt[nextOverride].pos == len(ret) { + // We have an override to insert at this position + log.Printf("OVERRIDE insert of %q", insertAt[nextOverride].repoName) + ret = append(ret, reposByName[insertAt[nextOverride].repoName]) + nextOverride++ + + } else if nextRepo < len(repos) { + // There are still other repos to insert generally + if _, ok := this.cfg.OverrideOrder[repos[nextRepo].Name]; ok { + // This repo has an overridden position. Don't insert it generally here + log.Printf("skipping natural insert of %q", repos[nextRepo].Name) + nextRepo++ + + } else { + // This repo does not have an overriden position. Here is fine + log.Printf("OK natural insert of %q", repos[nextRepo].Name) + ret = append(ret, repos[nextRepo]) + nextRepo++ + } + + } else { + // There are no more overrides to insert and there are no remaining + // non-override repos + // That means we're done + break + } + } + + return ret +} + func (this *Application) sync(ctx context.Context) (bool, error) { // List repositories on Gitea @@ -79,6 +144,7 @@ func (this *Application) sync(ctx context.Context) (bool, error) { sort.Slice(repos, func(i, j int) bool { return repos[i].GiteaCreated.After(repos[j].GiteaCreated) }) + repos = this.rearrangeOrder(repos) // Commit our changes for the other threads to look at this.reposMut.Lock() |