@@ -4,7 +4,7 @@ import ReleasePreparation from '../../lib/prepare_release.js';
44import ReleasePromotion from '../../lib/promote_release.js' ;
55import TeamInfo from '../../lib/team_info.js' ;
66import Request from '../../lib/request.js' ;
7- import { runPromise } from '../../lib/run.js' ;
7+ import { forceRunAsync , runPromise } from '../../lib/run.js' ;
88
99export const command = 'release [prid..]' ;
1010export const describe = 'Manage an in-progress release or start a new one.' ;
@@ -114,14 +114,30 @@ function release(state, argv) {
114114 cli . setAssumeYes ( ) ;
115115 }
116116
117- return runPromise ( main ( state , argv , cli , dir ) ) . catch ( ( err ) => {
117+ return runPromise ( wrapStash ( ( ) => main ( state , argv , cli , dir ) ) ) . catch ( ( err ) => {
118118 if ( cli . spinner . enabled ) {
119119 cli . spinner . fail ( ) ;
120120 }
121121 throw err ;
122122 } ) ;
123123}
124124
125+ async function wrapStash ( fn ) {
126+ const stashTip = await forceRunAsync ( 'git' , [ 'stash' , 'list' , '-1' , '--format="%gd"' ] ,
127+ { ignoreFailure : false , captureStdout : true } ) ;
128+ await forceRunAsync ( 'git' , [ 'stash' , '--include-untracked' ] , { ignoreFailure : false } ) ;
129+ const newStashTip = await forceRunAsync ( 'git' , [ 'stash' , 'list' , '-1' , '--format="%gd"' ] ,
130+ { ignoreFailure : false , captureStdout : true } ) ;
131+ const hasStashed = newStashTip !== stashTip && newStashTip . trim ( ) ;
132+ try {
133+ await fn ( ) ;
134+ } finally {
135+ if ( hasStashed ) {
136+ await forceRunAsync ( 'git' , [ 'stash' , 'pop' ] , { ignoreFailure : false } ) ;
137+ }
138+ }
139+ }
140+
125141async function main ( state , argv , cli , dir ) {
126142 if ( state === PREPARE ) {
127143 const release = new ReleasePreparation ( argv , cli , dir ) ;
0 commit comments