Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
chdsbd committed Mar 6, 2023
1 parent 60add96 commit 64dc4df
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 7 deletions.
22 changes: 15 additions & 7 deletions src/lib/ownership/OwnershipEngine.ts
Expand Up @@ -54,8 +54,10 @@ export class OwnershipEngine {
if (!line || line.startsWith("#")) {
continue;
}

owned.push(createMatcherCodeownersRule(line, idx));
const matcher = createMatcherCodeownersRule(line, idx);
if (matcher != null) {
owned.push(matcher);
}
}

return new OwnershipEngine(owned);
Expand All @@ -67,11 +69,15 @@ export class OwnershipEngine {
}

const createMatcherCodeownersRule = (
rule: string,
rawRuleString: string,
lineno: number
): FileOwnershipMatcher => {
): FileOwnershipMatcher | null => {
const ruleWithoutComments = rawRuleString.split("#")[0].trim();
if (!ruleWithoutComments) {
return null;
}
// Split apart on spaces
const parts = rule.split(/\s+/);
const parts = ruleWithoutComments.split(/\s+/);

// The first part is expected to be the path
const path = parts[0];
Expand All @@ -83,7 +89,9 @@ const createMatcherCodeownersRule = (
teamNames = parts.slice(1, parts.length);
for (const name of teamNames) {
if (!codeOwnerRegex.test(name)) {
throw new Error(`${name} is not a valid owner name in rule ${rule}`);
throw new Error(
`${name} is not a valid owner name in rule ${ruleWithoutComments}`
);
}
}
}
Expand All @@ -105,7 +113,7 @@ const createMatcherCodeownersRule = (

// Return our complete matcher
return {
rule,
rule: ruleWithoutComments,
path,
owners: teamNames,
lineno,
Expand Down
59 changes: 59 additions & 0 deletions src/lib/ownership/exampleCodeownersFile.txt
@@ -0,0 +1,59 @@
# This is a comment.
# Each line is a file pattern followed by one or more owners.

# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence,
# @global-owner1 and @global-owner2 will be requested for
# review when someone opens a pull request.
* @global-owner1 @global-owner2

# Order is important; the last matching pattern takes the most
# precedence. When someone opens a pull request that only
# modifies JS files, only @js-owner and not the global
# owner(s) will be requested for a review.
*.js @js-owner #This is an inline comment.

# You can also use email addresses if you prefer. They'll be
# used to look up users just like we do for commit author
# emails.
*.go docs@example.com

# Teams can be specified as code owners as well. Teams should
# be identified in the format @org/team-name. Teams must have
# explicit write access to the repository. In this example,
# the octocats team in the octo-org organization owns all .txt files.
*.txt @octo-org/octocats

# In this example, @doctocat owns any files in the build/logs
# directory at the root of the repository and any of its
# subdirectories.
/build/logs/ @doctocat

# The `docs/*` pattern will match files like
# `docs/getting-started.md` but not further nested files like
# `docs/build-app/troubleshooting.md`.
docs/* docs@example.com

# In this example, @octocat owns any file in an apps directory
# anywhere in your repository.
apps/ @octocat

# In this example, @doctocat owns any file in the `/docs`
# directory in the root of your repository and any of its
# subdirectories.
/docs/ @doctocat

# In this example, any change inside the `/scripts` directory
# will require approval from @doctocat or @octocat.
/scripts/ @doctocat @octocat

# In this example, @octocat owns any file in a `/logs` directory such as
# `/build/logs`, `/scripts/logs`, and `/deeply/nested/logs`. Any changes
# in a `/logs` directory will require approval from @octocat.
**/logs @octocat

# In this example, @octocat owns any file in the `/apps`
# directory in the root of your repository except for the `/apps/github`
# subdirectory, as its owners are left empty.
/apps/ @octocat
/apps/github
10 changes: 10 additions & 0 deletions src/lib/ownership/github-example.test.ts
@@ -0,0 +1,10 @@
import path from "path";
import { OwnershipEngine } from "./OwnershipEngine";

test("github example CODEOWNERS file", () => {
expect(
OwnershipEngine.FromCodeownersFile(
path.join(__dirname, "exampleCodeownersFile.txt")
).calcFileOwnership("example.go")?.owners ?? []
).toContain("docs@example.com");
});

0 comments on commit 64dc4df

Please sign in to comment.