You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ma...@apache.org on 2024/03/25 23:55:09 UTC

(superset) 02/04: progress

This is an automated email from the ASF dual-hosted git repository.

maximebeauchemin pushed a commit to branch pyproject.toml
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 4938e955ca071aacb9c255691861ccee764545cc
Author: Maxime Beauchemin <ma...@gmail.com>
AuthorDate: Mon Mar 25 16:18:05 2024 -0700

    progress
---
 .github/supersetbot/src/cli.js    |  2 +-
 .github/supersetbot/src/github.js | 33 ++++++++++++--------
 .github/supersetbot/src/utils.js  | 64 ++++++++++++++++++++++++++-------------
 3 files changed, 65 insertions(+), 34 deletions(-)

diff --git a/.github/supersetbot/src/cli.js b/.github/supersetbot/src/cli.js
index 4cefa3567f..2241d0c232 100755
--- a/.github/supersetbot/src/cli.js
+++ b/.github/supersetbot/src/cli.js
@@ -156,7 +156,7 @@ export default function getCLI(context) {
       .action(async function (pythonLib) {
         const opts = context.processOptions(this, ['repo']);
         const github = new Github({ context });
-        github.createBumpLibPullRequest(pythonLib, opts.verbose, opts.dryRun);
+        await github.createBumpLibPullRequest(pythonLib, opts.verbose, opts.dryRun);
       });
 
 
diff --git a/.github/supersetbot/src/github.js b/.github/supersetbot/src/github.js
index f94b350de5..b2b0ca2849 100644
--- a/.github/supersetbot/src/github.js
+++ b/.github/supersetbot/src/github.js
@@ -253,33 +253,42 @@ class Github {
     return PROTECTED_LABEL_PATTERNS.some((pattern) => new RegExp(pattern).test(label));
   }
 
-  createBumpLibPullRequest(lib, verbose = false, dryRun = false) {
+  async createBumpLibPullRequest(lib, verbose = false, dryRun = false) {
     const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'update-'));
     console.log("CWD:", cwd);
 
     // Clone the repo
-    runShellCommand({ command: `git clone --depth 1 git@github.com:${this.context.repo} .`, cwd, verbose });
+    await runShellCommand({ command: `git clone --depth 1 git@github.com:${this.context.repo} .`, cwd, verbose });
 
     // Run pip-compile-multi
-    runShellCommand({ command: `pip-compile-multi -P ${lib}`, cwd });
+    await runShellCommand({ command: `pip-compile-multi -P ${lib}`, cwd });
 
-    // Check for changes
-    const status = runShellCommand({ command: 'git status --porcelain', cwd, raiseOnError: false, verbose });
-    if (!!status) {
+    // Diffing
+    const diffResults = await runShellCommand({ command: 'git diff --color=never --unified=0', cwd, raiseOnError: false, verbose, exitOnError: false });
+
+    const changed = diffResults.stdout.trim()
+      .split('\n')
+      .map((line) => line.trim())
+      .filter((line) => line.startsWith('+' + lib))
+      .map((line) => line.substring(1));
+
+    if (changed.length === 0) {
       console.log('No changes detected... skipping.');
     } else {
 
+      console.log("LIB:", changed[0]);
+
       // Create branch
-      const branchName = `bump-${lib}-${Date.now()}`;
-      runShellCommand({ command: `git checkout -b ${branchName}`, cwd, verbose });
+      const branchName = `supersetbot-bump-${changed[0]}`;
+      await runShellCommand({ command: `git checkout -b ${branchName}`, cwd, verbose });
 
       // Commit changes
-      runShellCommand({ command: `git add .`, cwd });
-      const commitMessage = `chore(supersetbot): bump python library "${lib}"`;
-      runShellCommand({ command: `git commit -m "${commitMessage}"`, cwd, verbose });
+      await runShellCommand({ command: `git add .`, cwd });
+      const commitMessage = `chore(🤖): bump python "${changed[0]}"`;
+      await runShellCommand({ command: `git commit -m "${commitMessage}"`, cwd, verbose });
 
       // Push changes
-      runShellCommand({ command: `git push origin ${branchName}`, cwd, verbose });
+      await runShellCommand({ command: `git push origin ${branchName}`, cwd, verbose });
 
       if (!dryRun) {
         // Create a PR
diff --git a/.github/supersetbot/src/utils.js b/.github/supersetbot/src/utils.js
index 07777c378e..8bc745a852 100644
--- a/.github/supersetbot/src/utils.js
+++ b/.github/supersetbot/src/utils.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { spawnSync } from 'child_process';
+import { spawn} from 'child_process';
 
 import { readFile } from 'fs/promises';
 import { fileURLToPath } from 'url';
@@ -41,29 +41,51 @@ export async function currentPackageVersion() {
   return data.version;
 }
 
+
 export function runShellCommand({ command, raiseOnError = true, exitOnError = true, cwd = null, verbose = false }) {
-  const args = command.split(/\s+/).filter((s) => !!s && s !== '\\');
-  const spawnOptions = { stdio: 'inherit', shell: true };
-  if (verbose) {
-    console.log(`RUN: ${command}`);
-  }
-  if (cwd) {
-    spawnOptions.cwd = cwd;
-  }
+  return new Promise((resolve, reject) => {
+    const args = command.split(/\s+/).filter((s) => !!s && s !== '\\');
+    const spawnOptions = {
+      shell: true,
+      cwd,
+    };
 
-  const result = spawnSync(args.shift(), args, spawnOptions);
+    if (verbose) {
+      console.log(`RUN: ${command}`);
+    }
 
-  if (result.status !== 0) {
-    const msg = `Command failed with exit code ${result.status}: ${result.stderr?.toString()}`;
-    console.error(msg);
+    const child = spawn(args.shift(), args, spawnOptions);
+    let stdout = '';
+    let stderr = '';
 
-    if (raiseOnError) {
-      throw new Error(msg);
-    }
-    if (exitOnError) {
-      process.exit(1);
-    }
-  }
+    child.stdout.on('data', (data) => {
+      console.log(data.toString());
+      stdout += data.toString();
+    });
+
+    child.stderr.on('data', (data) => {
+      console.log(data.toString());
+      stderr += data.toString();
+    });
+
+    child.on('close', (code) => {
+      if (code !== 0) {
+        const msg = `Command failed with exit code ${code}: ${stderr}`;
+        console.error(msg);
+
+        if (raiseOnError) {
+          reject(new Error(msg));
+        }
+        if (exitOnError) {
+          process.exit(1);
+        }
+      }
+
+      resolve({ stdout, stderr });
+    });
 
-  return result.stdout?.toString();
+    child.on('error', (err) => {
+      reject(err);
+    });
+  });
 }