From 63a6fa98d350731d270afaad9c7a6a777f4e36aa Mon Sep 17 00:00:00 2001 From: Sarah Schneider Date: Wed, 9 Dec 2020 20:19:40 -0500 Subject: [PATCH 01/14] use release_candidate instead of start date if present --- script/update-enterprise-dates.js | 88 +++++++++---------------------- 1 file changed, 26 insertions(+), 62 deletions(-) diff --git a/script/update-enterprise-dates.js b/script/update-enterprise-dates.js index 9f3c67f972..9eeffbed27 100755 --- a/script/update-enterprise-dates.js +++ b/script/update-enterprise-dates.js @@ -1,79 +1,43 @@ #!/usr/bin/env node -const github = require('../lib/github') +const { getContents } = require('../lib/git-utils') const fs = require('fs') const path = require('path') -const filename = path.join(__dirname, '../lib/enterprise-dates.json') -const jsonFile = require(filename) +const enterpriseDatesFile = path.join(__dirname, '../lib/enterprise-dates.json') +const enterpriseDatesString = fs.readFileSync(enterpriseDatesFile, 'utf8') // [start-readme] // -// Run this script during Enterprise releases and deprecations. -// It uses the GitHub API to get dates from enterprise-releases and updates `lib/enterprise-dates.json`. -// The help site uses this JSON to display dates at the top of some Enterprise versions. -// -// This script requires that you have a GitHub Personal Access Token in a `.env` file. -// If you don't have a token, get one [here](https://github.com/settings/tokens/new?scopes=repo&description=docs-dev). -// If you don't have an `.env` file in your docs checkout, run this command in Terminal: -// -// `cp .env.example .env` -// -// Open the `.env` file in a text editor, and find the `GITHUB_TOKEN=` placeholder. Add your token after the equals sign. -// -// Do not commit the `.env` file; just leave it in your checkout. +// This script fetches data from https://github.com/github/enterprise-releases/blob/master/releases.json +// and updates `lib/enterprise-dates.json`, which the site uses for various functionality. // // [end-readme] +// check for required PAT +if (!process.env.GITHUB_TOKEN) { + console.error('Error! You must have a GITHUB_TOKEN set in an .env file to run this script.') + process.exit(1) +} + main() -// GHE Release Lifecycle Dates async function main () { - let raw - try { - raw = await getDataFromReleasesRepo() - } catch (err) { - console.log('error getting JSON from enterprise-releases repo') - throw (err) - } - const json = prepareData(raw) - if (json === prettify(jsonFile)) { + const rawDates = JSON.parse(await getContents('github', 'enterprise-releases', 'master', 'releases.json')) + + const formattedDates = {} + Object.entries(rawDates).forEach(([releaseNumber, releaseObject]) => { + formattedDates[releaseNumber] = { + releaseDate: releaseObject.release_candidate || releaseObject.start, + deprecationDate: releaseObject.end + } + }) + + const formattedDatesString = JSON.stringify(formattedDates, null, 2) + + if (formattedDatesString === enterpriseDatesString) { console.log('This repo is already in sync with enterprise-releases!') } else { - fs.writeFileSync(filename, json, 'utf8') - console.log(`${filename} has been updated!`) + fs.writeFileSync(enterpriseDatesFile, formattedDatesString) + console.log(`${enterpriseDatesFile} has been updated!`) } } - -// Uses https://octokit.github.io/rest.js/#api-Repos-getContents -async function getDataFromReleasesRepo () { - const octokit = github() - const { data } = await octokit.repos.getContents({ - owner: 'github', - repo: 'enterprise-releases', - path: 'releases.json', - ref: 'master', - headers: { accept: 'application/vnd.github.v3.raw+json' } - }) - return data -} - -// We only need some of the values from the source JSON -// We use https://github.com/zeke/browser-date-formatter on the client side to reformat the dates -function prepareData (raw) { - const data = Object.entries(JSON.parse(raw)) - const obj = {} - data.forEach(versions => { - const datesObj = {} - const version = versions[0] - const releaseDate = versions[1].start - const deprecationDate = versions[1].end - datesObj.releaseDate = releaseDate - datesObj.deprecationDate = deprecationDate - obj[version] = datesObj - }) - return prettify(obj) -} - -function prettify (json) { - return JSON.stringify(json, null, 2) -} From fa2b8b69dc58764d0a6bbfa51c06d7f40a01c71d Mon Sep 17 00:00:00 2001 From: Sarah Schneider Date: Wed, 9 Dec 2020 20:26:36 -0500 Subject: [PATCH 02/14] ran script/update-enterprise-dates.js --- lib/enterprise-dates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/enterprise-dates.json b/lib/enterprise-dates.json index d5724da995..b397abfbba 100644 --- a/lib/enterprise-dates.json +++ b/lib/enterprise-dates.json @@ -92,7 +92,7 @@ "deprecationDate": "2021-09-23" }, "3.0": { - "releaseDate": "2020-12-08", + "releaseDate": "2020-12-16", "deprecationDate": "2021-12-08" } } \ No newline at end of file From 4275c87be0c9cec414c0ec8d917b5e2f3f526dba Mon Sep 17 00:00:00 2001 From: Sarah Schneider Date: Wed, 9 Dec 2020 20:29:40 -0500 Subject: [PATCH 03/14] add comment --- script/update-enterprise-dates.js | 1 + 1 file changed, 1 insertion(+) diff --git a/script/update-enterprise-dates.js b/script/update-enterprise-dates.js index 9eeffbed27..9bdeb549f1 100755 --- a/script/update-enterprise-dates.js +++ b/script/update-enterprise-dates.js @@ -22,6 +22,7 @@ if (!process.env.GITHUB_TOKEN) { main() async function main () { + // send owner, repo, ref, path const rawDates = JSON.parse(await getContents('github', 'enterprise-releases', 'master', 'releases.json')) const formattedDates = {} From e0c929c13f770859a228bff9606d2eb4cab9fc79 Mon Sep 17 00:00:00 2001 From: Sarah Schneider Date: Wed, 9 Dec 2020 21:13:11 -0500 Subject: [PATCH 04/14] add exclusion --- tests/meta/repository-references.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/meta/repository-references.js b/tests/meta/repository-references.js index 9df0e07888..518ad3e735 100644 --- a/tests/meta/repository-references.js +++ b/tests/meta/repository-references.js @@ -15,6 +15,7 @@ const ALLOW_LIST = new Set([ 'platform-samples', 'github-services', 'explore', + 'enterprise-releases', 'markup', 'hubot', 'VisualStudio', From 01fb8ded1a2cf2c34db125c6e7a3b4e2989dfbb8 Mon Sep 17 00:00:00 2001 From: Tom Corbett <61699716+tom-corbett@users.noreply.github.com> Date: Mon, 14 Dec 2020 13:14:28 -0600 Subject: [PATCH 05/14] Updates to Actions and Packages provisions (#16409) * Updates to Actions and Packages provisions * Update github-additional-product-terms.md * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Lucas Costi * Update github-additional-product-terms.md * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Lucas Costi * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Lucas Costi * Update github-additional-product-terms.md * restored acceptable use language * fixed bug bounty link * fixed AUP link * Update github-additional-product-terms.md * Update github-additional-product-terms.md * Update github-additional-product-terms.md * Update github-additional-product-terms.md * Update github-additional-product-terms.md * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Abby Vollmer * Update github-additional-product-terms.md * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Lucas Costi * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Lucas Costi * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Lucas Costi * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Lucas Costi * Update content/github/site-policy/github-additional-product-terms.md * Update content/github/site-policy/github-additional-product-terms.md Co-authored-by: Lucas Costi Co-authored-by: Abby Vollmer --- .../github-additional-product-terms.md | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/content/github/site-policy/github-additional-product-terms.md b/content/github/site-policy/github-additional-product-terms.md index e1ce46499d..2fc91b9817 100644 --- a/content/github/site-policy/github-additional-product-terms.md +++ b/content/github/site-policy/github-additional-product-terms.md @@ -4,7 +4,7 @@ versions: free-pro-team: '*' --- -Version Effective Date: December 7, 2020 +Version Effective Date: December 14, 2020 When you create an Account, you're given access to lots of different features and products that are all a part of the Service. Because many of these features and products offer different functionality, they may require additional terms and conditions specific to that feature or product. Below, we've listed those features and products, along with the corresponding additional terms that apply to your use of them. @@ -46,13 +46,11 @@ GitHub Pages are subject to some specific bandwidth and usage limits, and may no ### 5. Actions and Packages #### a. Actions Usage -GitHub Actions enables you to create custom software development lifecycle workflows directly in your GitHub repository. Each Account comes with included compute and storage quantities for use with Actions, depending on your Account plan, which can be found in the [Actions documentation](/actions). Your Actions compute usage is displayed within [your account settings](https://github.com/settings/billing), and you will be notified by email in advance of reaching the limit of your included quantities. If you want to use Actions beyond your included quantities, then you may [enable overages](/github/setting-up-and-managing-billing-and-payments-on-github/about-billing-for-github-actions). +GitHub Actions is billed on a usage basis. The [Actions documentation](/actions) includes details, including compute and storage quantities (depending on your Account plan), and how to monitor your Actions minutes usage and set usage limits. -Compute usage for included and paid quantities is calculated in minutes based on the type of Actions you execute (e.g. Linux, Windows, macOS). The minutes used for each Action's job or task will be rounded up to the nearest minute. For included quantities and depending on the type of Action, a multiplier may be applied to the amount of time used to execute each job or task, prior to being rounded up to the nearest minute. Overage minutes are charged at the [stated per minute price](https://github.com/features/actions) based on the type of Actions you execute. Actions and Packages share storage, and your storage usage is displayed within your [account settings](https://github.com/settings/billing). For additional details about included quantity usage calculations, see the [Actions documentation](/actions). - -Actions and any elements of the Action service may not be used in violation of the Agreement, the [Acceptable Use Policy](/github/site-policy/github-acceptable-use-policies), or the GitHub Actions [service limitations](/actions/reference/usage-limits-billing-and-administration/#usage-limits). Additionally, Actions should not be used for: +Actions and any elements of the Actions service may not be used in violation of the Agreement, the [GitHub Acceptable Use Polices](/github/site-policy/github-acceptable-use-policies), or the GitHub Actions service limitations set forth in the [Actions documentation](/actions). Additionally, Actions should not be used for: - cryptomining; -- using our servers to disrupt, or to gain or to attempt to gain unauthorized access to, any service, device, data, account or network (other than those authorized by the [GitHub Bug Bounty program](https://bounty.github.com)) +- using our servers to disrupt, or to gain or to attempt to gain unauthorized access to, any service, device, data, account, or network (other than those authorized by the [GitHub Bug Bounty program](https://bounty.github.com)); - the provision of a stand-alone or integrated application or service offering Actions or any elements of Actions for commercial purposes; - any activity that places a burden on our servers, where that burden is disproportionate to the benefits provided to users (for example, don't use Actions as a content delivery network or as part of a serverless application, but a low benefit Action could be ok if it’s also low burden); or - any other activity unrelated to the production, testing, deployment, or publication of the software project associated with the repository where GitHub Actions are used. @@ -60,16 +58,7 @@ Actions and any elements of the Action service may not be used in violation of t In order to prevent violations of these limitations and abuse of GitHub Actions, GitHub may monitor your use of GitHub Actions. Misuse of GitHub Actions may result in termination of jobs, or restrictions in your ability to use GitHub Actions. #### b. Packages Usage -GitHub Packages may be used to download, publish, and manage packages of Content. Each Account plan comes with included bandwidth and storage quantities for use with Packages, which can be found in the [Packages documentation](/github/managing-packages-with-github-package-registry/about-github-package-registry). Actions and Packages share storage between the two Service features. Storage and bandwidth usage are displayed within your [account settings](https://github.com/settings/billing), and you will be notified by email in advance of reaching the limit of your included quantities. If you want to use Packages beyond your included bandwidth and storage quantities, then you may [enable overages](/github/setting-up-and-managing-billing-and-payments-on-github/about-billing-for-github-packages). - -Bandwidth usage is calculated based on the amount of data transferred out of your repositories through Packages, but package transfers through Actions will not count toward your included or paid quantities. Packages bandwidth usage is limited by the [Acceptable Use Policy](/github/site-policy/github-acceptable-use-policies#7-excessive-bandwidth-use), and included bandwidth quantities are determined by your [account plan](https://github.com/pricing). - -Actions and Packages storage usage is shared between the two Service features. Storage usage is calculated as a weighted average over the course of the month and does not reset each month. Public and private repositories have different included storage quantities, and the included quantities for private repositories depend on your [account plan](https://github.com/pricing). - -#### c. Payment and Billing for Actions and Packages -Billing for Actions and Packages is usage-based. Additional quantities of Actions or Packages cannot be purchased separately. For monthly-billed customers, you must have a payment method on file to choose to pay for additional quantities of these Service features. You will be charged on a monthly, recurring basis based on your usage in the preceding month, unless you are billed by invoice. For invoiced customers, you must pay the fees within thirty (30) days of the GitHub invoice date. For customers paying for Service feature overages in advance, unused prepaid minutes will not roll over to the next billing period and will not be refunded. - -You can set a monthly spending limit in your [account settings](https://github.com/settings/billing/cost_management). You will be notified by email in advance of reaching the limit of your included quantities and the designated spending limit of your paid additional quantities. +GitHub Packages is billed on a usage basis. The [Packages documentation](/packages) includes details, including bandwidth and storage quantities (depending on your Account plan), and how to monitor your Packages usage and set usage limits. Packages bandwidth usage is limited by the [GitHub Acceptable Use Polices](/github/site-policy/github-acceptable-use-policies). ### 6. Learning Lab From 2538a79a7b012dd55e9a75537d8ddd09a5289991 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Mon, 14 Dec 2020 11:26:57 -0800 Subject: [PATCH 06/14] In old path redirects, freeze up sets we iterate over (#16916) --- lib/redirects/get-old-paths-from-permalink.js | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/redirects/get-old-paths-from-permalink.js b/lib/redirects/get-old-paths-from-permalink.js index 8bf521c691..a636d02667 100644 --- a/lib/redirects/get-old-paths-from-permalink.js +++ b/lib/redirects/get-old-paths-from-permalink.js @@ -56,7 +56,7 @@ module.exports = function getOldPathsFromPath (currentPath, languageCode, curren // ------ BEGIN MODERN VERSION FORMAT REPLACEMENTS ------// if (currentlySupportedVersions.includes(currentVersion) || versionSatisfiesRange(currentVersion, `>${lastReleaseWithLegacyFormat}`)) { - oldPaths.forEach(oldPath => { + (new Set(oldPaths)).forEach(oldPath => { // create old path /github from new path /free-pro-team@latest/github oldPaths.add(oldPath .replace(`/${nonEnterpriseDefaultVersion}`, '')) @@ -107,19 +107,22 @@ module.exports = function getOldPathsFromPath (currentPath, languageCode, curren // ------ END MODERN VERSION FORMAT REPLACEMENTS ------// // For each old path added to the set above, do the following... + (new Set(oldPaths)).forEach(oldPath => { + // for English only, remove language code + if (languageCode === 'en') { + oldPaths.add(getPathWithoutLanguage(oldPath)) + } - // add language code - oldPaths.forEach(oldPath => oldPaths.add(getPathWithLanguage(oldPath, languageCode))) + // add language code + oldPaths.add(getPathWithLanguage(oldPath, languageCode)) - // for English only, remove language code - if (languageCode === 'en') { - oldPaths.forEach(oldPath => oldPaths.add(getPathWithoutLanguage(oldPath))) - } + // create /enterprise from /enterprise/latest + oldPaths.add(oldPath.replace(`/enterprise/${latest}`, '/enterprise')) + }) - // create /enterprise from /enterprise/latest - oldPaths.forEach(oldPath => oldPaths.add(oldPath.replace(`/enterprise/${latest}`, '/enterprise'))) + // exclude any empty old paths that may have been derived + oldPaths.delete('') + oldPaths.delete('/') - return Array.from(oldPaths) - // exclude any empty old paths that may have been derived - .filter(oldPath => oldPath !== '' && oldPath !== '/') + return oldPaths } From 2ace9e8344852fcfa3e3301e69b8b810d5ad164a Mon Sep 17 00:00:00 2001 From: Sarah Schneider Date: Mon, 14 Dec 2020 14:35:48 -0500 Subject: [PATCH 07/14] do an initial lookup in find-page before checking versioned pages --- lib/find-page.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/find-page.js b/lib/find-page.js index f859c6db9f..03e2b10c9a 100644 --- a/lib/find-page.js +++ b/lib/find-page.js @@ -8,6 +8,10 @@ module.exports = function findPage (href, pageMap, redirects = {}, languageCode // remove trailing slash href = slash(href).replace(patterns.trailingSlash, '$1') + // do an initial lookup on the path as-is + let page = pageMap[removeFragment(href)] + if (page) return page + // check all potential versions const versionedPathsToCheck = [...new Set(allVersions.map(version => { return getVersionedPathWithLanguage(href, version, languageCode) @@ -22,8 +26,8 @@ module.exports = function findPage (href, pageMap, redirects = {}, languageCode // need to account for redirects again pathToPage = redirects[pathToPage] || pathToPage - // find the page - const page = pageMap[removeFragment(pathToPage)] + // try finding the page again + page = pageMap[removeFragment(pathToPage)] if (page) return page From 748a71598824699e635300ad5984c18a38fd2a5e Mon Sep 17 00:00:00 2001 From: Sarah Schneider Date: Mon, 14 Dec 2020 14:39:09 -0500 Subject: [PATCH 08/14] add language code to paths in site tree so we can find the pages immediately and not look up versioned paths each time --- lib/site-tree.js | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/lib/site-tree.js b/lib/site-tree.js index 0cef06329f..fdde23b02b 100644 --- a/lib/site-tree.js +++ b/lib/site-tree.js @@ -1,7 +1,7 @@ const path = require('path') const findPageInVersion = require('./find-page-in-version') const products = Object.values(require('../lib/all-products')) -const { getVersionedPathWithoutLanguage } = require('./path-utils') +const { getVersionedPathWithLanguage, getPathWithLanguage } = require('./path-utils') const languageCodes = Object.keys(require('./languages')) const addTitlesToTree = require('./site-tree-titles') const allVersions = Object.keys(require('./all-versions')) @@ -35,7 +35,8 @@ module.exports = async function buildSiteTree (pageMap, site, redirects) { return } - product.href = item.href + // we don't want versioned product links because these links already have a default version in them + product.href = getPathWithLanguage(item.href, languageCode) // find the product TOC page and get TOC items const page = findPageInVersion(item.href, pageMap, redirects, languageCode, version) @@ -43,7 +44,7 @@ module.exports = async function buildSiteTree (pageMap, site, redirects) { // skip if page can't be found in this version if (!page) return - product.categories = buildCategoriesTree(page.tocItems, item.href, pageMap, redirects, version, languageCode) + product.categories = buildCategoriesTree(page.tocItems, product.href, pageMap, redirects, version, languageCode) productTree[item.id] = product return null @@ -67,11 +68,12 @@ function buildCategoriesTree (tocItems, productHref, pageMap, redirects, version const categoryHref = path.join(productHref, item.href) - const versionedCategoryHref = getVersionedPathWithoutLanguage(categoryHref, version) + // we DO want versioned category links + const versionedCategoryHref = getVersionedPathWithLanguage(categoryHref, version, languageCode) category.href = versionedCategoryHref // find the category TOC page and get its TOC items - const page = findPageInVersion(categoryHref, pageMap, redirects, languageCode, version) + const page = findPageInVersion(versionedCategoryHref, pageMap, redirects, languageCode, version) // skip if page can't be found in this version if (!page) return @@ -90,9 +92,9 @@ function buildCategoriesTree (tocItems, productHref, pageMap, redirects, version // if TOC contains maptopics, build a maptopics tree // otherwise build an articles tree if (hasMaptopics) { - category.maptopics = buildMaptopicsTree(page.tocItems, categoryHref, pageMap, redirects, version, languageCode) + category.maptopics = buildMaptopicsTree(page.tocItems, versionedCategoryHref, pageMap, redirects, version, languageCode) } else { - category.articles = buildArticlesTree(page.tocItems, categoryHref, pageMap, redirects, version, languageCode) + category.articles = buildArticlesTree(page.tocItems, versionedCategoryHref, pageMap, redirects, version, languageCode) } } @@ -102,7 +104,7 @@ function buildCategoriesTree (tocItems, productHref, pageMap, redirects, version return categoryTree } -function buildMaptopicsTree (tocItems, categoryHref, pageMap, redirects, version, languageCode) { +function buildMaptopicsTree (tocItems, versionedCategoryHref, pageMap, redirects, version, languageCode) { const maptopicTree = {} // for every maptopic in a category TOC... @@ -111,14 +113,11 @@ function buildMaptopicsTree (tocItems, categoryHref, pageMap, redirects, version .forEach(item => { const maptopic = {} - const maptopicHref = path.join(categoryHref, item.href) - - const versionedMaptopicHref = getVersionedPathWithoutLanguage(maptopicHref, version) + const versionedMaptopicHref = path.join(versionedCategoryHref, item.href) maptopic.href = versionedMaptopicHref - // we already have access to the child articles via the category TOC items - // but we still need the page to get the available versions - const page = findPageInVersion(maptopicHref, pageMap, redirects, languageCode, version) + // find the category TOC page and get its TOC items + const page = findPageInVersion(versionedMaptopicHref, pageMap, redirects, languageCode, version) // skip if page can't be found in this version if (!page) return @@ -135,14 +134,14 @@ function buildMaptopicsTree (tocItems, categoryHref, pageMap, redirects, version // make the child articles accessible to the page object for maptopic rendering if (!page.childArticles) page.childArticles = childArticles - maptopic.articles = buildArticlesTree(childArticles, categoryHref, pageMap, redirects, version, languageCode) + maptopic.articles = buildArticlesTree(maptopic.childArticles, versionedCategoryHref, pageMap, redirects, version, languageCode) maptopicTree[versionedMaptopicHref] = maptopic }) return maptopicTree } -function buildArticlesTree (tocItems, categoryHref, pageMap, redirects, version, languageCode) { +function buildArticlesTree (tocItems, versionedCategoryHref, pageMap, redirects, version, languageCode) { const articleTree = {} // REST categories may not have TOC items @@ -152,12 +151,11 @@ function buildArticlesTree (tocItems, categoryHref, pageMap, redirects, version, tocItems.forEach(item => { const article = {} - const articleHref = path.join(categoryHref, item.href) - - const versionedArticleHref = getVersionedPathWithoutLanguage(articleHref, version) + const versionedArticleHref = path.join(versionedCategoryHref, item.href) article.href = versionedArticleHref - const page = findPageInVersion(articleHref, pageMap, redirects, languageCode, version) + // find the category TOC page and get its TOC items + const page = findPageInVersion(versionedArticleHref, pageMap, redirects, languageCode, version) // skip if page can't be found in this version if (!page) return From f5b050dc5ea6beb4ccb06a2fe3bdd1c74984ae58 Mon Sep 17 00:00:00 2001 From: Sarah Schneider Date: Mon, 14 Dec 2020 14:39:45 -0500 Subject: [PATCH 09/14] updates now that siteTree paths include language codes --- includes/breadcrumbs.html | 2 +- includes/sidebar-guides.html | 8 ++++---- includes/sidebar-specific-product.html | 10 +++++----- middleware/breadcrumbs.js | 16 +++------------- tests/content/site-tree.js | 12 ++++++------ tests/rendering/breadcrumbs.js | 26 +++++++++++++------------- 6 files changed, 32 insertions(+), 42 deletions(-) diff --git a/includes/breadcrumbs.html b/includes/breadcrumbs.html index 47dc43c17a..9fdc33acc4 100644 --- a/includes/breadcrumbs.html +++ b/includes/breadcrumbs.html @@ -3,7 +3,7 @@ {% if breadcrumb[1].href == '' %} {{breadcrumb[1].title}} {% else %} - + {{breadcrumb[1].title}} {% endif %} {% endfor %} diff --git a/includes/sidebar-guides.html b/includes/sidebar-guides.html index c24e084944..ef2e81b62b 100644 --- a/includes/sidebar-guides.html +++ b/includes/sidebar-guides.html @@ -1,17 +1,17 @@