Skip to content

Commit

Permalink
fix: create new repositories during full-sync operation (#710)
Browse files Browse the repository at this point in the history
The full-sync script now properly creates new repositories defined in the
configuration instead of only updating existing ones.
This fixes the different behavior between webhook-based sync and full-sync runs.

Co-authored-by: Yadhav Jayaraman <[email protected]>
  • Loading branch information
PendaGTP and decyjphr authored Jan 2, 2025
1 parent 2ce0136 commit ee5909a
Showing 1 changed file with 41 additions and 11 deletions.
52 changes: 41 additions & 11 deletions lib/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ ${this.results.reduce((x, y) => {
async updateAll() {
// this.subOrgConfigs = this.subOrgConfigs || await this.getSubOrgConfigs(this.github, this.repo, this.log)
// this.repoConfigs = this.repoConfigs || await this.getRepoConfigs(this.github, this.repo, this.log)
return this.eachRepositoryRepos(this.github, this.config.restrictedRepos, this.log).then(res => {
return this.eachRepositoryRepos(this.github, this.log).then(res => {
this.appendToResults(res)
})
}
Expand Down Expand Up @@ -475,19 +475,49 @@ ${this.results.reduce((x, y) => {
return restrictedRepos.filter((restrictedRepo) => { return RegExp(restrictedRepo).test(repoName) }).length > 0
}

async eachRepositoryRepos(github, restrictedRepos, log) {
async eachRepositoryRepos (github, log) {
log.debug('Fetching repositories')
return github.paginate('GET /installation/repositories').then(repositories => {
return Promise.all(repositories.map(repository => {
if (this.isRestricted(repository.name)) {
return null
}

const { owner, name } = repository
return this.updateRepos({ owner: owner.login, repo: name })
const processedRepos = new Set()
const results = []

// Process existing repositories
const existingRepoResults = await github.paginate('GET /installation/repositories')
.then(repositories => {
return Promise.all(repositories.map(repository => {
if (this.isRestricted(repository.name)) {
return null
}
const { owner, name } = repository
processedRepos.add(`${owner.login}/${name}`)
return this.updateRepos({ owner: owner.login, repo: name })
}))
})
)
})

// Process missing repositories
const repoInConfigs = Object.values(this.repoConfigs)
.filter(config => config.repository?.name)
.map(config => {
return {
name: config.repository.name,
owner: config.repository.organization || this.repo.owner
}
})
const missingRepoResults = await Promise.all(
repoInConfigs
.filter(repo => !this.isRestricted(repo.name))
.filter(repo => !processedRepos.has(`${repo.owner}/${repo.name}`))
.map(repo => {
processedRepos.add(`${repo.owner}/${repo.name}`)
return this.updateRepos({ owner: repo.owner, repo: repo.name })
})
)

results
.concat(existingRepoResults || [], missingRepoResults || [])
.filter(result => result !== null)

return results
}

/**
Expand Down

0 comments on commit ee5909a

Please sign in to comment.