I am trying to migrate a private github repository to a local instance of gitea I've installed in a Docker container on a NAS in my home. I tried the built in migration but after running for about 5 minutes it failed on some obscure reference in a comment and left the only option to delete the repository and started again. So I manually created a Repository Called "alan/PAS".
I've been using a nodejs
application to read github issues and milestones for years as part of a report I write about activity on the repository. I decided I would try and use that to migrate, writing my own nodejs
script. I only wanted to migrate labels, milestones issues and comments. I ran the whole script with the writing to gitea part commented out and it worked perfectly, fetching all the information I need. However when it came to writing to gitea I couldn't make it work. I'll concentrate just on the labels section as that is where its initially failing.
Here is my code for that bit.
const labels = await readGithub(`labels`);
const labellist = new Map();
for(const label of labels) {
console.log('label received', label);
const l = await writeGitea('labels','POST',{color:'#'+label.color,description:label.description,name: label.name, exclusive: false});
labellist.set(label.id, l.id)
}
Nothing too complicated I read from github a list of labels and the iterate over them one by one and attempt to post a slightly altered version to gitea. I add some info to a map to refer to it later.
The code in writeGitea
in as follows
const options = {
hostname: 'gitea.local',
port: 3443,
headers : {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorisation' : 'c9454acadb6b68c2897a9abfbef56d5ec3dfe433'
}
}
async function writeGitea(url, method, body) {
console.log('writeGitea to url',url, 'method', method, 'body', body)
options.path = `/api/v1/repos/alan/PAS/${url}?token=c9454acadb6b68c2897a9abfbef56d5ec3dfe433`;
options.method = method;
return new Promise((resolve,reject) => {
const request = https.request(options, (res) => {
let body = '';
res.on('data', (chunk) => {
body += chunk
});
res.on('end', () => {
console.log('Gitea Request Complete, Status Code', res.statusCode, 'URL', options.path, 'response body', body)
if (res.statusCode > 299) {
reject(res.statusCode);
} else {
resolve(body)
}
});
res.on('error',() => reject(Error('Gitea Request Failed')));
})
request.write(JSON.stringify(body));
});
}
Again standard nodejs use of https
When I run this, nothing happens, no chunks received (I did have console.log in there to check), until eventually the request times out and throws a "socket hang up" error.
HOWEVER, I had previously used the toolkit that comes with the repository to see what authorisations work. Only two did and I used one of them... and then tried to run the same request there https://gitea.local:3443/api/v1/repos/alan/PASv5/labels?token=c9454acadb6b68c2897a9abfbef56d5ec3dfe433
(the token will be changed so is I don't mind exposing it)
This worked and created the label correctly. Here is the curl
request it used.
curl -X 'POST' \
'https://gitea.local:3443/api/v1/repos/alan/PAS/labels?token=c9454acadb6b68c2897a9abfbef56d5ec3dfe433' \
-H 'accept: application/json' \
-H 'Authorization: c9454acadb6b68c2897a9abfbef56d5ec3dfe433' \
-H 'Content-Type: application/json' \
-d '{
"color": "#38774E",
"description": "",
"exclusive": false,
"name": "appointments"
}'
And here is the response (status 201)
{
"id": 112,
"name": "appointments",
"exclusive": false,
"color": "38774e",
"description": "",
"url": "https://192.168.0.190:3433/api/v1/repos/alan/PAS/labels/112"
}
I am at a total loss why curl works and my nodejs request doesn't. Has anyone any ideas?
Solved. I missed a
request.end()
off the end of thewriteToGitea
function.I would like to give a shoutout to https://curlconverter.com/node-http/ which solved it for me.