{project.name}
@@ -136,7 +152,11 @@
{#if project.head}
- {project.head}
+ {#if compact}
+ {formatCommit(project.head)}
+ {:else}
+ {project.head}
+ {/if}
{:else}
✗ No head
{/if}
@@ -144,36 +164,39 @@
-
-
- {project.urn}
-
-
-
-
-
-
-
-
-
- {#if anchor && project.head}
-
- {/if}
-
-
-
-
- {#await loadCommits() then points}
-
-
+
+ {#if !compact}
+
+
+ {project.urn}
- {/await}
-
+
+
+
+
+
+
+
+
+ {#if anchor && project.head}
+
+ {/if}
+
+
+
+
+ {#await loadCommits() then points}
+
+
+
+ {/await}
+
+ {/if}
diff --git a/src/config.json b/src/config.json
index a1c769f13..c8a605147 100644
--- a/src/config.json
+++ b/src/config.json
@@ -99,6 +99,50 @@
"git": { "port": 443 }
}
},
+ "projects": {
+ "pinned": [
+ {
+ "name": "radicle-cli",
+ "urn": "rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao",
+ "seed": "seed.alt-clients.radicle.xyz"
+ },
+ {
+ "name": "radicle-interface",
+ "urn": "rad:git:hnrkjajuucc6zp5eknt3s9xykqsrus44cjimy",
+ "seed": "seed.alt-clients.radicle.xyz"
+ },
+ {
+ "name": "radicle-client-services",
+ "urn": "rad:git:hnrkk9c4zt9thuxhwi1ukxqcrs5tmhbtcsony",
+ "seed": "seed.alt-clients.radicle.xyz"
+ },
+ {
+ "name": "solmate",
+ "urn": "rad:git:hnrkbgczcfh9ycjtdfynmqyg478bqrso1hnty",
+ "seed": "willow.radicle.garden"
+ },
+ {
+ "name": "openzeppelin-contracts",
+ "urn": "rad:git:hnrkbx9xzjg8tf9hj9uh5qdxwuyjddsxyaw6o",
+ "seed": "willow.radicle.garden"
+ },
+ {
+ "name": "haskell-language-server",
+ "urn": "rad:git:hnrkf1jaje1e93rua64zgphg7zb14qo9zexgy",
+ "seed": "pine.radicle.garden"
+ },
+ {
+ "name": "rx",
+ "urn": "rad:git:hnrk8aoks6w3tdbcwt9dqnor9aqy8tjha3k5o",
+ "seed": "maple.radicle.garden"
+ },
+ {
+ "name": "py_ecc",
+ "urn": "rad:git:hnrkba67x8poqt4d9qgoc4au39ro9dx7pdhfo",
+ "seed": "maple.radicle.garden"
+ }
+ ]
+ },
"ipfs": { "gateway": "https://ipfs.io/ipfs/" },
"abi": {
"registrar": [
diff --git a/src/config.ts b/src/config.ts
index 90f87decc..9c10a7be9 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -35,6 +35,7 @@ export class Config {
reverseRegistrar: { address: string };
orgs: { subgraph: string; contractHash: string; pinned: string[] };
users: { pinned: string[] };
+ projects: { pinned: { urn: string; name: string; seed: string }[] };
seeds: { pinned: Record
};
gasLimits: { createOrg: number };
provider: ethers.providers.JsonRpcProvider;
@@ -120,6 +121,7 @@ export class Config {
this.provider = provider;
this.signer = null;
this.gasLimits = gasLimits;
+ this.projects = config.projects;
this.abi = config.abi;
this.ceramic = {
client: ceramic,
diff --git a/src/project.ts b/src/project.ts
index 6195bd96b..675c7ca20 100644
--- a/src/project.ts
+++ b/src/project.ts
@@ -432,4 +432,20 @@ export class Project implements ProjectInfo {
return new Project(urn, info, seed, peers, remote.heads, profile, anchors);
}
+
+ static async getMulti(projs: { urn: Urn; seed: string }[]): Promise<{ info: ProjectInfo; seed: Host }[]> {
+ const promises = [];
+
+ for (const proj of projs) {
+ const seed = { host: proj.seed, port: null };
+ promises.push(Project.getInfo(proj.urn, seed).then(info => {
+ return { info, seed };
+ }));
+ }
+ const results = await Promise.allSettled(promises);
+ const isFulfilled = (input: PromiseSettledResult):
+ input is PromiseFulfilledResult => input.status === 'fulfilled';
+
+ return results.filter(isFulfilled).map(r => r.value);
+ }
}