Skip to content

Commit f0e0e5a

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents a1144b3 + f3eb766 commit f0e0e5a

File tree

1,935 files changed

+100796
-76593
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,935 files changed

+100796
-76593
lines changed

.bowerrc

Lines changed: 0 additions & 3 deletions
This file was deleted.

.devcontainer/devcontainer.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"image": "mcr.microsoft.com/devcontainers/jekyll:2",
3+
"customizations": {
4+
"vscode": {
5+
"extensions": [
6+
"rebornix.Ruby",
7+
"DavidAnson.vscode-markdownlint"
8+
]
9+
}
10+
}
11+
}

.github/pull_request_template.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1+
<!--
12
Thanks for improving the documentation 😃
23
Please give a short description and check the matching checkboxes to help us review this as quick as possible.
34
4-
## 🏷 Type of documentation
5+
Please make the PR writeable. This allows us to fix typos, grammar and linting errors ourselves, which makes
6+
merging and reviewing a lot faster for everybody.
7+
8+
⚠️ The documentation is merged after the related code changes are merged and release ⚠️
9+
-->
510

11+
## 🏷 Type of documentation
12+
<!-- Remove items that don't apply and/or select an item by changing [ ] to [x] -->
613
- [ ] new bid adapter
714
- [ ] update bid adapter
815
- [ ] new feature
@@ -11,6 +18,6 @@ Please give a short description and check the matching checkboxes to help us rev
1118
- [ ] new examples
1219

1320
## 📋 Checklist
14-
15-
- [ ] Related pull requests in prebid.js or server are linked
21+
<!-- Remove items that don't apply and/or select an item by changing [ ] to [x] -->
22+
- [ ] Related pull requests in prebid.js or server are linked -> Paste link in this list or reference it on the PR itself
1623
- [ ] For new adapters check [submitting your adapter docs](https://docs.prebid.org/dev-docs/bidder-adaptor.html#submitting-your-adapter)

.github/workflows/ci.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: Continuous Integration
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- master
7+
push:
8+
branches:
9+
- master
10+
11+
jobs:
12+
# based on https://github.com/DavidAnson/markdownlint-cli2-action/blob/main/.github/workflows/changed.yml
13+
# runs markdown lint only for changed files
14+
markdownlint:
15+
name: run markdownlint
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@v4
19+
with:
20+
fetch-depth: 0
21+
- uses: tj-actions/changed-files@v46
22+
id: changed-files
23+
with:
24+
files: '**/*.md'
25+
separator: ","
26+
- uses: DavidAnson/markdownlint-cli2-action@v16
27+
if: steps.changed-files.outputs.any_changed == 'true'
28+
with:
29+
globs: "${{ steps.changed-files.outputs.all_changed_files }},!_includes"
30+
separator: ","
31+
config: '.markdownlint.json'
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
name: Notify Code Path Changes
2+
3+
on:
4+
pull_request_target:
5+
types: [opened, synchronize]
6+
paths:
7+
- '**'
8+
9+
env:
10+
OAUTH2_CLIENT_ID: ${{ secrets.OAUTH2_CLIENT_ID }}
11+
OAUTH2_CLIENT_SECRET: ${{ secrets.OAUTH2_CLIENT_SECRET }}
12+
OAUTH2_REFRESH_TOKEN: ${{ secrets.OAUTH2_REFRESH_TOKEN }}
13+
GITHUB_REPOSITORY: ${{ github.repository }}
14+
GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }}
15+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
16+
17+
permissions:
18+
contents: read
19+
20+
jobs:
21+
notify:
22+
runs-on: ubuntu-latest
23+
steps:
24+
- name: Checkout Code
25+
uses: actions/checkout@v3
26+
27+
- name: Set up Node.js
28+
uses: actions/setup-node@v3
29+
with:
30+
node-version: '18'
31+
32+
- name: Install dependencies
33+
run: npm install axios nodemailer
34+
35+
- name: Run Notification Script
36+
run: |
37+
node .github/workflows/scripts/send-notification-on-change.js
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# when a changed file paths matches the regex, send an alert email
2+
# structure of the file is:
3+
#
4+
# javascriptRegex : email address
5+
#
6+
# For example, in the Prebid docs repo, the file pattern is generally
7+
#
8+
# /dev-docs/bidders/BIDDERCODE.md
9+
#
10+
# The aim is to find a minimal set of regex patterns that matches any file in these paths
11+
12+
/dev-docs/bidders/rubicon : header-bidding@magnite.com
13+
/dev-docs/bidders/ix : pdu-supply-prebid@indexexchange.com
14+
/dev-docs/bidders/appnexus|/dev-docs/bidders/msft : prebid@microsoft.com
15+
/dev-docs/bidders/pubmatic : header-bidding@pubmatic.com
16+
/dev-docs/bidders/openx : prebid@openx.com
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
// send-notification-on-change.js
2+
//
3+
// called by the code-path-changes.yml workflow, this script queries github for
4+
// the changes in the current PR, checks the config file for whether any of those
5+
// file paths are set to alert an email address, and sends email to multiple
6+
// parties if needed
7+
8+
const fs = require('fs');
9+
const path = require('path');
10+
const axios = require('axios');
11+
const nodemailer = require('nodemailer');
12+
13+
async function getAccessToken(clientId, clientSecret, refreshToken) {
14+
try {
15+
const response = await axios.post('https://oauth2.googleapis.com/token', {
16+
client_id: clientId,
17+
client_secret: clientSecret,
18+
refresh_token: refreshToken,
19+
grant_type: 'refresh_token',
20+
});
21+
return response.data.access_token;
22+
} catch (error) {
23+
console.error('Failed to fetch access token:', error.response?.data || error.message);
24+
process.exit(1);
25+
}
26+
}
27+
28+
(async () => {
29+
const configFilePath = path.join(__dirname, 'codepath-notification');
30+
const repo = process.env.GITHUB_REPOSITORY;
31+
const prNumber = process.env.GITHUB_PR_NUMBER;
32+
const token = process.env.GITHUB_TOKEN;
33+
34+
// Generate OAuth2 access token
35+
const clientId = process.env.OAUTH2_CLIENT_ID;
36+
const clientSecret = process.env.OAUTH2_CLIENT_SECRET;
37+
const refreshToken = process.env.OAUTH2_REFRESH_TOKEN;
38+
39+
// validate params
40+
if (!repo || !prNumber || !token || !clientId || !clientSecret || !refreshToken) {
41+
console.error('Missing required environment variables.');
42+
process.exit(1);
43+
}
44+
45+
// the whole process is in a big try/catch. e.g. if the config file doesn't exist, github is down, etc.
46+
try {
47+
// Read and process the configuration file
48+
const configFileContent = fs.readFileSync(configFilePath, 'utf-8');
49+
const configRules = configFileContent
50+
.split('\n')
51+
.filter(line => line.trim() !== '' && !line.trim().startsWith('#')) // Ignore empty lines and comments
52+
.map(line => {
53+
const [regex, email] = line.split(':').map(part => part.trim());
54+
return { regex: new RegExp(regex), email };
55+
});
56+
57+
// Fetch changed files from github
58+
const [owner, repoName] = repo.split('/');
59+
const apiUrl = `https://api.github.com/repos/${owner}/${repoName}/pulls/${prNumber}/files`;
60+
const response = await axios.get(apiUrl, {
61+
headers: {
62+
Authorization: `Bearer ${token}`,
63+
Accept: 'application/vnd.github.v3+json',
64+
},
65+
});
66+
67+
const changedFiles = response.data.map(file => file.filename);
68+
console.log('Changed files:', changedFiles);
69+
70+
// match file pathnames that are in the config and group them by email address
71+
const matchesByEmail = {};
72+
changedFiles.forEach(file => {
73+
configRules.forEach(rule => {
74+
if (rule.regex.test(file)) {
75+
if (!matchesByEmail[rule.email]) {
76+
matchesByEmail[rule.email] = [];
77+
}
78+
matchesByEmail[rule.email].push(file);
79+
}
80+
});
81+
});
82+
83+
// Exit successfully if no matches were found
84+
if (Object.keys(matchesByEmail).length === 0) {
85+
console.log('No matches found. Exiting successfully.');
86+
process.exit(0);
87+
}
88+
89+
console.log('Grouped matches by email:', matchesByEmail);
90+
91+
// get ready to email the changes
92+
const accessToken = await getAccessToken(clientId, clientSecret, refreshToken);
93+
94+
// Configure Nodemailer with OAuth2
95+
// service: 'Gmail',
96+
const transporter = nodemailer.createTransport({
97+
host: "smtp.gmail.com",
98+
port: 465,
99+
secure: true,
100+
auth: {
101+
type: 'OAuth2',
102+
user: 'info@prebid.org',
103+
clientId: clientId,
104+
clientSecret: clientSecret,
105+
refreshToken: refreshToken,
106+
accessToken: accessToken
107+
},
108+
});
109+
110+
// Send one email per recipient
111+
for (const [email, files] of Object.entries(matchesByEmail)) {
112+
const emailBody = `
113+
${email},
114+
<p>
115+
Files owned by you have been changed in open source ${repo}. The <a href="https://github.com/${repo}/pull/${prNumber}">pull request is #${prNumber}</a>. These are the files you own that have been modified:
116+
<ul>
117+
${files.map(file => `<li>${file}</li>`).join('')}
118+
</ul>
119+
`;
120+
121+
try {
122+
await transporter.sendMail({
123+
from: `"Prebid Info" <info@prebid.org>`,
124+
to: email,
125+
subject: `Files have been changed in open source ${repo}`,
126+
html: emailBody,
127+
});
128+
129+
console.log(`Email sent successfully to ${email}`);
130+
console.log(`${emailBody}`);
131+
} catch (error) {
132+
console.error(`Failed to send email to ${email}:`, error.message);
133+
}
134+
}
135+
} catch (error) {
136+
console.error('Error:', error.message);
137+
process.exit(1);
138+
}
139+
})();

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Gemfile.lock
33
/dist/bootstrap
44
/dist/jquery
55
/.idea
6+
/.vscode
67
.DS_Store
78
/vendor
89
/.bundle
@@ -12,3 +13,7 @@ Gemfile.lock
1213

1314
# Files generated by `npm install`
1415
node_modules/
16+
!_sass/node_modules
17+
/.vs/prebid.github.io/v17/.suo
18+
/.vs/slnx.sqlite
19+
/.vs

.markdownlint.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"default": true,
3+
"MD009": false,
4+
"MD013": false,
5+
"MD022": false,
6+
"MD024": false,
7+
"MD025": false,
8+
"MD033": false,
9+
"MD036": false
10+
}

.ruby-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2.7.6

0 commit comments

Comments
 (0)