Skip to content
This repository was archived by the owner on Sep 20, 2023. It is now read-only.

change repo branch #2202

Merged
merged 3 commits into from
Sep 30, 2018
Merged

change repo branch #2202

merged 3 commits into from
Sep 30, 2018

Conversation

BrianLitwin
Copy link
Member

@BrianLitwin BrianLitwin commented Sep 29, 2018

#2162

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.

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.
Copy link
Member

@rnystrom rnystrom left a 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()
Copy link
Member

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.

Copy link
Member Author

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.

Copy link
Member

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
Copy link
Member

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
)
}
Copy link
Member

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
)

@BrianLitwin
Copy link
Member Author

BrianLitwin commented Sep 30, 2018

This gist here is that calling fetch(page:) twice cases a crash with certain README markdown content unless you directly called adapter.reloadData() before update(animated:)

Would have included a form of this test in the PR but it's shoddy.. had to subclass RepositoryOverviewViewController, overrode fetch(page:) and copied/pasted the code from the real class into the unit test to duplicate the crash..

There were other repos (README's) that caused crashes, but they were consistently the same ones with the same crash error: Duplicate identifier 8881235761306338196 for object StyledTextKit.StyledTextRenderer with object StyledTextKit.StyledTextRenderer

I can find more specific README's that crash if need be.

Failing Test
import 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
IGListKit/Source/Common/Internal/IGListArrayUtilsInternal.h:30
2018-09-30 07:24:15.901898-0400 Freetime[72542:2056665] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Duplicate identifier -8881235761306338196 for object StyledTextKit.StyledTextRenderer with object StyledTextKit.StyledTextRenderer'
*** First throw call stack:
(
	0   CoreFoundation                      0x000000010422129b __exceptionPreprocess + 331
	1   libobjc.A.dylib                     0x00000001037c5735 objc_exception_throw + 48
	2   CoreFoundation                      0x0000000104221022 +[NSException raise:format:arguments:] + 98
	3   Foundation                          0x00000001031c9c10 -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 166
	4   IGListKit                           0x00000001029db5b8 objectsWithDuplicateIdentifiersRemoved + 1048
	5   IGListKit                           0x00000001029dabd8 __60-[IGListBindingSectionController updateAnimated:completion:]_block_invoke + 856
	6   IGListKit                           0x00000001029bf458 __57-[IGListAdapter performBatchAnimated:updates:completion:]_block_invoke + 136
	7   IGListKit                           0x00000001029ce0d7 -[IGListAdapterUpdater performUpdateWithCollectionView:animated:itemUpdates:completion:] + 1687
	8   IGListKit                           0x00000001029bf2d8 -[IGListAdapter performBatchAnimated:updates:completion:] + 1976
	9   IGListKit                           0x00000001029da6cc -[IGListBindingSectionController updateAnimated:completion:] + 1260
	10  IGListKit                           0x00000001029dc1ae -[IGListBindingSectionController didUpdateToObject:] + 766
	11  IGListKit                           0x00000001029b5090 -[IGListAdapter _updateObjects:dataSource:] + 3728
	12  IGListKit                           0x00000001029ae81c __51-[IGListAdapter performUpdatesAnimated:completion:]_block_invoke + 268
	13  IGListKit                           0x00000001029c8e80 __62-[IGListAdapterUpdater performBatchUpdatesWithCollectionView:]_block_invoke + 128
	14  IGListKit                           0x00000001029c9574 __62-[IGListAdapterUpdater performBatchUpdatesWithCollectionView:]_block_invoke.82 + 36
	15  IGListKit                           0x00000001029c7f6b -[IGListAdapterUpdater performBatchUpdatesWithCollectionView:] + 2347
	16  IGListKit                           0x00000001029cc7a1 __55-[IGListAdapterUpdater _queueUpdateWithCollectionView:]_block_invoke + 401
	17  libdispatch.dylib                   0x0000000106a2851d _dispatch_call_block_and_release + 12
	18  libdispatch.dylib                   0x0000000106a29587 _dispatch_client_callout + 8
	19  libdispatch.dylib                   0x0000000106a353bc _dispatch_main_queue_callback_4CF + 1290
	20  CoreFoundation                      0x00000001041847f9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
	21  CoreFoundation                      0x000000010417ee86 __CFRunLoopRun + 2342
	22  CoreFoundation                      0x000000010417e221 CFRunLoopRunSpecific + 625
	23  XCTest                              0x0000000123b8656b -[XCTWaiter waitForExpectations:timeout:enforceOrder:] + 955
	24  XCTest                              0x0000000123b8985e +[XCTWaiter waitForExpectations:timeout:enforceOrder:] + 104
	25  XCTest                              0x0000000123ba6d77 -[XCTTestRunSession runTestsAndReturnError:] + 972
	26  XCTest                              0x0000000123b1525a -[XCTestDriver runTestsAndReturnError:] + 422
	27  XCTest                              0x0000000123b98fbd _XCTestMain + 1478
	28  libXCTestBundleInject.dylib         0x0000000102067bb8 __copy_helper_block_ + 0
	29  CoreFoundation                      0x0000000104184a3c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
	30  CoreFoundation                      0x00000001041841f0 __CFRunLoopDoBlocks + 336
	31  CoreFoundation                      0x000000010417ea64 __CFRunLoopRun + 1284
	32  CoreFoundation                      0x000000010417e221 CFRunLoopRunSpecific + 625
	33  GraphicsServices                    0x000000010b64e1dd GSEventRunModal + 62
	34  UIKitCore                           0x000000010d953115 UIApplicationMain + 140
	35  Freetime                            0x0000000100e200f4 main + 68
	36  libdyld.dylib                       0x0000000106a99551 start + 1
	37  ???                                 0x0000000000000005 0x0 + 5
)
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 "

@rnystrom
Copy link
Member

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()
@BrianLitwin
Copy link
Member Author

@rnystrom Requested changes are in 2nd commit. Thanks for the feedback!

@rnystrom rnystrom merged commit c62ce4a into GitHawkApp:master Sep 30, 2018
rizwankce referenced this pull request in rizwankce/GitHawk Oct 8, 2018
* '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)
  ...
rnystrom added a commit that referenced this pull request Nov 2, 2018
* 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
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants