mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 22:08:09 +08:00 
			
		
		
		
	Implement branch list using callbacks from exec function (#1045)
When trying to list local branches to figure out what needs cleaned up during runs on non-ephemeral Actions Runners, we use git rev-parse --symbolic-full-name to get a list of branches. This can lead to ambiguous ref name errors when there are branches and tags with similar names. Part of the reason we use rev-parse --symbolic-full-name vs git branch --list or git rev-parse --symbolic seems to related to a bug in Git 2.18. Until we can deprecate our usage of Git 2.18, I think we need to keep --symbolic-full-name. Since part of the problem is that these ambiguous ref name errors clog the Actions annotation limits, this is a mitigation to suppress those messages until we can get rid of the workaround.
This commit is contained in:
		
							
								
								
									
										127
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										127
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -7441,8 +7441,10 @@ class GitCommandManager { | ||||
|             const result = []; | ||||
|             // Note, this implementation uses "rev-parse --symbolic-full-name" because the output from
 | ||||
|             // "branch --list" is more difficult when in a detached HEAD state.
 | ||||
|             // Note, this implementation uses "rev-parse --symbolic-full-name" because there is a bug
 | ||||
|             // in Git 2.18 that causes "rev-parse --symbolic" to output symbolic full names.
 | ||||
|             // TODO(https://github.com/actions/checkout/issues/786): this implementation uses
 | ||||
|             // "rev-parse --symbolic-full-name" because there is a bug
 | ||||
|             // in Git 2.18 that causes "rev-parse --symbolic" to output symbolic full names. When
 | ||||
|             // 2.18 is no longer supported, we can switch back to --symbolic.
 | ||||
|             const args = ['rev-parse', '--symbolic-full-name']; | ||||
|             if (remote) { | ||||
|                 args.push('--remotes=origin'); | ||||
| @@ -7450,18 +7452,42 @@ class GitCommandManager { | ||||
|             else { | ||||
|                 args.push('--branches'); | ||||
|             } | ||||
|             const output = yield this.execGit(args); | ||||
|             for (let branch of output.stdout.trim().split('\n')) { | ||||
|                 branch = branch.trim(); | ||||
|                 if (branch) { | ||||
|                     if (branch.startsWith('refs/heads/')) { | ||||
|                         branch = branch.substr('refs/heads/'.length); | ||||
|                     } | ||||
|                     else if (branch.startsWith('refs/remotes/')) { | ||||
|                         branch = branch.substr('refs/remotes/'.length); | ||||
|                     } | ||||
|                     result.push(branch); | ||||
|             const stderr = []; | ||||
|             const errline = []; | ||||
|             const stdout = []; | ||||
|             const stdline = []; | ||||
|             const listeners = { | ||||
|                 stderr: (data) => { | ||||
|                     stderr.push(data.toString()); | ||||
|                 }, | ||||
|                 errline: (data) => { | ||||
|                     errline.push(data.toString()); | ||||
|                 }, | ||||
|                 stdout: (data) => { | ||||
|                     stdout.push(data.toString()); | ||||
|                 }, | ||||
|                 stdline: (data) => { | ||||
|                     stdline.push(data.toString()); | ||||
|                 } | ||||
|             }; | ||||
|             // Suppress the output in order to avoid flooding annotations with innocuous errors.
 | ||||
|             yield this.execGit(args, false, true, listeners); | ||||
|             core.debug(`stderr callback is: ${stderr}`); | ||||
|             core.debug(`errline callback is: ${errline}`); | ||||
|             core.debug(`stdout callback is: ${stdout}`); | ||||
|             core.debug(`stdline callback is: ${stdline}`); | ||||
|             for (let branch of stdline) { | ||||
|                 branch = branch.trim(); | ||||
|                 if (!branch) { | ||||
|                     continue; | ||||
|                 } | ||||
|                 if (branch.startsWith('refs/heads/')) { | ||||
|                     branch = branch.substring('refs/heads/'.length); | ||||
|                 } | ||||
|                 else if (branch.startsWith('refs/remotes/')) { | ||||
|                     branch = branch.substring('refs/remotes/'.length); | ||||
|                 } | ||||
|                 result.push(branch); | ||||
|             } | ||||
|             return result; | ||||
|         }); | ||||
| @@ -7712,7 +7738,7 @@ class GitCommandManager { | ||||
|             return result; | ||||
|         }); | ||||
|     } | ||||
|     execGit(args, allowAllExitCodes = false, silent = false) { | ||||
|     execGit(args, allowAllExitCodes = false, silent = false, customListeners = {}) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             fshelper.directoryExistsSync(this.workingDirectory, true); | ||||
|             const result = new GitOutput(); | ||||
| @@ -7723,20 +7749,24 @@ class GitCommandManager { | ||||
|             for (const key of Object.keys(this.gitEnv)) { | ||||
|                 env[key] = this.gitEnv[key]; | ||||
|             } | ||||
|             const defaultListener = { | ||||
|                 stdout: (data) => { | ||||
|                     stdout.push(data.toString()); | ||||
|                 } | ||||
|             }; | ||||
|             const mergedListeners = Object.assign(Object.assign({}, defaultListener), customListeners); | ||||
|             const stdout = []; | ||||
|             const options = { | ||||
|                 cwd: this.workingDirectory, | ||||
|                 env, | ||||
|                 silent, | ||||
|                 ignoreReturnCode: allowAllExitCodes, | ||||
|                 listeners: { | ||||
|                     stdout: (data) => { | ||||
|                         stdout.push(data.toString()); | ||||
|                     } | ||||
|                 } | ||||
|                 listeners: mergedListeners | ||||
|             }; | ||||
|             result.exitCode = yield exec.exec(`"${this.gitPath}"`, args, options); | ||||
|             result.stdout = stdout.join(''); | ||||
|             core.debug(result.exitCode.toString()); | ||||
|             core.debug(result.stdout); | ||||
|             return result; | ||||
|         }); | ||||
|     } | ||||
| @@ -13947,6 +13977,7 @@ var encode = function encode(str, defaultEncoder, charset, kind, format) { | ||||
| 
 | ||||
|         i += 1; | ||||
|         c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); | ||||
|         /* eslint operator-linebreak: [2, "before"] */ | ||||
|         out += hexTable[0xF0 | (c >> 18)] | ||||
|             + hexTable[0x80 | ((c >> 12) & 0x3F)] | ||||
|             + hexTable[0x80 | ((c >> 6) & 0x3F)] | ||||
| @@ -17572,7 +17603,7 @@ var parseObject = function (chain, val, options, valuesParsed) { | ||||
|             ) { | ||||
|                 obj = []; | ||||
|                 obj[index] = leaf; | ||||
|             } else { | ||||
|             } else if (cleanRoot !== '__proto__') { | ||||
|                 obj[cleanRoot] = leaf; | ||||
|             } | ||||
|         } | ||||
| @@ -34704,6 +34735,7 @@ var arrayPrefixGenerators = { | ||||
| }; | ||||
| 
 | ||||
| var isArray = Array.isArray; | ||||
| var split = String.prototype.split; | ||||
| var push = Array.prototype.push; | ||||
| var pushToArray = function (arr, valueOrArray) { | ||||
|     push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); | ||||
| @@ -34740,10 +34772,13 @@ var isNonNullishPrimitive = function isNonNullishPrimitive(v) { | ||||
|         || typeof v === 'bigint'; | ||||
| }; | ||||
| 
 | ||||
| var sentinel = {}; | ||||
| 
 | ||||
| var stringify = function stringify( | ||||
|     object, | ||||
|     prefix, | ||||
|     generateArrayPrefix, | ||||
|     commaRoundTrip, | ||||
|     strictNullHandling, | ||||
|     skipNulls, | ||||
|     encoder, | ||||
| @@ -34759,8 +34794,23 @@ var stringify = function stringify( | ||||
| ) { | ||||
|     var obj = object; | ||||
| 
 | ||||
|     if (sideChannel.has(object)) { | ||||
|         throw new RangeError('Cyclic object value'); | ||||
|     var tmpSc = sideChannel; | ||||
|     var step = 0; | ||||
|     var findFlag = false; | ||||
|     while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { | ||||
|         // Where object last appeared in the ref tree
 | ||||
|         var pos = tmpSc.get(object); | ||||
|         step += 1; | ||||
|         if (typeof pos !== 'undefined') { | ||||
|             if (pos === step) { | ||||
|                 throw new RangeError('Cyclic object value'); | ||||
|             } else { | ||||
|                 findFlag = true; // Break while
 | ||||
|             } | ||||
|         } | ||||
|         if (typeof tmpSc.get(sentinel) === 'undefined') { | ||||
|             step = 0; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (typeof filter === 'function') { | ||||
| @@ -34787,6 +34837,14 @@ var stringify = function stringify( | ||||
|     if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { | ||||
|         if (encoder) { | ||||
|             var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); | ||||
|             if (generateArrayPrefix === 'comma' && encodeValuesOnly) { | ||||
|                 var valuesArray = split.call(String(obj), ','); | ||||
|                 var valuesJoined = ''; | ||||
|                 for (var i = 0; i < valuesArray.length; ++i) { | ||||
|                     valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format)); | ||||
|                 } | ||||
|                 return [formatter(keyValue) + (commaRoundTrip && isArray(obj) && valuesArray.length === 1 ? '[]' : '') + '=' + valuesJoined]; | ||||
|             } | ||||
|             return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; | ||||
|         } | ||||
|         return [formatter(prefix) + '=' + formatter(String(obj))]; | ||||
| @@ -34801,7 +34859,7 @@ var stringify = function stringify( | ||||
|     var objKeys; | ||||
|     if (generateArrayPrefix === 'comma' && isArray(obj)) { | ||||
|         // we need to join elements in
 | ||||
|         objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : undefined }]; | ||||
|         objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; | ||||
|     } else if (isArray(filter)) { | ||||
|         objKeys = filter; | ||||
|     } else { | ||||
| @@ -34809,24 +34867,28 @@ var stringify = function stringify( | ||||
|         objKeys = sort ? keys.sort(sort) : keys; | ||||
|     } | ||||
| 
 | ||||
|     for (var i = 0; i < objKeys.length; ++i) { | ||||
|         var key = objKeys[i]; | ||||
|         var value = typeof key === 'object' && key.value !== undefined ? key.value : obj[key]; | ||||
|     var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? prefix + '[]' : prefix; | ||||
| 
 | ||||
|     for (var j = 0; j < objKeys.length; ++j) { | ||||
|         var key = objKeys[j]; | ||||
|         var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; | ||||
| 
 | ||||
|         if (skipNulls && value === null) { | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
|         var keyPrefix = isArray(obj) | ||||
|             ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix | ||||
|             : prefix + (allowDots ? '.' + key : '[' + key + ']'); | ||||
|             ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, key) : adjustedPrefix | ||||
|             : adjustedPrefix + (allowDots ? '.' + key : '[' + key + ']'); | ||||
| 
 | ||||
|         sideChannel.set(object, true); | ||||
|         sideChannel.set(object, step); | ||||
|         var valueSideChannel = getSideChannel(); | ||||
|         valueSideChannel.set(sentinel, sideChannel); | ||||
|         pushToArray(values, stringify( | ||||
|             value, | ||||
|             keyPrefix, | ||||
|             generateArrayPrefix, | ||||
|             commaRoundTrip, | ||||
|             strictNullHandling, | ||||
|             skipNulls, | ||||
|             encoder, | ||||
| @@ -34850,7 +34912,7 @@ var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { | ||||
|         return defaults; | ||||
|     } | ||||
| 
 | ||||
|     if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { | ||||
|     if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { | ||||
|         throw new TypeError('Encoder has to be a function.'); | ||||
|     } | ||||
| 
 | ||||
| @@ -34923,6 +34985,10 @@ module.exports = function (object, opts) { | ||||
|     } | ||||
| 
 | ||||
|     var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; | ||||
|     if (opts && 'commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') { | ||||
|         throw new TypeError('`commaRoundTrip` must be a boolean, or absent'); | ||||
|     } | ||||
|     var commaRoundTrip = generateArrayPrefix === 'comma' && opts && opts.commaRoundTrip; | ||||
| 
 | ||||
|     if (!objKeys) { | ||||
|         objKeys = Object.keys(obj); | ||||
| @@ -34943,6 +35009,7 @@ module.exports = function (object, opts) { | ||||
|             obj[key], | ||||
|             key, | ||||
|             generateArrayPrefix, | ||||
|             commaRoundTrip, | ||||
|             options.strictNullHandling, | ||||
|             options.skipNulls, | ||||
|             options.encode ? options.encoder : null, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user