Git Product home page Git Product logo

action-wordpress-plugin-asset-update's Introduction

WordPress.org Plugin Readme/Assets Update

Deploy readme and asset updates to the WordPress Plugin Repository.

Support Level Release Version MIT License

This Action commits any readme and WordPress.org-specific assets changes in your specified branch to the WordPress.org plugin repository if no other changes have been made since the last deployment to WordPress.org. This is useful for updating things like screenshots or Tested up to separately from functional changes, provided your Git branching methodology avoids changing anything else in the specified branch between functional releases. It is highly recommended that you use a stable branch where you only merge readme/asset commits in between larger functional merges that only occur when preparing for a release (often implemented as trunk vs. develop).

Because the WordPress.org plugin repository shows information from the readme in the specified Stable tag, this Action also attempts to parse out the stable tag from your readme and deploy to there as well as trunk. If your stable tag is trunk or a tag that does not exist in the tags subfolder, it will skip that part of the update and only update trunk and/or assets.

Important note: If your development process leads to a situation where trunk (or other specified branch) only contains changes to the readme or assets directory since the last sync to the plugin directory and those changes are in preparation for the next release, those changes will go live and potentially be misleading to users. Usage of this Action assumes a fairly traditional Git methodology that involves merging all changes to trunk when functional changes are ready and that this seemingly unlikely situation will therefore not happen in your repo; there are no safeguards against syncing changes based on readme/asset content, as that cannot be predicted.

☞ This Action is meant to be used in tandem with our WordPress.org Plugin Deploy Action

Configuration

Required secrets

  • SVN_USERNAME
  • SVN_PASSWORD

Secrets are set in your repository settings. They cannot be viewed once stored.

Optional environment variables

  • SLUG - defaults to the respository name, customizable in case your WordPress repository has a different slug or is capitalized differently.
  • ASSETS_DIR - defaults to .wordpress-org, customizable for other locations of WordPress.org plugin repository-specific assets that belong in the top-level assets directory (the one on the same level as trunk). If you want to skip updating assets because you don't have an assets directory, set SKIP_ASSETS : true
  • README_NAME - defaults to readme.txt, customizable in case you use README.md instead, which is now quietly supported in the WordPress.org plugin repository.
  • IGNORE_OTHER_FILES - defaults to false, which means that all your files are copied (as in WordPress.org Plugin Deploy Action, respecting .distignore and .gitattributes), and the Action will bail if anything except assets and readme.txt are modified. See "Important note" above. If you set this variable to true, then only assets and readme.txt will be copied, and changes to other files will be ignored and not committed.

Example Git Workflow

For this example, Git's main branch (the default on new repositories) corresponds directly to Subversion's trunk and is considered the "release" branch.

In general, the expected workflow when using the WordPress.org Plugin Deploy Action is as follows:

  1. Create a new branch for feature x
  2. When the feature is ready for release, merge it onto main
  3. On main, update the readme.txt to reflect the change, e.g.: set the "Stable tag", update the changelog, etc. (although some of this could be done on the feature branch prior to merging)
  4. Update any assets in .wordpress-org
  5. Tag main with the new version number, e.g.: 1.1.0

At this point, the deploy action will push the tag as a Subversion branch to the WordPress svn repository and your new version will be live.

And this is where this action comes in…

As main is our "release" branch, changes to anything other than the readme.txt and .wordpress-org can only be made live by tagging main.

If, however, you need to update the readme.txt or assets folder (.wordpress-org) for any reason, you should do that directly on main and then push your changes. This action will verify that only the readme.txt and .wordpress-org contain changes and if so, will push them directly to trunk on the WordPress svn repository.

Example Workflow File

name: Plugin asset/readme update
on:
  push:
    branches:
    - trunk
jobs:
  trunk:
    name: Push to trunk
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - name: WordPress.org plugin asset/readme update
      uses: 10up/action-wordpress-plugin-asset-update@stable
      env:
        SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }}
        SVN_USERNAME: ${{ secrets.SVN_USERNAME }}

Known issues

  • It would be more efficient to additionally use the paths filter for the push action to reduce the number of runs. So far in testing it is possible to limit it to pushes that include readme/asset files as specified, but not ones that only include those files. The Action itself still needs to run as written because it compares the totality of changes in the branch against what's in SVN and not just the contents of the current push.

Changelog

A complete listing of all notable changes to WordPress.org Plugin Readme/Assets Update are documented in CHANGELOG.md.

Contributing

Want to help? Check out our contributing guidelines to get started.

Support Level

Active: 10up is actively working on this, and we expect to continue work for the foreseeable future including keeping tested up to the most recent version of WordPress. Bug reports, feature requests, questions, and pull requests are welcome.

Like what you see?

action-wordpress-plugin-asset-update's People

Contributors

azizultex avatar dinhtungdu avatar dkotter avatar felipeelia avatar helen avatar jeffpaul avatar markjaquith avatar nikschavan avatar ocean90 avatar peterwilsoncc avatar preciousomonze avatar ravinderk avatar sidsector9 avatar stklcode avatar tedmasterweb avatar zaerl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

action-wordpress-plugin-asset-update's Issues

First time using it, getting an `Other files have been modified; changes not deployed` error

Describe the bug
After installing the action on my repo, I created a trunk branch, changed the readme.txt file, and submitted the changes, getting an Other files have been modified; changes not deployed error.

Commit: thecodecrate/wordpress-plugin-export-users@635870e
Failed action: https://github.com/loureirorg/wordpress-plugin-export-users/runs/938044443?check_suite_focus=true

Steps to Reproduce

  1. Create a trunk branch (git checkout -b trunk);
  2. Change the readme.txt file (echo "\n" >> readme.txt);
  3. Submit the changes (git add readme.txt; git commit -m "Test"; git push origin trunk);
  4. On GitHub Actions see the error Other files have been modified; changes not deployed;

Expected behavior
Changes made on WordPress.org.

Additional context
I use the WordPress.org Plugin Deploy as my deploy tool I don't have any problems with it. Recently I decided to try WordPress.org Plugin Readme/Assets Update for small changes on the readme.txt file.

I strongly believe I am missing something and that's not an actual bug. Maybe it's because I didn't have a trunk repository and thus it is trying to submit all the contents at once.

I actually don't use a trunk for any of my Git projects - instead, I create a new branch and once the code is ready to be merged I do a PR. So maybe I am not using the trunk approach as it was intended to by this tool.

We can check if .wordpress-org directory exists

Problem:
Sometimes we may want to push readme.txt file only and not create any .wordpress-org at all. I had this situation when I was just planning to update readme.txt and didn't create any .wordpress-org folder. But faced error: No such file or directory.

Solution would be like
Check if ASSETS_DIR exists before running
rsync -rc "$GITHUB_WORKSPACE/$ASSETS_DIR/" assets/ --delete --delete-excluded in the line 109.

if [ -d "$GITHUB_WORKSPACE/$ASSETS_DIR" ]; then
    rsync -rc "$GITHUB_WORKSPACE/$ASSETS_DIR/" assets/ --delete --delete-excluded
fi

This should fix the error in the screenshot below.

Designs
image

Change neutral exit for no changes found to success

Describe the bug

In the previous HCL-based Actions beta version, you could mark an exit as neutral by using exit 78. This no longer works for good reason, per https://twitter.com/ethomson/status/1163899559279497217. In practice this means that a declined readme/asset update due to no changes being found gets marked as errored where it isn't actually an error (declining to update due to other changes being found is properly an error). This issue is to acknowledge this IMO unexpected behavior and hold for whenever GitHub gets around to implementing a new neutral exit method in this YAML-based beta version.

Steps to Reproduce

  1. Make changes to a file that isn't deployed to .org, like an Actions workflow file or a test.
  2. Push to master (or whatever branch you have marked for the readme/asset deploy Action).
  3. Go to Actions.
  4. See that the Action failed with the message [error]Docker run failed with exit code 78

Expected behavior
I would expect the Action to be marked as neutral, not failed.

Link to "encrypted secrets" GitHub Docs

This is the same (quite small) problem reported here.

Describe the bug

Probably GitHub has updated their docs and the Secrets are set in your repository settings link present on the README.md file points to the wrong page.

Steps to Reproduce

  1. Go to repo's README.md
  2. Click on Secrets are set in your repository settings.
  3. The link points to the Virtual environments for GitHub-hosted runners page but the related section isn't there anymore :(

Expected behavior

The link should point to this new page.

Bump WordPress and PHP minimums

Bump WP & PHP Minimums to the following

  • WordPress to 5.7
  • PHP to 7.4
  • Remove any no-longer-needed conditional code for older version support.
  • Take a look at adjusting our testing matrices, if applicable.
  • Bump the minimums in plugin documentation and header fields.

Avoid having screenshots be force-downloaded on .org

Is your enhancement related to a problem? Please describe.
SVN has a bad habit of setting the mime type to octet instead of image for PNG/JPG files, which means that on .org you can't just view a screenshot and zoom in on it without having to download it.

Describe the solution you'd like
Need a PR to replicate the fix from the deploy action, see 10up/action-wordpress-plugin-deploy#40

Designs
n/a

Describe alternatives you've considered
n/a

Additional context
The proposed solution has already been tested and merged to the other action.

Support REAME.md with list headers

Describe the bug

Could not get stable tag from README.md

The stable tag in the README.md was as * Stable tag: 2.1.2.

Steps to Reproduce

  1. Create a README.md with a Markdown list for the headers.
  2. Run deployment
  3. See error "Could not get stable tag from README.md"

Expected behavior
Be able to get the stable tag regardless if it is a list or not.

Additional context

The code responsible:
https://github.com/10up/action-wordpress-plugin-asset-update/blob/78630c5a75476c993066e833e2de6f20a29be777/entrypoint.sh#L115_L118

By removing ^ in grep -m 1 "^Stable tag:" "$TMP_DIR/$README_NAME" would fix the bug.

WordPress.org parses the headers as follows.
https://github.com/WordPress/wordpress.org/blob/master/wordpress.org/public_html/wp-content/plugins/plugin-directory/readme/class-parser.php#L235-L253

As a temp fix I have switched for a list to using line breaks with two trailing whitespaces.

Question regarding build process

Hi! Thank you very much for this GitHub action! This streamlined my process to deploy my SimpleTOC Plug-In: https://github.com/mtoensing/simpletoc/blob/master/.github/workflows/deploy.yml

I use the "build" feature and have a few questions. When I use

Run npm install @wordpress/scripts --save-dev

I get these warnings and the process pauses for a few seconds. Is this normal and intended? Can I remove the warnings somehow?

Run npm install @wordpress/scripts --save-dev
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: [email protected]
npm WARN Found: [email protected]
npm WARN node_modules/react
npm WARN   peer react@">=16.8.0" from @emotion/[email protected]
npm WARN   node_modules/@emotion/react
npm WARN     peer @emotion/react@"^11.0.0-rc.0" from @emotion/[email protected]
npm WARN     node_modules/@emotion/styled
npm WARN     1 more (@wordpress/components)
npm WARN   30 more (@emotion/styled, @floating-ui/react-dom, ...)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer react@"^0.14 || ^[15](https://github.com/mtoensing/simpletoc/runs/7794469494?check_suite_focus=true#step:3:16).5.4 || ^16.1.1" from [email protected]
npm WARN node_modules/react-dates
npm WARN   react-dates@"^21.8.0" from @wordpress/[email protected]
npm WARN   node_modules/@wordpress/components
npm WARN 
npm WARN Conflicting peer dependency: react@[16](https://github.com/mtoensing/simpletoc/runs/7794469494?check_suite_focus=true#step:3:17).14.0 ....

My other question is: Is the build process just for validation or is it used for the commit to svn? So if I use "npm start" locally will the resulting javascript be used or the compiled script from your action?

Thank you! =)

Readme change could not update the readme from stable tag.

From the logs of the action run, it looks like grep could not find stable tag from the readme.txt -

grep: /readme.txt: No such file or directory
Could not get stable tag from readme.txt

Here is the link to the action log.
And this is the actual commit that was made by the action, As you can see the change was only made in the trunk and not in the stable tag.

The same thing happened for another plugin, here is it's action log
And a link to commit that was made from the action.

Here is a link to the action yml file it is taken from readme of this repo and without any modifications.

Any ideas if I am missing anything?

Best workflow

Hello,

I'm using this action and the plugin deploy action.
Today I had a small bug fix I did the following steps.

  1. Changed a few php files, updated version numbers in the plugin file and in the readme.txt
  2. Committed this to the dev branch and pushed.
  3. merged dev to main branch
  4. This action runs and errors on Other files have been modified
  5. I create a release and create a tag.
  6. The plugin deploy action runs and deploys to WordPress.org
  7. All is well in the lands.

Is this the intended workflow? Is there a way to do this process without triggering the error in step 4.
There isn't a real problem but the failed pipeline insinuates that something went wrong, that there is a real error.

Maybe I'm missing something, I'm trying to understand how this should work.

usage with composer based projects or similar

I've come across this particular workflow and I'm not sure if this is the intended behaviour or there is any workaround around this.

Let's say have a WordPress plugin which uses some 3rd party libraries and manage them with Composer and we have the following workflow to update readme/assets with wp.org

name: Sync assets with wordpress.org


on:
  push:
    branches:
      - master
    paths:
      - 'readme.txt'
      - '.wordpress-org/**'
jobs:
  run:
    runs-on: ubuntu-latest
    name: Push assets to wporg
    steps:
        - uses: actions/checkout@master
        - name: WordPress.org plugin asset/readme update
          uses: 10up/action-wordpress-plugin-asset-update@master
          env:
            SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }}
            SVN_USERNAME: ${{ secrets.SVN_USERNAME }}

Right now this workflow is failing due to the fact that the vendor files are missing triggering this error: Other files have been modified; changes not deployed from the action.
here you have the log details

A possible fix that I was thinking about is to install the composer deps before running the action, but in this case, SVN will see the composer autoloaders as modified and again failing the deployment of the assets.

This is just a basic example and not an uncommon practice for a WordPress plugin to use composer to manage 3rd party libraries.

Any idea if there is any solution to this?

Readme updates

Is your enhancement related to a problem? Please describe.
It's not obvious the level of support provided for this repo, so let's add some clarification.

Describe the solution you'd like

  • add support level section and badge
  • add release version badge
  • add license badge
  • create CHANGELOG.md

Designs
n/a

Describe alternatives you've considered
none

Additional context
n/a

Confusing workflow/documentation

Not sure if my brain is just tired or the documentation is confusing. I've read it over several times but still not comfortable implementing this action out of fear that ill mess something up in my current deploy workflow.

Here's my workflow:

  • Code, code, code
  • Push all that code to development branch (rinse and repeat)
  • It's release day, lets make a release -> Merge development branch into my master branch.
  • My needed initial actions take effect and do what they have to and cancel the deployment if needed.
  • If no issues, the next action called is https://github.com/10up/action-wordpress-plugin-deploy which syncs SVN.

My situation:

  • I updated some screenshots and the readme...
  • What now?

Question 1: Do I push them to development branch and then merge into master and call it a day? So this action would see that it's only those assets updated and it would sync SVN with just those screenshot and readme changes while leaving all other PHP/Folders untouched?


Here's the spanner in the workflow...

When updating the readme and screenshots, I would NOT want https://github.com/10up/action-wordpress-plugin-deploy to be ran.

I would just want to maybe be able to push to a special branch called interim (or something else) where I can push ONLY assets (.wordpress-org) and readme.txt that would need to be updated on SVN until I actually make a release that would contain those interim changes and any other changes i did to PHP etc.

So say I make some changes to my assets, I don't plan to release a new version of the plugin yet, I just want to update those asset files and the readme and have them sync on SVN.

Question 2: Is that possible?


I think the part of the documention that confuses me is:

As main is our "release" branch, changes to anything other than the readme.txt and .wordpress-org can only be made live by tagging main.
If, however, you need to update the readme.txt or assets folder (.wordpress-org) for any reason, you should do that directly on main and then push your changes. This action will verify that only the readme.txt and .wordpress-org contain changes and if so, will push them directly to trunk on the WordPress svn repository.

In the wording you're saying main shouldn't be touched for anything other than true releases...yet you're saying push those asset and readme.txt changes to main...

SLUG not overwritten?

Describe the bug

We wanted to deploy just a tiny change in readme.txt with this action, but it seems that the SLUG secret is not taken into account (or at least in our case). It was the first test in our (private) repo, but It should work like this, right?

Steps to Reproduce

  1. Use Github repo with a different name than the slug on WP.org
  2. Push to trunk branch
  3. Step "WordPress.org plugin asset/readme update" should fail:
    image

Expected behavior
Use SLUG from secrets.

Additional context
I'm happy to debug further (but I don't have access to the repository settings so it's a bit complicated). Thanks a lot in advance! (And really thanks for both WP.org related actions, they work like charm on my other projects)

Guess $SVN_USERNAME if not provided as secret and make it optional

Is your enhancement related to a problem? Please describe.

The username $SVN_USERNAME can normally be found in the list of contributors in the readme. If $SVN_USERNAME is not defined use the very first one in from the list of contributes.

This will help if you define $SVN_PASSWORD in your organizations secrets and you don't have to redo it for every repo

Describe the solution you'd like

Check if the $SVN_USERNAME is defined and set it if not.

if [[ -z "$SVN_USERNAME" ]]; then
	echo "Set the SVN_USERNAME secret"
	SVN_USERNAME=`grep  "^Contributors:[^\s]*" $README_NAME | awk '$1=="Contributors:"{print $2}' | tr -d ','`
fi

Describe alternatives you've considered

Additional context

Enable updates of README.md files

The assets update action currently only handles changes on a readme.txt file. Nowadays many plugin developers use a README.md file instead, escpecially when hosting the plugin code on a git hosting platform like GitHub.

I would suggest to add a environment variable to enable users to set the file name of the readme file to a different name, so this file is checked for changes.

SVG images do not get the correct MIME type

Describe the bug

SVG format assets do not have their correct MIME type set.

Steps to Reproduce

  1. Add a file icon.svg to the assets dir (ie .wordpress-org)
  2. Commit change to trunk to trigger action
  3. Check mime type of file

Expected behavior

File has image/svg+xml mime type

Additional context

I have lodged a PR in the 10up/action-wordpress-plugin-deploy repo here for the same issue (no issue lodged there at this stage).

The required change is the same in this repo though

Turn off alerts for "changes not deployed"

Is your enhancement related to a problem? Please describe.

Right now the deploy script returns error code if other files have been modified (which actually not an issue). This triggers email notification about the failed GitHub Action.

if [[ -z $(svn stat) ]]; then
echo "🛑 Nothing to deploy!"
exit 0
# Check if there is more than just the readme.txt modified in trunk
# The leading whitespace in the pattern is important
# so it doesn't match potential readme.txt in subdirectories!
elif svn stat trunk | grep -qvi " trunk/$README_NAME$"; then
echo "🛑 Other files have been modified; changes not deployed"
exit 1
fi

Describe the solution you'd like

Could we exit with code 0 same as "Nothing to deploy" case?

Check warning: The "master" branch is no longer the default branch name for actions/checkout

Describe your question

Given I have a single branch "master" and the action has been installed with the branch name set to "master" (it is set as "trunk" in the example)

When I update the readme and push my changes

Then I get the warning "The "master" branch is no longer the default branch name for actions/checkout" and the action does not seem to work (the changes to the readme are not pushed to the svn repo).

I've tried creating a branch named "trunk" but get the same result.

This is the line that seems to be failing:

image

I'm very new to github actions so I'm not really sure where to look to try and debug this.

Thanks in advance.

Implement `.distignore` method from action-wordpress-plugin-deploy

Is your enhancement related to a problem? Please describe.
If you're using the new .distignore method for the deploy action, previously ignored files are no longer ignored and you get false failures for other files having been modified/added.

Describe the solution you'd like
Add the same type of code path split! Almost makes me wish these shared code :)

PR incoming.

Composer autoloader considered as "Other files have been modified"

Describe the issue

When composer is used to autoload plugin's files, it is most likely has composer install --no-dev script during the npm run build

While technically, nothing changed in the plugin files, some of autoload files in /vendor/composer folder will have changed content because of unique hash string in class and functions names.

In this case the action exits with "Other files have been modified; changes not deployed" message, while composer-only changed files could be ignored.

Example

In this example, the only real files were changed are readme.txt and new assets added to the .wordpress-org folder.

The /vendor/autoload.php and all files in /vendor/composer are the same as trunk but with different classnames and functions.

Screenshot 2023-02-09 at 17 14 40

Error on deployment: .github:1 Docker run failed with exit code 23

Hello,
I'm trying to use this actions with your others to deploy on wp.org repo but with this action I Got an error .github:1 Docker run failed with exit code 23 and deployment failed...

I've got in my /github/workflows 2 files, 1 with

name: Deploy to OpenAgenda to WordPress.org
on:
  push:
    tags:
      - "*"
jobs:
  tag:
    name: New Readme
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: WordPress.org plugin asset/readme update
        uses: 10up/action-wordpress-plugin-asset-update@master
        env:
          SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }}
          SVN_USERNAME: ${{ secrets.SVN_USERNAME }} 

and one with

name: Deploy to OpenAgenda to WordPress.org Readme
on:
  push:
    tags:
      - "*"
jobs:
  tag:
    name: New Readme
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: WordPress.org plugin asset/readme update
        uses: 10up/action-wordpress-plugin-asset-update@master
        env:
          SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }}
          SVN_USERNAME: ${{ secrets.SVN_USERNAME }}

Do you know what I'm doing wrong?

Failure on action run

Describe the bug

Steps to Reproduce

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior

Additional context

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.