Optimisation

This commit is contained in:
Nishtha Gupta
2022-12-29 15:35:31 +05:30
parent e95cd87648
commit 64305dab94
4 changed files with 77 additions and 264 deletions

156
dist/index.js vendored
View File

@@ -24,7 +24,7 @@ const RATE_LIMIT = 1;
let totalCount = 0;
function getVersionIds(owner, packageName, packageType, numVersions, page, token) {
return version_1.getOldestVersions(owner, packageName, packageType, numVersions, page, token).pipe(operators_2.expand(value => value.paginate
? version_1.getOldestVersions(owner, packageName, packageType, numVersions, value.page, token)
? version_1.getOldestVersions(owner, packageName, packageType, numVersions, value.page + 1, token)
: rxjs_1.EMPTY), operators_2.tap(value => (totalCount = totalCount + value.totalCount)), operators_1.reduce((acc, value) => acc.concat(value.versions), []));
}
exports.getVersionIds = getVersionIds;
@@ -33,86 +33,33 @@ function finalIds(input) {
return rxjs_1.of(input.packageVersionIds);
}
if (input.hasOldestVersionQueryInfo()) {
if (input.minVersionsToKeep < 0) {
// This code block is when num-old-versions-to-delete is specified.
// Setting input.numOldVersionsToDelete is set as minimum of input.numOldVersionsToDelete and RATE_LIMIT
input.numOldVersionsToDelete =
input.numOldVersionsToDelete < RATE_LIMIT
? input.numOldVersionsToDelete
: RATE_LIMIT;
return getVersionIds(input.owner, input.packageName, input.packageType, RATE_LIMIT, 1, input.token).pipe(
// This code block executes on batches of 100 versions starting from oldest
operators_2.map(value => {
console.log('If block');
console.log(`value: ${JSON.stringify(value)}`);
// we need to delete oldest versions first
value.sort((a, b) => {
return (new Date(a.created_at).getTime() -
new Date(b.created_at).getTime());
});
console.log(`sorted value: ${JSON.stringify(value)}`);
/*
Here first filter out the versions that are to be ignored.
Then update input.numOldeVersionsToDelete to the no of versions deleted from the next 100 versions batch.
*/
value = value.filter(info => !input.ignoreVersions.test(info.version));
const temp = input.numOldVersionsToDelete;
input.numOldVersionsToDelete =
input.numOldVersionsToDelete - value.length <= 0
? 0
: input.numOldVersionsToDelete - value.length;
return value.map(info => info.id.toString()).slice(0, temp);
}));
}
else {
// This code block is when min-versions-to-keep is specified.
return getVersionIds(input.owner, input.packageName, input.packageType, RATE_LIMIT, 1, input.token).pipe(
// This code block executes on batches of 100 versions starting from oldest
operators_2.map(value => {
console.log('Else block');
console.log(`value: ${JSON.stringify(value)}`);
// we need to delete oldest versions first
value.sort((a, b) => {
return (new Date(a.created_at).getTime() -
new Date(b.created_at).getTime());
});
console.log(`sorted value: ${JSON.stringify(value)}`);
/*
Here totalCount is the total no of versions in the package.
First we update totalCount by removing no of ignored versions from it and also filter them out from value.
toDelete is the no of versions that need to be deleted and input.numDeleted is the total no of versions deleted before this batch.
We calculate this from total no of versions in the package, the min no of versions to keep and the no of versions we have deleted in earlier batch.
Then we update toDelete to not exceed the length of current batch of versions.
Now toDelete holds the no of versions to be deleted from the current batch of versions.
*/
totalCount =
totalCount -
value.filter(info => input.ignoreVersions.test(info.version)).length;
value = value.filter(info => !input.ignoreVersions.test(info.version));
let toDelete = totalCount - input.minVersionsToKeep - input.numDeleted;
toDelete = toDelete > value.length ? value.length : toDelete;
//Checking here if we have any versions to delete and whether we are within the RATE_LIMIT.
if (toDelete > 0 && input.numDeleted < RATE_LIMIT) {
/*
Checking here if we can delete all the versions left in the current batch.
input.numDeleted + toDelete should not exceed RATE_LIMIT.
If it is exceeding we only delete the no of versions from this batch that are allowed within the RATE_LIMIT.
i.e. diff between RATE_LIMIT and versions deleted till now (input.numDeleted)
input.numDeleted is updated accordingly.
*/
if (input.numDeleted + toDelete > RATE_LIMIT) {
toDelete = RATE_LIMIT - input.numDeleted;
input.numDeleted = RATE_LIMIT;
}
else {
input.numDeleted = input.numDeleted + toDelete;
}
return value.map(info => info.id.toString()).slice(0, toDelete);
}
else
return [];
}));
}
return getVersionIds(input.owner, input.packageName, input.packageType, RATE_LIMIT, 1, input.token).pipe(
// This code block executes on all versions of a package starting from oldest
operators_2.map(value => {
console.log('If block');
console.log(`value: ${JSON.stringify(value)}`);
// we need to delete oldest versions first
value.sort((a, b) => {
return (new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
});
console.log(`sorted value: ${JSON.stringify(value)}`);
/*
Here first filter out the versions that are to be ignored.
Then update input.numOldeVersionsToDelete to the no of versions deleted from the next 100 versions batch.
*/
value = value.filter(info => !input.ignoreVersions.test(info.version));
let toDelete = 0;
if (input.minVersionsToKeep < 0) {
toDelete = Math.min(value.length, Math.min(input.numOldVersionsToDelete, RATE_LIMIT));
}
else {
toDelete = Math.min(value.length - input.minVersionsToKeep, RATE_LIMIT);
}
console.log(`toDelete is ${toDelete}`);
if (toDelete < 0)
return [];
return value.map(info => info.id.toString()).slice(0, toDelete);
}));
}
return rxjs_1.throwError("Could not get packageVersionIds. Explicitly specify using the 'package-version-ids' input");
}
@@ -208,59 +155,20 @@ exports.Input = Input;
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.deletePackageVersions = exports.deletePackageVersion = void 0;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
/* eslint-disable @typescript-eslint/no-unused-vars */
const rxjs_1 = __nccwpck_require__(5805);
const operators_1 = __nccwpck_require__(7801);
const rest_1 = __nccwpck_require__(5375);
let deleted = 0;
// export interface DeletePackageVersionAPIResponse {
// deletePackageVersion: {
// success: boolean
// }
// }
// const mutation = `
// mutation deletePackageVersion($packageVersionId: ID!) {
// deletePackageVersion(input: {packageVersionId: $packageVersionId}) {
// success
// }
// }`
function deletePackageVersion(packageVersionId, owner, packageName, packageType, token) {
const octokit = new rest_1.Octokit({
auth: token
});
const package_version_id = +packageVersionId;
// const response = octokit.rest.packages.deletePackageVersionForUser({
// packageType,
// packageName,
// owner,
// packageVersionId,
// });
// if (response.status != 200) {
// throw new Error(
// `Unexpected response from GitHub API. Status: ${response.status}, Data: ${response.data}`
// )
// }
const package_type = packageType;
deleted += 1;
// return from(
// graphql(token, mutation, {
// packageVersionId,
// headers: {
// Accept: 'application/vnd.github.package-deletes-preview+json'
// }
// }) as Promise<DeletePackageVersionMutationResponse>
// ).pipe(
// catchError(err => {
// const msg = 'delete version mutation failed.'
// return throwError(
// err.errors && err.errors.length > 0
// ? `${msg} ${err.errors[0].message}`
// : `${msg} ${err.message} \n${deleted - 1} versions deleted till now.`
// )
// }),
// map(response => response.deletePackageVersion.success)
// )
return rxjs_1.from(octokit.rest.packages.deletePackageVersionForUser({
package_type: 'npm',
package_type,
package_name: packageName,
username: owner,
package_version_id
@@ -327,7 +235,7 @@ function getOldestVersions(owner, packageName, packageType, numVersions, page, t
created_at: version.created_at
};
}),
page: page + 1,
page,
paginate: response.data.length === numVersions,
totalCount: response.data.length
};

View File

@@ -36,7 +36,7 @@ export function getVersionIds(
packageName,
packageType,
numVersions,
value.page,
value.page + 1,
token
)
: EMPTY
@@ -51,102 +51,47 @@ export function finalIds(input: Input): Observable<string[]> {
return of(input.packageVersionIds)
}
if (input.hasOldestVersionQueryInfo()) {
if (input.minVersionsToKeep < 0) {
// This code block is when num-old-versions-to-delete is specified.
// Setting input.numOldVersionsToDelete is set as minimum of input.numOldVersionsToDelete and RATE_LIMIT
input.numOldVersionsToDelete =
input.numOldVersionsToDelete < RATE_LIMIT
? input.numOldVersionsToDelete
: RATE_LIMIT
return getVersionIds(
input.owner,
input.packageName,
input.packageType,
RATE_LIMIT,
1,
input.token
).pipe(
// This code block executes on batches of 100 versions starting from oldest
map(value => {
console.log('If block')
console.log(`value: ${JSON.stringify(value)}`)
// we need to delete oldest versions first
value.sort((a, b) => {
return (
new Date(a.created_at).getTime() -
new Date(b.created_at).getTime()
)
})
console.log(`sorted value: ${JSON.stringify(value)}`)
/*
return getVersionIds(
input.owner,
input.packageName,
input.packageType,
RATE_LIMIT,
1,
input.token
).pipe(
// This code block executes on all versions of a package starting from oldest
map(value => {
console.log('If block')
console.log(`value: ${JSON.stringify(value)}`)
// we need to delete oldest versions first
value.sort((a, b) => {
return (
new Date(a.created_at).getTime() - new Date(b.created_at).getTime()
)
})
console.log(`sorted value: ${JSON.stringify(value)}`)
/*
Here first filter out the versions that are to be ignored.
Then update input.numOldeVersionsToDelete to the no of versions deleted from the next 100 versions batch.
*/
value = value.filter(info => !input.ignoreVersions.test(info.version))
const temp = input.numOldVersionsToDelete
input.numOldVersionsToDelete =
input.numOldVersionsToDelete - value.length <= 0
? 0
: input.numOldVersionsToDelete - value.length
return value.map(info => info.id.toString()).slice(0, temp)
})
)
} else {
// This code block is when min-versions-to-keep is specified.
return getVersionIds(
input.owner,
input.packageName,
input.packageType,
RATE_LIMIT,
1,
input.token
).pipe(
// This code block executes on batches of 100 versions starting from oldest
map(value => {
console.log('Else block')
console.log(`value: ${JSON.stringify(value)}`)
// we need to delete oldest versions first
value.sort((a, b) => {
return (
new Date(a.created_at).getTime() -
new Date(b.created_at).getTime()
)
})
console.log(`sorted value: ${JSON.stringify(value)}`)
/*
Here totalCount is the total no of versions in the package.
First we update totalCount by removing no of ignored versions from it and also filter them out from value.
toDelete is the no of versions that need to be deleted and input.numDeleted is the total no of versions deleted before this batch.
We calculate this from total no of versions in the package, the min no of versions to keep and the no of versions we have deleted in earlier batch.
Then we update toDelete to not exceed the length of current batch of versions.
Now toDelete holds the no of versions to be deleted from the current batch of versions.
*/
totalCount =
totalCount -
value.filter(info => input.ignoreVersions.test(info.version)).length
value = value.filter(info => !input.ignoreVersions.test(info.version))
let toDelete = totalCount - input.minVersionsToKeep - input.numDeleted
toDelete = toDelete > value.length ? value.length : toDelete
//Checking here if we have any versions to delete and whether we are within the RATE_LIMIT.
if (toDelete > 0 && input.numDeleted < RATE_LIMIT) {
/*
Checking here if we can delete all the versions left in the current batch.
input.numDeleted + toDelete should not exceed RATE_LIMIT.
If it is exceeding we only delete the no of versions from this batch that are allowed within the RATE_LIMIT.
i.e. diff between RATE_LIMIT and versions deleted till now (input.numDeleted)
input.numDeleted is updated accordingly.
*/
if (input.numDeleted + toDelete > RATE_LIMIT) {
toDelete = RATE_LIMIT - input.numDeleted
input.numDeleted = RATE_LIMIT
} else {
input.numDeleted = input.numDeleted + toDelete
}
return value.map(info => info.id.toString()).slice(0, toDelete)
} else return []
})
)
}
value = value.filter(info => !input.ignoreVersions.test(info.version))
let toDelete = 0
if (input.minVersionsToKeep < 0) {
toDelete = Math.min(
value.length,
Math.min(input.numOldVersionsToDelete, RATE_LIMIT)
)
} else {
toDelete = Math.min(
value.length - input.minVersionsToKeep,
RATE_LIMIT
)
}
console.log(`toDelete is ${toDelete}`)
if (toDelete < 0) return []
return value.map(info => info.id.toString()).slice(0, toDelete)
})
)
}
return throwError(
"Could not get packageVersionIds. Explicitly specify using the 'package-version-ids' input"

View File

@@ -1,22 +1,11 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
/* eslint-disable @typescript-eslint/no-unused-vars */
import {from, Observable, merge, throwError, of} from 'rxjs'
import {catchError, map, tap} from 'rxjs/operators'
import {Octokit} from '@octokit/rest'
import {RestEndpointMethodTypes} from '@octokit/plugin-rest-endpoint-methods/dist-types/generated/parameters-and-response-types'
let deleted = 0
// export interface DeletePackageVersionAPIResponse {
// deletePackageVersion: {
// success: boolean
// }
// }
// const mutation = `
// mutation deletePackageVersion($packageVersionId: ID!) {
// deletePackageVersion(input: {packageVersionId: $packageVersionId}) {
// success
// }
// }`
type PackageType = RestEndpointMethodTypes['packages']['getAllPackageVersionsForPackageOwnedByUser']['parameters']['package_type']
export function deletePackageVersion(
packageVersionId: string,
@@ -29,41 +18,12 @@ export function deletePackageVersion(
auth: token
})
const package_version_id = +packageVersionId
// const response = octokit.rest.packages.deletePackageVersionForUser({
// packageType,
// packageName,
// owner,
// packageVersionId,
// });
// if (response.status != 200) {
// throw new Error(
// `Unexpected response from GitHub API. Status: ${response.status}, Data: ${response.data}`
// )
// }
const package_type: PackageType = packageType as PackageType
deleted += 1
// return from(
// graphql(token, mutation, {
// packageVersionId,
// headers: {
// Accept: 'application/vnd.github.package-deletes-preview+json'
// }
// }) as Promise<DeletePackageVersionMutationResponse>
// ).pipe(
// catchError(err => {
// const msg = 'delete version mutation failed.'
// return throwError(
// err.errors && err.errors.length > 0
// ? `${msg} ${err.errors[0].message}`
// : `${msg} ${err.message} \n${deleted - 1} versions deleted till now.`
// )
// }),
// map(response => response.deletePackageVersion.success)
// )
return from(
octokit.rest.packages.deletePackageVersionForUser({
package_type: 'npm',
package_type,
package_name: packageName,
username: owner,
package_version_id

View File

@@ -59,7 +59,7 @@ export function getOldestVersions(
created_at: version.created_at
}
}),
page: page + 1,
page,
paginate: response.data.length === numVersions,
totalCount: response.data.length
}