From e432963d4e5da4d09e184ceea94a0f5937b3a46a Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Wed, 1 May 2019 15:31:36 -0400 Subject: [PATCH 01/15] Feature request draft :memo: --- docs/feature-requests/005-blank-slate.md | 229 +++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 docs/feature-requests/005-blank-slate.md diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md new file mode 100644 index 0000000000..ae3cff4d74 --- /dev/null +++ b/docs/feature-requests/005-blank-slate.md @@ -0,0 +1,229 @@ + + +**_Part 1 - Required information_** + +# Improved Blank Slate Behavior + +## :memo: Summary + +Improve the behavior of the GitHub tab when no GitHub remote is detected to better guide users to start using GitHub features. + +## :checkered_flag: Motivation + +Well, for one thing, we've had TODOs in [GitHubTabView](https://github.com/atom/github/blob/cf1009243a35e2a6880ae3c969f2fe2a11d3f72d/lib/views/github-tab-view.js#L81) and [GitHubTabContainer](https://github.com/atom/github/blob/cf1009243a35e2a6880ae3c969f2fe2a11d3f72d/lib/containers/github-tab-container.js#L78-L81) for these cases since they were written. But we've also received repeated and clear feedback from UXR studies, [issues](https://github.com/atom/github/issues/1962), and [the forum](https://discuss.atom.io/t/github-link/60168) that users are confused about what to do to "link a repository with GitHub" to use our GitHub features. + +This is a roadblock that is almost certainly keeping users who want to use our package from doing so. + +## 🤯 Explanation + +Our goal is to provide prompts for useful next steps when the current repository does not have a unique remote pointing to `https://github.com`. When a user opens the GitHub tab in any of these situations, they should be presented with options to direct their next course of action. + +In each situation below, our user's goal is the same: to have the repository they wish to work on (a) cloned on their computer with a correct remote configuration and (b) on dotcom. + +## GitHub tab + +### No local repository + +We detect this state when the active repository is absent, meaning there are no project root directories. + +> TODO: prototype + +#### ...no dotcom repository + +_Scenario:_ A user wants to start a new project published on GitHub. + +Clicking the "Create GitHub repository" button opens the [Create repository dialog](#create-repository-dialog) in "no local repository" mode. + +#### ...existing dotcom repository + +_Scenario:_ A user wishes to contribute to a project that exists on GitHub, but does not yet have a clone on their local machine. Perhaps a friend or co-worker created the repository and they wish to collaborate, or they're working on a personal project on a different machine, or there is an open-source repository they wish to contribute to. + +Clicking the "Clone GitHub repository" button opens the [Clone repository dialog](#clone-repository-dialog). + +### Local repository, uninitialized + +We detect this state when the active repository is empty, meaning the current project root has no Git repository. + +> TODO: prototype + +#### ...no dotcom repository + +_Scenario:_ A user has begun a project locally and now wishes to put it under version control and share it on GitHub. + +Clicking the "Create GitHub repository" button opens the [Create repository dialog](#create-repository-dialog) in "local repository" mode. + +### Local repository, initialized, no dotcom remotes + +We detect this state when the active repository is present but has no dotcom remotes. + +> TODO: prototype + +#### ...no dotcom repository + +_Scenario:_ A user has begun a project locally and now wishes to share it on GitHub. + +Clicking the "Create GitHub repository" button opens the [Create repository dialog](#create-repository-dialog) panel in "local repository" mode. + +#### ...existing dotcom repository + +_Scenario:_ A user has a project cloned locally and it exists on GitHub. + +_Scenario:_ A user has a project cloned locally and it exists on GitHub, but they cannot push. Maybe they cloned the project before to read its source more easily, but now they wish to contribute. + +Clicking the "Connect GitHub repository" button opens the [Connect repository dialog](#connect-repository-dialog). + +### Local repository, initialized, dotcom remotes + +This is the state we handle now: when an active repository is present and has one or more dotcom remotes. + +## Clone repository dialog + +The clone repository dialog begins in search mode. As you type within the text input, once more than three characters have been entered, repositories on GitHub matching the entered text appear in the result list below. Repositories may be identified by full clone URL, `owner/name` pair, or a unique substring of `owner/name`. + +> TODO: clone repository, empty search input + +> TODO: clone repository, search input with several characters + +### GitHub clone mode + +Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: + +> TODO: clone repository, GitHub clone mode + +If the authenticated user cannot push to the chosen GitHub repository, the "fork" checkbox is pre-checked. + +While the "fork" checkbox is checked, the "fork destination" dropdown is also shown, populated with organizations to which the user belongs. Organizations within which the user does not has permission to create repositories are disabled with an explanatory suffix. The user's account is selected by default in the "fork destination" dropdown. The "upstream remote name" input is shown and populated with the value of the Atom config setting `github.upstreamRemoteName`. + +> TODO: clone repository, GitHub clone mode, fork destination selection: no existing forks + +If the user already has push rights to a fork of the chosen repository, they are prompted to clone an existing fork instead. + +> TODO: clone repository, GitHub clone mode, fork destination selection: existing forks + +Clicking on an existing fork modifies the search query to select the chosen fork. + +### Non-GitHub clone mode + +Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode: + +> TODO: clone repository, non-GitHub clone mode + +### Common behavior + +The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. + +The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists, the path is considered invalid and an error message is shown. + +> TODO: clone repository, invalid clone destination path + +The "Clone" button is enabled when: + +* A clone source is uniquely identified, by GitHub `name/owner` or git URL; +* The "source remote name" input is populated with a valid git remote name; +* The fork checkbox is unchecked, or it is checked, an enabled fork destination is chosen from the dropdown, and the "upstream remote name" input is populated with a valid git remote name. +* A valid path is entered within the clone destination path input. + +Clicking the "Clone" button: + +* Clones the repository from the chosen clone source to the clone destination path. +* Adds the clone destination path as a project root. +* Ensures that the clone destination is the active GitHub package context. +* Closes the "Clone repository" dialog. + +## Create repository dialog + +The create repository dialog may be opened in either "no local repository" mode or "local repository" mode. + +### "No local repository" mode + +> TODO: create repository, "no local repository" mode + +The "owner" drop-down is populated with the user's account name and the list of organizations to which the authenticated user belongs. Organizations to which the user has insufficient permissions to create repositories are disabled with an explanatory suffix. + +The "repository name" field is initially empty and focused. As the user types, an error message appears if a repository with the chosen name and owner already exists. + +The "add .gitignore" dropdown is populated with the value "none" and a selectable value for each file in the root directory of [the github/gitignore repository](https://github.com/github/gitignore). These values are cached per Atom renderer process. "none" is selected by default. + +The "license template" dropdown is populated with the value "none" and a selectable value chosen from [the "commonly used licenses" API endpoint on GitHub](https://developer.github.com/v3/licenses/#list-commonly-used-licenses). These values are cached per Atom renderer process. "none" is selected by default. + +The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. + +The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists, the path is considered invalid and an error message is shown. + +Clicking the "Create" button: + +* Creates a repository on GitHub with the chosen owner, name, description, README, `.gitignore`, and license templates. +* Clones the newly created repository to the clone destination path with its source remote set to the source remote name. +* Adds the clone destination path as a project root. +* Ensures that the clone destination path is the active GitHub package context. +* Closes the "Create repository" dialog. + +### "Local repository" mode + +The major difference in this mode is that certain controls are pre-populated with values from the state of the provided local repository. + +* The "repository name" field is pre-populated with the directory name of the local repository's root directory. +* The "create README" checkbox is unchecked. It is disabled if a file matching `README.*` is already present in the local repository. +* The "add .gitignore" dropdown is disabled if a file called `.gitignore` is already present in the local repository. +* The "license template" dropdown is disabled if a file matching `LICENSE.*` is already present in the local repository. +* The "source remote" field is invalid if a remote with the given name is already present in the local repository. + +Clicking the "Create" button also behaves slightly differently: + +* Initializes a git repository in the local repository path if it is not already a git repository. +* Adds a templated README if "create README" was checked. +* Adds a stock `.gitignore` file if "add .gitignore" was not "none". +* Adds the license template as a file called `LICENSE` if "license template" was not "none". Values for `[fullname]`, `[login]`, `[year]`, and other placeholders are replaced with best guesses from the user's GitHub account information, consist with [choosealicense.com](https://github.com/github/choosealicense.com#auto-populated-fields). +* Creates a commit if any files were added. +* Creates a repository on GitHub with the chosen owner, name, and description. +* Adds a remote with the specified "source remote name" and sets it to the clone URL of the newly created repository, respecting the https/ssh toggle. +* If a branch called `master` is present in the local repository, its push and fetch upstreams are configured to be the source remote. +* The local repository path is added as a project root if it is not already present. +* Ensures that the clone destination path is the active GitHub package context. +* Closes the "Create repository" dialog. + +## Improved branch publish behavior + +If a remote is present in the current repository with a name matching the setting `github.cloneSourceRemoteName`, both clicking "publish" in the push-pull status bar tile and clicking a "publish ..." button in the GitHub tab push HEAD to the clone source remote instead of `origin`, even if the "chosen" remote differs. + +If a multiple remotes are present in the current repository, and one is present with a name matching the setting `github.upstreamRemoteName` that has a recognized GitHub URL, it will be preferred as the default remote by the `GitTabContainer` component. Otherwise, if one is present with a name matching the setting `github.cloneSourceRemoteName` and a GitHub URL, that one will be used. Finally we'll fall back to our existing `RemoveSelectorView` menu. + +When multiple remotes are present in the current repository and the push-pull status bar tile is in its "publish" state, the push-pull status bar tile's context menu includes a separate "Push" entry for each available remote. + +**_Part 2 - Additional information_** + +## :anchor: Drawbacks + +Modal dialogs are disruptive to UX flow. You can't start creating a repository, have another thought and make a quick edit, then come back to it. This design uses a lot of them. + +The "Create repository" flow includes a lot of dotcom-isms. We can make _some_ things nicer with the local context we have to work with - like guessing a repository name from the project directory - but we're likely to frequently fall behind what's available on the dotcom repository creation page. + +There is no "create repository" mutation available in the GraphQL API, so we'll need to use the REST API for that. + +Some users don't use GitHub, but have remotes hosted elsewhere. We want to avoid being too invasive and annoying these users with prompts that will never apply to them. + +## :thinking: Rationale and alternatives + +We could open dotcom for repository creation, but then we would have no way to smoothly clone or connect the created repository. + +## :question: Unresolved questions + +* Are there better ways to intelligently identify which remotes should be used to push branches and which should be queried for pull requests? +* Are there different, common upstream-and-fork remote setups that these dialogs will support poorly? +* Is the language used in these dialogs and controls familiar enough to git newcomers? + +## :warning: Out of Scope + +This effort should not include: + +* GitHub enterprise support. (:sad:) We have separate issues ([#270](https://github.com/atom/github/issues/270), [#919](https://github.com/atom/github/issues/919)) to track that, although this does complicate its eventual implementation, because the clone and create dialogs need to be Enterprise-aware. + +## :construction: Implementation phases + +_TODO_ + +## :white_check_mark: Feature description for Atom release blog post + +_TODO_ From a9cfc29ae19daa988682652dc93986bf8eb265e3 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Wed, 1 May 2019 15:40:22 -0400 Subject: [PATCH 02/15] Another out-of-scope bullet point --- docs/feature-requests/005-blank-slate.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index ae3cff4d74..2240b5cc03 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -219,6 +219,7 @@ We could open dotcom for repository creation, but then we would have no way to s This effort should not include: * GitHub enterprise support. (:sad:) We have separate issues ([#270](https://github.com/atom/github/issues/270), [#919](https://github.com/atom/github/issues/919)) to track that, although this does complicate its eventual implementation, because the clone and create dialogs need to be Enterprise-aware. +* General remote management ([#555](https://github.com/atom/github/issues/555)). ## :construction: Implementation phases From 762e889cad9f8733aa5586b22535bc37dc826405 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 2 May 2019 09:28:44 -0400 Subject: [PATCH 03/15] GitHub tab prototypes --- docs/feature-requests/005-blank-slate.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index 2240b5cc03..9599f0522d 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -28,7 +28,7 @@ In each situation below, our user's goal is the same: to have the repository the We detect this state when the active repository is absent, meaning there are no project root directories. -> TODO: prototype +github tab, no local repositories #### ...no dotcom repository @@ -46,7 +46,7 @@ Clicking the "Clone GitHub repository" button opens the [Clone repository dialog We detect this state when the active repository is empty, meaning the current project root has no Git repository. -> TODO: prototype +github tab, local repository is uninitialized #### ...no dotcom repository @@ -58,7 +58,8 @@ Clicking the "Create GitHub repository" button opens the [Create repository dial We detect this state when the active repository is present but has no dotcom remotes. -> TODO: prototype +github tab, local repository with no GitHub remotes + #### ...no dotcom repository From 13eaddfbc5c50d3ef36ebb96f0f1253dcc547170 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 2 May 2019 09:30:51 -0400 Subject: [PATCH 04/15] Let's punt README, .gitignore, and license creation out of scope --- docs/feature-requests/005-blank-slate.md | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index 9599f0522d..71e189365d 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -145,10 +145,6 @@ The "owner" drop-down is populated with the user's account name and the list of The "repository name" field is initially empty and focused. As the user types, an error message appears if a repository with the chosen name and owner already exists. -The "add .gitignore" dropdown is populated with the value "none" and a selectable value for each file in the root directory of [the github/gitignore repository](https://github.com/github/gitignore). These values are cached per Atom renderer process. "none" is selected by default. - -The "license template" dropdown is populated with the value "none" and a selectable value chosen from [the "commonly used licenses" API endpoint on GitHub](https://developer.github.com/v3/licenses/#list-commonly-used-licenses). These values are cached per Atom renderer process. "none" is selected by default. - The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists, the path is considered invalid and an error message is shown. @@ -166,18 +162,11 @@ Clicking the "Create" button: The major difference in this mode is that certain controls are pre-populated with values from the state of the provided local repository. * The "repository name" field is pre-populated with the directory name of the local repository's root directory. -* The "create README" checkbox is unchecked. It is disabled if a file matching `README.*` is already present in the local repository. -* The "add .gitignore" dropdown is disabled if a file called `.gitignore` is already present in the local repository. -* The "license template" dropdown is disabled if a file matching `LICENSE.*` is already present in the local repository. * The "source remote" field is invalid if a remote with the given name is already present in the local repository. Clicking the "Create" button also behaves slightly differently: * Initializes a git repository in the local repository path if it is not already a git repository. -* Adds a templated README if "create README" was checked. -* Adds a stock `.gitignore` file if "add .gitignore" was not "none". -* Adds the license template as a file called `LICENSE` if "license template" was not "none". Values for `[fullname]`, `[login]`, `[year]`, and other placeholders are replaced with best guesses from the user's GitHub account information, consist with [choosealicense.com](https://github.com/github/choosealicense.com#auto-populated-fields). -* Creates a commit if any files were added. * Creates a repository on GitHub with the chosen owner, name, and description. * Adds a remote with the specified "source remote name" and sets it to the clone URL of the newly created repository, respecting the https/ssh toggle. * If a branch called `master` is present in the local repository, its push and fetch upstreams are configured to be the source remote. @@ -199,7 +188,7 @@ When multiple remotes are present in the current repository and the push-pull st Modal dialogs are disruptive to UX flow. You can't start creating a repository, have another thought and make a quick edit, then come back to it. This design uses a lot of them. -The "Create repository" flow includes a lot of dotcom-isms. We can make _some_ things nicer with the local context we have to work with - like guessing a repository name from the project directory - but we're likely to frequently fall behind what's available on the dotcom repository creation page. +The "Create repository" flow is missing some of the functionality that the dotcom page has, like initializing a README and a license. We can make _some_ things nicer with the local context we have to work with - like guessing a repository name from the project directory - but we'd be unlikely to keep up with what's available on dotcom. There is no "create repository" mutation available in the GraphQL API, so we'll need to use the REST API for that. From a45033b70873e90a094061179da969f57da1db7d Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 2 May 2019 09:41:05 -0400 Subject: [PATCH 05/15] Actually describe the "Connect" dialog --- docs/feature-requests/005-blank-slate.md | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index 71e189365d..af51ceef93 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -133,6 +133,56 @@ Clicking the "Clone" button: * Ensures that the clone destination is the active GitHub package context. * Closes the "Clone repository" dialog. +## Connect repository dialog + +The connect repository dialog is similar to the [clone repository dialog](#clone-repository-dialog), but omits the controls related to choosing a clone destination. + +The connect repository dialog begins in search mode. As you type within the text input, once more than three characters have been entered, repositories on GitHub matching the entered text appear in the result list below. Repositories may be identified by full clone URL, `owner/name` pair, or a unique substring of `owner/name`. + +> TODO: connect repository, search results + +### GitHub clone mode + +Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: + +> TODO: connect repository, GitHub clone mode + +If the authenticated user cannot push to the chosen GitHub repository, the "fork" checkbox is pre-checked. + +While the "fork" checkbox is checked, the "fork destination" dropdown is also shown, populated with organizations to which the user belongs. Organizations within which the user does not has permission to create repositories are disabled with an explanatory suffix. The user's account is selected by default in the "fork destination" dropdown. The "upstream remote name" input is shown and populated with the value of the Atom config setting `github.upstreamRemoteName`. + +> TODO: connect repository, GitHub clone mode, fork destination selection: no existing forks + +If the user already has push rights to a fork of the chosen repository, they are prompted to clone an existing fork instead. + +> TODO: connect repository, GitHub clone mode, fork destination selection: existing forks + +Clicking on an existing fork modifies the search query to select the chosen fork. + +### Non-GitHub clone mode + +Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode: + +> TODO: connect repository, non-GitHub clone mode + +### Common behavior + +The "remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. + +The "Connect" button is enabled when: + +* A remote source is uniquely identified, by GitHub `name/owner` or git URL; +* The "remote name" input is populated with a valid git remote name; +* The fork checkbox is unchecked, or it is checked, an enabled fork destination is chosen from the dropdown, and the "upstream remote name" input is populated with a valid git remote name. + +Clicking the "Connect" button: + +* If the fork checkbox is checked, forks the repository to the chosen fork destination. +* Adds the chosen repository or the newly created fork as a remote with the chosen remote name. +* If the fork checkbox was checked, adds the fork source as a remote with the chosen upstream remote name. +* Ensures that the connected local repository is the active GitHub package context. +* Closes the "Connect repository" dialog. + ## Create repository dialog The create repository dialog may be opened in either "no local repository" mode or "local repository" mode. From bf9acfa1f72487432b575f74ac3ac2ba11152caf Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Thu, 2 May 2019 14:05:37 -0400 Subject: [PATCH 06/15] Mocks for the Clone dialog --- docs/feature-requests/005-blank-slate.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index af51ceef93..3ad3c6027d 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -83,25 +83,25 @@ This is the state we handle now: when an active repository is present and has on The clone repository dialog begins in search mode. As you type within the text input, once more than three characters have been entered, repositories on GitHub matching the entered text appear in the result list below. Repositories may be identified by full clone URL, `owner/name` pair, or a unique substring of `owner/name`. -> TODO: clone repository, empty search input +clone dialog, empty search -> TODO: clone repository, search input with several characters +clone dialog, search results ### GitHub clone mode Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: -> TODO: clone repository, GitHub clone mode +clone dialog, GitHub mode If the authenticated user cannot push to the chosen GitHub repository, the "fork" checkbox is pre-checked. While the "fork" checkbox is checked, the "fork destination" dropdown is also shown, populated with organizations to which the user belongs. Organizations within which the user does not has permission to create repositories are disabled with an explanatory suffix. The user's account is selected by default in the "fork destination" dropdown. The "upstream remote name" input is shown and populated with the value of the Atom config setting `github.upstreamRemoteName`. -> TODO: clone repository, GitHub clone mode, fork destination selection: no existing forks +clone dialog, fork checked If the user already has push rights to a fork of the chosen repository, they are prompted to clone an existing fork instead. -> TODO: clone repository, GitHub clone mode, fork destination selection: existing forks +clone dialog, existing forks Clicking on an existing fork modifies the search query to select the chosen fork. @@ -109,7 +109,7 @@ Clicking on an existing fork modifies the search query to select the chosen fork Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode: -> TODO: clone repository, non-GitHub clone mode +clone-dialog-nongithub ### Common behavior @@ -117,8 +117,6 @@ The "source remote name" input is pre-populated with the value of the Atom setti The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists, the path is considered invalid and an error message is shown. -> TODO: clone repository, invalid clone destination path - The "Clone" button is enabled when: * A clone source is uniquely identified, by GitHub `name/owner` or git URL; From 32b99f8ab5111b0b7e6c9b90c5f6a7d2674929b3 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Mon, 6 May 2019 13:56:54 -0400 Subject: [PATCH 07/15] Clone dialog mocks with protocol toggle --- docs/feature-requests/005-blank-slate.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index 3ad3c6027d..427f9a515c 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -91,17 +91,17 @@ The clone repository dialog begins in search mode. As you type within the text i Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: -clone dialog, GitHub mode +clone dialog, GitHub mode If the authenticated user cannot push to the chosen GitHub repository, the "fork" checkbox is pre-checked. While the "fork" checkbox is checked, the "fork destination" dropdown is also shown, populated with organizations to which the user belongs. Organizations within which the user does not has permission to create repositories are disabled with an explanatory suffix. The user's account is selected by default in the "fork destination" dropdown. The "upstream remote name" input is shown and populated with the value of the Atom config setting `github.upstreamRemoteName`. -clone dialog, fork checked +clone dialog, fork checked If the user already has push rights to a fork of the chosen repository, they are prompted to clone an existing fork instead. -clone dialog, existing forks +clone dialog, existing forks Clicking on an existing fork modifies the search query to select the chosen fork. From add566a89bb4ed9dc23826b7ed9e29e40d9dd627 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Mon, 6 May 2019 14:01:53 -0400 Subject: [PATCH 08/15] Document the behavior of the protocol radio button group. --- docs/feature-requests/005-blank-slate.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index 427f9a515c..d6f929cd09 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -93,6 +93,8 @@ Clicking on an entry in the search result list or entering the full clone URL of clone dialog, GitHub mode +The "protocol" toggle is initialized to match the value of the `github.preferredRemoteProtocol` config setting. If the protocol is changed, the setting is changed to match. + If the authenticated user cannot push to the chosen GitHub repository, the "fork" checkbox is pre-checked. While the "fork" checkbox is checked, the "fork destination" dropdown is also shown, populated with organizations to which the user belongs. Organizations within which the user does not has permission to create repositories are disabled with an explanatory suffix. The user's account is selected by default in the "fork destination" dropdown. The "upstream remote name" input is shown and populated with the value of the Atom config setting `github.upstreamRemoteName`. From 24e7f7436e0758827ec5c768ad1fed572c0d797e Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Mon, 6 May 2019 15:34:34 -0400 Subject: [PATCH 09/15] Connect and Create dialog mocks --- docs/feature-requests/005-blank-slate.md | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index d6f929cd09..a1682564a7 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -111,7 +111,7 @@ Clicking on an existing fork modifies the search query to select the chosen fork Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode: -clone-dialog-nongithub +clone dialog, non-GitHub ### Common behavior @@ -139,31 +139,26 @@ The connect repository dialog is similar to the [clone repository dialog](#clone The connect repository dialog begins in search mode. As you type within the text input, once more than three characters have been entered, repositories on GitHub matching the entered text appear in the result list below. Repositories may be identified by full clone URL, `owner/name` pair, or a unique substring of `owner/name`. -> TODO: connect repository, search results +connect dialog, search results ### GitHub clone mode Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: -> TODO: connect repository, GitHub clone mode +connect dialog, GitHub mode If the authenticated user cannot push to the chosen GitHub repository, the "fork" checkbox is pre-checked. While the "fork" checkbox is checked, the "fork destination" dropdown is also shown, populated with organizations to which the user belongs. Organizations within which the user does not has permission to create repositories are disabled with an explanatory suffix. The user's account is selected by default in the "fork destination" dropdown. The "upstream remote name" input is shown and populated with the value of the Atom config setting `github.upstreamRemoteName`. -> TODO: connect repository, GitHub clone mode, fork destination selection: no existing forks - -If the user already has push rights to a fork of the chosen repository, they are prompted to clone an existing fork instead. - -> TODO: connect repository, GitHub clone mode, fork destination selection: existing forks - -Clicking on an existing fork modifies the search query to select the chosen fork. +If the user already has push rights to a fork of the chosen repository, they are prompted to clone an existing fork instead. Clicking on an existing fork modifies the search query to select the chosen fork. ### Non-GitHub clone mode Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode: -> TODO: connect repository, non-GitHub clone mode +connect dialog, non-GitHub + ### Common behavior @@ -189,7 +184,7 @@ The create repository dialog may be opened in either "no local repository" mode ### "No local repository" mode -> TODO: create repository, "no local repository" mode +create The "owner" drop-down is populated with the user's account name and the list of organizations to which the authenticated user belongs. Organizations to which the user has insufficient permissions to create repositories are disabled with an explanatory suffix. @@ -258,7 +253,7 @@ We could open dotcom for repository creation, but then we would have no way to s This effort should not include: -* GitHub enterprise support. (:sad:) We have separate issues ([#270](https://github.com/atom/github/issues/270), [#919](https://github.com/atom/github/issues/919)) to track that, although this does complicate its eventual implementation, because the clone and create dialogs need to be Enterprise-aware. +* GitHub enterprise support. ( :sad: ) We have separate issues ([#270](https://github.com/atom/github/issues/270), [#919](https://github.com/atom/github/issues/919)) to track that, although this does complicate its eventual implementation, because the clone and create dialogs need to be Enterprise-aware. * General remote management ([#555](https://github.com/atom/github/issues/555)). ## :construction: Implementation phases From 67b33917685568956c3e1547a48c0a73831e8963 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Mon, 6 May 2019 15:35:34 -0400 Subject: [PATCH 10/15] Remove missing create dialog controls. --- docs/feature-requests/005-blank-slate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index a1682564a7..cc38b0448c 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -196,7 +196,7 @@ The clone destination path is pre-populated with the directory specified as `cor Clicking the "Create" button: -* Creates a repository on GitHub with the chosen owner, name, description, README, `.gitignore`, and license templates. +* Creates a repository on GitHub with the chosen owner and name. * Clones the newly created repository to the clone destination path with its source remote set to the source remote name. * Adds the clone destination path as a project root. * Ensures that the clone destination path is the active GitHub package context. From 5890d54e9b6cb5eedabfc299fd626609cff70ade Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Fri, 12 Jul 2019 13:15:16 -0500 Subject: [PATCH 11/15] Replace the create dialog's local repo mode with a publish dialog --- docs/feature-requests/005-blank-slate.md | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index cc38b0448c..7765124491 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -52,7 +52,7 @@ We detect this state when the active repository is empty, meaning the current pr _Scenario:_ A user has begun a project locally and now wishes to put it under version control and share it on GitHub. -Clicking the "Create GitHub repository" button opens the [Create repository dialog](#create-repository-dialog) in "local repository" mode. +Clicking the "Publish GitHub repository" button opens the [Publish repository dialog](#publish-repository-dialog). ### Local repository, initialized, no dotcom remotes @@ -60,20 +60,11 @@ We detect this state when the active repository is present but has no dotcom rem github tab, local repository with no GitHub remotes - #### ...no dotcom repository _Scenario:_ A user has begun a project locally and now wishes to share it on GitHub. -Clicking the "Create GitHub repository" button opens the [Create repository dialog](#create-repository-dialog) panel in "local repository" mode. - -#### ...existing dotcom repository - -_Scenario:_ A user has a project cloned locally and it exists on GitHub. - -_Scenario:_ A user has a project cloned locally and it exists on GitHub, but they cannot push. Maybe they cloned the project before to read its source more easily, but now they wish to contribute. - -Clicking the "Connect GitHub repository" button opens the [Connect repository dialog](#connect-repository-dialog). +Clicking the "Create GitHub repository" button opens the [Create repository dialog](#create-repository-dialog). ### Local repository, initialized, dotcom remotes @@ -180,10 +171,6 @@ Clicking the "Connect" button: ## Create repository dialog -The create repository dialog may be opened in either "no local repository" mode or "local repository" mode. - -### "No local repository" mode - create The "owner" drop-down is populated with the user's account name and the list of organizations to which the authenticated user belongs. Organizations to which the user has insufficient permissions to create repositories are disabled with an explanatory suffix. @@ -202,11 +189,12 @@ Clicking the "Create" button: * Ensures that the clone destination path is the active GitHub package context. * Closes the "Create repository" dialog. -### "Local repository" mode +## Publish repository dialog + +> TODO: screenshot -The major difference in this mode is that certain controls are pre-populated with values from the state of the provided local repository. +The major difference between this dialog and the [Create repository dialog](#create-repository-dialog) is that the local repository's path is displayed above the owner and name controls. -* The "repository name" field is pre-populated with the directory name of the local repository's root directory. * The "source remote" field is invalid if a remote with the given name is already present in the local repository. Clicking the "Create" button also behaves slightly differently: From 29def99548719c4c7b143df30ba46589b72be8fb Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Fri, 12 Jul 2019 13:16:50 -0500 Subject: [PATCH 12/15] Remove forking and connect --- docs/feature-requests/005-blank-slate.md | 60 ++---------------------- 1 file changed, 4 insertions(+), 56 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index 7765124491..23f8fe6fa9 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -84,19 +84,11 @@ Clicking on an entry in the search result list or entering the full clone URL of clone dialog, GitHub mode -The "protocol" toggle is initialized to match the value of the `github.preferredRemoteProtocol` config setting. If the protocol is changed, the setting is changed to match. - -If the authenticated user cannot push to the chosen GitHub repository, the "fork" checkbox is pre-checked. - -While the "fork" checkbox is checked, the "fork destination" dropdown is also shown, populated with organizations to which the user belongs. Organizations within which the user does not has permission to create repositories are disabled with an explanatory suffix. The user's account is selected by default in the "fork destination" dropdown. The "upstream remote name" input is shown and populated with the value of the Atom config setting `github.upstreamRemoteName`. - -clone dialog, fork checked - -If the user already has push rights to a fork of the chosen repository, they are prompted to clone an existing fork instead. +Clicking the "advanced" arrow expands controls to customize cloning protocol and the created local remote name. -clone dialog, existing forks +> TODO: screenshot -Clicking on an existing fork modifies the search query to select the chosen fork. +The "protocol" toggle is initialized to match the value of the `github.preferredRemoteProtocol` config setting. If the protocol is changed, the setting is changed to match. ### Non-GitHub clone mode @@ -124,51 +116,6 @@ Clicking the "Clone" button: * Ensures that the clone destination is the active GitHub package context. * Closes the "Clone repository" dialog. -## Connect repository dialog - -The connect repository dialog is similar to the [clone repository dialog](#clone-repository-dialog), but omits the controls related to choosing a clone destination. - -The connect repository dialog begins in search mode. As you type within the text input, once more than three characters have been entered, repositories on GitHub matching the entered text appear in the result list below. Repositories may be identified by full clone URL, `owner/name` pair, or a unique substring of `owner/name`. - -connect dialog, search results - -### GitHub clone mode - -Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: - -connect dialog, GitHub mode - -If the authenticated user cannot push to the chosen GitHub repository, the "fork" checkbox is pre-checked. - -While the "fork" checkbox is checked, the "fork destination" dropdown is also shown, populated with organizations to which the user belongs. Organizations within which the user does not has permission to create repositories are disabled with an explanatory suffix. The user's account is selected by default in the "fork destination" dropdown. The "upstream remote name" input is shown and populated with the value of the Atom config setting `github.upstreamRemoteName`. - -If the user already has push rights to a fork of the chosen repository, they are prompted to clone an existing fork instead. Clicking on an existing fork modifies the search query to select the chosen fork. - -### Non-GitHub clone mode - -Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode: - -connect dialog, non-GitHub - - -### Common behavior - -The "remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. - -The "Connect" button is enabled when: - -* A remote source is uniquely identified, by GitHub `name/owner` or git URL; -* The "remote name" input is populated with a valid git remote name; -* The fork checkbox is unchecked, or it is checked, an enabled fork destination is chosen from the dropdown, and the "upstream remote name" input is populated with a valid git remote name. - -Clicking the "Connect" button: - -* If the fork checkbox is checked, forks the repository to the chosen fork destination. -* Adds the chosen repository or the newly created fork as a remote with the chosen remote name. -* If the fork checkbox was checked, adds the fork source as a remote with the chosen upstream remote name. -* Ensures that the connected local repository is the active GitHub package context. -* Closes the "Connect repository" dialog. - ## Create repository dialog create @@ -242,6 +189,7 @@ We could open dotcom for repository creation, but then we would have no way to s This effort should not include: * GitHub enterprise support. ( :sad: ) We have separate issues ([#270](https://github.com/atom/github/issues/270), [#919](https://github.com/atom/github/issues/919)) to track that, although this does complicate its eventual implementation, because the clone and create dialogs need to be Enterprise-aware. +* Workflows related to fork creation and management. * General remote management ([#555](https://github.com/atom/github/issues/555)). ## :construction: Implementation phases From 9b467ffec21ee12d5e8f2699ebef6d8c4fec03a1 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Fri, 12 Jul 2019 13:16:59 -0500 Subject: [PATCH 13/15] Describe the "advanced" details element --- docs/feature-requests/005-blank-slate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index 23f8fe6fa9..5f2651b52b 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -124,7 +124,7 @@ The "owner" drop-down is populated with the user's account name and the list of The "repository name" field is initially empty and focused. As the user types, an error message appears if a repository with the chosen name and owner already exists. -The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. +Clicking the "advanced" arrow expands controls to customize cloning protocol and the created local remote name. The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists, the path is considered invalid and an error message is shown. From 0ece94ede07e7c060b1c3f26b17b81ea854c8d12 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 16 Jul 2019 09:33:28 -0400 Subject: [PATCH 14/15] Directory selection buttons --- docs/feature-requests/005-blank-slate.md | 37 ++++++++++++------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index 5f2651b52b..aa9f3404b6 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -34,19 +34,19 @@ We detect this state when the active repository is absent, meaning there are no _Scenario:_ A user wants to start a new project published on GitHub. -Clicking the "Create GitHub repository" button opens the [Create repository dialog](#create-repository-dialog) in "no local repository" mode. +Clicking the "Create a new GitHub repository" button opens the [Create repository dialog](#create-repository-dialog). #### ...existing dotcom repository _Scenario:_ A user wishes to contribute to a project that exists on GitHub, but does not yet have a clone on their local machine. Perhaps a friend or co-worker created the repository and they wish to collaborate, or they're working on a personal project on a different machine, or there is an open-source repository they wish to contribute to. -Clicking the "Clone GitHub repository" button opens the [Clone repository dialog](#clone-repository-dialog). +Clicking the "Clone an existing GitHub repository" button opens the [Clone repository dialog](#clone-repository-dialog). ### Local repository, uninitialized We detect this state when the active repository is empty, meaning the current project root has no Git repository. -github tab, local repository is uninitialized +local-uninitialized #### ...no dotcom repository @@ -58,13 +58,13 @@ Clicking the "Publish GitHub repository" button opens the [Publish repository di We detect this state when the active repository is present but has no dotcom remotes. -github tab, local repository with no GitHub remotes +github tab, local repository with no GitHub remotes #### ...no dotcom repository _Scenario:_ A user has begun a project locally and now wishes to share it on GitHub. -Clicking the "Create GitHub repository" button opens the [Create repository dialog](#create-repository-dialog). +Clicking the "Publish on GitHub" button opens the [Publish repository dialog](#publish-repository-dialog). ### Local repository, initialized, dotcom remotes @@ -82,31 +82,30 @@ The clone repository dialog begins in search mode. As you type within the text i Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: -clone dialog, GitHub mode +clone dialog, GitHub mode Clicking the "advanced" arrow expands controls to customize cloning protocol and the created local remote name. -> TODO: screenshot +clone dialog, GitHub mode, advanced section expanded The "protocol" toggle is initialized to match the value of the `github.preferredRemoteProtocol` config setting. If the protocol is changed, the setting is changed to match. ### Non-GitHub clone mode -Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode: +Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode. Clicking the "advanced" arrow expands controls to customize the created local remote name. (The cloning protocol is inferred from the source URL.) -clone dialog, non-GitHub +clone dialog, non-GitHub ### Common behavior The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. -The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists, the path is considered invalid and an error message is shown. +The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists and is nonempty, or is not writable by the current user, the path is considered invalid and an error message is shown. Clicking the button to the right of the destination path text field opens a system directory selection or creation dialog that populates the clone destination path with on accept. The "Clone" button is enabled when: * A clone source is uniquely identified, by GitHub `name/owner` or git URL; * The "source remote name" input is populated with a valid git remote name; -* The fork checkbox is unchecked, or it is checked, an enabled fork destination is chosen from the dropdown, and the "upstream remote name" input is populated with a valid git remote name. * A valid path is entered within the clone destination path input. Clicking the "Clone" button: @@ -118,15 +117,15 @@ Clicking the "Clone" button: ## Create repository dialog -create +create dialog The "owner" drop-down is populated with the user's account name and the list of organizations to which the authenticated user belongs. Organizations to which the user has insufficient permissions to create repositories are disabled with an explanatory suffix. The "repository name" field is initially empty and focused. As the user types, an error message appears if a repository with the chosen name and owner already exists. -Clicking the "advanced" arrow expands controls to customize cloning protocol and the created local remote name. The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. +The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists and is nonempty, or is unwritable by the current user, the path is considered invalid and an error message is shown. Clicking the button to the right of the destination path text field opens a system directory selection or creation dialog that populates the clone destination path with on accept. -The clone destination path is pre-populated with the directory specified as `core.projectHome` in the user's Atom settings joined with the repository name. If the destination directory already exists, the path is considered invalid and an error message is shown. +Clicking the "advanced" arrow expands controls to customize cloning protocol and the created local remote name. The "source remote name" input is pre-populated with the value of the Atom setting `github.cloneSourceRemoteName`. If it's changed to be empty, or to contain characters that are not valid in a git remote name, an error message is shown. Clicking the "Create" button: @@ -138,21 +137,21 @@ Clicking the "Create" button: ## Publish repository dialog -> TODO: screenshot +publish dialog -The major difference between this dialog and the [Create repository dialog](#create-repository-dialog) is that the local repository's path is displayed above the owner and name controls. +The major difference between this dialog and the [Create repository dialog](#create-repository-dialog) is that the local repository's path is displayed in a read-only input field and the directory selection button is disabled. * The "source remote" field is invalid if a remote with the given name is already present in the local repository. -Clicking the "Create" button also behaves slightly differently: +Clicking the "Publish" button also behaves slightly differently from the "Create" button: * Initializes a git repository in the local repository path if it is not already a git repository. -* Creates a repository on GitHub with the chosen owner, name, and description. +* Creates a repository on GitHub with the chosen owner and name. * Adds a remote with the specified "source remote name" and sets it to the clone URL of the newly created repository, respecting the https/ssh toggle. * If a branch called `master` is present in the local repository, its push and fetch upstreams are configured to be the source remote. * The local repository path is added as a project root if it is not already present. * Ensures that the clone destination path is the active GitHub package context. -* Closes the "Create repository" dialog. +* Closes the "Publish repository" dialog. ## Improved branch publish behavior From 76571cd819683614f7743e10e59d7d83de6e9565 Mon Sep 17 00:00:00 2001 From: Ash Wilson Date: Tue, 16 Jul 2019 10:25:16 -0400 Subject: [PATCH 15/15] Screenshots with GitHub repository mark --- docs/feature-requests/005-blank-slate.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/feature-requests/005-blank-slate.md b/docs/feature-requests/005-blank-slate.md index aa9f3404b6..40b0b6d9cc 100644 --- a/docs/feature-requests/005-blank-slate.md +++ b/docs/feature-requests/005-blank-slate.md @@ -82,11 +82,11 @@ The clone repository dialog begins in search mode. As you type within the text i Clicking on an entry in the search result list or entering the full clone URL of a GitHub repository changes the dialog to "GitHub clone" mode: -clone dialog, GitHub mode +clone dialog, GitHub mode Clicking the "advanced" arrow expands controls to customize cloning protocol and the created local remote name. -clone dialog, GitHub mode, advanced section expanded +clone dialog, GitHub mode, advanced section expanded The "protocol" toggle is initialized to match the value of the `github.preferredRemoteProtocol` config setting. If the protocol is changed, the setting is changed to match. @@ -94,7 +94,7 @@ The "protocol" toggle is initialized to match the value of the `github.preferred Entering the full clone URL of a non-GitHub repository changes the dialog to "non-GitHub clone" mode. Clicking the "advanced" arrow expands controls to customize the created local remote name. (The cloning protocol is inferred from the source URL.) -clone dialog, non-GitHub +clone dialog, non-GitHub mode ### Common behavior