Skip to content

Commit d740196

Browse files
committed
feat: allow manually indexing incomplete repos
1 parent 724344e commit d740196

File tree

4 files changed

+80
-24
lines changed

4 files changed

+80
-24
lines changed

nuxt.config.ts

+6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export default defineNuxtConfig({
2727
},
2828
},
2929
github: {
30+
token: '',
3031
appId: '',
3132
privateKey: '',
3233
},
@@ -40,6 +41,11 @@ export default defineNuxtConfig({
4041
typedPages: true,
4142
},
4243
compatibilityDate: '2024-04-03',
44+
nitro: {
45+
experimental: {
46+
tasks: true,
47+
},
48+
},
4349
hub: {
4450
ai: true,
4551
analytics: true,

server/api/clusters/[owner]/[repo].get.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export default defineCachedCorsEventHandler(async (event) => {
2323
})
2424

2525
const clusters = clusterEmbeddings(issues, embeddings)
26-
console.log('generated', clusters.length, 'clusters')
26+
console.log('generated', clusters.length, 'clusters from', issues.length, embeddings.length)
2727

2828
return clusters
2929
.map(cluster => cluster.map(i => ({

server/routes/github/webhook.post.ts

+34-23
Original file line numberDiff line numberDiff line change
@@ -93,35 +93,46 @@ async function addRepos(event: H3Event, installation: Installation | Installatio
9393
continue
9494
}
9595

96-
console.log('starting to index', `${repo.full_name}`)
96+
await indexRepo(octokit, repo)
9797

9898
const [owner, name] = repo.full_name.split('/')
99+
event.waitUntil(setMetadataForRepo(owner!, name!, { ...repo, indexed: true }))
100+
}
101+
}
99102

100-
const promises: Array<Promise<unknown>> = []
101-
102-
await octokit.paginate(octokit.rest.issues.listForRepo, {
103-
owner: owner!,
104-
repo: name!,
105-
state: 'open',
106-
per_page: 100,
107-
}, (response) => {
108-
console.log(response.headers)
109-
for (const issue of response.data) {
110-
promises.push(indexIssue(issue, { owner: { login: owner! }, name: name! }))
111-
}
112-
return []
113-
})
103+
export async function indexRepo(octokit: Octokit, repo: InstallationRepo) {
104+
if (repo.private) {
105+
return
106+
}
114107

115-
await Promise.allSettled(promises).then((r) => {
116-
if (r.some(p => p.status === 'rejected')) {
117-
console.error('Failed to fetch some issues from', `${owner}/${name}`)
118-
}
119-
})
108+
console.log('starting to index', `${repo.full_name}`)
120109

121-
console.log('added', promises.length - 1, 'issues from', `${owner}/${name}`, 'to the index')
110+
const [owner, name] = repo.full_name.split('/')
122111

123-
event.waitUntil(setMetadataForRepo(owner!, name!, { ...repo, indexed: true }))
124-
}
112+
const promises: Array<Promise<unknown>> = []
113+
114+
await octokit.paginate(octokit.rest.issues.listForRepo, {
115+
owner: owner!,
116+
repo: name!,
117+
state: 'open',
118+
per_page: 100,
119+
}, (response) => {
120+
for (const issue of response.data) {
121+
promises.push(indexIssue(issue, { owner: { login: owner! }, name: name! }))
122+
}
123+
if (parseInt(response.headers['x-ratelimit-remaining'] || '999') < 100) {
124+
console.info(parseInt(response.headers['x-ratelimit-remaining']!), 'requests remaining')
125+
}
126+
return []
127+
})
128+
129+
await Promise.allSettled(promises).then((r) => {
130+
if (r.some(p => p.status === 'rejected')) {
131+
console.error('Failed to fetch some issues from', `${owner}/${name}`)
132+
}
133+
})
134+
135+
console.log('added', promises.length, 'issues from', `${owner}/${name}`, 'to the index')
125136
}
126137

127138
async function deleteRepo(event: H3Event, repo: InstallationRepo) {

server/tasks/index-repo.ts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Octokit } from '@octokit/rest'
2+
import { defineTask } from 'nitropack/runtime'
3+
import { indexRepo } from '~~/server/routes/github/webhook.post'
4+
5+
export default defineTask({
6+
meta: {
7+
name: 'index-repo',
8+
description: 'Index repositories',
9+
},
10+
async run() {
11+
const octokit = new Octokit({ auth: useRuntimeConfig().github.token })
12+
13+
const repos = await $fetch('/api/repos')
14+
const indexed: string[] = []
15+
let count = 1
16+
for (const repo of repos) {
17+
if (repo.indexed) continue
18+
19+
try {
20+
const [owner, name] = repo.repo.split('/')
21+
const meta = await getMetadataForRepo(owner!, name!)
22+
if (!meta) continue
23+
24+
await indexRepo(octokit, meta)
25+
indexed.push(repo.repo)
26+
await setMetadataForRepo(owner!, name!, { ...meta, indexed: true })
27+
}
28+
catch (e) {
29+
console.error(e)
30+
}
31+
32+
if (count++ > 30) {
33+
break
34+
}
35+
}
36+
37+
return indexed
38+
},
39+
})

0 commit comments

Comments
 (0)