-
Notifications
You must be signed in to change notification settings - Fork 383
Conversation
additions: - A change-repository-branch workflow thats very similar to the workflow in Milestones - GraphQL query to fetch a repo's branches modifications: - a mutable "branch" string in RepositoryOverviewController and RepositoryCodeDirectoryViewController - updated the V3RepositoryReadME fetch to include a branch parameter - a protocol RepositoryBranchUpdatable to flag and update the appropriate ViewControllers when a user switches branches - ContextMenu and UIAlertAction setup - Removed some outdated code to get a repo's branch name from fetch(page:) in RepositoryOverviewViewController - Added a line feed.adapter.reloadData() in fetch(page:) because app was crashing intermittently after a user switched branches without that line - was always an IGListKit duplicate identifier error on StyledTextRenderers - to reproduce, remove the feed.adapter.reloadData(), go to https://github.com/TheAlgorithms/Python, try to switch branches and the app will crash. I'm working raising an issue for it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Love this! So excited to play with it. Couple notes from me.
@@ -99,6 +96,7 @@ BaseListViewControllerDataSource { | |||
let model = RepositoryReadmeModel(models: models) | |||
DispatchQueue.main.async { [weak self] in | |||
self?.readme = model | |||
self?.feed.adapter.reloadData() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We'll need to find another solution for this. Can we remove this line in the meanwhile? It reloads and then diffs+batch-updates which is pretty wasteful.
Does it crash w/out this feature? Like if you just reload the readme on the repo you outlined.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes, this was the line that prevented a crash on the particular repo/README I mentioned... without this line, It was crashing on about ~10% of repos that i manually tested, so prob should resolve the underlying issue before merging. I put a comment below with more detail + a unit test, crash log.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It’s fine to solve it in another PR. We can hold before sending another TF build. I’d like to keep PRs focused on one thing for the most part. Say the fix causes a regression, reverting the fix in this case would revert the whole feature.
|
||
private let repo: RepositoryDetails | ||
private let client: GithubClient | ||
private let controllers: [UIViewController] | ||
private var bookmarkNavController: BookmarkNavigationController? = nil | ||
public var branch: String |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: can you make the setter private?
), | ||
delegate: self | ||
) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit on this whole function: params on newline. ex:
UIAlertAction(
title: NSLocalizedString("Switch Branch", comment: ""),
style: .default
)
This gist here is that calling Would have included a form of this test in the PR but it's shoddy.. had to subclass RepositoryOverviewViewController, overrode There were other repos (README's) that caused crashes, but they were consistently the same ones with the same crash error: I can find more specific README's that crash if need be. Failing Testimport XCTest
@testable import Freetime
import Foundation
import IGListKit
import StyledTextKit
class SwitchBranches: XCTestCase {
class RepositoryOverviewViewController_Test: RepositoryOverviewViewController {
let content: String
let mockRepo: RepositoryDetails
init(content: String) {
self.content = content
let githubclient = newGithubClient()
let repoDetails = RepositoryDetails(owner: "githawkapp", name: "githawk", defaultBranch: "master", hasIssuesEnabled: true)
self.mockRepo = repoDetails
super.init(client: githubclient, repo: repoDetails)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func fetch(page: NSString?) {
print("fetch(page:) called ***")
let models = MarkdownModels(
content,
owner: mockRepo.owner,
repo: mockRepo.name,
width: 320,
viewerCanUpdate: false,
contentSizeCategory: UIContentSizeCategory.preferred,
isRoot: false,
branch: "master"
)
let model = RepositoryReadmeModel(models: models)
self.readme = model
// feed.adapter.reloadData() un-comment this line to fix crash
self.update(animated: trueUnlessReduceMotionEnabled)
}
// this here just to get test to work real quick
override func sectionController(model: Any, listAdapter: ListAdapter) -> ListSectionController {
let readMESectionController = RepositoryReadmeSectionController()
readMESectionController.inset = UIEdgeInsets.zero
return readMESectionController
}
}
func test() {
let content = "# Source: [Wikipedia](https://en.wikipedia.org)\n" + "# Source: [Wikipedia](https://en.wikipedia.org)\n"
// note: removing the '#'s removes the crash
// works fine: "Source: [Wikipedia](https://en.wikipedia.org)\n" + "Source: [Wikipedia](https://en.wikipedia.org)\n"
//fetch(page:) called at loadViewIfNeed()
//crashes if you call it a second time
let viewController = RepositoryOverviewViewController_Test(content: content)
viewController.loadViewIfNeeded()
viewController.fetch(page: nil)
}
} Crash Log
Example of full README Content that causes crash"# The Algorithms - Python \n\n### All algorithms implemented in Python (for education)\n\nThese are for demonstration purposes only. There are many implementations of sorts in the Python standard library that are much better for performance reasons.\n\n## Sort Algorithms\n\n\n### Bubble\n![alt text][bubble-image]\n\nFrom [Wikipedia][bubble-wiki]: Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorithm that repeatedly steps through the list to be sorted, compares each pair of adjacent items and swaps them if they are in the wrong order. The pass through the list is repeated until no swaps are needed, which indicates that the list is sorted.\n\n__Properties__\n* Worst case performance\tO(n^2)\n* Best case performance\tO(n)\n* Average case performance\tO(n^2)\n\n###### View the algorithm in [action][bubble-toptal]\n\n\n\n### Insertion\n![alt text][insertion-image]\n\nFrom [Wikipedia][insertion-wiki]: Insertion sort is a simple sorting algorithm that builds the final sorted array (or list) one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort.\n\n__Properties__\n* Worst case performance\tO(n^2)\n* Best case performance\tO(n)\n* Average case performance\tO(n^2)\n\n###### View the algorithm in [action][insertion-toptal]\n\n\n### Merge\n![alt text][merge-image]\n\nFrom [Wikipedia][merge-wiki]: In computer science, merge sort (also commonly spelled mergesort) is an efficient, general-purpose, comparison-based sorting algorithm. Most implementations produce a stable sort, which means that the implementation preserves the input order of equal elements in the sorted output. Mergesort is a divide and conquer algorithm that was invented by John von Neumann in 1945.\n\n__Properties__\n* Worst case performance\tO(n log n)\n* Best case performance\tO(n)\n* Average case performance\tO(n)\n\n\n###### View the algorithm in [action][merge-toptal]\n\n### Quick\n![alt text][quick-image]\n\nFrom [Wikipedia][quick-wiki]: Quicksort (sometimes called partition-exchange sort) is an efficient sorting algorithm, serving as a systematic method for placing the elements of an array in order.\n\n__Properties__\n* Worst case performance\tO(n^2)\n* Best case performance\tO(n log n) or O(n) with three-way partition\n* Average case performance\tO(n log n)\n\n###### View the algorithm in [action][quick-toptal]\n\n### Selection\n![alt text][selection-image]\n\nFrom [Wikipedia][selection-wiki]: The algorithm divides the input list into two parts: the sublist of items already sorted, which is built up from left to right at the front (left) of the list, and the sublist of items remaining to be sorted that occupy the rest of the list. Initially, the sorted sublist is empty and the unsorted sublist is the entire input list. The algorithm proceeds by finding the smallest (or largest, depending on sorting order) element in the unsorted sublist, exchanging (swapping) it with the leftmost unsorted element (putting it in sorted order), and moving the sublist boundaries one element to the right.\n\n__Properties__\n* Worst case performance\tO(n^2)\n* Best case performance\tO(n^2)\n* Average case performance\tO(n^2)\n\n###### View the algorithm in [action][selection-toptal]\n\n### Shell\n![alt text][shell-image]\n\nFrom [Wikipedia][shell-wiki]: Shellsort is a generalization of insertion sort that allows the exchange of items that are far apart. The idea is to arrange the list of elements so that, starting anywhere, considering every nth element gives a sorted list. Such a list is said to be h-sorted. Equivalently, it can be thought of as h interleaved lists, each individually sorted.\n\n__Properties__\n* Worst case performance O(nlog2 2n)\n* Best case performance O(n log n)\n* Average case performance depends on gap sequence\n\n###### View the algorithm in [action][shell-toptal]\n\n### Time-Complexity Graphs\n\nComparing the complexity of sorting algorithms (Bubble Sort, Insertion Sort, Selection Sort)\n\n[Complexity Graphs](https://github.com/prateekiiest/Python/blob/master/sorts/sortinggraphs.png)\n\n----------------------------------------------------------------------------------\n\n## Search Algorithms\n\n### Linear\n![alt text][linear-image]\n\nFrom [Wikipedia][linear-wiki]: linear search or sequential search is a method for finding a target value within a list. It sequentially checks each element of the list for the target value until a match is found or until all the elements have been searched.\n Linear search runs in at worst linear time and makes at most n comparisons, where n is the length of the list.\n\n__Properties__\n* Worst case performance\tO(n)\n* Best case performance\tO(1)\n* Average case performance\tO(n)\n* Worst case space complexity\tO(1) iterative\n\n### Binary\n![alt text][binary-image]\n\nFrom [Wikipedia][binary-wiki]: Binary search, also known as half-interval search or logarithmic search, is a search algorithm that finds the position of a target value within a sorted array. It compares the target value to the middle element of the array; if they are unequal, the half in which the target cannot lie is eliminated and the search continues on the remaining half until it is successful.\n\n__Properties__\n* Worst case performance\tO(log n)\n* Best case performance\tO(1)\n* Average case performance\tO(log n)\n* Worst case space complexity\tO(1) \n\n----------------------------------------------------------------------------------------------------------------------\n\n## Ciphers\n\n### Caesar\n![alt text][caesar]\nIn cryptography, a **Caesar cipher**, also known as Caesar\'s cipher, the shift cipher, Caesar\'s code or Caesar shift, is one of the simplest and most widely known encryption techniques. \nIt is **a type of substitution cipher** in which each letter in the plaintext is replaced by a letter some fixed number of positions down the alphabet. For example, with a left shift of 3, D would be replaced by A, E would become B, and so on. \nThe method is named after **Julius Caesar**, who used it in his private correspondence. \nThe encryption step performed by a Caesar cipher is often incorporated as part of more complex schemes, such as the Vigenère cipher, and still has modern application in the ROT13 system. As with all single-alphabet substitution ciphers, the Caesar cipher is easily broken and in modern practice offers essentially no communication security.\n###### Source: [Wikipedia](https://en.wikipedia.org/wiki/Caesar_cipher)\n\n### Vigenère\nThe **Vigenère cipher** is a method of encrypting alphabetic text by using a series of **interwoven Caesar ciphers** based on the letters of a keyword. It is **a form of polyalphabetic substitution**. \nThe Vigenère cipher has been reinvented many times. The method was originally described by Giovan Battista Bellaso in his 1553 book La cifra del. Sig. Giovan Battista Bellaso; however, the scheme was later misattributed to Blaise de Vigenère in the 19th century, and is now widely known as the \"Vigenère cipher\". \nThough the cipher is easy to understand and implement, for three centuries it resisted all attempts to break it; this earned it the description **le chiffre indéchiffrable**(French for \'the indecipherable cipher\'). \nMany people have tried to implement encryption schemes that are essentially Vigenère ciphers. Friedrich Kasiski was the first to publish a general method of deciphering a Vigenère cipher in 1863.\n###### Source: [Wikipedia](https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher)\n\n### Transposition\nIn cryptography, a **transposition cipher** is a method of encryption by which the positions held by units of plaintext (which are commonly characters or groups of characters) are shifted according to a regular system, so that the ciphertext constitutes a permutation of the plaintext. That is, the order of the units is changed (the plaintext is reordered). \nMathematically a bijective function is used on the characters\' positions to encrypt and an inverse function to decrypt.\n###### Source: [Wikipedia](https://en.wikipedia.org/wiki/Transposition_cipher)\n\n[bubble-toptal]: https://www.toptal.com/developers/sorting-algorithms/bubble-sort\n[bubble-wiki]: https://en.wikipedia.org/wiki/Bubble_sort\n[bubble-image]: https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Bubblesort-edited-color.svg/220px-Bubblesort-edited-color.svg.png \"Bubble Sort\"\n\n[insertion-toptal]: https://www.toptal.com/developers/sorting-algorithms/insertion-sort\n[insertion-wiki]: https://en.wikipedia.org/wiki/Insertion_sort\n[insertion-image]: https://upload.wikimedia.org/wikipedia/commons/7/7e/Insertionsort-edited.png \"Insertion Sort\"\n\n[quick-toptal]: https://www.toptal.com/developers/sorting-algorithms/quick-sort\n[quick-wiki]: https://en.wikipedia.org/wiki/Quicksort\n[quick-image]: https://upload.wikimedia.org/wikipedia/commons/6/6a/Sorting_quicksort_anim.gif \"Quick Sort\"\n\n[merge-toptal]: https://www.toptal.com/developers/sorting-algorithms/merge-sort\n[merge-wiki]: https://en.wikipedia.org/wiki/Merge_sort\n[merge-image]: https://upload.wikimedia.org/wikipedia/commons/c/cc/Merge-sort-example-300px.gif \"Merge Sort\"\n\n[selection-toptal]: https://www.toptal.com/developers/sorting-algorithms/selection-sort\n[selection-wiki]: https://en.wikipedia.org/wiki/Selection_sort\n[selection-image]: https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Selection_sort_animation.gif/250px-Selection_sort_animation.gif \"Selection Sort Sort\"\n\n[shell-toptal]: https://www.toptal.com/developers/sorting-algorithms/shell-sort\n[shell-wiki]: https://en.wikipedia.org/wiki/Shellsort\n[shell-image]: https://upload.wikimedia.org/wikipedia/commons/d/d8/Sorting_shellsort_anim.gif \"Shell Sort\"\n\n[linear-wiki]: https://en.wikipedia.org/wiki/Linear_search\n[linear-image]: http://www.tutorialspoint.com/data_structures_algorithms/images/linear_search.gif\n\n[binary-wiki]: https://en.wikipedia.org/wiki/Binary_search_algorithm\n[binary-image]: https://upload.wikimedia.org/wikipedia/commons/f/f7/Binary_search_into_array.png\n\n\n[caesar]: https://upload.wikimedia.org/wikipedia/commons/4/4a/Caesar_cipher_left_shift_of_3.svg\n " |
Since the assert is unrelated to this feature, let’s solve that in another PR Sent with GitHawk |
- changed public var to private(set) for var branch: String - removed wasteful feed.adapter.reloadData() call - re-formated params in switchBranchAction()
@rnystrom Requested changes are in 2nd commit. Thanks for the feedback! |
* 'master' of https://github.com/GitHawkApp/GitHawk: (107 commits) new routing library and refactor shortcuts (#2241) use edge inset to right align image (#2232) Adds more share actions when browsing a repository (#2161) (#2237) Huge refactor of AppDelegate and authentication routing (#2238) Fix readme duplicate identifier asserts (#2219) Order repo branches after fetch (#2228) set spinner color in RepoBranchVC (#2221) Update Setup.md (#2218) Localize Inbox Zero and allow for per-year holidays (#2215) change repo branch (#2202) Fix entitlements path (#2211) Settings cell textColor (#2193) Fixed cell border on merge button (#2204) Move entitlements to Resources (#2209) Restore readme images after assets move (#2210) Delete AppStore.md Delete appcenter-post-clone.sh move designs to own repo (#2208) Switched to constants (#2207) Move lock (#2206) ...
* Fix cell size on the Bookmarks tab (#2124) * Create code of conduct (#2126) It is encouraged by GitHub to comply with recommended community standards. * Fixed s/nuber/number/ typo in SECURITY.md (#2130) * Add issue template for feature request (#2132) Use GitHub template. * Add issue template for bug report (#2131) Use GitHub template. * bump version to 1.23 (#2143) * Replace "Inbox Zero" functionality and remove Firebase (#2142) * simpler inbox zero date that allows date planning * clean up * remove firebase * Don't override entire message when replying (#2160) * Local push notifications (#2145) * add fmdb * add local notification cache mechanism * rewiring to update local db when fetching notifications * local pushes working * building for xcode 10 * Add UIAppearance styling for UISwitch & UISearchBar (#2144) * Add(UIAppearance styling for UISwitch) * Add(UIAppearance for UISearchBar) * Added activity indicator (#2157) * Fixes bug where send button is enabled after sending a comment (#2158) * Load Consistency (#2159) * Combine 2 load cells into 1 * Fixed load more in BaseViewController * Switch if-else to ternary * adds review GitHubAccess button to notifications view controller (#2176) * Action Controller images (#2135) * Add images to action controller * Added pod to podfile Added icon to NotificationSectionController * Installed Pod * ContextMenu Dominant corner * Target support files * Fixed support * Updated Action Image Controller * grammatical change to code signing instructions (#2186) * Add TestFlight link to README (#2194) * Add TestFlight link to README * Update README.md * fix double tap tab invalid (#2192) this bug is caused by the time interval between two taps which is too small. * Fixed color issue. (#2188) * allows setting Milestone's loading indicator's color (#2195) * allows setting loading indicator's color * updated spinner color to .white in Milestones/Labels/People * Merge button status (#2189) * Addresses #2178 Shows merge status without button when you cannot merge. * Swift naming * Fortify local notifications code (#2191) * move path/defaults to be injected * remove unused defaults * add tests for notification db, fix settings, avoid dupe inbox requests * better tests, fix dupe insert bug * Attempt to fix iTunes Connect issue where watchOS needs min target (#2173) * attempt to fix iTunes Connect issue where watchOS needs min target * fix podfile * Use updatedAt time to key notification send times (#2201) * Use updatedAt time to key notification send times * better formatting and fix tests * Delete CNAME * move blog to own repo (#2205) * fixed icon name (#2203) * Move lock (#2206) * Moves lock under divider * fix param style * Update IssueManagingContextController.swift * Switched to constants (#2207) * move designs to own repo (#2208) * Delete appcenter-post-clone.sh * Delete AppStore.md * Restore readme images after assets move (#2210) * Move entitlements to Resources (#2209) * Fixed cell border on merge button (#2204) * Fixed cell border on merge button * Fixed nits * Settings cell textColor (#2193) * Set API Status cell textColor to custom (Matching the rest of the settings page) * Updated Double Tap Reaction off color to custom * Updated Enabled textColor to custom * Updated reaction textColors to proper custom * Switched all labels to settingsLabels * Fix entitlements path (#2211) * change repo branch (#2202) * change repo branch additions: - A change-repository-branch workflow thats very similar to the workflow in Milestones - GraphQL query to fetch a repo's branches modifications: - a mutable "branch" string in RepositoryOverviewController and RepositoryCodeDirectoryViewController - updated the V3RepositoryReadME fetch to include a branch parameter - a protocol RepositoryBranchUpdatable to flag and update the appropriate ViewControllers when a user switches branches - ContextMenu and UIAlertAction setup - Removed some outdated code to get a repo's branch name from fetch(page:) in RepositoryOverviewViewController - Added a line feed.adapter.reloadData() in fetch(page:) because app was crashing intermittently after a user switched branches without that line - was always an IGListKit duplicate identifier error on StyledTextRenderers - to reproduce, remove the feed.adapter.reloadData(), go to https://github.com/TheAlgorithms/Python, try to switch branches and the app will crash. I'm working raising an issue for it. * requested changes - changed public var to private(set) for var branch: String - removed wasteful feed.adapter.reloadData() call - re-formated params in switchBranchAction() * style nit * Localize Inbox Zero and allow for per-year holidays (#2215) * Update Setup.md (#2218) Grammatical change to md * set spinner color in RepoBranchVC (#2221) * Order repo branches after fetch (#2228) * Order repo branches after fetch - added func to order branches + unit tests - replaced 'var branch: String' w/ 'private(set) var selectedBranch: String' & added a defaultBranch variable - changed fetch(page:) to update(animated:) in didSelect(value:) - an oversight from original pr * AX animation * Fix readme duplicate identifier asserts (#2219) * WIP to fix readme asserts * remove newline * improved markdown parsing working * fix tests * Huge refactor of AppDelegate and authentication routing (#2238) * refactor with new app controller, replace root nav mgr * finish refactoring out root nav mgr * remove root mgr * Adds more share actions when browsing a repository (#2161) (#2237) * add additional share actions * fix share URLs * use edge inset to right align image (#2232) * new routing library and refactor shortcuts (#2241) * [FIX] Settings write review indent (#2242) * PeopleVC: Sort users with self first (#2246) - moves sorting logic from fetch(page:) into type method - unit test * Simpler logic for review access button handling (#2249) * Always update shortcuts on app launch (#2248) * move the bookmark icon for the RepoVC and address a CR comment (#2255) * always call completion block when early returning b/c of bg (#2258) * open issue from notification (#2259) * [FIX] Navigation for double tap reaction on settings (#2275) - Changes segue kind from show to showDetail - Adds a navigation controller for "Double tap Reaction" so it will work on both iPhone and iPad * [FIX] Navigation controller on "View Source" from settings (#2276) * keep read layer in front when animating inbox (#2280) * Proper fix to prevent double fetching from background (#2279) * Update Gemfile to use same version of CocoaPods referenced in Podfile.lock (#2277) * Update cocoapods version constraint * Run `bundle update cocoapods` * Run `npm install` * Add new iPhone models to UIDevice+Model.swift (#2278) * Switched from long press to tap recognizer for menu controllers (#2271) * Add steps in the setup to avoid commiting env variables to the repo (#2262) * Add "Try Again" button for EmptyView (#2214) (#2226) * Button to display Push Notification info in Settings (#2282) * Add push notification info in settings * better sizing * add empty error view to latest base VC (#2283) * move background handling into feed for better state control (#2285) * thread error descriptions to squawk throughout app (#2286) * Update MessageViewController (#2287) * update messageviewcontroller * add latest update * update with revert * Add clear button to action menus (#2288) * Add clear button to the labels and milestone action menu * Move the selection count in the PeopleViewController into the title Add a clear button to the people controller * Remove mock return for testing action menu * Add "Clear" string constant Remove unused Protocol * Setup the clear enabled state and the Poeple title correctly on init * Sorts issues after fetch (#2304) *reverse chronologically * Warn that logging out removes bookmarks (#2303) * Enable SwiftLint and fix issues (#2292) * update swiftlint * build with lint enabled * fix almost all warnings * remove wholemodule * fetch subscription status and fix mutation (#2291) * update ContextMenu (#2310) * reopen menu item is green (#2311) * fix landscape read animation issue (#2312) * Search for labels in app (take two) (#2314) * Created DidTap Protocol for label section controllers - created a protocol to route tap events to a delegate. The idea is that the delgate will have a reference to GithubClient and we can limit the baggage of passing around GithubClient * Refactor Repo VC and SC to use name and owner as parameters - Will make it easier to present RepoVC without needing a ref to RepositoryDetails. The only parameters being used from RepositoryDetails were owner and name * Added presentLabels extension to UIViewController * requested changes * Show PR CI status inline with title (#2325) * remove unused gql * show PR CI status in list * update StyledTextKit * Thread networking errors and add custom error descriptions (#2324) * Better network error descriptions * localized descriptions for custom errors * Improve empty retry UX (#2323) * Highlight CodeView text on a background queue (#2322) * Browse commit history of repositories, directories, and files (#2321) * add history request * Browse commit history of repo, directories, and files * Move routes to own pod (#2317) * Use https url for login (#2327) Removes a deprecation warning for SFAuthentication because of using http * Expand push settings info accessibility label (#2326) * cleans up issue labels query (#2334) * Move dropdown control to own lib (#2335) * Move dropdown control to own lib * update to add missing assets * fix interaction, set appearances * clear push notifications on open (#2336) * update dropdown view for centered title view (#2338) * inset preview collection view (#2340) * update routing lib and wire up new repo route (#2344) * Update reivewGitHUbAccessBtn constraints (#2339) * [ADD] "Try Beta" cell on Settings (#2346) Adds "Try Beta" cell on Settings screen, On tap opens the testflight invite link in safari * Message on "Try Beta" when already in TF (#2351) * [ADD] On Tap "Try Beta", show Squawk message when user is already on beta * Update Squawk+GitHawk.swift * Fixes regex for consecutive shortlinks (#2358) - updated unit tests * Fix typo in TF squawk (#2361) * Lowercase issue/PR search string (#2360) * fix lints * lowercase search string * fix more lints * Allow showing/cloning repository in Working Copy when installed (#2366) .../more button when looking at repository has extra action when Working Copy is installed to show or clone this repository in this app. * Fixes Reaction emoji updates on split view (#2359) * [FIX] Reaction emoji updates on split view * [FIX] Change listener to delegate * Update MessageViewController (#2370) * Update routes to final form (#2374) * update routes to final form * fix routes build and update with router object
#2162
additions:
modifications: