From dbf30700d3d93cf3f32353bfb1de94fe57ee3949 Mon Sep 17 00:00:00 2001 From: srirambv Date: Tue, 29 Jun 2021 00:50:37 -0400 Subject: [PATCH 1/2] Add IPFS WikiTemplate & update testscript --- brave_testrun_generator.py | 141 ++++++++++++++++++++++++++++--------- wikitemplate-IPFS.md | 140 ++++++++++++++++++++++++++++++++++++ 2 files changed, 249 insertions(+), 32 deletions(-) create mode 100644 wikitemplate-IPFS.md diff --git a/brave_testrun_generator.py b/brave_testrun_generator.py index cb35720..b0fe343 100755 --- a/brave_testrun_generator.py +++ b/brave_testrun_generator.py @@ -103,17 +103,17 @@ def laptop_testruns(milestonever): "tests" not in label_names): linux_checklist.append(output_line) - print("Release Notes ") + print("\nRelease Notes ") for line in release_notes: print(line) print("") - print("Checklist: ") + print("\nChecklist: ") for line in checklist: print(line) print("") - print("Mac Checklist (Intel):") + print("\nMac Checklist (Intel):") print(laptop_template) print("") macTitle = "Manual test run on macOS (Intel) for " + milestonever @@ -129,7 +129,7 @@ def laptop_testruns(milestonever): milestone=bc_milestone[milestonever], labels=macList) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Mac Checklist (arm64):") print(macOS_arm64) @@ -147,7 +147,7 @@ def laptop_testruns(milestonever): milestone=bc_milestone[milestonever], labels=macarm64List) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Win64 Checklist:") print(laptop_template) @@ -165,7 +165,7 @@ def laptop_testruns(milestonever): milestone=bc_milestone[milestonever], labels=winList) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Linux Checklist:") print(laptop_template) @@ -241,12 +241,12 @@ def laptop_hf_testruns(milestonever): "tests" not in label_names): linux_checklist.append(output_line) - print("Release Notes ") + print("\nRelease Notes ") for line in release_notes: print(line) print("") - print("Mac Checklist (Intel):") + print("\nMac Checklist (Intel):") print(laptop_hf_template) print("") macTitle = "Manual test run on macOS (Intel) for " + milestonever @@ -262,7 +262,7 @@ def laptop_hf_testruns(milestonever): milestone=bc_milestone[milestonever], labels=macList) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Mac Checklist(arm64):") print(macOS_arm64) @@ -280,7 +280,7 @@ def laptop_hf_testruns(milestonever): milestone=bc_milestone[milestonever], labels=macarm64List) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Win64 Checklist:") print(laptop_hf_template) @@ -298,7 +298,7 @@ def laptop_hf_testruns(milestonever): milestone=bc_milestone[milestonever], labels=winList) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Linux Checklist:") print(laptop_hf_template) @@ -379,17 +379,17 @@ def android_testruns(milestonever): "phone-specific" not in label_names): android_tab_checklist.append(output_line) - print("Release Notes:") + print("\nRelease Notes:") for line in release_notes: print(line) print("") - print("Checklist:") + print("\nChecklist:") for line in checklist: print(line) print("") - print("Android ARM Checklist:") + print("\nAndroid ARM Checklist:") print(android_template) print("") AndroidARMtitle = "Manual test run on Android ARM for " + milestonever @@ -405,7 +405,7 @@ def android_testruns(milestonever): milestone=bc_milestone[milestonever], labels=AndroidARMlist) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Android Tab Checklist:") print(android_template) @@ -423,7 +423,7 @@ def android_testruns(milestonever): milestone=bc_milestone[milestonever], labels=AndroidTablist) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Android x86 Checklist:") print(android_x86_template) @@ -504,17 +504,17 @@ def android_hf_testruns(milestonever): "phone-specific" not in label_names): android_tab_checklist.append(output_line) - print("Release Notes:") + print("\nRelease Notes:") for line in release_notes: print(line) print("") - print("Checklist:") + print("\nChecklist:") for line in checklist: print(line) print("") - print("Android ARM Checklist:") + print("\nAndroid ARM Checklist:") print(android_hf_template) print("") AndroidARMtitle = "Manual test run on Android ARM for " + milestonever @@ -530,7 +530,7 @@ def android_hf_testruns(milestonever): milestone=bc_milestone[milestonever], labels=AndroidARMlist) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Android Tab Checklist:") print(android_hf_template) @@ -549,7 +549,7 @@ def android_hf_testruns(milestonever): labels=AndroidTablist) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Android x86 Checklist:") print(android_x86_template) @@ -622,14 +622,14 @@ def iOS_testruns(): "tests" not in label_names): iPhoneX_checklist.append(output_line) - print("Release Notes:") + print("\nRelease Notes:") print(release_notes) for line in release_notes: relline += line +"\n" print(relline) print("") - print("iPad Checklist:") + print("\niPad Checklist:") print(ios_template) print("") iPad_Title = "Manual test run for " + ios_key +\ @@ -645,7 +645,7 @@ def iOS_testruns(): milestone=ios_milestone[ios_key], labels=iPad_List) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("iPhone Checklist:") print(ios_template) @@ -663,7 +663,7 @@ def iOS_testruns(): milestone=ios_milestone[ios_key], labels=iPhone_List) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("iPhone X Checklist:") print(ios_template) @@ -695,7 +695,7 @@ def tor_testruns(tor_rel): linux_tor_wiki = open("wikitemplate-tor-Linux.md", "r") linux_template = linux_tor_wiki.read() - print("Mac Checklist (Intel):") + print("\nMac Checklist (Intel):") print(macOS_intel_template) print("") macTitle = "Manual test run on macOS (Intel) for " + tor_rel @@ -712,7 +712,7 @@ def tor_testruns(tor_rel): milestone=bc_milestone[tor_rel], labels=macList) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Mac Checklist(arm64):") print(macOS_arm64_template) @@ -731,7 +731,7 @@ def tor_testruns(tor_rel): milestone=bc_milestone[tor_rel], labels=macarm64List) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Win64 Checklist:") print(windows_template) @@ -750,7 +750,7 @@ def tor_testruns(tor_rel): milestone=bc_milestone[tor_rel], labels=winList) - print("--------------------------------------------------------") + print("--------------------------------------------------------\n") print("Linux Checklist:") print(linux_template) @@ -771,6 +771,68 @@ def tor_testruns(tor_rel): return 0 +def ipfs_testruns(ipfs_rel): + + ipfs_wiki = open("wikitemplate-IPFS.md", "r") + ipfs_template = ipfs_wiki.read() + + print("\nMac Checklist (Intel/arm64):") + print(ipfs_template) + print("") + macTitle = "Manual test run on macOS (Intel/arm64) for " + ipfs_rel + macList = ["OS/macOS", + "release-notes/exclude", + "tests", + "QA/Yes", + "OS/Desktop", + "feature/ipfs"] + + if args.test is None: + bc_repo.create_issue(title=macTitle, + body=ipfs_template, + milestone=bc_milestone[ipfs_rel], + labels=macList) + + print("--------------------------------------------------------\n") + + print("Win64 Checklist:") + print(ipfs_template) + print("") + winTitle = "Manual test run on Windows x64 & x86 for " + ipfs_rel + winList = ["OS/Windows", + "release-notes/exclude", + "tests", + "QA/Yes", + "OS/Desktop", + "feature/ipfs"] + + if args.test is None: + bc_repo.create_issue(title=winTitle, + body=windows_template, + milestone=bc_milestone[ipfs_rel], + labels=winList) + + print("--------------------------------------------------------\n") + + print("Linux Checklist:") + print(ipfs_template) + print("") + linTitle = "Manual test run on Linux for " + ipfs_rel + linList = ["OS/Linux", + "release-notes/exclude", + "tests", + "QA/Yes", + "OS/Desktop", + "feature/ipfs"] + + if args.test is None: + bc_repo.create_issue(title=linTitle, + body=linux_template, + milestone=bc_milestone[ipfs_rel], + labels=linList) + + return 0 + print("\n#######################################################################" "###################################################") print("\n For Desktop or Android minor CR bump use the HF selection to " @@ -788,7 +850,10 @@ def tor_testruns(tor_rel): print(str(ioslength+1) + ". " + sorted(ios_milestone.keys())[ioslength]) ioslength += 1 -print("\n Note: For Tor Release make sure you type \"Tor\" or \"tor\" instead " +print("\nNOTE:") +print("\n For Tor Release make sure you type \"Tor\" or \"tor\" instead " + "of the number") +print("\n For IPFS Release make sure you type \"IPFS\" or \"ipfs\" instead " "of the number") print("#######################################################################" @@ -803,6 +868,7 @@ def tor_testruns(tor_rel): " Hotfix/minor CR bump)") ios = print("5. iOS Release") tor = print("6. Tor Release") +ipfs = print("7. IPFS Release") select_checklist = input("\nChoose the platform for which you want to" + " generate the test run: ") @@ -835,9 +901,20 @@ def tor_testruns(tor_rel): "and then generate test runs") else: torkey = tormilestone[0] - generate_ios_test = print("\nGenerating test runs for Tor ", - sorted(bc_milestone.keys())[0]) + generate_ios_test = print("\nGenerating test runs for Tor", + (tormilestone)[0]) tor_testruns(torkey) +elif (select_checklist == "IPFS" or select_checklist == "ipfs"): + ipfsmilestone = [i for i in bc_milestone if "IPFS" in i] + if (len(ipfsmilestone) == 0): + ipfskey = "" + print("No IPFS milestone exists. Please create milestone " + "and then generate test runs") + else: + ipfskey = ipfsmilestone[0] + generate_ipfs_test = print("\nGenerating test runs for", + (ipfsmilestone)[0]) + ipfs_testruns(ipfskey) else: print("Incorrect selection. " + select_checklist + " is not a valid input\n") exit() diff --git a/wikitemplate-IPFS.md b/wikitemplate-IPFS.md new file mode 100644 index 0000000..34a4d47 --- /dev/null +++ b/wikitemplate-IPFS.md @@ -0,0 +1,140 @@ +## Installation & Setup + + ### `go-updater` node update + + - [ ] Verify going to `brave://ipfs` and clicking on `Install and start` installs and shows `go-ipfs/0.7.0` (or latest released), via the `Version:` section under `Node info`. + - [ ] Verify, using the above profile, that restarting Brave with `--use-dev-goupdater-url`, and clicking on `Restart` via `brave://ipfs` downloads and installs the latest development candidate. + + ### Config + + - [ ] Verify changing `Maximum IPFS cache size (GB)` on the `brave://settings/ipfs` page (set `Method to resolve IPFS resources` to `Local node` on `brave://settings/ipfs`), the new value is reflected on the diagnostic page (`brave://ipfs`) in the `Repo Stats -> Size` section. + + ### Diagnostic page (`brave://ipfs`) + + - [ ] Verify loading `brave://ipfs` redirects to `brave://ipfs-internals`. + - [ ] Verify, on a clean profile, visiting `brave://ipfs` will present you with an `Install and start` button, which will install and start an IPFS local node. Confirm you see `Node is running` under `IPFS node status`, `Stop`, `Restart`, and `My Node` buttons, and a dynamically updating `Connected peers:` count. + - [ ] Verify that clicking `Stop` resets all statistics, paths, and config information. + - [ ] Verify that clicking `Start` populates all statistics, paths, and config information, and you see `Stop`, `Restart`, and `My Node` buttons, along with a dynamically updating `Connected peers:` count. + - [ ] Verify that clicking `Restart` resets and repopulates all stats, paths, and config information, and you see `Stop`, `Restart`, and `My Node` buttons, along with a dynamically updating `Connected peers:` count. + - [ ] Verify that clicking on `(details)` to the right of `Connected peers:` takes you to the `PEERS` pane of `127.0.0.1:45002/ipfs/bafy..../#/` and you see a global map with a dynamically updating peer count and listing, below. + - [ ] Verify that clicking on `Perform a garbage collection sweep` resets and repopulates the `Objects:` and `Size:` stats beneath `Repo Stats`. + - [ ] Verify that clicking `My Node` takes you to the `Status` pane of the IPFS dashboard, with a URL similar to `127.0.0.1:45002/ipfs/bafy..../#/`, where you see `Connected to IPFS`, MB count of files shared, and dynamically updating peers count, as well as your `PEER ID` and `AGENT`. + +## Import: + +- [ ] Prerequisites: local node launched and local gateway configured. On a new profile, loading `ipns://brantly.eth` and clicking `Use a local node` on the interstitial page will set you up. + + ### Importing a page via IPFS + + - [ ] Verify the IPFS item available in the page context menu. Select `Import to IPFS > This page` and import any page content. Make sure the content is downloaded and imported, the import folder is opened when import completed successfully, the page content can be downloaded. The shareable link is copied to the clipboard. + + ### Importing linked content + + - [ ] Verify the IPFS item available in the linked content context menu. Select `Import to IPFS > Linked content` and import any linked content from any page. Make sure the content is downloaded and imported, the import folder is opened when import completed successfully, the file can be downloaded. The shareable link is copied to the clipboard. + + ### Importing selected audio + + - [ ] Verify the IPFS item available in the audio context menu. Select `Import to IPFS > Selected audio` and import any audio from any page. Make sure the audio is downloaded and imported, the import folder is opened when import completed successfully, the file can be downloaded. The shareable link is copied to the clipboard. + + ### Importing selected image + + - [ ] Verify the IPFS item available in the image context menu. Select an image and choose `Import to IPFS > Selected image` and import any image from any page. Make sure the image is downloaded and imported, the import folder is opened when import completed successfully, the file can be downloaded. The shareable link is copied to the clipboard. + + ### Importing selected text + + - [ ] Verify the IPFS item available in the selected text context menu. Select text and choose `Import Selected Text to IPFS`. Make sure the text is wrapped into a file with id like `file_1.txt` and the imported text is available inside the file. The shareable link is copied to the clipboard. + + ### Importing selected video + + - [ ] Verify the IPFS item available in the video context menu. Select a video and choose `Import to IPFS > Selected video`/ Make sure the video is downloaded and imported, the import folder is opened when import completed successfully, the file can be downloaded. The shareable link is copied to the clipboard. + + ### Sharing a local file using IPFS (without keys) + + - [ ] Verify the IPFS item available in the main app menu. Go to `IPFS -> Share Local File Using IPFS` select and import any local file. Make sure the file is imported, the import folder is opened when import completed successfully, the file can be downloaded and the downloaded one is same as original. The shareable link is copied to the clipboard. + + ### Sharing a local folder using IPFS (without keys) + + - [ ] Verify the IPFS item available in the main app menu. Go to `IPFS -> share Local Folder Using IPFS` select and import any local folder. Make sure the whole folder is imported, the import folder is opened when import completed successfully, files can be downloaded and the downloaded one is same as original. The shareable link is copied to the clipboard. + + ### Automatic redirects (needs fleshing out) + + - [ ] Automatic redirection of IPFS resources to IPFS gateway if option enabled on `brave://settings/ipfs` page + - [ ] Automatic redirect DNSLink to an IPFS version of a website when possible, only if site has header `x-ipfs-path` or DNSLink TXT record if server returned 5xx error + - [ ] Verify IPFS address bar badge is shown for pages with x-ipfs-header and dnslink TXT record for 5xx error code + - [ ] Verify by clicking the `IPFS` badge icon in the address bar on IPFS/IPNS pages it shows valid (green) information about the IPFS resource. + - [ ] Verify, when loading an IPFS/IPNS resources on a new profile (such as `ipns://brantly.eth`), that the interstitial page (`Ask` mode in `brave://settings/ipfs`) gives you two choices: 1) to install a local node (`Use a local node`) or 2) `Use a public gateway` (Android + iOS: public gateway only). + +## DNSLink + +- [ ] Verify that loading `https://dweb.link/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Mars.html` redirects you seamlessly to `https://bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa.ipfs.dweb.link/wiki/Mars.html`, and there's an `Open using IPFS` badge/button in the URL bar. Confirm that clicking `Open using IPFS` goes to `ipfs://bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa/wiki/Mars.html`. +- [ ] Verify that loading `https://ipfs.io/ipns/libp2p.io/` shows an `Open using IPFS` button in the URL bar, and clicking it redirects to `ipns://libp2p.io/`. Confirm it resolves and loads. + +## IPFS Companion + +- [ ] Verify that toggling `IPFS Companion` to `On` via `brave://settings/ipfs` prompts you to install the extension. After clicking `Add extension`, confirm you get a notification that IPFS Companion was added to Brave, and are then taken to the `Set your IPFS preference` interstitial page. +- [ ] Verify that clicking on the puzzle-piece icon on the browser toolbar, then `IPFS Companion`, will load a popup. Click on the gears (settings) icon and confirm it loads the `Companion Preferences` page. + +## IPFS URLs + +- [ ] Ensure each of the following IPFS URLs load over both `Gateway` and `Local node` modes: + - [ ] `ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/wiki/Vincent_van_Gogh.html` + - [ ] `ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi/` + - [ ] `ipfs://QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Tokyo_National_Museum.html` + - [ ] `ipfs:QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme` + +## IPNS URLs + +- [ ] Ensure each of the following IPNS URLs load over both `Gateway` and `Local node` modes: + - [ ] `ipns://brantly.eth` + - [ ] `ipns://en.wikipedia-on-ipfs.org` + - [ ] `ipns://libp2p.io/` + - [ ] `ipns://ipfs.io` + +## Gateway + +- [ ] Verify, on a new profile, you can load `brave://settings/ipfs`, click on the `Change` button for `IPFS public gateway address`, enter `https://cloudflare-ipfs.com/` and are presented with an interstitial page after loading `ipns://brantly.eth`. Click `Use a public gateway` and confirm you're taken to `https://cloudflare-ipfs.com/ipns/brantly.eth/#/`. (Alternatively, use one from `https://ipfs.github.io/public-gateway-checker/`.) +- [ ] Verify, on a new profile, you can load `https://wikipedia-on-ipfs.org`, switch `Method to resolve IPFS resources` to either `Gateway` or `Local node` in `brave://settings/ipfs`, and then see an `Open using IPFS` badge/icon in the URL bar. +- [ ] Verify clicking on `Open using IPFS` on `https://blog.ipfs.io/24-uncensorable-wikipedia` loads `ipfs://bafybeiaieqdmhtnehaau7kqoj2lmdfqc7juk34cjyb7dxr35vahp22bquu/24-uncensorable-wikipedia/` + + ### Protocol system handler/OS integration + + - [ ] Verify (`Windows`) that pressing `Win+R`, typing `open ipfs://bafkreigcnxudvpojjfwncmauociy5q46zsq46oe66cxbyzie3imabuoege`, and pressing `Enter` opens Brave and loads an HTML page with the word `PASS`. + - [ ] Verify (`macOS`): opening Terminal, and typing `open ipfs://bafkreigcnxudvpojjfwncmauociy5q46zsq46oe66cxbyzie3imabuoege`, and pressing `Enter` opens Brave and loads an HTML page with the word `PASS`. + - [ ] Verify (`Linux`) that opening a shell and typing `xdg-open ipfs://bafkreigcnxudvpojjfwncmauociy5q46zsq46oe66cxbyzie3imabuoege` and pressing `Enter` opens Brave and loads an HTML page with the word `PASS`. + +## Peers: +- [ ] Prerequisites: local node launched and local gateway configured. + + ### Adding + + - [ ] Verify when you go to `brave://settings/ipfs/peers` and click on the `Add` button, it prompts you to enter a new peer-connection string. Confirm that entering an incorrect string yields `This name is not valid` upon clicking `Submit`. (Acceptable ones are only CIDs or something like `**/p2p/**` format.) + - [ ] Verify if a peer is added and node is started, it proposes to restart node to apply changes. + - [ ] Verify the local node is restarted by clicking `Restart` button; happen it shows error message and suggests to see more on diagnostic page. + + ### Removing + + - [ ] Verify a peer can be removed by clicking on Trash icon in the peer line. + +## IPNS keys: + +- [ ] Prerequisites: local node launched and local gateway configured. Go to `Settings -> IPFS`, there should be an available `Set up your IPNS keys` option, which opens `brave://settings/ipfs/keys` + + ### Sharing a local file using an IPFS key + + - [ ] Verify the IPFS item available in the main app menu. Go to `IPFS -> Share Local File Using IPFS`, select the `self` key via the context menu, under `Publish using IPNS`, and import any local file. Make sure the file is imported, the import folder is opened when import completed successfully, the file can be downloaded and the downloaded one is same as original. The shareable link is copied to the clipboard; verify you see your key before the `?filename=filename.ext` in the copied text, e.g. `https://dweb.link/ipns/k51qzi5uqu5dgxhiv8w8cdvmgdhbvy3t9gn4jwpwwro18fots0xtdabpcxxzwc?filename=Big_Buck_Bunny_4K.webm` (the key is `k51qzi5uqu5dgxhiv8w8cdvmgdhbvy3t9gn4jwpwwro18fots0xtdabpcxxzwc`). + + ### Sharing a local folder using an IPFS key + + - [ ] Verify the IPFS item available in the main app menu. Go to `IPFS -> share Local Folder Using IPFS`, select the `self` key via the context menu, under `Publish using IPNS`, and import any local folder. Make sure the whole folder is imported, the import folder is opened when import completed successfully, files can be downloaded and the downloaded one is same as original. The shareable link is copied to the clipboard; verify you see your key before the `?filename=Downloads` part, e.g. `https://dweb.link/ipns/k51qzi5uqu5djfh24zd6m4e8fm6d9rju48fyokc13achcfo4hz9fmioev0xln6?filename=Downloads` (`k51qzi5uqu5djfh24zd6m4e8fm6d9rju48fyokc13achcfo4hz9fmioev0xln6` is the key here). + + ### Importing keys + + - [ ] Verify adding a new key by clicking on the `Import` button and choosing an existing key file to import. + - [ ] Verify imported key is available with entered name; verify entering `self` will yield `This name cannot be used`. + - [ ] Verify you cannot import the same key twice. + + ### Add/Remove/Rotate keys + + - [ ] Verify when you click `Add`, it prompts for key name and generates a new key. + - [ ] Verify clicking on `Add` and entering an existing key name shows a `This name cannot be used` error message. + - [ ] Verify when you click on the Trash icon for a key, it removes the key. \ No newline at end of file From b6b029640efa608412414193dc85650c086d249c Mon Sep 17 00:00:00 2001 From: srirambv Date: Tue, 6 Jul 2021 00:19:47 -0400 Subject: [PATCH 2/2] Fix template --- brave_testrun_generator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/brave_testrun_generator.py b/brave_testrun_generator.py index b0fe343..4e17cd3 100755 --- a/brave_testrun_generator.py +++ b/brave_testrun_generator.py @@ -808,7 +808,7 @@ def ipfs_testruns(ipfs_rel): if args.test is None: bc_repo.create_issue(title=winTitle, - body=windows_template, + body=ipfs_template, milestone=bc_milestone[ipfs_rel], labels=winList) @@ -827,7 +827,7 @@ def ipfs_testruns(ipfs_rel): if args.test is None: bc_repo.create_issue(title=linTitle, - body=linux_template, + body=ipfs_template, milestone=bc_milestone[ipfs_rel], labels=linList)