mirror of
https://github.com/silvanocerza/github-gitless-sync.git
synced 2026-07-22 12:10:28 +00:00
Chonky update
This commit is contained in:
parent
509b41fb57
commit
b23c2a1868
2 changed files with 143 additions and 1 deletions
137
src/main.ts
137
src/main.ts
|
|
@ -1,22 +1,157 @@
|
|||
import { Plugin } from "obsidian";
|
||||
import { GitHubSyncSettings, DEFAULT_SETTINGS } from "./settings/settings";
|
||||
import GithubClient from "./github/client";
|
||||
import GitHubSyncSettingsTab from "./settings/tab";
|
||||
import MetadataStore from "./metadata-store";
|
||||
import EventsListener from "./events/listener";
|
||||
import EventsConsumer from "./events/consumer";
|
||||
import { type Event } from "./events/types";
|
||||
|
||||
export default class GitHubSyncPlugin extends Plugin {
|
||||
settings: GitHubSyncSettings;
|
||||
metadataStore: MetadataStore;
|
||||
client: GithubClient;
|
||||
eventsListener: EventsListener;
|
||||
eventsConsumer: EventsConsumer;
|
||||
syncIntervalId: number | null = null;
|
||||
|
||||
async onload() {
|
||||
await this.loadSettings();
|
||||
await this.loadMetadata();
|
||||
|
||||
this.addSettingTab(new GitHubSyncSettingsTab(this.app, this));
|
||||
|
||||
console.log("GitHubSyncPlugin loaded");
|
||||
this.client = new GithubClient(
|
||||
this.app.vault,
|
||||
this.metadataStore,
|
||||
this.settings.githubToken,
|
||||
);
|
||||
|
||||
this.app.workspace.onLayoutReady(async () => {
|
||||
// Create the events handling only after tha layout is ready to avoid
|
||||
// getting spammed with create events.
|
||||
// See the official Obsidian docs:
|
||||
// https://docs.obsidian.md/Reference/TypeScript+API/Vault/on('create')
|
||||
await this.startEventsHandlers();
|
||||
});
|
||||
|
||||
this.addCommand({
|
||||
id: "github-sync-modified-files",
|
||||
name: "Sync modified files to GitHub",
|
||||
repeatable: false,
|
||||
icon: "arrow-up",
|
||||
callback: () => this.syncModifiedFiles(),
|
||||
});
|
||||
|
||||
// this.addCommand({
|
||||
// id: "github-sync-all-files",
|
||||
// name: "Sync all files to GitHub",
|
||||
// repeatable: false,
|
||||
// icon: "arrow-up-from-line",
|
||||
// callback: () => {},
|
||||
// });
|
||||
|
||||
this.addRibbonIcon("arrow-down-from-line", "Download all", async () => {
|
||||
await this.client.downloadRepoContent(
|
||||
this.settings.githubOwner,
|
||||
this.settings.githubRepo,
|
||||
this.settings.repoContentDir,
|
||||
this.settings.githubBranch,
|
||||
this.settings.localContentDir,
|
||||
);
|
||||
});
|
||||
// this.addRibbonIcon("arrow-up-from-line", "Upload all", async () => {
|
||||
// const activeFile = this.app.workspace.getActiveFile();
|
||||
// if (!activeFile) {
|
||||
// return;
|
||||
// }
|
||||
// client.uploadFile(
|
||||
// this.settings.githubOwner,
|
||||
// this.settings.githubRepo,
|
||||
// this.settings.githubBranch,
|
||||
// activeFile.path,
|
||||
// );
|
||||
// });
|
||||
}
|
||||
|
||||
async onunload() {
|
||||
console.log("GitHubSyncPlugin unloaded");
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a new sync interval.
|
||||
* Raises an error if the interval is already running.
|
||||
*/
|
||||
startSyncInterval() {
|
||||
if (this.syncIntervalId) {
|
||||
throw new Error("Sync interval is already running");
|
||||
}
|
||||
this.syncIntervalId = window.setInterval(
|
||||
() => this.syncModifiedFiles(),
|
||||
// Sync interval is set in minutes but setInterval expects milliseconds
|
||||
this.settings.syncInterval * 60 * 1000,
|
||||
);
|
||||
this.registerInterval(this.syncIntervalId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stops the currently running sync interval
|
||||
*/
|
||||
stopSyncInterval() {
|
||||
if (this.syncIntervalId) {
|
||||
window.clearInterval(this.syncIntervalId);
|
||||
this.syncIntervalId = null;
|
||||
}
|
||||
}
|
||||
|
||||
private async syncModifiedFiles() {
|
||||
await Promise.all(
|
||||
this.eventsListener.flush().map(async (event: Event) => {
|
||||
await this.eventsConsumer.process(event);
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Util function that stops and restart the sync interval
|
||||
*/
|
||||
restartSyncInterval() {
|
||||
this.stopSyncInterval();
|
||||
this.startSyncInterval();
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts events listener and consumer.
|
||||
* If the sync strategy is set to "interval", starts the sync interval.
|
||||
*/
|
||||
private async startEventsHandlers() {
|
||||
if (this.eventsListener && this.eventsConsumer) {
|
||||
// They've been already started
|
||||
return;
|
||||
}
|
||||
this.eventsListener = new EventsListener(
|
||||
this.app.vault,
|
||||
this.metadataStore,
|
||||
this.settings.localContentDir,
|
||||
this.settings.repoContentDir,
|
||||
);
|
||||
this.eventsConsumer = new EventsConsumer(
|
||||
this.client,
|
||||
this.metadataStore,
|
||||
this.settings.githubOwner,
|
||||
this.settings.githubRepo,
|
||||
this.settings.githubBranch,
|
||||
);
|
||||
if (this.settings.syncStrategy == "interval") {
|
||||
this.restartSyncInterval();
|
||||
}
|
||||
}
|
||||
|
||||
private async loadMetadata() {
|
||||
this.metadataStore = new MetadataStore(this.app.vault);
|
||||
await this.metadataStore.load();
|
||||
}
|
||||
|
||||
async loadSettings() {
|
||||
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -143,6 +143,8 @@ export default class GitHubSyncSettingsTab extends PluginSettingTab {
|
|||
.onChange(async (value) => {
|
||||
this.plugin.settings.syncInterval = parseInt(value) || 1;
|
||||
await this.plugin.saveSettings();
|
||||
// We need to restart the interval if the value is changed
|
||||
this.plugin.restartSyncInterval();
|
||||
}),
|
||||
);
|
||||
intervalSettings.setDisabled(
|
||||
|
|
@ -157,6 +159,11 @@ export default class GitHubSyncSettingsTab extends PluginSettingTab {
|
|||
intervalSettings.setDisabled(value !== "interval");
|
||||
this.plugin.settings.syncStrategy = value;
|
||||
await this.plugin.saveSettings();
|
||||
if (value === "interval") {
|
||||
this.plugin.startSyncInterval();
|
||||
} else {
|
||||
this.plugin.stopSyncInterval();
|
||||
}
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue