Coder Social home page Coder Social logo

maticzav / label-sync Goto Github PK

View Code? Open in Web Editor NEW
60.0 60.0 4.0 22.8 MB

๐Ÿท A delightful companion to manage Github Labels across multiple repositories.

Home Page: https://label-sync.com

License: BSD 3-Clause "New" or "Revised" License

JavaScript 3.65% TypeScript 96.25% CSS 0.10%
assistant github github-labels hacktoberfest label-sync labels sync

label-sync's People

Contributors

dependabot[bot] avatar emma-cli[bot] avatar jamnikhana avatar janpio avatar maticzav avatar renovate-bot avatar renovate[bot] avatar schickling 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

Watchers

 avatar  avatar  avatar

label-sync's Issues

Also support milestones

Feature request

Current goal of this tool:

Label Sync helps you sync Github labels across multiple repositories.

I suggest to add "... and milestones" to that.

Is your feature request related to a problem?

Prisma uses label-sync, and our software lives in many repositories. We recently switched from using labels (release/preview-5) to using milestones to plan the work we want to achieve in a sprint.

So previously it was enough to add the preview to the label sync configuration, and it would be created across all repositories. Then we could use label:release/preview-5 in the search to see all the relevant issues.

As GitHub doesn't support cross repository milestones (as it doesn't support cross repository labels), we have to do the same now for milestones and use milestone:"Preview 5" for search.

But the creation of these milestones is a similar amount of work as creation of labels: They need a name, a description and a due date, if any of that changes we have to go through our growing number of repositories to update it.

(see also https://github.com/prisma/prisma-label-sync/issues/42 where this is mainly copy/pasted from)

Describe the solution you propose

It would be neat if label-sync could handle milestones in a similar way that it handles labels: Define them in code, run the script, everything gets set up or updated for you.

Describe alternatives you've considered

a) Do it manually

b) Use existing tools or services

https://github.com/vanilla/github-sync
https://github.com/matomo-org/github-sync
https://help.codetree.com/en/articles/2605231-working-with-multiple-repositories#codetree-automatically-adds-labels-and-milestones-to-all-repos-in-a-project

c) Create a new tool

We could also create a new thing that does this.

Additional context

As we are currently using Codetree for other reasons, it might actually be a good solution for us to use it to create and sync the milestones as well. I wanted to create this issue here anyway, as it could really be useful for other users as well - but no real need for us there (until I find something that is broken in Codetree).

Output current configuration

It would be neat if there was a way to output the current configuration, that would make it obsolete to look at the code.

Variants:

  • Another Circle job that just outputs all repos with the labels that should exist there. You can go to the last commit, open that job and see the overview
  • A website is generated and committed to gh-pages branch and made available via GitHub pages. You just open the URL to get the currently active configuration.

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Rate Limited

These updates are currently rate limited. Click on a checkbox below to force their creation now.

  • chore(deps): update dependency @types/node to v14.18.22
  • chore(deps): update dependency nock to v13.2.8
  • fix(deps): update dependency moment to v2.29.4
  • fix(deps): update dependency winston to v3.8.1
  • chore(deps): update dependency execa to v6
  • chore(deps): update dependency husky to v8
  • chore(deps): update dependency lerna to v5
  • chore(deps): update dependency tailwindcss to v3
  • chore(deps): update dependency ts-node to v10
  • chore(deps): update jest monorepo to v28 (major) (@types/jest, jest, ts-jest)
  • chore(deps): update node.js to v16 (node, @types/node)
  • fix(deps): update dependency @octokit/rest to v19
  • fix(deps): update dependency @prisma/client to v4
  • fix(deps): update dependency chalk to v5
  • fix(deps): update dependency inquirer to v9
  • fix(deps): update dependency meow to v10
  • fix(deps): update dependency ora to v6
  • fix(deps): update dependency probot to v12
  • fix(deps): update dependency query-string to v7
  • fix(deps): update dependency stripe to v9
  • fix(deps): update dependency swr to v1

Other Branches

These updates are pending. To force PRs open, click the checkbox below.

  • fix(deps): update dependency handlebars to v4.7.7 [security]

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

npm
app/package.json
  • @graywolfai/react-heroicons 1.3.0
  • next 9.5.5
  • react 16.14.0
  • react-dom 16.14.0
  • react-transition-group 4.4.2
  • @tailwindcss/ui 0.7.2
  • @types/react 16.14.28
  • @types/react-dom 16.9.16
  • @types/react-transition-group 4.4.5
  • autoprefixer 9.8.8
  • tailwindcss 1.9.6
  • typescript 3.9.10
package.json
  • @types/jest 26.0.24
  • chalk 4.1.2
  • codecov 3.8.2
  • execa 4.1.0
  • husky 4.3.8
  • jest 26.6.3
  • jest-serializer-ansi 1.0.3
  • lerna 3.22.1
  • prettier 2.7.1
  • pretty-quick 3.1.3
  • ts-jest 26.5.6
  • ts-node 9.1.1
  • typescript 4.0.5
packages/create-label-sync/package.json
  • chalk ^4.1.0
  • creato ^1.0.5
  • handlebars ^4.7.6
  • inquirer ^7.3.3
  • meow ^9.0.0
  • multilines ^1.0.3
  • ora ^5.2.0
  • prettier ^2.2.1
  • @types/inquirer 7.3.3
  • @types/meow 5.0.0
  • @types/node 14.18.21
  • @types/prettier 2.6.3
packages/label-sync/package.json
  • js-yaml ^3.14.0
  • @types/js-yaml 3.12.7
  • @types/node 14.18.21
server/package.json
  • @octokit/rest 18.12.0
  • @prisma/client 2.12.1
  • body-parser 1.20.0
  • cors 2.8.5
  • express 4.18.1
  • fp-ts 2.12.1
  • handlebars 4.7.7
  • io-ts 2.2.16
  • js-yaml 3.14.1
  • jsonwebtoken 8.5.1
  • lodash 4.17.21
  • moment 2.29.3
  • multilines 1.0.3
  • prettier 2.7.1
  • probot 9.15.1
  • query-string 6.14.1
  • stripe 8.125.0
  • winston 3.8.0
  • @prisma/cli 2.12.1
  • @types/cors 2.8.12
  • @types/express 4.17.13
  • @types/jest 26.0.24
  • @types/js-yaml 3.12.7
  • @types/jsonwebtoken 8.5.8
  • @types/nock 11.1.0
  • @types/node 14.18.21
  • @types/prettier 2.6.3
  • @types/request-promise-native 1.0.18
  • @types/stripe 7.13.25
  • codecov 3.8.2
  • execa 4.1.0
  • js-yaml 3.14.1
  • lerna 3.22.1
  • nock 13.2.7
  • request 2.88.2
  • request-promise-native 1.0.9
  • ts-node 9.1.1
  • typescript 4.0.5
templates/typescript/package.json
  • husky latest
  • label-sync latest
  • prettier *
  • ts-node *
  • typescript *
web/package.json
  • @stripe/stripe-js 1.32.0
  • lodash 4.17.21
  • multilines 1.0.3
  • next 9.5.5
  • prop-types 15.8.1
  • react 17.0.2
  • react-dom 17.0.2
  • react-transition-group 4.4.2
  • react-typist 2.0.5
  • swr 0.5.7
  • @tailwindcss/ui 0.7.2
  • @types/lodash 4.14.182
  • @types/node 14.18.21
  • @types/react 16.14.28
  • @types/react-dom 16.9.16
  • @types/react-transition-group 4.4.5
  • @types/react-typist 2.0.3
  • autoprefixer 9.8.8
  • tailwindcss 1.9.6
  • typescript 4.0.5
nvm
.nvmrc
  • node 13.14.0

  • Check this box to trigger a request for Renovate to run again on this repository

"Update labels" should output information what was changed

Did it change the description? Color? Something else?

A diff style view of the old vs. new config for that label could be a simple way to output this in the log that could explain what is going on. More structured output ala "Color was change from #000 to #fff" would work as well of course.

`npm install` fails on Windows

C:\Users\Jan\Documents\throwaway\prisma-labelsync>npm install
npm ERR! path C:\Users\Jan\Documents\throwaway\prisma-labelsync\node_modules\label-sync\dist\bin.js
npm ERR! code ENOENT
npm ERR! errno -4058
npm ERR! syscall chmod
npm ERR! enoent ENOENT: no such file or directory, chmod 'C:\Users\Jan\Documents\throwaway\prisma-labelsync\node_modules\label-sync\dist\bin.js'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Jan\AppData\Roaming\npm-cache\_logs\2020-08-05T18_07_25_098Z-debug.log

This is the package.json:

{
  "name": "prisma-labelsync",
  "private": true,
  "main": "index.js",
  "scripts": {
    "make": "ts-node src/main.ts"
  },
  "dependencies": {
    "husky": "4.2.5",
    "label-sync": "3.5.0"
  },
  "devDependencies": {
    "prettier": "*",
    "ts-node": "*",
    "typescript": "*"
  },
  "husky": {
    "hooks": {
      "pre-commit": "yarn -s make && git add labelsync.yml"
    }
  },
  "license": "MIT"
}

Running yarn works.

Action Required: Fix Renovate Configuration

There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.

Error type: undefined. Note: this is a nested preset so please contact the preset author if you are unable to fix it yourself.

Define a label prefix that label-sync doesn't touch

Similar to #88, but not on a repository level but for a specific label prefix (which means we have more control):

It would be nice if we could define a label (e.g. topic/* or epic/*) that label-sync would skip and not touch when syncing. That would enable us to use it ad hoc in the repository to have more freestyle grouping, e.g. topic/foo after we encountered 5 issues about foo.

Label Sync Check Hangs on Dry Run if YML has entry with Alias and Name set to the same value.

Bug report

  • I have checked other issues to make sure this is not a duplicate.

Describe the bug

Having a label with an alias equal to itself seems to hang the dry-run process.

To Reproduce

I have a simple yml based on the setup one from yarn. While editing for my use, I ended up creating this entry:

  "bug":
    color: &bug
    description: A bug
    alias: ["bug"]

I assume an alias being the same as the name is causing some unexpected behavior.

Expected behavior

Either an error if this isn't allowed, or the job finishing within normal time frames. A cancel button to stop the action once it starts misbehaving would also be nice.

Actual behaviour

Screen Shot 2021-05-24 at 9 34 46 AM
20+ Minutes running, closing the PR or deleting the branch don't seem to cancel it.

Better error handling, more information about error source

Feature request

Is your feature request related to a problem? Please describe

Currently the error message you get when something goes wrong when talking to Github doesn't have any context what exactly the script was trying to do - it just tells you an error happened.

2 examples:

  • https://github.com/prisma/prisma-label-sync/issues/51 - Here we got "HttpError: Not Found" because of some unknown reason, it fixed itself but we still don't know what exactly was wrong so it was only solved by chance.
  • https://circleci.com/gh/prisma/prisma-label-sync/216 - Here we get "HttpError: Server Error" with no context. My current guess is that the user/token we are using can not access this repo or at least not create labels there (Will report back after we fixed this - Update: Indeed giving the bot user the necessary rights fixed this error - so "Server Error" might sometimes mean "your token/user does not have access")

Describe the solution you propose

It would be nice if the error message would not just output the error message, but also what it was doing when things went wrong: What URL was it requesting? What action was it trying to execute? What changes did it want to make to the repo? What repo was it working on when the error happened?

Describe alternatives you've considered

Try anything I can think of that could possibly have gone wrong.

Single Labelsync Manager across multiple orgs or accounts

Explain your question

Hi. We at The Guild were looking for the ability to do label syncing across multiple repos we have in Github and thats when we found labelsync. Now, the question I have is that, our convention differs from other Github orgs and accounts where we dont host the OSS projects under a single org or a single account but is rather split across multiple accounts like this with the repos hosted against multiple maintainers like so:

https://github.com/dotansimha/graphql-code-generator for GraphQL Codegen
https://github.com/ardatan/graphql-tools for GraphQL Tools
https://github.com/Urigo/graphql-mesh for GraphQL Mesh
https://github.com/the-guild-org/the-guild-website for Guild Website

and so on..

Now, my question is, would a single paid label sync subscription support this across multiple accounts/orgs ? Where should the Github app be installed in such case? I understand that you support unlimited repos in the paid subscription, but is it across unlimited orgs and accounts or a single org/account?

Thanks.

  • I have checked existing issue and found none that could answer my question.

CC: @maticzav

Siblings?

Over at https://github.com/prisma/prisma-label-sync we use siblings for bug qualification: bug/0-need-info, bug/1-has-repo and bug/2-confirmed are configured to have kind/bug as siblings:

https://github.com/prisma/prisma-label-sync/blob/51f917e3d7870a7ce0c94da5ba152eec32d2d98a/src/labels/common/prisma2.ts#L14-L32

Now we introduced kind/regression which is a kind/bug with some additional meaning.

How can I configure that so that the tool is happy for the bug/* labels with either kind/bug or kind/regression? Currently it re-adds kind/bug to all the kind/regression only issues.

Your format is unknown - bot does not recognize it as yaml file?

Explain your question

  • [ x] I have checked existing issue and found none that could answer my question.

Describe your question in as much detail as possible.
If possible include context, source of the problem, and the end goal you are trying to achieve.

I encourage you to try and make an issue with one of the other templates before submitting the general form.
I have a .yml file and when I make a commit the bot runs and says the format is unknown to it. I am using vscode and it looks like a yaml file so I don't know where to check to ensure its the right file and format for the bot to process

image

Repository level configuration to ignore unknown labels

Currently label-sync by default removes all the unknown labels from a repository. That is fine most of the times, but sometimes you want to have a more free form label set that allows you to just create things additionally that are not touched by label-sync.

It would be nice if we could configure this on a repository level.

Invalid value null supplied to repos

Bug report

  • I have checked other issues to make sure this is not a duplicate.

Describe the bug

I keep having this error popping up the configuration looks good!!!

To Reproduce

Steps to reproduce the behavior, please provide code snippets or a repository:

  1. This is my configuration.
# Colors
# I used this website to get the HEX colors names: http://chir.ag/projects/name-that-color/#E9E0E0
colors:
  sunset-orange: &sunset-orange "#ff5050"
  peach-orange: &peach-orange "#ffd4a0"
  onahau: &onahau "#c0e6ff"
  mystic: &mystic "#dfe9e9"
  turquoise: &turquoise "#41d6c3"
  medium-purple: &medium-purple "#9855d4"
  conifer: &conifer "#b4e051"
  cerise: &cerise "#db2780"
  ebb: &ebb "#e9e0e0"
  gold: &gold "#fad401"

# Labels
labels: &default-lables
  "blocker":
    color: &sunset-orange
  "bug":
    color: &sunset-orange
    description: Something isn't working.
  "hotfix":
    color: &sunset-orange
  "cleanup":
    color: &peach-orange
  "refactor":
    color: &peach-orange
  "technical debt":
    color: &peach-orange
  "documentation":
    color: &onahau
    description: Improvements or additions to documentation.
  "duplicate":
    color: &mystic
    description: This issue or pull request already exists.
  "invalid":
    color: &mystic
    description: This doesn't seem right.
  "on hold":
    color: &mystic
  "wontfix":
    color: &mystic
    description: This will not be worked on.
  "enhancement":
    color: &turquoise
    description: New feature or request.
  "optimization":
    color: &turquoise
  "epic":
    color: &medium-purple
  "feature":
    color: &conifer
  "help-wanted":
    color: &cerise
    description: Extra attention is needed.
  "prototype":
    color: &cerise
  "question":
    color: &cerise
    description: Further information is requested.
  "ready-for-review":
    color: &cerise
  "local":
    color: &ebb
    description: Local environment.
  "production":
    color: &ebb
    description: Production environment.
  "staging":
    color: &ebb
    description: Staging environment.
  "under-consideration":
    color: &gold

# Repositories
repos:
  api:
    config:
      removeUnconfiguredLabels: false
    labels:
      <<: *default-lables
  front-end:
    config:
      removeUnconfiguredLabels: false
    labels:
      <<: *default-lables
  portfoy:
    config:
      removeUnconfiguredLabels: false
    labels:
      <<: *default-lables
  admin:
    config:
      removeUnconfiguredLabels: false
    labels:
      <<: *default-lables
  mail:
    config:
      removeUnconfiguredLabels: false
    labels:
      <<: *default-lables
  1. This is the report I get
our configuration seems a bit strange. Here's what I am having problems with:

Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/blocker: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/bug: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/hotfix: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/cleanup: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/refactor: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/technical debt: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/documentation: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/duplicate: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/invalid: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/on hold: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/wontfix: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/enhancement: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/optimization: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/epic: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/feature: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/help-wanted: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/prototype: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/question: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/ready-for-review: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/local: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) }/api: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } })/1: { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }/labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) }/production: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>)/0: { color: string }/color: string
Invalid value null supplied to : { repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array, alias: Array }>) } }) } }/repos: { [K in string]: (Partial<{ config: Partial<{ removeUnconfiguredLabels: boolean }> }> & { labels: { [K in string]: ({ color: string } & Partial<{ description: string, siblings: Array

Support #-prefix on colors

This would enable e.g. users to benefit from vscode extensions that render colors inline. Original use-case raised here. Example:

example

Happy to make a PR for this :)

Support label renaming

Current workaround: Rename the labels manually, then execute label-sync. Then the existing labels do not get deleted and recreated and as such can keep their issues.

handle repo renames

Feature request

Is your feature request related to a problem? Please describe

If a repo is renamed, would be great if it doesn't break label-sync

Describe the solution you propose

  • Assuming the github api makes this possible, when a repo is not found, check for if it has been renamed, use it if so
  • If it has been renamed, make a PR on the repo to update the name to the new one; or, at least, an issue about what needs to be changed

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.