diff --git a/Cargo.lock b/Cargo.lock index 066dc27..ebd6ccc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,6 +29,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" + [[package]] name = "aho-corasick" version = "0.7.18" @@ -217,6 +223,25 @@ dependencies = [ "phf_codegen", ] +[[package]] +name = "config" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54ad70579325f1a38ea4c13412b82241c5900700a69785d73e2736bd65a33f86" +dependencies = [ + "async-trait", + "json5", + "lazy_static", + "nom", + "pathdiff", + "ron", + "rust-ini", + "serde", + "serde_json", + "toml", + "yaml-rust", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -273,6 +298,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "dlv-list" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68df3f2b690c1b86e65ef7830956aededf3cb0a16f898f79b9a6f421a7b6211b" +dependencies = [ + "rand", +] + [[package]] name = "encoding_rs" version = "0.8.30" @@ -461,6 +495,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.11.2" @@ -619,7 +662,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.11.2", ] [[package]] @@ -664,6 +707,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -739,6 +793,12 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -790,6 +850,16 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "ntapi" version = "0.3.7" @@ -873,6 +943,16 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "ordered-multimap" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c672c7ad9ec066e428c00eb917124a06f08db19e2584de982cc34b1f4c12485" +dependencies = [ + "dlv-list", + "hashbrown 0.9.1", +] + [[package]] name = "parking_lot" version = "0.12.0" @@ -905,6 +985,12 @@ dependencies = [ "regex", ] +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + [[package]] name = "percent-encoding" version = "2.1.0" @@ -1174,6 +1260,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "ron" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b861ecaade43ac97886a512b360d01d66be9f41f3c61088b42cedf92e03d678" +dependencies = [ + "base64", + "bitflags", + "serde", +] + +[[package]] +name = "rust-ini" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63471c4aa97a1cf8332a5f97709a79a4234698de6a1f5087faf66f2dae810e22" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + [[package]] name = "rustls" version = "0.20.4" @@ -1392,12 +1499,14 @@ name = "starchart" version = "0.1.0" dependencies = [ "actix-rt", + "config", "lazy_static", "rand", "reqwest", "serde", "serde_json", "tera", + "tokio", "trust-dns-resolver", "url", ] @@ -1547,6 +1656,15 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + [[package]] name = "tower-service" version = "0.3.1" @@ -1978,3 +2096,12 @@ checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi", ] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/Cargo.toml b/Cargo.toml index 3cdcc8e..9e341ab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,9 +9,11 @@ repository = "https://github.com/forgeflux-org/starchart" version = "0.1.0" [dependencies] actix-rt = "2.7" +config = "0.12.0" lazy_static = "1.4.0" rand = "0.8.5" tera = "1.15" +tokio = { version = "1.17", features = ["fs", "time"] } url = "2.2.2" [dependencies.reqwest] diff --git a/src/gitea.rs b/src/gitea.rs new file mode 100644 index 0000000..ae645a9 --- /dev/null +++ b/src/gitea.rs @@ -0,0 +1,166 @@ +/* + * ForgeFlux StarChart - A federated software forge spider + * Copyright © 2usize22 Aravinth Manivannan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +use std::collections::HashMap; + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct SearchResults { + pub ok: bool, + pub data: Vec, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct User { + pub id: usize, + pub login: String, + pub full_name: String, + pub email: String, + pub avatar_url: String, + pub language: String, + pub is_admin: bool, + pub last_login: String, + pub created: String, + pub restricted: bool, + pub active: bool, + pub prohibit_login: bool, + pub location: String, + pub website: String, + pub description: String, + pub visibility: String, + pub followers_count: usize, + pub following_count: usize, + pub starred_repos_count: usize, + pub username: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Repository { + pub name: String, + pub full_name: String, + pub description: String, + pub empty: bool, + pub private: bool, + pub fork: bool, + pub template: bool, + pub parent: Option>, + pub mirror: bool, + pub size: usize, + pub html_url: String, + pub ssh_url: String, + pub clone_url: String, + pub original_url: String, + pub website: String, + pub stars_count: usize, + pub forks_count: usize, + pub watchers_count: usize, + pub open_issues_count: usize, + pub open_pr_counter: usize, + pub release_counter: usize, + pub default_branch: String, + pub archived: bool, + pub created_at: String, + pub updated_at: String, + pub internal_tracker: InternalIssueTracker, + pub has_issues: bool, + pub has_wiki: bool, + pub has_pull_requests: bool, + pub has_projects: bool, + pub ignore_whitespace_conflicts: bool, + pub allow_merge_commits: bool, + pub allow_rebase: bool, + pub allow_rebase_explicit: bool, + pub allow_squash_merge: bool, + pub default_merge_style: String, + pub avatar_url: String, + pub internal: bool, + pub mirror_interval: String, + pub mirror_updated: String, + pub repo_transfer: Option, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct InternalIssueTracker { + pub enable_time_tracker: bool, + pub allow_only_contributors_to_track_time: bool, + pub enable_issue_dependencies: bool, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct RepoTransfer { + pub doer: User, + pub recipient: User, + pub teams: Option, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Organization { + pub avatar_url: String, + pub description: String, + pub full_name: String, + pub id: u64, + pub location: String, + pub repo_admin_change_team_access: bool, + pub username: String, + pub visibility: String, + pub website: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum Permission { + None, + Read, + Write, + Admin, + Owner, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Team { + pub can_create_org_repo: bool, + pub description: String, + pub id: u64, + pub includes_all_repositories: bool, + pub name: String, + pub organization: Organization, + pub permission: Permission, + pub units: Vec, + pub units_map: HashMap, +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::fs; + + #[test] + /// Tests if Gitea responses panic when deserialized with serde into structs defined in this + /// module/file. Since Go doesn't have abilities to describe nullable values, I(@realaravinth) + /// am forced to do this as I my knowledge about Gitea codebase is very limited. + fn schema_doesnt_panic() { + let files = ["./tests/schema/gitea/git.batsense.net.json"]; + for file in files.iter() { + let contents = fs::read_to_string(file).unwrap(); + for line in contents.lines() { + let _: SearchResults = serde_json::from_str(line).expect("Gitea schema paniced"); + } + } + } +} diff --git a/src/main.rs b/src/main.rs index 955b2a8..91414f9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,12 +15,13 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +pub mod gitea; pub mod utils; pub mod verify; pub const VERSION: &str = env!("CARGO_PKG_VERSION"); pub const PKG_NAME: &str = env!("CARGO_PKG_NAME"); -pub const DOMAIN: &str = "todo.example.forgeflux.org"; +pub const DOMAIN: &str = "developer-starchart.forgeflux.org"; #[actix_rt::main] async fn main() {} diff --git a/tests/schema/gitea/git.batsense.net.json b/tests/schema/gitea/git.batsense.net.json new file mode 100644 index 0000000..f42b562 --- /dev/null +++ b/tests/schema/gitea/git.batsense.net.json @@ -0,0 +1,2 @@ +{"ok":true,"data":[{"id":5,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"analysis-of-captcha-systems","full_name":"realaravinth/analysis-of-captcha-systems","description":"","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":109,"html_url":"https://git.batsense.net/realaravinth/analysis-of-captcha-systems","ssh_url":"git@git.batsense.net:realaravinth/analysis-of-captcha-systems.git","clone_url":"https://git.batsense.net/realaravinth/analysis-of-captcha-systems.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-09-20T15:50:21+05:30","updated_at":"2021-09-21T18:06:09+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":32,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"fediparty-wiki","full_name":"realaravinth/fediparty-wiki","description":"","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":435,"html_url":"https://git.batsense.net/realaravinth/fediparty-wiki","ssh_url":"git@git.batsense.net:realaravinth/fediparty-wiki.git","clone_url":"https://git.batsense.net/realaravinth/fediparty-wiki.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-01-13T13:10:42+05:30","updated_at":"2022-01-13T13:11:24+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":26,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"ff-spec","full_name":"realaravinth/ff-spec","description":"notes, spec and all things forged fed","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":true,"size":142,"html_url":"https://git.batsense.net/realaravinth/ff-spec","ssh_url":"git@git.batsense.net:realaravinth/ff-spec.git","clone_url":"https://git.batsense.net/realaravinth/ff-spec.git","original_url":"https://github.com/forgefedv2/spec","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-01-01T17:50:17+05:30","updated_at":"2022-01-19T18:38:20+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"8h0m0s","mirror_updated":"2022-04-02T15:42:42+05:30","repo_transfer":null},{"id":18,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"fork-ex","full_name":"realaravinth/fork-ex","description":"","empty":true,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":80,"html_url":"https://git.batsense.net/realaravinth/fork-ex","ssh_url":"git@git.batsense.net:realaravinth/fork-ex.git","clone_url":"https://git.batsense.net/realaravinth/fork-ex.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-12-21T14:53:38+05:30","updated_at":"2021-12-21T14:53:38+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":22,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"fork-ex2","full_name":"realaravinth/fork-ex2","description":"","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":19,"owner":{"id":2,"login":"bot","full_name":"","email":"bot@batsense.net","avatar_url":"https://git.batsense.net/avatar/a4edc8a838d6e28ddc38ab12aeb9d9cd","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-29T15:18:42+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"bot"},"name":"fork-ex","full_name":"bot/fork-ex","description":"","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":89,"html_url":"https://git.batsense.net/bot/fork-ex","ssh_url":"git@git.batsense.net:bot/fork-ex.git","clone_url":"https://git.batsense.net/bot/fork-ex.git","original_url":"","website":"","stars_count":0,"forks_count":1,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-12-21T14:56:50+05:30","updated_at":"2021-12-21T14:56:53+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},"mirror":false,"size":89,"html_url":"https://git.batsense.net/realaravinth/fork-ex2","ssh_url":"git@git.batsense.net:realaravinth/fork-ex2.git","clone_url":"https://git.batsense.net/realaravinth/fork-ex2.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-12-22T16:58:46+05:30","updated_at":"2021-12-22T16:58:46+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":6,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"git-sandbox","full_name":"realaravinth/git-sandbox","description":"","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":103,"html_url":"https://git.batsense.net/realaravinth/git-sandbox","ssh_url":"git@git.batsense.net:realaravinth/git-sandbox.git","clone_url":"https://git.batsense.net/realaravinth/git-sandbox.git","original_url":"","website":"","stars_count":0,"forks_count":1,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-09-29T13:09:42+05:30","updated_at":"2021-09-29T18:14:27+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":42,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"hostea-organization","full_name":"realaravinth/hostea-organization","description":"Organization of the hostea project","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":41,"owner":{"id":5,"login":"Hostea","full_name":"","email":"","avatar_url":"https://git.batsense.net/avatars/fbade9e36a3f36d3d676c1b808451dd7","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2022-03-14T23:24:35+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://pad.batsense.net/wiEY8U7pSpCuZLz7gZVJoQ?view#","description":"Managed Gitea Hosting\r\n\r\npreviously: Project Z and Gitea managed hosting","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Hostea"},"name":"organization","full_name":"Hostea/organization","description":"Organization of the hostea project","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":278,"html_url":"https://git.batsense.net/Hostea/organization","ssh_url":"git@git.batsense.net:Hostea/organization.git","clone_url":"https://git.batsense.net/Hostea/organization.git","original_url":"","website":"","stars_count":0,"forks_count":1,"watchers_count":2,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-03-22T16:55:57+05:30","updated_at":"2022-04-01T22:37:53+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},"mirror":false,"size":194,"html_url":"https://git.batsense.net/realaravinth/hostea-organization","ssh_url":"git@git.batsense.net:realaravinth/hostea-organization.git","clone_url":"https://git.batsense.net/realaravinth/hostea-organization.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-04-01T15:04:14+05:30","updated_at":"2022-04-01T15:04:14+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":35,"owner":{"id":5,"login":"Hostea","full_name":"","email":"","avatar_url":"https://git.batsense.net/avatars/fbade9e36a3f36d3d676c1b808451dd7","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2022-03-14T23:24:35+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://pad.batsense.net/wiEY8U7pSpCuZLz7gZVJoQ?view#","description":"Managed Gitea Hosting\r\n\r\npreviously: Project Z and Gitea managed hosting","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Hostea"},"name":"july-mvp","full_name":"Hostea/july-mvp","description":"100% Free Software Managed Gitea Hosting MVP scheduled for July 2022","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":148,"html_url":"https://git.batsense.net/Hostea/july-mvp","ssh_url":"git@git.batsense.net:Hostea/july-mvp.git","clone_url":"https://git.batsense.net/Hostea/july-mvp.git","original_url":"","website":"","stars_count":2,"forks_count":1,"watchers_count":2,"open_issues_count":28,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-03-14T23:31:53+05:30","updated_at":"2022-03-23T10:55:49+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":41,"owner":{"id":5,"login":"Hostea","full_name":"","email":"","avatar_url":"https://git.batsense.net/avatars/fbade9e36a3f36d3d676c1b808451dd7","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2022-03-14T23:24:35+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://pad.batsense.net/wiEY8U7pSpCuZLz7gZVJoQ?view#","description":"Managed Gitea Hosting\r\n\r\npreviously: Project Z and Gitea managed hosting","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Hostea"},"name":"organization","full_name":"Hostea/organization","description":"Organization of the hostea project","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":278,"html_url":"https://git.batsense.net/Hostea/organization","ssh_url":"git@git.batsense.net:Hostea/organization.git","clone_url":"https://git.batsense.net/Hostea/organization.git","original_url":"","website":"","stars_count":0,"forks_count":1,"watchers_count":2,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-03-22T16:55:57+05:30","updated_at":"2022-04-01T22:37:53+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":37,"owner":{"id":5,"login":"Hostea","full_name":"","email":"","avatar_url":"https://git.batsense.net/avatars/fbade9e36a3f36d3d676c1b808451dd7","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2022-03-14T23:24:35+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://pad.batsense.net/wiEY8U7pSpCuZLz7gZVJoQ?view#","description":"Managed Gitea Hosting\r\n\r\npreviously: Project Z and Gitea managed hosting","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Hostea"},"name":"payments","full_name":"Hostea/payments","description":"","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":148,"html_url":"https://git.batsense.net/Hostea/payments","ssh_url":"git@git.batsense.net:Hostea/payments.git","clone_url":"https://git.batsense.net/Hostea/payments.git","original_url":"","website":"","stars_count":1,"forks_count":0,"watchers_count":2,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-03-16T15:12:05+05:30","updated_at":"2022-03-19T20:54:23+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":34,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"rust-async","full_name":"realaravinth/rust-async","description":"","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":88,"html_url":"https://git.batsense.net/realaravinth/rust-async","ssh_url":"git@git.batsense.net:realaravinth/rust-async.git","clone_url":"https://git.batsense.net/realaravinth/rust-async.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-02-24T22:06:00+05:30","updated_at":"2022-02-24T23:04:57+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":15,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"testing","full_name":"realaravinth/testing","description":"test-description","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":93,"html_url":"https://git.batsense.net/realaravinth/testing","ssh_url":"git@git.batsense.net:realaravinth/testing.git","clone_url":"https://git.batsense.net/realaravinth/testing.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":1,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-12-21T11:37:55+05:30","updated_at":"2022-03-19T18:41:16+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":10,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"tmp","full_name":"realaravinth/tmp","description":"test repo","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":417,"html_url":"https://git.batsense.net/realaravinth/tmp","ssh_url":"git@git.batsense.net:realaravinth/tmp.git","clone_url":"https://git.batsense.net/realaravinth/tmp.git","original_url":"","website":"","stars_count":0,"forks_count":1,"watchers_count":2,"open_issues_count":3,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-10-23T10:08:50+05:30","updated_at":"2021-11-28T14:30:49+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":13,"owner":{"id":1,"login":"realaravinth","full_name":"Aravinth Manivannan","email":"realaravinth@batsense.net","avatar_url":"https://git.batsense.net/avatars/bc11e95d9356ac4bdc035964be00ff0d","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-10T18:44:04+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"Internet","website":"https://batsense.net","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":2,"username":"realaravinth"},"name":"tmp22","full_name":"realaravinth/tmp22","description":"lib created","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":11,"owner":{"id":2,"login":"bot","full_name":"","email":"bot@batsense.net","avatar_url":"https://git.batsense.net/avatar/a4edc8a838d6e28ddc38ab12aeb9d9cd","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2021-09-29T15:18:42+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"bot"},"name":"tmp2","full_name":"bot/tmp2","description":"https://git.batsense.net/bot/tmp2","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":418,"html_url":"https://git.batsense.net/bot/tmp2","ssh_url":"git@git.batsense.net:bot/tmp2.git","clone_url":"https://git.batsense.net/bot/tmp2.git","original_url":"","website":"","stars_count":0,"forks_count":1,"watchers_count":1,"open_issues_count":3,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-10-23T16:56:59+05:30","updated_at":"2022-01-01T13:28:38+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},"mirror":false,"size":430,"html_url":"https://git.batsense.net/realaravinth/tmp22","ssh_url":"git@git.batsense.net:realaravinth/tmp22.git","clone_url":"https://git.batsense.net/realaravinth/tmp22.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2021-10-23T18:32:21+05:30","updated_at":"2021-10-23T18:32:21+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null},{"id":38,"owner":{"id":5,"login":"Hostea","full_name":"","email":"","avatar_url":"https://git.batsense.net/avatars/fbade9e36a3f36d3d676c1b808451dd7","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2022-03-14T23:24:35+05:30","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://pad.batsense.net/wiEY8U7pSpCuZLz7gZVJoQ?view#","description":"Managed Gitea Hosting\r\n\r\npreviously: Project Z and Gitea managed hosting","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Hostea"},"name":"user-research","full_name":"Hostea/user-research","description":"User Research https://jdittrich.github.io/userNeedResearchBook/","empty":true,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":80,"html_url":"https://git.batsense.net/Hostea/user-research","ssh_url":"git@git.batsense.net:Hostea/user-research.git","clone_url":"https://git.batsense.net/Hostea/user-research.git","original_url":"","website":"","stars_count":2,"forks_count":0,"watchers_count":2,"open_issues_count":6,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2022-03-19T12:46:53+05:30","updated_at":"2022-03-19T12:46:54+05:30","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":false,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"default_merge_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null}]} +{"ok":true,"data":[]}