From eb215425bb3b2eb480916e98968a0f8c0375d988 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Wed, 26 Jul 2023 13:52:37 +0100 Subject: [PATCH 1/7] Use header for the different repo models Since there is quite a lot of text, put under actual headings rather than as part of the bullet point list --- _episodes/41-code-review.md | 52 +++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index 15b8c7fd5..d04791690 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -30,29 +30,35 @@ and improve our code by engaging in code review process with other team members. > the type of development model you use in your project. > Two commonly used models are: > -> - **fork and pull model** - -> where anyone can **fork** an existing repository -> (to create their copy of the project linked to the source) -> and push changes to their personal fork. -> A contributor can work independently on their own fork as they do not need -> permissions on the source repository to push modifications to a fork they own. -> The changes from contributors can then be **pulled** into the source repository -> by the project maintainer on request and after a code review process. -> This model is popular with open source projects as it -> reduces the start up costs for new contributors -> and allows them to work independently without upfront coordination -> with source project maintainers. -> So, for example, you may use this model when you are an external collaborator on a project -> rather than a core team member. -> - **shared repository model** - -> where collaborators are granted push access to a single shared code repository. -> Even though collaborators have write access to the main development and production branches, -> the best practice of creating feature branches for new developments -> and when changes need to be made is still followed. -> This is to enable easier testing of the new code -> and initiate code review and general discussion about a set of changes -> before they are merged into the development branch. -> This model is more prevalent with teams and organisations collaborating on private projects. +> * Fork and pull model +> * Shared repository model +> +> ### Fork and Pull Model +> +> Where anyone can **fork** an existing repository +> (to create their copy of the project linked to the source) +> and push changes to their personal fork. +> A contributor can work independently on their own fork as they do not need +> permissions on the source repository to push modifications to a fork they own. +> The changes from contributors can then be **pulled** into the source repository +> by the project maintainer on request and after a code review process. +> This model is popular with open source projects as it +> reduces the start up costs for new contributors +> and allows them to work independently without upfront coordination +> with source project maintainers. +> So, for example, you may use this model when you are an external collaborator on a project +> rather than a core team member. +> +> ### Shared Repository Model +> +> Where collaborators are granted push access to a single shared code repository. +> Even though collaborators have write access to the main development and production branches, +> the best practice of creating feature branches for new developments +> and when changes need to be made is still followed. +> This is to enable easier testing of the new code +> and initiate code review and general discussion about a set of changes +> before they are merged into the development branch. +> This model is more prevalent with teams and organisations collaborating on private projects. {: .callout} Regardless of the collaborative code development model you and your collaborators use - From 1c86412bc1f98f12b067d2afc3d179cc635551a5 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Wed, 26 Jul 2023 13:55:30 +0100 Subject: [PATCH 2/7] Add information for protecting the main branch These instructions mean that on a shared repository the pull request system must be used. This prevents accidentally pushing to the main branch, as well as ensuring people get into the habbit of raising pull requests for their changes. --- _episodes/41-code-review.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index d04791690..fadea87df 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -52,13 +52,26 @@ and improve our code by engaging in code review process with other team members. > ### Shared Repository Model > > Where collaborators are granted push access to a single shared code repository. -> Even though collaborators have write access to the main development and production branches, -> the best practice of creating feature branches for new developments -> and when changes need to be made is still followed. +> By default, collaborators have write access to the main branch. +> However, best practises is to create feature branches for new developments, +> and protect the main branch. > This is to enable easier testing of the new code > and initiate code review and general discussion about a set of changes > before they are merged into the development branch. > This model is more prevalent with teams and organisations collaborating on private projects. +> It also helps to keep the main branch stable, making it easier for other developers to work on the code. +> +> To protect the main branch in GitHub, go to the repository settings, select `Branches`. +> Click `Add Rule`. Type in the name of your main branch (e.g. `main` and/or `develop`). +> Tick the check box saying require pull requests. This will ensure all changes to the +> branch are done via a pull request. +> +> It is recomended to also tick `Require approvals` and `Require status checks before merging`. +> The first means someone besides the person who raised the pull request will need to approve the change. +> The second ensures that CI has run succesfully before allowing the changes to be made. +> +> See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). + {: .callout} Regardless of the collaborative code development model you and your collaborators use - From 354495be6c7893c510e2bd22f85333b736055475 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Wed, 26 Jul 2023 13:57:52 +0100 Subject: [PATCH 3/7] Add screenshot demonstrating setting branch proection --- _episodes/41-code-review.md | 2 ++ fig/github-branch-protection-settings.png | Bin 0 -> 67401 bytes 2 files changed, 2 insertions(+) create mode 100644 fig/github-branch-protection-settings.png diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index fadea87df..d2067db35 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -66,6 +66,8 @@ and improve our code by engaging in code review process with other team members. > Tick the check box saying require pull requests. This will ensure all changes to the > branch are done via a pull request. > +> ![GitHub add a branch protection rule settings screen with recommended settings enabled for a branch called main](../fig/github-branch-protection-settings.png) +> > It is recomended to also tick `Require approvals` and `Require status checks before merging`. > The first means someone besides the person who raised the pull request will need to approve the change. > The second ensures that CI has run succesfully before allowing the changes to be made. diff --git a/fig/github-branch-protection-settings.png b/fig/github-branch-protection-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3434a7fc93f173437273d266855d7589f269d5 GIT binary patch literal 67401 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 S%ln;C%SkIsl}LQ}{J#K^t66{m literal 0 HcmV?d00001 From 3feff14c46a2f49abd4d77a2b85f94eee92d64e1 Mon Sep 17 00:00:00 2001 From: Thomas Kiley <138868636+thomaskileyukaea@users.noreply.github.com> Date: Fri, 4 Aug 2023 10:23:05 +0100 Subject: [PATCH 4/7] Amend words to flow better now collaborative development models isn't a list Co-authored-by: Aleksandra Nenadic --- _episodes/41-code-review.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index d2067db35..c21e56d82 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -35,7 +35,7 @@ and improve our code by engaging in code review process with other team members. > > ### Fork and Pull Model > -> Where anyone can **fork** an existing repository +> In this model, anyone can **fork** an existing repository > (to create their copy of the project linked to the source) > and push changes to their personal fork. > A contributor can work independently on their own fork as they do not need @@ -51,7 +51,7 @@ and improve our code by engaging in code review process with other team members. > > ### Shared Repository Model > -> Where collaborators are granted push access to a single shared code repository. +> In this model, collaborators are granted push access to a single shared code repository. > By default, collaborators have write access to the main branch. > However, best practises is to create feature branches for new developments, > and protect the main branch. From fd2d772fcc1b8019fa00f2f93648949665d76c6f Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 10:43:54 +0100 Subject: [PATCH 5/7] Fix callout box --- _episodes/41-code-review.md | 1 - 1 file changed, 1 deletion(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index c21e56d82..13e2e4d2b 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -73,7 +73,6 @@ and improve our code by engaging in code review process with other team members. > The second ensures that CI has run succesfully before allowing the changes to be made. > > See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). - {: .callout} Regardless of the collaborative code development model you and your collaborators use - From a2187b2b312955783f7e43023f0861dc6dffa5f0 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 10:44:10 +0100 Subject: [PATCH 6/7] Fix spelling typos --- _episodes/41-code-review.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index 13e2e4d2b..f0d774e98 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -53,12 +53,12 @@ and improve our code by engaging in code review process with other team members. > > In this model, collaborators are granted push access to a single shared code repository. > By default, collaborators have write access to the main branch. -> However, best practises is to create feature branches for new developments, +> However, it is best practice to create feature branches for new developments, > and protect the main branch. > This is to enable easier testing of the new code > and initiate code review and general discussion about a set of changes > before they are merged into the development branch. -> This model is more prevalent with teams and organisations collaborating on private projects. +> This model is more prevalent with teams and organizations collaborating on private projects. > It also helps to keep the main branch stable, making it easier for other developers to work on the code. > > To protect the main branch in GitHub, go to the repository settings, select `Branches`. @@ -68,9 +68,9 @@ and improve our code by engaging in code review process with other team members. > > ![GitHub add a branch protection rule settings screen with recommended settings enabled for a branch called main](../fig/github-branch-protection-settings.png) > -> It is recomended to also tick `Require approvals` and `Require status checks before merging`. +> It is recommended to also tick `Require approvals` and `Require status checks before merging`. > The first means someone besides the person who raised the pull request will need to approve the change. -> The second ensures that CI has run succesfully before allowing the changes to be made. +> The second ensures that CI has run successWfully before allowing the changes to be made. > > See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). {: .callout} From 0b385a84189d04df397bc6dca386ba79c4951630 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 10:54:50 +0100 Subject: [PATCH 7/7] Remove fork and pull from the pullout box --- _episodes/41-code-review.md | 97 ++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index f0d774e98..c6d4ac223 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -25,55 +25,54 @@ Software is often designed and built as part of a team, so in this episode we'll be looking at how to manage the process of team software development and improve our code by engaging in code review process with other team members. -> ## Collaborative Code Development Models -> The way your team provides contributions to the shared codebase depends on -> the type of development model you use in your project. -> Two commonly used models are: -> -> * Fork and pull model -> * Shared repository model -> -> ### Fork and Pull Model -> -> In this model, anyone can **fork** an existing repository -> (to create their copy of the project linked to the source) -> and push changes to their personal fork. -> A contributor can work independently on their own fork as they do not need -> permissions on the source repository to push modifications to a fork they own. -> The changes from contributors can then be **pulled** into the source repository -> by the project maintainer on request and after a code review process. -> This model is popular with open source projects as it -> reduces the start up costs for new contributors -> and allows them to work independently without upfront coordination -> with source project maintainers. -> So, for example, you may use this model when you are an external collaborator on a project -> rather than a core team member. -> -> ### Shared Repository Model -> -> In this model, collaborators are granted push access to a single shared code repository. -> By default, collaborators have write access to the main branch. -> However, it is best practice to create feature branches for new developments, -> and protect the main branch. -> This is to enable easier testing of the new code -> and initiate code review and general discussion about a set of changes -> before they are merged into the development branch. -> This model is more prevalent with teams and organizations collaborating on private projects. -> It also helps to keep the main branch stable, making it easier for other developers to work on the code. -> -> To protect the main branch in GitHub, go to the repository settings, select `Branches`. -> Click `Add Rule`. Type in the name of your main branch (e.g. `main` and/or `develop`). -> Tick the check box saying require pull requests. This will ensure all changes to the -> branch are done via a pull request. -> -> ![GitHub add a branch protection rule settings screen with recommended settings enabled for a branch called main](../fig/github-branch-protection-settings.png) -> -> It is recommended to also tick `Require approvals` and `Require status checks before merging`. -> The first means someone besides the person who raised the pull request will need to approve the change. -> The second ensures that CI has run successWfully before allowing the changes to be made. -> -> See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). -{: .callout} +## Collaborative Code Development Models +The way your team provides contributions to the shared codebase depends on +the type of development model you use in your project. +Two commonly used models are: + + * Fork and pull model + * Shared repository model + +### Fork and Pull Model + +In this model, anyone can **fork** an existing repository +(to create their copy of the project linked to the source) +and push changes to their personal fork. +A contributor can work independently on their own fork as they do not need +permissions on the source repository to push modifications to a fork they own. +The changes from contributors can then be **pulled** into the source repository +by the project maintainer on request and after a code review process. +This model is popular with open source projects as it +reduces the start up costs for new contributors +and allows them to work independently without upfront coordination +with source project maintainers. +So, for example, you may use this model when you are an external collaborator on a project +rather than a core team member. + +### Shared Repository Model + +In this model, collaborators are granted push access to a single shared code repository. +By default, collaborators have write access to the main branch. +However, it is best practice to create feature branches for new developments, +and protect the main branch. +This is to enable easier testing of the new code +and initiate code review and general discussion about a set of changes +before they are merged into the development branch. +This model is more prevalent with teams and organizations collaborating on private projects. +It also helps to keep the main branch stable, making it easier for other developers to work on the code. + +To protect the main branch in GitHub, go to the repository settings, select `Branches`. +Click `Add Rule`. Type in the name of your main branch (e.g. `main` and/or `develop`). +Tick the check box saying require pull requests. This will ensure all changes to the +branch are done via a pull request. + +![GitHub add a branch protection rule settings screen with recommended settings enabled for a branch called main](../fig/github-branch-protection-settings.png) + +It is recommended to also tick `Require approvals` and `Require status checks before merging`. +The first means someone besides the person who raised the pull request will need to approve the change. +The second ensures that CI has run successWfully before allowing the changes to be made. + +See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). Regardless of the collaborative code development model you and your collaborators use - code reviews are one of the widely accepted best practices for software development in teams