Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wp-env: Use Simple Git instead of NodeGit #28848

Merged
merged 13 commits into from Feb 18, 2021
Merged

Conversation

ockham
Copy link
Contributor

@ockham ockham commented Feb 8, 2021

Description

Fixes #26660. Alternative to #28804.

Since simple-git doesn't expose download progress for git clone, we lose the progress meters (i.e. they only show 0% at the start, and 100% once the download is done, but no in-between states).

Edit (see #28848 (comment)): Oh, turns out the latest version of simple-git (which was just released) now includes a proper progress handler 🥳

How has this been tested?

  • Remove your local ~/.wp-env or ~/wp-env folder (warning, this removes your local WP dev install).
  • Run ./packages/env/bin/wp-env start. Verify that it successfully clones the WordPress and theme-experiments repos, and starts a local WP install successfully.
  • Furthermore, verify that CI tests pass.

@ockham ockham added the [Package] Env /packages/env label Feb 8, 2021
@ockham ockham self-assigned this Feb 8, 2021
@github-actions
Copy link

github-actions bot commented Feb 8, 2021

Size Change: 0 B

Total Size: 1.38 MB

ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.78 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 665 B 0 B
build/block-directory/index.js 9.1 kB 0 B
build/block-directory/style-rtl.css 1.01 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-editor/index.js 124 kB 0 B
build/block-editor/style-rtl.css 12.1 kB 0 B
build/block-editor/style.css 12.1 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 103 B 0 B
build/block-library/blocks/audio/style.css 103 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 465 B 0 B
build/block-library/blocks/button/style.css 464 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 233 B 0 B
build/block-library/blocks/buttons/editor.css 233 B 0 B
build/block-library/blocks/buttons/style-rtl.css 303 B 0 B
build/block-library/blocks/buttons/style.css 303 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 421 B 0 B
build/block-library/blocks/columns/style.css 421 B 0 B
build/block-library/blocks/cover/editor-rtl.css 390 B 0 B
build/block-library/blocks/cover/editor.css 389 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.25 kB 0 B
build/block-library/blocks/cover/style.css 1.25 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 396 B 0 B
build/block-library/blocks/embed/style.css 395 B 0 B
build/block-library/blocks/file/editor-rtl.css 199 B 0 B
build/block-library/blocks/file/editor.css 198 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 689 B 0 B
build/block-library/blocks/gallery/editor.css 690 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.07 kB 0 B
build/block-library/blocks/gallery/style.css 1.06 kB 0 B
build/block-library/blocks/group/editor-rtl.css 318 B 0 B
build/block-library/blocks/group/editor.css 317 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 477 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/editor-rtl.css 159 B 0 B
build/block-library/blocks/latest-comments/editor.css 158 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 269 B 0 B
build/block-library/blocks/latest-comments/style.css 269 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/list/editor-rtl.css 65 B 0 B
build/block-library/blocks/list/editor.css 65 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 395 B 0 B
build/block-library/blocks/navigation-link/editor.css 397 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 704 B 0 B
build/block-library/blocks/navigation-link/style.css 702 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.34 kB 0 B
build/block-library/blocks/navigation/editor.css 1.34 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 195 B 0 B
build/block-library/blocks/navigation/style.css 195 B 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 214 B 0 B
build/block-library/blocks/page-list/editor.css 214 B 0 B
build/block-library/blocks/page-list/style-rtl.css 527 B 0 B
build/block-library/blocks/page-list/style.css 526 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 109 B 0 B
build/block-library/blocks/paragraph/editor.css 109 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 273 B 0 B
build/block-library/blocks/paragraph/style.css 273 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 63 B 0 B
build/block-library/blocks/preformatted/style.css 63 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 316 B 0 B
build/block-library/blocks/pullquote/style.css 316 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 90 B 0 B
build/block-library/blocks/query-loop/editor.css 89 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query/editor-rtl.css 159 B 0 B
build/block-library/blocks/query/editor.css 160 B 0 B
build/block-library/blocks/quote/editor-rtl.css 61 B 0 B
build/block-library/blocks/quote/editor.css 61 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 165 B 0 B
build/block-library/blocks/search/editor.css 165 B 0 B
build/block-library/blocks/search/style-rtl.css 342 B 0 B
build/block-library/blocks/search/style.css 344 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 236 B 0 B
build/block-library/blocks/separator/style.css 236 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 504 B 0 B
build/block-library/blocks/shortcode/editor.css 504 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 201 B 0 B
build/block-library/blocks/site-logo/editor.css 201 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 117 B 0 B
build/block-library/blocks/site-logo/style.css 117 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 696 B 0 B
build/block-library/blocks/social-links/editor.css 696 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB 0 B
build/block-library/blocks/social-links/style.css 1.37 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 302 B 0 B
build/block-library/blocks/spacer/editor.css 302 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/subhead/editor-rtl.css 99 B 0 B
build/block-library/blocks/subhead/editor.css 99 B 0 B
build/block-library/blocks/subhead/style-rtl.css 80 B 0 B
build/block-library/blocks/subhead/style.css 80 B 0 B
build/block-library/blocks/table/editor-rtl.css 489 B 0 B
build/block-library/blocks/table/editor.css 489 B 0 B
build/block-library/blocks/table/style-rtl.css 386 B 0 B
build/block-library/blocks/table/style.css 386 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 557 B 0 B
build/block-library/blocks/template-part/editor.css 556 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 62 B 0 B
build/block-library/blocks/verse/editor.css 62 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 193 B 0 B
build/block-library/blocks/video/style.css 193 B 0 B
build/block-library/common-rtl.css 1.01 kB 0 B
build/block-library/common.css 1.01 kB 0 B
build/block-library/editor-rtl.css 9.05 kB 0 B
build/block-library/editor.css 9.04 kB 0 B
build/block-library/index.js 145 kB 0 B
build/block-library/style-rtl.css 8.8 kB 0 B
build/block-library/style.css 8.8 kB 0 B
build/block-library/theme-rtl.css 748 B 0 B
build/block-library/theme.css 748 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/blocks/index.js 48.3 kB 0 B
build/components/index.js 272 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/compose/index.js 11.1 kB 0 B
build/core-data/index.js 16.7 kB 0 B
build/customize-widgets/index.js 4.08 kB 0 B
build/customize-widgets/style-rtl.css 168 B 0 B
build/customize-widgets/style.css 168 B 0 B
build/data-controls/index.js 830 B 0 B
build/data/index.js 8.86 kB 0 B
build/date/index.js 31.8 kB 0 B
build/deprecated/index.js 768 B 0 B
build/dom-ready/index.js 576 B 0 B
build/dom/index.js 4.94 kB 0 B
build/edit-navigation/index.js 11 kB 0 B
build/edit-navigation/style-rtl.css 1.26 kB 0 B
build/edit-navigation/style.css 1.25 kB 0 B
build/edit-post/index.js 307 kB 0 B
build/edit-post/style-rtl.css 6.81 kB 0 B
build/edit-post/style.css 6.8 kB 0 B
build/edit-site/index.js 25.6 kB 0 B
build/edit-site/style-rtl.css 4.36 kB 0 B
build/edit-site/style.css 4.36 kB 0 B
build/edit-widgets/index.js 20 kB 0 B
build/edit-widgets/style-rtl.css 3.2 kB 0 B
build/edit-widgets/style.css 3.2 kB 0 B
build/editor/editor-styles-rtl.css 543 B 0 B
build/editor/editor-styles.css 545 B 0 B
build/editor/index.js 41.9 kB 0 B
build/editor/style-rtl.css 3.89 kB 0 B
build/editor/style.css 3.89 kB 0 B
build/element/index.js 4.61 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/index.js 6.77 kB 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.js 2.28 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 4.01 kB 0 B
build/is-shallow-equal/index.js 698 B 0 B
build/keyboard-shortcuts/index.js 2.54 kB 0 B
build/keycodes/index.js 1.95 kB 0 B
build/list-reusable-blocks/index.js 3.15 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.js 5.36 kB 0 B
build/notices/index.js 1.85 kB 0 B
build/nux/index.js 3.41 kB 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/plugins/index.js 2.55 kB 0 B
build/primitives/index.js 1.42 kB 0 B
build/priority-queue/index.js 790 B 0 B
build/react-i18n/index.js 1.45 kB 0 B
build/redux-routine/index.js 2.83 kB 0 B
build/reusable-blocks/index.js 2.92 kB 0 B
build/rich-text/index.js 13.4 kB 0 B
build/server-side-render/index.js 2.77 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 3.02 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

@ockham
Copy link
Contributor Author

ockham commented Feb 8, 2021

Seems to work locally, and in CI 🎉

I'm still getting a few Git#then is deprecated after version 1.72 and will be removed in version 2.x warnings in the console (that screw up the progress messages -- that's not properly working with simple-git anyway) even more 😕

@paaljoachim
Copy link
Contributor

Please let me know of any adjustments I will need to make to the Block Editor documentation for setting up a local WP dev environment: https://developer.wordpress.org/block-editor/tutorials/devenv/
Thanks!

@ockham
Copy link
Contributor Author

ockham commented Feb 9, 2021

Please let me know of any adjustments I will need to make to the Block Editor documentation for setting up a local WP dev environment: https://developer.wordpress.org/block-editor/tutorials/devenv/
Thanks!

Will do! I don't expect many user-facing changes, except we might lose the progress meter while wp-env is cloning git repos.

@ockham
Copy link
Contributor Author

ockham commented Feb 9, 2021

It seems that #28741 is no longer blocked by this PR. It'd still be nice to get it in eventually (once the Git#then warnings are sorted out), but I might deprioritize it a bit.

@noahtallen
Copy link
Member

@ockham Looks like we have to require simple-git/promise for promise-based ops: steveukx/git-js#406 (comment)

Seeing if that fixes the then error

@noahtallen
Copy link
Member

@noahtallen
Copy link
Member

Part of the problem might be that we have a different version of it in packages/wp-env than we do at the root 🤔

@noahtallen
Copy link
Member

noahtallen commented Feb 11, 2021

Part of the problem might be that we have a different version of it in packages/wp-env than we do at the root 🤔

Yep, after addressing this, everything is working correctly. However, simple-git is used extensively in lib/git.js, so I'm worried that it might not be compatible with the newest version. Looking through the file, it looks fine, but I wouldn't know without testing.

@noahtallen
Copy link
Member

noahtallen commented Feb 11, 2021

Ok, so yeah, that definitely caused a lot of problems. I'm thinking we should do the update and fix the commands (probably not too hard) in lib/git.js. 🤔 (Would have to be done in a separate PR though)

Alternatively, we could stay on a legacy version, and only utilize legacy-version-compatible syntax for wp-env.

Otherwise, this is testing pretty well for me. 👍

@ockham
Copy link
Contributor Author

ockham commented Feb 11, 2021

Thanks for tracking this down, Noah! 🎉

Ok, so yeah, that definitely caused a lot of problems. I'm thinking we should do the update and fix the commands (probably not too hard) in lib/git.js. (Would have to be done in a separate PR though)

Yep 👍 On a sidenote, lib/git.js is solely used by release related tools. Some of those will be obsolete once the plugin build workflow has been moved into GitHub actions in its entirety (see #28138); there are however a few commands (such as the perf tests runner, or the wp/trunk branch merge) that might need them a little longer.

Alternatively, we could stay on a legacy version, and only utilize legacy-version-compatible syntax for wp-env.

I'd rather use the new version, especially since I think we'll see lib/git.js used less and less (see above). I'm a bit on the fence whether we should wait for #28138 to land (in case this will make a few of the functions in lib/git.js obsolete -- and thus there'd be less code to migrate to the new version), but maybe I'll try to get a quick grasp of how much work it would be to update it so we aren't blocked by any other PRs.

Otherwise, this is testing pretty well for me.

🥳

@ockham
Copy link
Contributor Author

ockham commented Feb 11, 2021

Looking at the CI errors and https://github.com/steveukx/git-js#usage, I think the fix might be as simple as

diff --git a/bin/plugin/lib/git.js b/bin/plugin/lib/git.js
index b8b4242800..9af6288b99 100644
--- a/bin/plugin/lib/git.js
+++ b/bin/plugin/lib/git.js
@@ -1,7 +1,7 @@
 /**
  * External dependencies
  */
-const SimpleGit = require( 'simple-git/promise' );
+const SimpleGit = require( 'simple-git' );
 
 /**
  * Internal dependencies

@ockham
Copy link
Contributor Author

ockham commented Feb 11, 2021

I'm getting a ton of TypeScript errors that look like this now (see CI):

Error: bin/plugin/lib/git.js(20,20): error TS2349: This expression is not callable.
  Type 'typeof import("/home/runner/work/gutenberg/gutenberg/node_modules/simple-git/typings/index")' has no call signatures.

They happen on lines where I try to instantiate simple-git like this:

const SimpleGit = require( 'simple-git' );
const git = SimpleGit(); // <-- error

@jsnajdr Any chance this is related to #28879?

@noahtallen
Copy link
Member

Do we need to convert wp-env to typescript? :trollface: I'd love to do that actually, the jsdoc types are both important and a pain to work with.

@noahtallen
Copy link
Member

@ockham I added // @ts-nocheck to lib/git.js. It does "fix" the problem, but is obviously not ideal.

I think part of the problem is that this file is written as a node script (and therefore uses require()), but typescript is expecting normal imports?

For example, import SimpleGit from 'simple-git' removes the type issues. (But I'm not sure that would actually work in the context of node CLI here)

@jsnajdr
Copy link
Member

jsnajdr commented Feb 12, 2021

Any chance this is related to #28879?

@ockham That seems unlikely to me. #28879 mostly adds support for transpiling TypeScript files with Babel. It doesn't make any changes that would affect how tsc is run and configured.

@ockham ockham force-pushed the update/wp-env-use-simple-git branch from a3861aa to 93acbab Compare February 12, 2021 12:27
@ockham
Copy link
Contributor Author

ockham commented Feb 12, 2021

Thanks @noahtallen and @jsnajdr!

The TS ignore seems like a good solution for now.


Static analysis checks have been complaining about an outdated package-lock. Rebasing to attempt a fix 🤞

@ockham
Copy link
Contributor Author

ockham commented Feb 12, 2021

FWIW, I've briefly tried removing the // @ts-nocheck from bin/plugin/lib/git.js (by using an ESM import for simple-git, and ESM exports for the individual functions, see diff below).

Diff
diff --git a/bin/plugin/lib/git.js b/bin/plugin/lib/git.js
index 6bf62a0f8f..0f9c64ddbb 100644
--- a/bin/plugin/lib/git.js
+++ b/bin/plugin/lib/git.js
@@ -1,8 +1,7 @@
-// @ts-nocheck
 /**
  * External dependencies
  */
-const SimpleGit = require( 'simple-git' );
+import SimpleGit from 'simple-git';
 
 /**
  * Internal dependencies
@@ -16,7 +15,7 @@ const { getRandomTemporaryPath } = require( './utils' );
  *
  * @return {Promise<string>} Repository local Path
  */
-async function clone( repositoryUrl ) {
+export async function clone( repositoryUrl ) {
 	const gitWorkingDirectoryPath = getRandomTemporaryPath();
 	const simpleGit = SimpleGit();
 	await simpleGit.clone( repositoryUrl, gitWorkingDirectoryPath, [
@@ -35,7 +34,7 @@ async function clone( repositoryUrl ) {
  *
  * @return {Promise<string>} Commit Hash
  */
-async function commit( gitWorkingDirectoryPath, message, filesToAdd = [] ) {
+export async function commit( gitWorkingDirectoryPath, message, filesToAdd = [] ) {
 	const simpleGit = SimpleGit( gitWorkingDirectoryPath );
 	await simpleGit.add( filesToAdd );
 	const commitData = await simpleGit.commit( message );
@@ -50,7 +49,7 @@ async function commit( gitWorkingDirectoryPath, message, filesToAdd = [] ) {
  * @param {string} gitWorkingDirectoryPath Local repository path.
  * @param {string} branchName Branch Name
  */
-async function createLocalBranch( gitWorkingDirectoryPath, branchName ) {
+export async function createLocalBranch( gitWorkingDirectoryPath, branchName ) {
 	const simpleGit = SimpleGit( gitWorkingDirectoryPath );
 	await simpleGit.checkoutLocalBranch( branchName );
 }
@@ -61,7 +60,7 @@ async function createLocalBranch( gitWorkingDirectoryPath, branchName ) {
  * @param {string} gitWorkingDirectoryPath Local repository path.
  * @param {string} branchName Branch Name
  */
-async function checkoutRemoteBranch( gitWorkingDirectoryPath, branchName ) {
+export async function checkoutRemoteBranch( gitWorkingDirectoryPath, branchName ) {
 	const simpleGit = SimpleGit( gitWorkingDirectoryPath );
 	await simpleGit.fetch( 'origin', branchName );
 	await simpleGit.checkout( branchName );
@@ -73,7 +72,7 @@ async function checkoutRemoteBranch( gitWorkingDirectoryPath, branchName ) {
  * @param {string} gitWorkingDirectoryPath Local repository path.
  * @param {string} tagName Tag Name
  */
-async function createLocalTag( gitWorkingDirectoryPath, tagName ) {
+export async function createLocalTag( gitWorkingDirectoryPath, tagName ) {
 	const simpleGit = SimpleGit( gitWorkingDirectoryPath );
 	await simpleGit.addTag( tagName );
 }
@@ -84,7 +83,7 @@ async function createLocalTag( gitWorkingDirectoryPath, tagName ) {
  * @param {string} gitWorkingDirectoryPath Local repository path.
  * @param {string} branchName Branch Name
  */
-async function pushBranchToOrigin( gitWorkingDirectoryPath, branchName ) {
+export async function pushBranchToOrigin( gitWorkingDirectoryPath, branchName ) {
 	const simpleGit = SimpleGit( gitWorkingDirectoryPath );
 	await simpleGit.push( 'origin', branchName );
 }
@@ -94,7 +93,7 @@ async function pushBranchToOrigin( gitWorkingDirectoryPath, branchName ) {
  *
  * @param {string} gitWorkingDirectoryPath Local repository path.
  */
-async function pushTagsToOrigin( gitWorkingDirectoryPath ) {
+export async function pushTagsToOrigin( gitWorkingDirectoryPath ) {
 	const simpleGit = SimpleGit( gitWorkingDirectoryPath );
 	await simpleGit.pushTags( 'origin' );
 }
@@ -115,7 +114,7 @@ async function discardLocalChanges( gitWorkingDirectoryPath ) {
  * @param {string} gitWorkingDirectoryPath Local repository path.
  * @param {string} branchName Branch Name
  */
-async function resetLocalBranchAgainstOrigin(
+export async function resetLocalBranchAgainstOrigin(
 	gitWorkingDirectoryPath,
 	branchName
 ) {
@@ -131,7 +130,7 @@ async function resetLocalBranchAgainstOrigin(
  * @param {string} gitWorkingDirectoryPath Local repository path.
  * @param {string} commitHash Branch Name
  */
-async function cherrypickCommitIntoBranch(
+export async function cherrypickCommitIntoBranch(
 	gitWorkingDirectoryPath,
 	commitHash
 ) {
@@ -146,7 +145,7 @@ async function cherrypickCommitIntoBranch(
  * @param {string} gitWorkingDirectoryPath Local repository path.
  * @param {string} sourceBranchName Branch Name
  */
-async function replaceContentFromRemoteBranch(
+export async function replaceContentFromRemoteBranch(
 	gitWorkingDirectoryPath,
 	sourceBranchName
 ) {
@@ -159,17 +158,3 @@ async function replaceContentFromRemoteBranch(
 		'.',
 	] );
 }
-
-module.exports = {
-	clone,
-	commit,
-	checkoutRemoteBranch,
-	createLocalBranch,
-	createLocalTag,
-	pushBranchToOrigin,
-	pushTagsToOrigin,
-	discardLocalChanges,
-	resetLocalBranchAgainstOrigin,
-	cherrypickCommitIntoBranch,
-	replaceContentFromRemoteBranch,
-};

That almost worked, except for a small issue with git.reset().

bin/plugin/lib/git.js:108:25 - error TS2769: No overload matches this call.
  Overload 1 of 3, '(mode: ResetMode, options?: string[] | ResetOptions | undefined, callback?: SimpleGitTaskCallback<string, GitError> | undefined): Response<...>', gave the following error.
    Argument of type '"hard"' is not assignable to parameter of type 'ResetMode'.
  Overload 2 of 3, '(mode: ResetMode, callback?: SimpleGitTaskCallback<string, GitError> | undefined): Response<string>', gave the following error.
    Argument of type '"hard"' is not assignable to parameter of type 'ResetMode'.
  Overload 3 of 3, '(options?: string[] | ResetOptions | undefined, callback?: SimpleGitTaskCallback<string, GitError> | undefined): Response<string>', gave the following error.
    Argument of type '"hard"' is not assignable to parameter of type 'string[] | ResetOptions | undefined'.

108  await simpleGit.reset( 'hard' );

That could be fixed by a type assertion:

import SimpleGit, { ResetMode } from 'simple-git';
/* ... */
await simpleGit.reset( 'hard' as ResetMode );

However, if I try to build that, I'm reminded that type assertions are only allowed in actual *.ts files:

bin/plugin/lib/git.js:108:35 - error TS8016: Type assertion expressions can only be used in TypeScript files.

108  await simpleGit.reset( 'hard' as ResetMode );

At that point, I broke off the experiment.

I did file an issue against simple-git about requiring the type assertion: steveukx/git-js#575

@ockham
Copy link
Contributor Author

ockham commented Feb 12, 2021

Since we'll be losing the progress meter (well, other than it showing 0% and then 100% once it's done cloning), I've also asked upstream if they could add the necessary features that might help us re-enable the progress meter later.

@ockham
Copy link
Contributor Author

ockham commented Feb 12, 2021

The static analysis check is still complaining about an outdated package-lock. I can't repro locally when using npm 6, so I guess it's due to npm 7. I'll try to unblock that...

@noahtallen
Copy link
Member

Yeah, I also noticed that 🤔

@ockham
Copy link
Contributor Author

ockham commented Feb 12, 2021

The static analysis check is still complaining about an outdated package-lock. I can't repro locally when using npm 6, so I guess it's due to npm 7. I'll try to unblock that...

FWIW, lots of fun here (and in PRs linked therein): #28834

@ockham
Copy link
Contributor Author

ockham commented Feb 17, 2021

Oh, turns out the latest version of simple-git (which was released yesterday) now includes a proper progress handler 🥳

@ockham
Copy link
Contributor Author

ockham commented Feb 17, 2021

Oh, turns out the latest version of simple-git (which was released yesterday) now includes a proper progress handler

I've upgraded to v2.35.0 and tried using the new progress handler in 37ccf2a, but haven't got it working (still only seeing either 0 or 100% of progress).

One idea I had is that the RegEx that's looking for progress messages isn't compatible with my German locale. I tried aliasing git to LC_ALL=en git, but I'm not sure that does the trick.

@noahtallen Can you check if it works for you?

Copy link
Member

@noahtallen noahtallen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it appears to be working for me. I will note that I had to run npx wp-env destroy to really get the full effect. I think this might just be because the progress is mostly for clone, and when fetching the latest changes (e.g. if the repos already exist), maybe there's not much progress to indicate, or it just happens:

Screen.Recording.2021-02-17.at.4.38.39.PM.mov

@ockham
Copy link
Contributor Author

ockham commented Feb 18, 2021

Yeah, it appears to be working for me. I will note that I had to run npx wp-env destroy to really get the full effect. I think this might just be because the progress is mostly for clone, and when fetching the latest changes (e.g. if the repos already exist), maybe there's not much progress to indicate, or it just happens:

Screen.Recording.2021-02-17.at.4.38.39.PM.mov

Awesome, so happy to hear it works for you, Noah!

I filed an upstream bug report about this: steveukx/git-js#579

Since releases seem to happen frequently for simple-git, let's maybe wait for another day or so before merging in case we can bump simple-git to a version that includes a fix for this.

@ockham
Copy link
Contributor Author

ockham commented Feb 18, 2021

Oh, seems like it's actually working for me now 🤔 🎉

Maybe I didn't properly clean out my ~/wp-env last night. Anyway, going to merge! 🥳

@ockham ockham merged commit d7f3337 into master Feb 18, 2021
@ockham ockham deleted the update/wp-env-use-simple-git branch February 18, 2021 17:16
@github-actions github-actions bot added this to the Gutenberg 10.1 milestone Feb 18, 2021
@noahtallen
Copy link
Member

Nice!

@mkaz
Copy link
Member

mkaz commented Feb 18, 2021

@paaljoachim I don't think there is any change to the developer documentation for this PR. The issue previously was when we bumped the Node version there was not a pre-built binary for nodegit which was the previous module. The new library simple-git does not need a binary built so it simplifies matters.

@paaljoachim
Copy link
Contributor

Thanks Marcus! A thank you to Bernie and Noah as well!
It is good to see that wp-env is being updated.

I gave the documentation a rest for a while before I get back to it again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Env /packages/env
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Migrate wp-env to use simple-git instead of nodegit
5 participants