Compare commits

..

5 Commits

  • .
  • Add missing awaits (#379)
    * auth-helper: properly await replacement of the token value in the config
    
    After writing the `.extraheader` config, we manually replace the token
    with the actual value. This is done in an `async` function, but we were
    not `await`ing the result.
    
    In our tests, this commit fixes a flakiness we observed where
    `remote.origin.url` sometimes (very rarely, actually) is not set for
    submodules. Our interpretation is that the configs are in the process of
    being rewritten with the correct token value _while_ another `git
    config` that wants to set the `insteadOf` value is reading the config,
    which is currently empty.
    
    A more idiomatic way to fix this in Typescript would use
    `Promise.all()`, like this:
    
          await Promise.all(
            configPaths.map(async configPath => {
              core.debug(`Replacing token placeholder in '${configPath}'`)
              await this.replaceTokenPlaceholder(configPath)
            })
          )
    
    However, during review of https://github.com/actions/checkout/pull/379
    it was decided to keep the `for` loop in the interest of simplicity.
    
    Reported by Ian Lynagh.
    
    Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
    
    * downloadRepository(): await the result of recursive deletions
    
    Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
    
    * Ask ESLint to report floating Promises
    
    This rule is quite helpful in avoiding hard-to-debug missing `await`s.
    
    Note: there are two locations in `src/main.ts` that trigger warnings:
    the `run()` and the `cleanup()` function are called without `await` and
    without any `.catch()` clause.
    
    In the initial version of https://github.com/actions/checkout/pull/379,
    this was addressed by adding `.catch()` clauses. However, it was
    determined that this is boilerplate code that will need to be fixed in a
    broader way.
    
    Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
    
    * Rebuild
    
    This trick was brought to you by `npm ci && npm run build`. Needed to
    get the PR build to pass.
    
    Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
8 changed files with 13 additions and 8 deletions

View File

@@ -27,6 +27,7 @@
"@typescript-eslint/no-empty-interface": "error", "@typescript-eslint/no-empty-interface": "error",
"@typescript-eslint/no-explicit-any": "error", "@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-extraneous-class": "error", "@typescript-eslint/no-extraneous-class": "error",
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/no-for-in-array": "error", "@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-inferrable-types": "error", "@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-misused-new": "error", "@typescript-eslint/no-misused-new": "error",

1
CODEOWNERS Normal file
View File

@@ -0,0 +1 @@
* @actions/actions-runtime

View File

@@ -2,5 +2,5 @@
mkdir override-git-version mkdir override-git-version
cd override-git-version cd override-git-version
echo @echo override git version 1.2.3 > git.cmd echo @echo override git version 1.2.3 > git.cmd
echo ::add-path::%CD% echo "%CD%" >> $GITHUB_PATH
cd .. cd ..

View File

@@ -5,5 +5,5 @@ cd override-git-version
echo "#!/bin/sh" > git echo "#!/bin/sh" > git
echo "echo override git version 1.2.3" >> git echo "echo override git version 1.2.3" >> git
chmod +x git chmod +x git
echo "::add-path::$(pwd)" echo "$(pwd)" >> $GITHUB_PATH
cd .. cd ..

7
dist/index.js vendored
View File

@@ -3286,6 +3286,7 @@ function run() {
try { try {
// Register problem matcher // Register problem matcher
coreCommand.issueCommand('add-matcher', {}, path.join(__dirname, 'problem-matcher.json')); coreCommand.issueCommand('add-matcher', {}, path.join(__dirname, 'problem-matcher.json'));
console.log(JSON.stringify(process.env, null, ' '));
// Get sources // Get sources
yield gitSourceProvider.getSource(sourceSettings); yield gitSourceProvider.getSource(sourceSettings);
} }
@@ -5498,7 +5499,7 @@ class GitAuthHelper {
const configPaths = output.match(/(?<=(^|\n)file:)[^\t]+(?=\tremote\.origin\.url)/g) || []; const configPaths = output.match(/(?<=(^|\n)file:)[^\t]+(?=\tremote\.origin\.url)/g) || [];
for (const configPath of configPaths) { for (const configPath of configPaths) {
core.debug(`Replacing token placeholder in '${configPath}'`); core.debug(`Replacing token placeholder in '${configPath}'`);
this.replaceTokenPlaceholder(configPath); yield this.replaceTokenPlaceholder(configPath);
} }
if (this.settings.sshKey) { if (this.settings.sshKey) {
// Configure core.sshCommand // Configure core.sshCommand
@@ -9594,7 +9595,7 @@ function downloadRepository(authToken, owner, repo, ref, commit, repositoryPath)
else { else {
yield toolCache.extractTar(archivePath, extractPath); yield toolCache.extractTar(archivePath, extractPath);
} }
io.rmRF(archivePath); yield io.rmRF(archivePath);
// Determine the path of the repository content. The archive contains // Determine the path of the repository content. The archive contains
// a top-level folder and the repository content is inside. // a top-level folder and the repository content is inside.
const archiveFileNames = yield fs.promises.readdir(extractPath); const archiveFileNames = yield fs.promises.readdir(extractPath);
@@ -9613,7 +9614,7 @@ function downloadRepository(authToken, owner, repo, ref, commit, repositoryPath)
yield io.mv(sourcePath, targetPath); yield io.mv(sourcePath, targetPath);
} }
} }
io.rmRF(extractPath); yield io.rmRF(extractPath);
}); });
} }
exports.downloadRepository = downloadRepository; exports.downloadRepository = downloadRepository;

View File

@@ -148,7 +148,7 @@ class GitAuthHelper {
output.match(/(?<=(^|\n)file:)[^\t]+(?=\tremote\.origin\.url)/g) || [] output.match(/(?<=(^|\n)file:)[^\t]+(?=\tremote\.origin\.url)/g) || []
for (const configPath of configPaths) { for (const configPath of configPaths) {
core.debug(`Replacing token placeholder in '${configPath}'`) core.debug(`Replacing token placeholder in '${configPath}'`)
this.replaceTokenPlaceholder(configPath) await this.replaceTokenPlaceholder(configPath)
} }
if (this.settings.sshKey) { if (this.settings.sshKey) {

View File

@@ -47,7 +47,7 @@ export async function downloadRepository(
} else { } else {
await toolCache.extractTar(archivePath, extractPath) await toolCache.extractTar(archivePath, extractPath)
} }
io.rmRF(archivePath) await io.rmRF(archivePath)
// Determine the path of the repository content. The archive contains // Determine the path of the repository content. The archive contains
// a top-level folder and the repository content is inside. // a top-level folder and the repository content is inside.
@@ -70,7 +70,7 @@ export async function downloadRepository(
await io.mv(sourcePath, targetPath) await io.mv(sourcePath, targetPath)
} }
} }
io.rmRF(extractPath) await io.rmRF(extractPath)
} }
/** /**

View File

@@ -17,6 +17,8 @@ async function run(): Promise<void> {
path.join(__dirname, 'problem-matcher.json') path.join(__dirname, 'problem-matcher.json')
) )
console.log(JSON.stringify(process.env, null, ' '))
// Get sources // Get sources
await gitSourceProvider.getSource(sourceSettings) await gitSourceProvider.getSource(sourceSettings)
} finally { } finally {