Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c494891

Browse filesBrowse files
Add support for deleting files from tree (hub4j#1678)
* issue hub4j#1484: Add support for deleting files from tree * Reorder GHTreeBuilder.delete method definition * Hardcode mode value for deletion * Add missing javadoc * Update src/main/java/org/kohsuke/github/GHTreeBuilder.java * Update src/main/java/org/kohsuke/github/GHTreeBuilder.java * Update src/main/java/org/kohsuke/github/GHTreeBuilder.java --------- Co-authored-by: Liam Newman <bitwiseman@gmail.com>
1 parent 8e73065 commit c494891
Copy full SHA for c494891

File tree

Expand file treeCollapse file tree

39 files changed

+1711
-1
lines changed
Filter options
Expand file treeCollapse file tree

39 files changed

+1711
-1
lines changed

‎src/main/java/org/kohsuke/github/GHTreeBuilder.java

Copy file name to clipboardExpand all lines: src/main/java/org/kohsuke/github/GHTreeBuilder.java
+30-1Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class GHTreeBuilder {
2222
// Issue #636: Create Tree no longer accepts null value in sha field
2323
@JsonInclude(Include.NON_NULL)
2424
@SuppressFBWarnings("URF_UNREAD_FIELD")
25-
private static final class TreeEntry {
25+
private static class TreeEntry {
2626

2727
private final String path;
2828
private final String mode;
@@ -37,6 +37,22 @@ private TreeEntry(String path, String mode, String type) {
3737
}
3838
}
3939

40+
private static class DeleteTreeEntry extends TreeEntry {
41+
/**
42+
* According to reference doc https://docs.github.com/en/rest/git/trees?apiVersion=2022-11-28#create-a-tree: if
43+
* sha value is null then the file will be deleted. That's why in this DTO sha is always {@literal null} and is
44+
* included to json.
45+
*/
46+
@JsonInclude
47+
private final String sha = null;
48+
49+
private DeleteTreeEntry(String path) {
50+
// The `mode` and `type` parameters are required by the API, but their values are ignored during delete.
51+
// Supply reasonable placeholders.
52+
super(path, "100644", "blob");
53+
}
54+
}
55+
4056
/**
4157
* Instantiates a new GH tree builder.
4258
*
@@ -162,6 +178,19 @@ public GHTreeBuilder add(String path, String content, boolean executable) {
162178
return add(path, content.getBytes(StandardCharsets.UTF_8), executable);
163179
}
164180

181+
/**
182+
* Removes an entry with the given path from base tree.
183+
*
184+
* @param path
185+
* the file path in the tree
186+
* @return this GHTreeBuilder
187+
*/
188+
public GHTreeBuilder delete(String path) {
189+
TreeEntry entry = new DeleteTreeEntry(path);
190+
treeEntries.add(entry);
191+
return this;
192+
}
193+
165194
private String getApiTail() {
166195
return String.format("/repos/%s/%s/git/trees", repo.getOwnerName(), repo.getName());
167196
}

‎src/test/java/org/kohsuke/github/GHTreeBuilderTest.java

Copy file name to clipboardExpand all lines: src/test/java/org/kohsuke/github/GHTreeBuilderTest.java
+40Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,46 @@ public void testAdd() throws Exception {
134134

135135
}
136136

137+
/**
138+
* Test delete.
139+
*
140+
* @throws Exception
141+
* the exception
142+
*/
143+
@Test
144+
public void testDelete() throws Exception {
145+
// add test tree
146+
treeBuilder.add(PATH_README, CONTENT_README, false);
147+
treeBuilder.add(PATH_DATA1, CONTENT_DATA1, false);
148+
149+
GHCommit commit = updateTree();
150+
151+
assertThat(getFileSize(PATH_README), equalTo((long) CONTENT_README.length()));
152+
assertThat(getFileSize(PATH_DATA1), equalTo((long) CONTENT_DATA1.length));
153+
154+
assertThat(commit.getCommitShortInfo().getAuthor().getEmail(), equalTo("author@author.com"));
155+
assertThat(commit.getCommitShortInfo().getCommitter().getEmail(), equalTo("committer@committer.com"));
156+
157+
// remove a file from tree
158+
mainRef = repo.getRef("heads/main");
159+
treeBuilder = repo.createTree().baseTree(commit.getTree().getSha());
160+
treeBuilder.delete(PATH_DATA1);
161+
162+
GHCommit deleteCommit = updateTree();
163+
164+
assertThat(getFileSize(PATH_README), equalTo((long) CONTENT_README.length()));
165+
166+
assertThat(deleteCommit.getCommitShortInfo().getAuthor().getEmail(), equalTo("author@author.com"));
167+
assertThat(deleteCommit.getCommitShortInfo().getCommitter().getEmail(), equalTo("committer@committer.com"));
168+
169+
try {
170+
getFileSize(PATH_DATA1);
171+
fail("File " + PATH_DATA1 + " should not exist");
172+
} catch (IOException e) {
173+
assertThat(e.getMessage(), stringContainsInOrder(PATH_DATA1, "Not Found"));
174+
}
175+
}
176+
137177
private GHCommit updateTree() throws IOException {
138178
String treeSha = treeBuilder.create().getSha();
139179
GHCommit commit = new GHCommitBuilder(repo).message("Add files")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
{
2+
"id": 654900107,
3+
"node_id": "R_kgDOJwj7iw",
4+
"name": "GHTreeBuilderTest",
5+
"full_name": "hub4j-test-org/GHTreeBuilderTest",
6+
"private": true,
7+
"owner": {
8+
"login": "hub4j-test-org",
9+
"id": 1793410,
10+
"node_id": "MDQ6VXNlcjE3OTM0MTA=",
11+
"avatar_url": "https://avatars.githubusercontent.com/u/1793410?v=4",
12+
"gravatar_id": "",
13+
"url": "https://api.github.com/users/hub4j-test-org",
14+
"html_url": "https://github.com/hub4j-test-org",
15+
"followers_url": "https://api.github.com/users/hub4j-test-org/followers",
16+
"following_url": "https://api.github.com/users/hub4j-test-org/following{/other_user}",
17+
"gists_url": "https://api.github.com/users/hub4j-test-org/gists{/gist_id}",
18+
"starred_url": "https://api.github.com/users/hub4j-test-org/starred{/owner}{/repo}",
19+
"subscriptions_url": "https://api.github.com/users/hub4j-test-org/subscriptions",
20+
"organizations_url": "https://api.github.com/users/hub4j-test-org/orgs",
21+
"repos_url": "https://api.github.com/users/hub4j-test-org/repos",
22+
"events_url": "https://api.github.com/users/hub4j-test-org/events{/privacy}",
23+
"received_events_url": "https://api.github.com/users/hub4j-test-org/received_events",
24+
"type": "User",
25+
"site_admin": false
26+
},
27+
"html_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest",
28+
"description": null,
29+
"fork": false,
30+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest",
31+
"forks_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/forks",
32+
"keys_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/keys{/key_id}",
33+
"collaborators_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/collaborators{/collaborator}",
34+
"teams_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/teams",
35+
"hooks_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/hooks",
36+
"issue_events_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/issues/events{/number}",
37+
"events_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/events",
38+
"assignees_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/assignees{/user}",
39+
"branches_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/branches{/branch}",
40+
"tags_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/tags",
41+
"blobs_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/blobs{/sha}",
42+
"git_tags_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/tags{/sha}",
43+
"git_refs_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/refs{/sha}",
44+
"trees_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/trees{/sha}",
45+
"statuses_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/statuses/{sha}",
46+
"languages_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/languages",
47+
"stargazers_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/stargazers",
48+
"contributors_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contributors",
49+
"subscribers_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/subscribers",
50+
"subscription_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/subscription",
51+
"commits_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/commits{/sha}",
52+
"git_commits_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/commits{/sha}",
53+
"comments_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/comments{/number}",
54+
"issue_comment_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/issues/comments{/number}",
55+
"contents_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contents/{+path}",
56+
"compare_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/compare/{base}...{head}",
57+
"merges_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/merges",
58+
"archive_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/{archive_format}{/ref}",
59+
"downloads_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/downloads",
60+
"issues_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/issues{/number}",
61+
"pulls_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/pulls{/number}",
62+
"milestones_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/milestones{/number}",
63+
"notifications_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/notifications{?since,all,participating}",
64+
"labels_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/labels{/name}",
65+
"releases_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/releases{/id}",
66+
"deployments_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/deployments",
67+
"created_at": "2023-06-17T09:21:30Z",
68+
"updated_at": "2023-06-17T09:21:30Z",
69+
"pushed_at": "2023-06-20T05:28:20Z",
70+
"git_url": "git://github.com/hub4j-test-org/GHTreeBuilderTest.git",
71+
"ssh_url": "git@github.com:hub4j-test-org/GHTreeBuilderTest.git",
72+
"clone_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest.git",
73+
"svn_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest",
74+
"homepage": null,
75+
"size": 4,
76+
"stargazers_count": 0,
77+
"watchers_count": 0,
78+
"language": null,
79+
"has_issues": true,
80+
"has_projects": true,
81+
"has_downloads": true,
82+
"has_wiki": false,
83+
"has_pages": false,
84+
"has_discussions": false,
85+
"forks_count": 0,
86+
"mirror_url": null,
87+
"archived": false,
88+
"disabled": false,
89+
"open_issues_count": 0,
90+
"license": null,
91+
"allow_forking": true,
92+
"is_template": false,
93+
"web_commit_signoff_required": false,
94+
"topics": [],
95+
"visibility": "private",
96+
"forks": 0,
97+
"open_issues": 0,
98+
"watchers": 0,
99+
"default_branch": "main",
100+
"permissions": {
101+
"admin": true,
102+
"maintain": true,
103+
"push": true,
104+
"triage": true,
105+
"pull": true
106+
},
107+
"temp_clone_token": "AANV3AUXZXCI3AHCWHMMVFLESE5DS",
108+
"allow_squash_merge": true,
109+
"allow_merge_commit": true,
110+
"allow_rebase_merge": true,
111+
"allow_auto_merge": false,
112+
"delete_branch_on_merge": false,
113+
"allow_update_branch": false,
114+
"use_squash_pr_title_as_default": false,
115+
"squash_merge_commit_message": "COMMIT_MESSAGES",
116+
"squash_merge_commit_title": "COMMIT_OR_PR_TITLE",
117+
"merge_commit_message": "PR_TITLE",
118+
"merge_commit_title": "MERGE_MESSAGE",
119+
"network_count": 0,
120+
"subscribers_count": 1
121+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{
2+
"sha": "7e888a1cd95c3caf31a16ff21751a06a7feb039f",
3+
"node_id": "MDY6Q29tbWl0NjU0OTAwMTA3OjdlODg4YTFjZDk1YzNjYWYzMWExNmZmMjE3NTFhMDZhN2ZlYjAzOWY=",
4+
"commit": {
5+
"author": {
6+
"name": "author",
7+
"email": "author@author.com",
8+
"date": "2021-01-23T20:20:25Z"
9+
},
10+
"committer": {
11+
"name": "committer",
12+
"email": "committer@committer.com",
13+
"date": "2021-01-23T20:20:25Z"
14+
},
15+
"message": "Add files",
16+
"tree": {
17+
"sha": "0efbfcf79def8e437d825e0116def4be6be56026",
18+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/trees/0efbfcf79def8e437d825e0116def4be6be56026"
19+
},
20+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/commits/7e888a1cd95c3caf31a16ff21751a06a7feb039f",
21+
"comment_count": 0,
22+
"verification": {
23+
"verified": false,
24+
"reason": "unsigned",
25+
"signature": null,
26+
"payload": null
27+
}
28+
},
29+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/commits/7e888a1cd95c3caf31a16ff21751a06a7feb039f",
30+
"html_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/commit/7e888a1cd95c3caf31a16ff21751a06a7feb039f",
31+
"comments_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/commits/7e888a1cd95c3caf31a16ff21751a06a7feb039f/comments",
32+
"author": null,
33+
"committer": null,
34+
"parents": [
35+
{
36+
"sha": "172349212fb19ffa4f33dcced3263c6963dc750a",
37+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/commits/172349212fb19ffa4f33dcced3263c6963dc750a",
38+
"html_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/commit/172349212fb19ffa4f33dcced3263c6963dc750a"
39+
}
40+
],
41+
"stats": {
42+
"total": 2,
43+
"additions": 2,
44+
"deletions": 0
45+
},
46+
"files": [
47+
{
48+
"sha": "aed2973e4b8a7ff1b30ff5c4751e5a2b38989e74",
49+
"filename": "data/val1.dat",
50+
"status": "added",
51+
"additions": 1,
52+
"deletions": 0,
53+
"changes": 1,
54+
"blob_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/blob/7e888a1cd95c3caf31a16ff21751a06a7feb039f/data%2Fval1.dat",
55+
"raw_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/raw/7e888a1cd95c3caf31a16ff21751a06a7feb039f/data%2Fval1.dat",
56+
"contents_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contents/data%2Fval1.dat?ref=7e888a1cd95c3caf31a16ff21751a06a7feb039f",
57+
"patch": "@@ -0,0 +1 @@\n+\u0001\u0002\u0003\n\\ No newline at end of file"
58+
},
59+
{
60+
"sha": "fbbc875b17d1e17da06b4ee8fda46e2596c41f3c",
61+
"filename": "doc/readme.txt",
62+
"status": "added",
63+
"additions": 1,
64+
"deletions": 0,
65+
"changes": 1,
66+
"blob_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/blob/7e888a1cd95c3caf31a16ff21751a06a7feb039f/doc%2Freadme.txt",
67+
"raw_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/raw/7e888a1cd95c3caf31a16ff21751a06a7feb039f/doc%2Freadme.txt",
68+
"contents_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contents/doc%2Freadme.txt?ref=7e888a1cd95c3caf31a16ff21751a06a7feb039f",
69+
"patch": "@@ -0,0 +1 @@\n+Thanks for using our application!"
70+
}
71+
]
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"sha": "7f9b11d9512f639acc6d48439621026cf8410f3a",
3+
"node_id": "MDY6Q29tbWl0NjU0OTAwMTA3OjdmOWIxMWQ5NTEyZjYzOWFjYzZkNDg0Mzk2MjEwMjZjZjg0MTBmM2E=",
4+
"commit": {
5+
"author": {
6+
"name": "author",
7+
"email": "author@author.com",
8+
"date": "2021-01-23T20:20:25Z"
9+
},
10+
"committer": {
11+
"name": "committer",
12+
"email": "committer@committer.com",
13+
"date": "2021-01-23T20:20:25Z"
14+
},
15+
"message": "Add files",
16+
"tree": {
17+
"sha": "f9a619cb835ac407e0a464618fc59386be70bd63",
18+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/trees/f9a619cb835ac407e0a464618fc59386be70bd63"
19+
},
20+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/commits/7f9b11d9512f639acc6d48439621026cf8410f3a",
21+
"comment_count": 0,
22+
"verification": {
23+
"verified": false,
24+
"reason": "unsigned",
25+
"signature": null,
26+
"payload": null
27+
}
28+
},
29+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/commits/7f9b11d9512f639acc6d48439621026cf8410f3a",
30+
"html_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/commit/7f9b11d9512f639acc6d48439621026cf8410f3a",
31+
"comments_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/commits/7f9b11d9512f639acc6d48439621026cf8410f3a/comments",
32+
"author": null,
33+
"committer": null,
34+
"parents": [
35+
{
36+
"sha": "7e888a1cd95c3caf31a16ff21751a06a7feb039f",
37+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/commits/7e888a1cd95c3caf31a16ff21751a06a7feb039f",
38+
"html_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/commit/7e888a1cd95c3caf31a16ff21751a06a7feb039f"
39+
}
40+
],
41+
"stats": {
42+
"total": 1,
43+
"additions": 0,
44+
"deletions": 1
45+
},
46+
"files": [
47+
{
48+
"sha": "aed2973e4b8a7ff1b30ff5c4751e5a2b38989e74",
49+
"filename": "data/val1.dat",
50+
"status": "removed",
51+
"additions": 0,
52+
"deletions": 1,
53+
"changes": 1,
54+
"blob_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/blob/7e888a1cd95c3caf31a16ff21751a06a7feb039f/data%2Fval1.dat",
55+
"raw_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/raw/7e888a1cd95c3caf31a16ff21751a06a7feb039f/data%2Fval1.dat",
56+
"contents_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contents/data%2Fval1.dat?ref=7e888a1cd95c3caf31a16ff21751a06a7feb039f",
57+
"patch": "@@ -1 +0,0 @@\n-\u0001\u0002\u0003\n\\ No newline at end of file"
58+
}
59+
]
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "val1.dat",
3+
"path": "data/val1.dat",
4+
"sha": "aed2973e4b8a7ff1b30ff5c4751e5a2b38989e74",
5+
"size": 3,
6+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contents/data/val1.dat?ref=main",
7+
"html_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/blob/main/data/val1.dat",
8+
"git_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/blobs/aed2973e4b8a7ff1b30ff5c4751e5a2b38989e74",
9+
"download_url": "https://raw.githubusercontent.com/hub4j-test-org/GHTreeBuilderTest/main/data/val1.dat?token=AANV3AQG25IMIIRS2WYVBALESE4UY",
10+
"type": "file",
11+
"content": "AQID\n",
12+
"encoding": "base64",
13+
"_links": {
14+
"self": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contents/data/val1.dat?ref=main",
15+
"git": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/blobs/aed2973e4b8a7ff1b30ff5c4751e5a2b38989e74",
16+
"html": "https://github.com/hub4j-test-org/GHTreeBuilderTest/blob/main/data/val1.dat"
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"name": "readme.txt",
3+
"path": "doc/readme.txt",
4+
"sha": "fbbc875b17d1e17da06b4ee8fda46e2596c41f3c",
5+
"size": 34,
6+
"url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contents/doc/readme.txt?ref=main",
7+
"html_url": "https://github.com/hub4j-test-org/GHTreeBuilderTest/blob/main/doc/readme.txt",
8+
"git_url": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/blobs/fbbc875b17d1e17da06b4ee8fda46e2596c41f3c",
9+
"download_url": "https://raw.githubusercontent.com/hub4j-test-org/GHTreeBuilderTest/main/doc/readme.txt?token=AANV3AUAKUQF4Q66G35XPVLESE4UY",
10+
"type": "file",
11+
"content": "VGhhbmtzIGZvciB1c2luZyBvdXIgYXBwbGljYXRpb24hCg==\n",
12+
"encoding": "base64",
13+
"_links": {
14+
"self": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/contents/doc/readme.txt?ref=main",
15+
"git": "https://api.github.com/repos/hub4j-test-org/GHTreeBuilderTest/git/blobs/fbbc875b17d1e17da06b4ee8fda46e2596c41f3c",
16+
"html": "https://github.com/hub4j-test-org/GHTreeBuilderTest/blob/main/doc/readme.txt"
17+
}
18+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.