From 236b3095f4167ac3123770718f81f2fc24cf3335 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Fri, 9 Feb 2024 09:27:43 +0100 Subject: [PATCH] octokit dgitprovider --- apps/remix-ide/src/app/files/dgitProvider.ts | 140 ++++++++++++++++++- 1 file changed, 139 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/files/dgitProvider.ts b/apps/remix-ide/src/app/files/dgitProvider.ts index b741860cdb..d62fc2b018 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.ts +++ b/apps/remix-ide/src/app/files/dgitProvider.ts @@ -15,6 +15,8 @@ import path from 'path' import FormData from 'form-data' import axios from 'axios' import {Registry} from '@remix-project/remix-lib' +import { Octokit, App } from "octokit"; +import { commitChange, GitHubUser, RateLimit } from '@remix-ui/git' const profile = { name: 'dGitProvider', @@ -22,7 +24,8 @@ const profile = { description: 'Decentralized git provider', icon: 'assets/img/fileManager.webp', version: '0.0.1', - methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'reset', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'version', 'updateSubmodules'], + methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'reset', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'version', 'updateSubmodules' + , 'getGitHubUser', 'remotebranches', 'remotecommits', 'repositories', 'getCommitChanges'], kind: 'file-system' } class DGitProvider extends Plugin { @@ -233,6 +236,60 @@ class DGitProvider extends Plugin { return status } + async getCommitChanges(commitHash1, commitHash2): Promise { + //console.log([git.TREE({ ref: commitHash1 }), git.TREE({ ref: commitHash2 })]) + const result: commitChange[] = await git.walk({ + ...await this.getGitConfig(), + trees: [git.TREE({ ref: commitHash1 }), git.TREE({ ref: commitHash2 })], + map: async function (filepath, [A, B]) { + // ignore directories + + //console.log(filepath, A, B) + + if (filepath === '.') { + return + } + try { + if ((A && await A.type()) === 'tree' || B && (await B.type()) === 'tree') { + return + } + } catch (e) { + // ignore + } + + // generate ids + const Aoid = A && await A.oid() || undefined + const Boid = B && await B.oid() || undefined + + const commitChange: Partial = { + hashModified: commitHash1, + hashOriginal: commitHash2, + path: filepath, + } + + // determine modification type + if (Aoid !== Boid) { + commitChange.type = "modified" + } + if (Aoid === undefined) { + commitChange.type = "deleted" + } + if (Boid === undefined) { + commitChange.type = "added" + } + if (Aoid === undefined && Boid === undefined) { + commitChange.type = "unknown" + } + if (commitChange.type) + return commitChange + else + return undefined + }, + }) + //console.log(result) + return result + } + async remotes(config) { if ((Registry.getInstance().get('platform').api.isDesktop())) { return await this.call('isogit', 'remotes', config) @@ -939,6 +996,87 @@ class DGitProvider extends Plugin { } return result } + + // OCTOKIT FEATURES + + async remotebranches(input: { owner: string, repo: string, token: string }) { + console.log(input) + + const octokit = new Octokit({ + auth: input.token + }) + + const data = await octokit.request('GET /repos/{owner}/{repo}/branches{?protected,per_page,page}', { + owner: input.owner, + repo: input.repo, + per_page: 100 + }) + console.log(data) + return data.data + } + + async getGitHubUser(input: { token: string }): Promise<{ + user: GitHubUser, + ratelimit: RateLimit + }> { + const octokit = new Octokit({ + auth: input.token + }) + + const ratelimit = await octokit.request('GET /rate_limit', { + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }) + // epoch timestamp to local date time + const localResetTime = ratelimit.data.rate.reset * 1000 + const localResetTimeString = new Date(localResetTime).toLocaleString() + + + console.log('rate limit', localResetTimeString) + + const user = await octokit.request('GET /user') + + return { + user: user.data, + ratelimit: ratelimit.data + } + } + + async remotecommits(input: { owner: string, repo: string, token: string, branch: string, length: number }): Promise { + const octokit = new Octokit({ + auth: input.token + }) + + const data = await octokit.request('GET /repos/{owner}/{repo}/commits', { + owner: input.owner, + repo: input.repo, + sha: input.branch, + per_page: input.length + }) + + + return data.data + } + + async repositories(input: { token: string }) { + const octokit = new Octokit({ + auth: input.token + }) + + const data = await octokit.request('GET /user/repos{?visibility,affiliation,type,sort,direction,per_page,page,since,before}', { + sort: "pushed", + direction: "desc", + per_page: 100, + affiliation: "owner,collaborator" + }) + + + octokit + + return data.data + } + } const addSlash = (file) => {