Skip to content
This repository has been archived by the owner on Mar 13, 2023. It is now read-only.

Commit

Permalink
fix: updater not picking up new prereleases, please update manually
Browse files Browse the repository at this point in the history
  • Loading branch information
moranje committed Feb 11, 2020
1 parent 7dc811e commit fdcb793
Showing 1 changed file with 112 additions and 36 deletions.
148 changes: 112 additions & 36 deletions src/lib/updater.ts
Original file line number Diff line number Diff line change
@@ -1,69 +1,145 @@
import compareVersions from 'compare-versions';
import compare from 'compare-versions';
import got from 'got';

import { createCall } from '@/lib/cli-args';
import settingsStore from '@/lib/stores/settings-store';
import { ENV } from '@/lib/utils';
import { Item, workflowList } from '@/lib/workflow';

import updateStore from './stores/update-store';
// import { createLogger } from './logger';

// TODO: Add decent testing for updater, as it must not break
export interface Release {
url: string;
assets_url: string;
html_url: string;
id: number;
tag_name: string;
target_commitish: string;
name: string;
prerelease: boolean;
created_at: string;
published_at: string;
assets?: (Asset | null)[] | null;
body: string;
}
export interface Asset {
url: string;
id: number;
name: string;
label: string;
state: string;
size: number;
download_count: number;
created_at: string;
updated_at: string;
browser_download_url: string;
}

export const GITHUB_PACKAGE_URL =
'https://raw.githubusercontent.com/moranje/alfred-workflow-todoist/master/package.json';
const RELEASES_URL =
'https://api.github.com/repos/moranje/alfred-workflow-todoist/releases';

/**
* Check for workflow update on Github.
*/
export async function checkForWorkflowUpdate(): Promise<void> {
const timePassed =
new Date().getTime() - new Date(updateStore().get('updated')).getTime();
// function assertUpdateCheckPossible(): void | never {
// 'assert has github releases';

if (
timePassed <
settingsStore(ENV.meta.dataPath).get('update_checks') *
1000 /* Milliseconds */
) {
return;
}
// 'assert valid version';

const { body: remote } = await got(GITHUB_PACKAGE_URL, {
responseType: 'json',
});
// 'assert has settings store';
// 'assert valid update checks';
// 'assert valid pre_releases';
// 'assert valid last_update';
// }

function getReleases(
releases: Release[]
): { latest: Release | undefined; prerelease: Release | undefined } {
let latest, prerelease;
for (const [, release] of releases.entries()) {
if (release.prerelease === true && !prerelease) {
prerelease = release;
}

// No alpha en beta updates bij default
if (/.*(?:alpha|beta).*/.test(remote.version)) {
if (settingsStore(ENV.meta.dataPath).get('pre_releases') === false) return;
if (release.prerelease === false && !latest) {
latest = release;
}
}

const currentVersion = updateStore().get('version');
if (compareVersions.compare(remote.version, currentVersion, '>')) {
return { latest, prerelease };
}

function isUpdateCheckNeeded(): boolean {
const now = Date.now();
// TODO: needs guard and fallback
const lastUpdate = settingsStore(ENV.meta.dataPath).get('last_update') ?? now;
// TODO: needs guard and fallback
const updateInterval =
settingsStore(ENV.meta.dataPath).get('update_checks') *
1000; /* Milliseconds */
const timePassed = now - new Date(lastUpdate).getTime();

// Do not keep nagging
// settingsStore(ENV.meta.dataPath).set('last_update', new Date().toISOString());

if (timePassed > updateInterval) return true;

return false;
}

function addRelease(release: Release, current: string): void {
const [workflow] = release.assets || [];

if (workflow) {
workflowList.addItem(
new Item({
arg: createCall({
name: 'openUrl',
args:
'https://github.com/moranje/alfred-workflow-todoist/releases/latest/download/Alfred.Workflow.Todoist.alfredworkflow',
args: workflow.browser_download_url,
}),
title: `Download workflow update`,
subtitle: `The latest version is v${remote.version} you are on v${currentVersion}`,
quicklookurl:
'https://github.com/moranje/alfred-workflow-todoist/blob/master/CHANGELOG.md',
subtitle: `The latest version is ${release.tag_name} you are on v${current}`,
quicklookurl: release.html_url,
})
);
workflowList.addItem(
new Item({
arg: createCall({
name: 'openUrl',
args:
'https://github.com/moranje/alfred-workflow-todoist/blob/master/CHANGELOG.md',
args: release.html_url,
}),
title: `Open changelog`,
subtitle: `See what's changed in the current version`,
quicklookurl:
'https://github.com/moranje/alfred-workflow-todoist/blob/master/CHANGELOG.md',
subtitle: `See what's changed in the latest version`,
quicklookurl: release.html_url,
})
);
}
}

/**
*
*/
export async function checkForWorkflowUpdate(): Promise<void> {
if (isUpdateCheckNeeded() === false) return;
// const all = assertUpdateCheckPossible();

// TODO: needs guard and fallback
const { body: releases } = await got(RELEASES_URL, {
responseType: 'json',
});

const { latest, prerelease } = getReleases(releases);
// TODO: needs guard and fallback
const hasPrereleases = settingsStore(ENV.meta.dataPath).get('pre_releases');

if (
hasPrereleases === true &&
prerelease &&
/* current < prerelease */
compare(ENV.workflow.version, prerelease.tag_name) === -1
) {
return addRelease(prerelease, ENV.workflow.version);
}

/* current < latest */
if (latest && compare(ENV.workflow.version, latest.tag_name) === -1) {
return addRelease(latest, ENV.workflow.version);
}
}

0 comments on commit fdcb793

Please sign in to comment.