”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 构建 jargons.dev [# Fork 脚本

构建 jargons.dev [# Fork 脚本

发布于2024-09-18
浏览:867

这是我按照系统架构中所述编写的 4 个脚本中的第一个。感觉很抽气!这是朝着创建“wiki”体验方向迈出的一步,无需与 GitHub UI 交互即可为开源做出贡献?.

这些脚本是什么?

这些 js 文件包含一些相关的可重用函数,特别是用于与 GitHub API 交互;它们要么在同一脚本中使用,要么导出以用于在项目中的其他地方执行其基本功能。他们接受经过身份验证的用户 Octokit 实例作为其他人的参数,该实例用于代表经过身份验证的用户通过 GitHub API 执行操作/功能。

需要创建一个在不与 GitHub UI 交互的情况下为开源做出贡献的流程,这意味着我们必须自动化一些流程 - 模拟用户通过 GitHub UI 做出贡献时将采取的每一个步骤,步骤如下接下来..

  1. 分叉项目仓库
  2. 创建分支
  3. 将更改提交到分支(在 src/pages/word/ 目录中添加新的 mdx 文件以获取新单词或编辑现有文件,在我们的例子中)
  4. 创建拉取请求(在我们的例子中提交单词更改)

一个值得陈述的真理

我在初次提交后就开始编写这个脚本,这实际上是 PR #2,但在漫长的一个月休息期间它受到了打击?在重新开始开发基本字典功能之前,我从该项目中获取了一些信息。

脚本

这里的任务是创建“The Fork Script”——其最终目标是在用户帐户上创建/获取 jargons.dev 存储库的分叉。它应该包含执行以下操作的每个函数。

  • 检查用户帐户上是否已存在 jargons.dev 的 Fork
    • 如果分叉存在
      • 检查 Fork 是否与上游同步(即与 jargons.dev 存储库主分支保持同步);如果不是 — 更新 fork
    • 如果没有找到叉子
      • 创建分叉

理解了作业后,我直接“钻研”到了剧本上。

由于我在 Hearts 的日常工作中频繁使用,我已经非常习惯 GitHub API 了❤️...所以我的 GitHub 的 Fork 文档对我来说就像是 broski 吗?...

步骤

  • 我创建了一个主 forkRepository 函数,它是执行 fork 功能的主要入口点 - 它引导其他地方
  • 我添加了以下函数,这些函数主要用作明显的主 forkRepository 函数的帮助程序
    • isRepositoryForked - 此函数检查 jargons.dev 存储库是否已分叉到当前经过身份验证的用户帐户
    • isRepositoryForkUpdated - 检查分叉(如果找到)是否(与头存储库同步)与主 jargons.dev 存储库是最新的
    • updateRepositoryFork - 用于更新(同步)存储库到主(头)jargons.dev 存储库的状态
    • getBranch - 是一个基本实用程序(在编写此脚本时需要),用于获取 jargons.dev 存储库和用户分支的分支/引用详细信息,以在 isRepositoryForkUpdated 帮助程序中完成的比较中使用以执行其主要功能;它使用 GitHub References 端点。

我的奇怪假设

在我脑海中闪过?当我写这个脚本时,我在阅读了 GitHub Fork 文档中下面引用的段落后一直坚持这个想法

注意:分叉存储库是异步发生的。您可能需要等待一小段时间才能访问 git 对象。如果这花费的时间超过 5 分钟,请务必联系 GitHub 支持。

我误解了这一点,并假设我们只能启动一个分叉过程,继续前进,并且肯定无法等待返回新分叉详细信息的响应对象,因为我们不知道当 fork 进程完成时。

这个假设迫使我不从主 forkRepository 函数返回任何数据,此时我已经开始思考 - 我如何获取分叉详细信息以处理贡献过程的下一阶段!?嗯,也许我会使用网络钩子?!?

事实证明我想得太多了?,我后来意识到我实际上会得到分叉的响应详细信息,这导致我做了一个后续 PR 来解决从分叉响应对象返回所需的数据以供消费贡献过程。

公关

主要的:

Building jargons.dev [# The Fork Script 壮举:实现 `fork` 存储库脚本 #3

Building jargons.dev [# The Fork Script
巴布尔贝 发布于

这个 Pull Request 实现了 fork 脚本;该脚本旨在用于以编程方式将主项目存储库分叉到用户帐户;它包含一个主要函数和其他辅助函数,用于执行一些必要的操作,以确保高效的回购分叉操作。

所做的更改

  • 在脚本中实现了主要的 forkRepository 功能;该函数是执行主要 fork 操作的主要导出函数;它接受 userOctokit (一个经过用户身份验证的对象,有权代表用户行事)实例和项目的存储库详细信息,即 repoDetails 对象,并且它执行以下操作...
    • 它使用 isRepositoryForked 辅助函数检查项目存储库是否已分叉到用户帐户;这将返回 null 的分叉
      • 如果存储库已经分叉,那么我们使用 isRepositoryForkUpdated 辅助函数检查分叉是否是最新的/与主项目存储库同步;这将返回 UpdatedSHA 和一个布尔值 isUpdated 属性,用于确认 fork 是否是最新的
        • 如果 fork 不是最新的;然后我们使用 updateRepositoryFork 辅助函数将其与主项目存储库同步来执行更新
      • 如果存储库是最新的/与主项目存储库同步;我们此时取消操作并提前返回;
    • 如果项目存储库未分叉到用户帐户上;然后我们通过使用 userOctokit 实例调用“POST /repos/{owner}/{repo}/forks”端点来启动 fork 进程。 (这将启动分叉过程,我们不知道该过程何时完成?)
  • 实现在主 forkRepository 函数和其他辅助函数中使用的以下辅助函数
    • updateRepositoryFork - 用于将存储库更新(同步)到主(头)存储库的状态
    • isRepositoryForkUpdated - 用于检查分叉是否(与头存储库同步)与主存储库是最新的
    • getBranch - 用于获取分支/参考详细信息
    • isRepositoryForked - 用于检查用户的分叉存储库列表中是否存在特定存储库
  • 将 getRepoParts 添加到 /lib/utils;它是一个实用程序函数,用于从存储库全名解析 repoOwner 和 repoName。

相关问题

解决#2

截屏/屏幕截图

https://github.com/babblebey/jargons.dev/assets/25631971/16221b7e-3c28-4c6c-a1f3-24d583ce7e3a

在 GitHub 上查看

后续:

Building jargons.dev [# The Fork Script 壮举:在 fork 脚本中返回 repo `fullname` #29

Building jargons.dev [# The Fork Script
巴布尔贝 发表于

此 PR 是对 #3 中 fork 脚本初始实现中缺失步骤的后续操作; fork 脚本无法返回可用于下一步计算的存储库。这是因为我在最初实施期间有一个奇怪的假设。 ?请参阅下面我的假设...

我假设对“POST /repos/{owner}/{repo}/forks”端点的调用只能确保启动分叉过程,而根本无法保证我们得到响应。这意味着我们可能无法在调用

之后准确获得response.data

...但事实并非如此,我发现response.data确实出现了,但可能只需要一些时间,而且只有在分叉的回购协议很大的情况下......而目前分叉项目仓库的时间不到 5 秒。

所做的更改

  • 返回的 fork 存储库 - 这是从 isRepositoryForked 辅助函数返回的存储库全名值;我特此将其作为 forkRepository 函数执行的主要返回值返回,前提是存储库已在执行用户的帐户上分叉
  • 返回的response.data.full_name - 这是一个新创建的fork repo fullname;它是对“POST /repos/{owner}/{repo}/forks”端点调用的响应的值;在执行用户帐户上尚未找到分叉的情况下,我特此将其作为 forkRepository 函数执行的主要返回值返回
  • Cherry 从 #25 中选择了一些更改用于此处
    • f12f25f548a5c5836e9be7d601ed226c5269f5ee
    • 436ceea649b67812c0ec1164fde95d443ce556e0

在 GitHub 上查看
版本声明 本文转载于:https://dev.to/babblebey/building-jargonsdev-5-the-fork-script-558i?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何解决 JLabel 拖放的鼠标事件冲突?
    如何解决 JLabel 拖放的鼠标事件冲突?
    用于拖放的 JLabel 鼠标事件:解决鼠标事件冲突为了在 JLabel 上启用拖放功能,鼠标事件必须被覆盖。然而,当尝试使用 mousePressed 事件实现拖放时,会出现一个常见问题,因为 mouseReleased 事件对该 JLabel 无效。提供的代码在 mousePressed 事件中...
    编程 发布于2024-11-06
  • MySQL 中的数据库分片:综合指南
    MySQL 中的数据库分片:综合指南
    随着数据库变得越来越大、越来越复杂,有效地控制性能和扩展就出现了。数据库分片是用于克服这些障碍的一种方法。称为“分片”的数据库分区将大型数据库划分为更小、更易于管理的段(称为“分片”)。通过将每个分片分布在多个服务器上(每个服务器保存总数据的一小部分),可以提高可扩展性和吞吐量。 在本文中,我们将探...
    编程 发布于2024-11-06
  • 如何将 Python 日期时间对象转换为秒?
    如何将 Python 日期时间对象转换为秒?
    在 Python 中将日期时间对象转换为秒在 Python 中使用日期时间对象时,通常需要将它们转换为秒以适应各种情况分析目的。但是,toordinal() 方法可能无法提供所需的输出,因为它仅区分具有不同日期的日期。要准确地将日期时间对象转换为秒,特别是对于 1970 年 1 月 1 日的特定日期...
    编程 发布于2024-11-06
  • 如何使用 Laravel Eloquent 的 firstOrNew() 方法有效优化 CRUD 操作?
    如何使用 Laravel Eloquent 的 firstOrNew() 方法有效优化 CRUD 操作?
    使用 Laravel Eloquent 优化 CRUD 操作在 Laravel 中使用数据库时,插入或更新记录是很常见的。为了实现这一点,开发人员经常求助于条件语句,在决定执行插入或更新之前检查记录是否存在。firstOrNew() 方法幸运的是, Eloquent 通过firstOrNew() 方...
    编程 发布于2024-11-06
  • 为什么在 PHP 中重写方法参数违反了严格的标准?
    为什么在 PHP 中重写方法参数违反了严格的标准?
    在 PHP 中重写方法参数:违反严格标准在面向对象编程中,里氏替换原则 (LSP) 规定:子类型的对象可以替换其父对象,而不改变程序的行为。然而,在 PHP 中,用不同的参数签名覆盖方法被认为是违反严格标准的。为什么这是违规?PHP 是弱类型语言,这意味着编译器无法在编译时确定变量的确切类型。这意味...
    编程 发布于2024-11-06
  • 哪个 PHP 库提供卓越的 SQL 注入防护:PDO 还是 mysql_real_escape_string?
    哪个 PHP 库提供卓越的 SQL 注入防护:PDO 还是 mysql_real_escape_string?
    PDO vs. mysql_real_escape_string:综合指南查询转义对于防止 SQL 注入至关重要。虽然 mysql_real_escape_string 提供了转义查询的基本方法,但 PDO 成为了一种具有众多优点的卓越解决方案。什么是 PDO?PHP 数据对象 (PDO) 是一个数...
    编程 发布于2024-11-06
  • React 入门:初学者的路线图
    React 入门:初学者的路线图
    大家好! ? 我刚刚开始学习 React.js 的旅程。这是一次令人兴奋(有时甚至具有挑战性!)的冒险,我想分享一下帮助我开始的步骤,以防您也开始研究 React。这是我的处理方法: 1.掌握 JavaScript 基础知识 在开始使用 React 之前,我确保温习一下我的 JavaScript 技...
    编程 发布于2024-11-06
  • 如何引用 JavaScript 对象中的内部值?
    如何引用 JavaScript 对象中的内部值?
    如何在 JavaScript 对象中引用内部值在 JavaScript 中,访问引用同一对象中其他值的对象中的值有时可能具有挑战性。考虑以下代码片段:var obj = { key1: "it ", key2: key1 " works!" }; ...
    编程 发布于2024-11-06
  • Python 列表方法快速指南及示例
    Python 列表方法快速指南及示例
    介绍 Python 列表用途广泛,并附带各种内置方法,有助于有效地操作和处理数据。下面是所有主要列表方法的快速参考以及简短的示例。 1. 追加(项目) 将项目添加到列表末尾。 lst = [1, 2, 3] lst.append(4) # [1, 2, 3, 4]...
    编程 发布于2024-11-06
  • C++ 中何时需要用户定义的复制构造函数?
    C++ 中何时需要用户定义的复制构造函数?
    何时需要用户定义的复制构造函数?复制构造函数是 C 面向对象编程的组成部分,提供了一种基于现有实例初始化对象的方法。虽然编译器通常会为类生成默认的复制构造函数,但在某些情况下需要进行自定义。需要用户定义复制构造函数的情况当默认复制构造函数不够时,程序员会选择用户定义的复制构造函数来实现自定义复制行为...
    编程 发布于2024-11-06
  • 尝试...捕获 V/s 安全分配 (?=):现代发展的福音还是诅咒?
    尝试...捕获 V/s 安全分配 (?=):现代发展的福音还是诅咒?
    最近,我发现了 JavaScript 中引入的新安全赋值运算符 (?.=),我对它的简单性着迷。 ? 安全赋值运算符 (SAO) 是传统 try...catch 块的简写替代方案。它允许您内联捕获错误,而无需为每个操作编写显式的错误处理代码。这是一个例子: const [error, respons...
    编程 发布于2024-11-06
  • 如何在Python中优化固定宽度文件解析?
    如何在Python中优化固定宽度文件解析?
    优化固定宽度文件解析为了有效地解析固定宽度文件,可以考虑利用Python的struct模块。此方法利用 C 来提高速度,如以下示例所示:import struct fieldwidths = (2, -10, 24) fmtstring = ' '.join('{}{}'.format(abs(fw...
    编程 发布于2024-11-06
  • 蝇量级
    蝇量级
    结构模式之一旨在通过与相似对象共享尽可能多的数据来减少内存使用。 在处理大量相似对象时特别有用,为每个对象创建一个新实例在内存消耗方面会非常昂贵。 关键概念: 内在状态:多个对象之间共享的状态独立于上下文,并且在不同对象之间保持相同。 外部状态:每个对象唯一的、从客户端传递的状态。此状态可能会有所不...
    编程 发布于2024-11-06
  • 解锁您的 MySQL 掌握:MySQL 实践实验室课程
    解锁您的 MySQL 掌握:MySQL 实践实验室课程
    通过全面的 MySQL 实践实验室课程提高您的 MySQL 技能并成为数据库专家。这种实践学习体验旨在指导您完成一系列实践练习,使您能够克服复杂的 SQL 挑战并优化数据库性能。 深入了解 MySQL 无论您是想要建立强大 MySQL 基础的初学者,还是想要提升专业知识的经验丰富的开...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3