From 311f6b6e84c5e713064c6e462042cd63f85de8a7 Mon Sep 17 00:00:00 2001 From: Vadim Zakondyrin Date: Fri, 7 Jun 2019 14:12:45 +0600 Subject: [PATCH 1/8] Fix saved cursor position on resize of alt screen --- src/InputHandler.ts | 4 ++-- src/common/buffer/Buffer.ts | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/InputHandler.ts b/src/InputHandler.ts index 5ea20caf..60693994 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -1916,7 +1916,7 @@ export class InputHandler extends Disposable implements IInputHandler { */ public saveCursor(params: number[]): void { this._terminal.buffer.savedX = this._terminal.buffer.x; - this._terminal.buffer.savedY = this._terminal.buffer.y; + this._terminal.buffer.savedY = this._terminal.buffer.ybase + this._terminal.buffer.y; this._terminal.buffer.savedCurAttrData.fg = this._terminal.curAttrData.fg; this._terminal.buffer.savedCurAttrData.bg = this._terminal.curAttrData.bg; } @@ -1929,7 +1929,7 @@ export class InputHandler extends Disposable implements IInputHandler { */ public restoreCursor(params: number[]): void { this._terminal.buffer.x = this._terminal.buffer.savedX || 0; - this._terminal.buffer.y = this._terminal.buffer.savedY || 0; + this._terminal.buffer.y = Math.max(this._terminal.buffer.savedY - this._terminal.buffer.ybase, 0); this._terminal.curAttrData.fg = this._terminal.buffer.savedCurAttrData.fg; this._terminal.curAttrData.bg = this._terminal.buffer.savedCurAttrData.bg; } diff --git a/src/common/buffer/Buffer.ts b/src/common/buffer/Buffer.ts index 1e6edae9..a30274b6 100644 --- a/src/common/buffer/Buffer.ts +++ b/src/common/buffer/Buffer.ts @@ -124,6 +124,7 @@ export class Buffer implements IBuffer { public clear(): void { this.ydisp = 0; this.ybase = 0; + this.savedY = 0; this.y = 0; this.x = 0; this.lines = new CircularList(this._getCorrectBufferLength(this._rows)); @@ -203,6 +204,7 @@ export class Buffer implements IBuffer { this.lines.trimStart(amountToTrim); this.ybase = Math.max(this.ybase - amountToTrim, 0); this.ydisp = Math.max(this.ydisp - amountToTrim, 0); + this.savedY = Math.max(this.savedY - amountToTrim, 0); } this.lines.maxLength = newMaxLength; } @@ -213,7 +215,6 @@ export class Buffer implements IBuffer { if (addToY) { this.y += addToY; } - this.savedY = Math.min(this.savedY, newRows - 1); this.savedX = Math.min(this.savedX, newCols - 1); this.scrollTop = 0; @@ -282,6 +283,7 @@ export class Buffer implements IBuffer { this.ybase--; } } + this.savedY = Math.max(this.savedY - countRemoved, 0); } private _reflowSmaller(newCols: number, newRows: number): void { @@ -393,6 +395,7 @@ export class Buffer implements IBuffer { } } } + this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1); } // Rearrange lines in the buffer if there are any insertions, this is done at the end rather From 699e721c4587faa548c9c9f258f7c4a52000c60a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 15 Jun 2019 13:17:43 -0700 Subject: [PATCH 2/8] Add a test for DECRC --- test/InputHandler.api.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/InputHandler.api.ts b/test/InputHandler.api.ts index 3a95feca..cbf5dbd6 100644 --- a/test/InputHandler.api.ts +++ b/test/InputHandler.api.ts @@ -292,6 +292,23 @@ describe('InputHandler Integration Tests', function(): void { assert.deepEqual(await getLinesAsArray(3), ['#', ' #', 'abcd####']); }); }); + + describe('ESC', () => { + describe('DECRC: Save cursor, ESC 7', () => { + it('should save the absolute cursor position so resizing restores to the correct position', async () => { + await page.evaluate(` + window.term.resize(10, 2); + window.term.write('1\\n\\r2\\n\\r3\\n\\r4\\n\\r5'); + window.term.write('\\x1b7\\x1b[?47h'); + `); + await page.evaluate(` + window.term.resize(10, 4); + window.term.write('\\x1b[?47l\\x1b8'); + `); + assert.deepEqual(await getCursor(), {col: 1, row: 3}); + }); + }); + }); }); async function openTerminal(options: ITerminalOptions = {}): Promise { From 2e83483e089e2505952f76a8ba90900c3c88444a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 15 Jun 2019 13:42:52 -0700 Subject: [PATCH 3/8] Support dry run publishing using --dry --- bin/publish.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index 9df2e982..d9e2798e 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -11,6 +11,11 @@ const packageJson = require('../package.json'); // Setup auth fs.writeFileSync(`${process.env['HOME']}/.npmrc`, `//registry.npmjs.org/:_authToken=${process.env['NPM_AUTH_TOKEN']}`); +const isDryRun = process.argv.indexOf('--dry') !== -1; +if (isDryRun) { + console.log('Publish dry run'); +} + // Determine if this is a stable or beta release const publishedVersions = getPublishedVersions(); const isStableRelease = publishedVersions.indexOf(packageJson.version) === -1; @@ -22,15 +27,23 @@ console.log(`Publishing version: ${nextVersion}`); // Set the version in package.json const packageJsonFile = path.resolve(__dirname, '..', 'package.json'); packageJson.version = nextVersion; -fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); +if (isDryRun) { + console.log(`Set version of ${packageJsonFile} to ${nextVersion}`); +} else { + fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); +} // Publish const args = ['publish']; if (!isStableRelease) { args.push('--tag', 'beta'); } -const result = cp.spawn('npm', args, { stdio: 'inherit' }); -result.on('exit', code => process.exit(code)); +if (isDryRun) { + console.log(`Spawn: npm ${args.join(' ')}`); +} else { + const result = cp.spawn('npm', args, { stdio: 'inherit' }); + result.on('exit', code => process.exit(code)); +} function getNextBetaVersion() { if (!/^[0-9]+\.[0-9]+\.[0-9]+$/.exec(packageJson.version)) { @@ -61,3 +74,6 @@ function getPublishedVersions(version, tag) { } return versionsJson; } + +function publishPackage(packageDir) { +} From 15c99869f5f6929b7af36b53261e567df1a19f0a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 15 Jun 2019 13:51:13 -0700 Subject: [PATCH 4/8] Start of publishing addons Part of #2165 --- addons/xterm-addon-attach/package.json | 2 +- addons/xterm-addon-fit/package.json | 2 +- addons/xterm-addon-search/package.json | 2 +- addons/xterm-addon-web-links/package.json | 2 +- bin/publish.js | 77 +++++++++++++---------- 5 files changed, 49 insertions(+), 36 deletions(-) diff --git a/addons/xterm-addon-attach/package.json b/addons/xterm-addon-attach/package.json index 1d72b144..84740e1e 100644 --- a/addons/xterm-addon-attach/package.json +++ b/addons/xterm-addon-attach/package.json @@ -1,6 +1,6 @@ { "name": "xterm-addon-attach", - "version": "0.1.0-beta11", + "version": "0.1.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" diff --git a/addons/xterm-addon-fit/package.json b/addons/xterm-addon-fit/package.json index 4ee8e1b7..6e553700 100644 --- a/addons/xterm-addon-fit/package.json +++ b/addons/xterm-addon-fit/package.json @@ -1,6 +1,6 @@ { "name": "xterm-addon-fit", - "version": "0.1.0-beta3", + "version": "0.1.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" diff --git a/addons/xterm-addon-search/package.json b/addons/xterm-addon-search/package.json index 02cb6695..5a607fe9 100644 --- a/addons/xterm-addon-search/package.json +++ b/addons/xterm-addon-search/package.json @@ -1,6 +1,6 @@ { "name": "xterm-addon-search", - "version": "0.1.0-beta6", + "version": "0.1.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" diff --git a/addons/xterm-addon-web-links/package.json b/addons/xterm-addon-web-links/package.json index a764a200..fd3945d3 100644 --- a/addons/xterm-addon-web-links/package.json +++ b/addons/xterm-addon-web-links/package.json @@ -1,6 +1,6 @@ { "name": "xterm-addon-web-links", - "version": "0.1.0-beta10", + "version": "0.1.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" diff --git a/bin/publish.js b/bin/publish.js index d9e2798e..fd2475c4 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -6,7 +6,6 @@ const cp = require('child_process'); const fs = require('fs'); const path = require('path'); -const packageJson = require('../package.json'); // Setup auth fs.writeFileSync(`${process.env['HOME']}/.npmrc`, `//registry.npmjs.org/:_authToken=${process.env['NPM_AUTH_TOKEN']}`); @@ -16,36 +15,53 @@ if (isDryRun) { console.log('Publish dry run'); } -// Determine if this is a stable or beta release -const publishedVersions = getPublishedVersions(); -const isStableRelease = publishedVersions.indexOf(packageJson.version) === -1; +const publishablePackages = [ + path.resolve(__dirname, '..'), + path.resolve(__dirname, '../addons/xterm-addon-attach'), + path.resolve(__dirname, '../addons/xterm-addon-fit'), + path.resolve(__dirname, '../addons/xterm-addon-search'), + path.resolve(__dirname, '../addons/xterm-addon-web-links') +]; -// Get the next version -let nextVersion = isStableRelease ? packageJson.version : getNextBetaVersion(); -console.log(`Publishing version: ${nextVersion}`); +publishablePackages.forEach(p => checkAndPublishPackage(p)); -// Set the version in package.json -const packageJsonFile = path.resolve(__dirname, '..', 'package.json'); -packageJson.version = nextVersion; -if (isDryRun) { - console.log(`Set version of ${packageJsonFile} to ${nextVersion}`); -} else { - fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); +function checkAndPublishPackage(packageDir) { + const packageJson = require(path.join(packageDir, 'package.json')); + console.group('Checking package ' + packageJson.name); + + // Determine if this is a stable or beta release + const publishedVersions = getPublishedVersions(packageJson); + const isStableRelease = publishedVersions.indexOf(packageJson.version) === -1; + + // Get the next version + let nextVersion = isStableRelease ? packageJson.version : getNextBetaVersion(packageJson); + console.log(`Publishing version: ${nextVersion}`); + + // Set the version in package.json + const packageJsonFile = path.join(packageDir, 'package.json'); + packageJson.version = nextVersion; + if (isDryRun) { + console.log(`Set version of ${packageJsonFile} to ${nextVersion}`); + } else { + fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); + } + + // Publish + const args = ['publish']; + if (!isStableRelease) { + args.push('--tag', 'beta'); + } + if (isDryRun) { + console.log(`Spawn: npm ${args.join(' ')}`); + } else { + const result = cp.spawn('npm', args, { stdio: 'inherit' }); + result.on('exit', code => process.exit(code)); + } + + console.groupEnd(); } -// Publish -const args = ['publish']; -if (!isStableRelease) { - args.push('--tag', 'beta'); -} -if (isDryRun) { - console.log(`Spawn: npm ${args.join(' ')}`); -} else { - const result = cp.spawn('npm', args, { stdio: 'inherit' }); - result.on('exit', code => process.exit(code)); -} - -function getNextBetaVersion() { +function getNextBetaVersion(packageJson) { if (!/^[0-9]+\.[0-9]+\.[0-9]+$/.exec(packageJson.version)) { console.error('The package.json version must be of the form x.y.z'); process.exit(1); @@ -53,7 +69,7 @@ function getNextBetaVersion() { const tag = 'beta'; const stableVersion = packageJson.version.split('.'); const nextStableVersion = `${stableVersion[0]}.${parseInt(stableVersion[1]) + 1}.0`; - const publishedVersions = getPublishedVersions(nextStableVersion, tag); + const publishedVersions = getPublishedVersions(packageJson, nextStableVersion, tag); if (publishedVersions.length === 0) { return `${nextStableVersion}-${tag}1`; } @@ -66,7 +82,7 @@ function getNextBetaVersion() { return `${nextStableVersion}-${tag}${latestTagVersion + 1}`; } -function getPublishedVersions(version, tag) { +function getPublishedVersions(packageJson, version, tag) { const versionsProcess = cp.spawnSync('npm', ['view', packageJson.name, 'versions', '--json']); const versionsJson = JSON.parse(versionsProcess.stdout); if (tag) { @@ -74,6 +90,3 @@ function getPublishedVersions(version, tag) { } return versionsJson; } - -function publishPackage(packageDir) { -} From 64403f2dca174b7686b0b06457f95d3ad0af6ea4 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 15 Jun 2019 14:06:45 -0700 Subject: [PATCH 5/8] Publish addons and xterm based on whether files changed Fixes #2165 --- bin/publish.js | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index fd2475c4..3bacb585 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -15,19 +15,30 @@ if (isDryRun) { console.log('Publish dry run'); } -const publishablePackages = [ - path.resolve(__dirname, '..'), +const addonPackageDirs = [ path.resolve(__dirname, '../addons/xterm-addon-attach'), path.resolve(__dirname, '../addons/xterm-addon-fit'), path.resolve(__dirname, '../addons/xterm-addon-search'), path.resolve(__dirname, '../addons/xterm-addon-web-links') ]; -publishablePackages.forEach(p => checkAndPublishPackage(p)); +const changedFiles = getChangedFilesInCommit('HEAD'); + +// Publish xterm if any files were changed outside of the addons directory +if (changedFiles.some(e => e.search(/^addons\//) === -1)) { + checkAndPublishPackage(path.resolve(__dirname, '..')); +} + +// Publish addons if any files were changed inside of the addon +addonPackageDirs.forEach(p => { + const addon = path.basename(p); + if (changedFiles.some(e => e.indexOf(addon) !== -1)) { + checkAndPublishPackage(p); + } +}); function checkAndPublishPackage(packageDir) { const packageJson = require(path.join(packageDir, 'package.json')); - console.group('Checking package ' + packageJson.name); // Determine if this is a stable or beta release const publishedVersions = getPublishedVersions(packageJson); @@ -90,3 +101,11 @@ function getPublishedVersions(packageJson, version, tag) { } return versionsJson; } + +function getChangedFilesInCommit(commit) { + const args = ['log', '-m', '-1', '--name-only', `--pretty=format:`, commit]; + const result = cp.spawnSync('git', args); + const output = result.stdout.toString(); + const changedFiles = output.split('\n').filter(e => e.length > 0); + return changedFiles; +} From d06fd04465bf31db14cc9436ee62b389124e8cef Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 15 Jun 2019 14:10:48 -0700 Subject: [PATCH 6/8] Move addon const under addon comment --- bin/publish.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index 3bacb585..fb6b3ee2 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -15,13 +15,6 @@ if (isDryRun) { console.log('Publish dry run'); } -const addonPackageDirs = [ - path.resolve(__dirname, '../addons/xterm-addon-attach'), - path.resolve(__dirname, '../addons/xterm-addon-fit'), - path.resolve(__dirname, '../addons/xterm-addon-search'), - path.resolve(__dirname, '../addons/xterm-addon-web-links') -]; - const changedFiles = getChangedFilesInCommit('HEAD'); // Publish xterm if any files were changed outside of the addons directory @@ -30,6 +23,12 @@ if (changedFiles.some(e => e.search(/^addons\//) === -1)) { } // Publish addons if any files were changed inside of the addon +const addonPackageDirs = [ + path.resolve(__dirname, '../addons/xterm-addon-attach'), + path.resolve(__dirname, '../addons/xterm-addon-fit'), + path.resolve(__dirname, '../addons/xterm-addon-search'), + path.resolve(__dirname, '../addons/xterm-addon-web-links') +]; addonPackageDirs.forEach(p => { const addon = path.basename(p); if (changedFiles.some(e => e.indexOf(addon) !== -1)) { From 91c4ca5e0dce67d3d4e71506117f5346acb7695b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 15 Jun 2019 14:27:01 -0700 Subject: [PATCH 7/8] Publish addons with right cwd and don't exit Part of #2165 --- bin/publish.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index fb6b3ee2..e03fa6ab 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -50,9 +50,8 @@ function checkAndPublishPackage(packageDir) { // Set the version in package.json const packageJsonFile = path.join(packageDir, 'package.json'); packageJson.version = nextVersion; - if (isDryRun) { - console.log(`Set version of ${packageJsonFile} to ${nextVersion}`); - } else { + console.log(`Set version of ${packageJsonFile} to ${nextVersion}`); + if (!isDryRun) { fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); } @@ -61,11 +60,16 @@ function checkAndPublishPackage(packageDir) { if (!isStableRelease) { args.push('--tag', 'beta'); } - if (isDryRun) { - console.log(`Spawn: npm ${args.join(' ')}`); - } else { - const result = cp.spawn('npm', args, { stdio: 'inherit' }); - result.on('exit', code => process.exit(code)); + console.log(`Spawn: npm ${args.join(' ')}`); + if (!isDryRun) { + const result = cp.spawnSync('npm', args, { + cwd: packageDir, + stdio: 'inherit' + }); + if (result.status) { + console.error(`Spawn exited with code ${result.status}`); + process.exit(result.status); + } } console.groupEnd(); From a46c723020c2f6f8639aafc914631e7415c1786d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 15 Jun 2019 14:29:41 -0700 Subject: [PATCH 8/8] npmignore webpack.config.js (test automated release) Part of #2165 --- addons/xterm-addon-attach/.npmignore | 1 + addons/xterm-addon-fit/.npmignore | 1 + addons/xterm-addon-search/.npmignore | 1 + addons/xterm-addon-web-links/.npmignore | 1 + 4 files changed, 4 insertions(+) diff --git a/addons/xterm-addon-attach/.npmignore b/addons/xterm-addon-attach/.npmignore index e8fc8237..1c794445 100644 --- a/addons/xterm-addon-attach/.npmignore +++ b/addons/xterm-addon-attach/.npmignore @@ -2,3 +2,4 @@ **/*.api.ts tsconfig.json .yarnrc +webpack.config.js diff --git a/addons/xterm-addon-fit/.npmignore b/addons/xterm-addon-fit/.npmignore index e8fc8237..1c794445 100644 --- a/addons/xterm-addon-fit/.npmignore +++ b/addons/xterm-addon-fit/.npmignore @@ -2,3 +2,4 @@ **/*.api.ts tsconfig.json .yarnrc +webpack.config.js diff --git a/addons/xterm-addon-search/.npmignore b/addons/xterm-addon-search/.npmignore index e8fc8237..1c794445 100644 --- a/addons/xterm-addon-search/.npmignore +++ b/addons/xterm-addon-search/.npmignore @@ -2,3 +2,4 @@ **/*.api.ts tsconfig.json .yarnrc +webpack.config.js diff --git a/addons/xterm-addon-web-links/.npmignore b/addons/xterm-addon-web-links/.npmignore index e8fc8237..1c794445 100644 --- a/addons/xterm-addon-web-links/.npmignore +++ b/addons/xterm-addon-web-links/.npmignore @@ -2,3 +2,4 @@ **/*.api.ts tsconfig.json .yarnrc +webpack.config.js