Compare commits

..
10 Commits
Author SHA1 Message Date
Jamie Wong 2686a3ccc0 1.0.2 2018-09-04 20:55:25 -07:00
Jamie Wong 789f296c9c Run unit tests as part of release build 2018-09-04 20:53:58 -07:00
Jamie Wong 64e290c9fc Change deploy script to use assets from npm 2018-09-04 20:50:30 -07:00
Jamie Wong a0eba8d434 Update CHANGELOG.md 2018-09-04 20:13:29 -07:00
januszn 281d9f9033 Allow optional CR before LF when probing collapsed stacks files (#154)
This fixes #152, in that it allows "collapsed stacks" files generated with
tools using Windows line endings to be imported into the tool verbatim.
2018-09-04 20:12:27 -07:00
Jamie Wong 44a1f520fe Update CHANGELOG.md 2018-09-04 17:04:35 -07:00
Jonathan Chan b6190362b4 Match more Firefox-internal locations (#156)
Looks like Firefox also generates locations with names like
`bound (self-hosted:951:0)`. We check for `self-hosted`, but not for
`self-hosted` with stuff after it following a colon. We should ignore
these too, otherwise we can end up with stuff on our stack that we don't
expect. This was causing Firefox profiles not to load because we
completed building the profile with a non-empty stack.

Attached is a profile that errors without this patch and successfully renders
with this patch.

[copy.json.zip](https://github.com/jlfwong/speedscope/files/2350583/copy.json.zip)
2018-09-04 17:03:55 -07:00
Jamie Wong a09f27d816 Update CHANGELOG.md 2018-09-04 16:14:41 -07:00
Alex Dukhno 944a6cb126 Change time formatting for minutes from 1.50min to 1:30 (#153) 2018-09-04 13:30:02 -07:00
Jamie Wong 828beb7ccf Update README-ADMINS.md 2018-08-23 10:04:42 -07:00
17 changed files with 187 additions and 27 deletions
+10
View File
@@ -1,3 +1,13 @@
## Unreleased
## [1.0.2] - 2018-09-04
### Fixed
* Allow optional CR before LF when probing collapsed stacks files [#154]
* Fix import for Firefox 63 [#156]
* Change time formatting for minutes from 1.50min to 1:30 [#153]
## [1.0.1] - 2018-08-23
* Fixed an issue where flamegraph bounds were not always being cleared correctly, leading to visual artifacts [#150]
+11 -6
View File
@@ -44,7 +44,7 @@ If everything looks good, proceed to "Prepare the release".
2. Update CHANGELOG.md to indicate the changes that were made as part of this release
3. Commit the changes with the version name as the commit message, e.g. `git commit -m 0.6.0`
4. `git tag` the release. We use tags like `v0.6.0`, e.g. `git tag v0.6.0`
5. `git push --tags`
5. `git push && git push --tags`
## Publish to npm
@@ -59,13 +59,16 @@ Try `speedscope sample/profiles/stackcollapse/simple.txt`, which should immediat
## Deploying the website
This step must follow the "Publish to npm" step, since it uses assets from
the npm publish.
https://www.speedscope.app/ is hosted on GitHub pages, and is published via pushing
to the `gh-pages` branch. The `gh-pages` branch has totally different contents than
other branches of this repository: https://github.com/jlfwong/speedscope/tree/gh-pages.
It's populated by a deploy script which is invoked by running `npm run deploy` script.
This will do a build of the static resources, and boot a local server for you to test
the compiled assets. Please do not skip the manual testing in this step.
It's populated by a deploy script which is invoked by running `npm run deploy` script. This populate a directory with assets pulled from npm, and
boot a local server for you to test the compiled assets. Please do not skip
the manual testing in this step.
If everything looks good, you should be able to hit Ctrl+C, and you should see this prompt:
@@ -80,8 +83,10 @@ which includes the version, the date, and the commit of the deploy.
## Upload a release to GitHub
To make a zipfile suitable for uploading to GitHub as a release, run prepare-zip-file.sh. Note that this step must follow the "Publish to npm" step,
since it uses assets from the npm publish.
This step must follow the "Publish to npm" step, since it uses assets from
the npm publish.
To make a zipfile suitable for uploading to GitHub as a release, run `scripts/prepare-zip-file.sh`.
Once that's done, you should have a zip file in `dist/release/`
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "speedscope",
"version": "1.0.1",
"version": "1.0.2",
"description": "",
"repository": "jlfwong/speedscope",
"main": "index.js",
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
a;b;c 1
a;b;c 1
a;b;d 4
a;b;c 3
a;b 5
+3
View File
@@ -7,6 +7,9 @@ OUTDIR=`pwd`/dist/release
# Typecheck
node_modules/.bin/tsc --noEmit
# Run unit tests
npm run jest
# Clean out the release directory
rm -rf "$OUTDIR"
mkdir -p "$OUTDIR"
+12 -13
View File
@@ -1,26 +1,28 @@
#!/bin/bash
#
# type check, do a release build, then do a shallow clone of the
# repository into a temporary directory and copy the release build
# artifacts into there to commit & push to the gh-pages branch
# Do a shallow clone of the repository into a temporary directory and copy the
# artifacts pulled from npm into the shallow clone to commit & push to the
# gh-pages branch.
set -euxo pipefail
OUTDIR=`pwd`/dist/release
echo $OUTDIR
SRCDIR=`pwd`
OUTDIR=`mktemp -d -t speedscope-unpacked`
./scripts/build-release.sh
# Untar the package
pushd "$OUTDIR"
PACKEDNAME=`npm pack speedscope | tail -n1`
tar -xvvf "$PACKEDNAME"
# Create a shallow clone of the repository
TMPDIR=`mktemp -d -t speedscope-release`
echo "Entering $TMPDIR"
TMPDIR=`mktemp -d -t speedscope-deploy`
pushd "$TMPDIR"
git clone --depth 1 git@github.com:jlfwong/speedscope.git -b gh-pages
# Copy the build artifacts into the shallow clone
pushd speedscope
rm -rf *
cp -R "$OUTDIR"/* .
cp -R "$OUTDIR"/package/dist/release/** .
# Set the CNAME record
echo www.speedscope.app > CNAME
@@ -35,17 +37,14 @@ function ctrl_c() {
if [[ $REPLY =~ ^yes$ ]]
then
git add --all
git commit -m 'Release'
git commit -m "Deploy $PACKEDNAME"
git push origin HEAD:gh-pages
popd
rm -rf "$TMPDIR"
exit 0
else
set +x
echo "Aborting release."
set -x
popd
rm -rf "$TMPDIR"
exit 1
fi
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# Prepare a mock installation of speedscope to test it before the actual npm
# publish
# Create a zip file containing a standalone copy of speedscope
# based on the contents of the package published to npm
set -euxo pipefail
@@ -50,6 +50,60 @@ Object {
}
`;
exports[`importFromBGFlameGraph with CRLF 1`] = `
Object {
"frames": Array [
Frame {
"col": undefined,
"file": undefined,
"key": "a",
"line": undefined,
"name": "a",
"selfWeight": 0,
"totalWeight": 14,
},
Frame {
"col": undefined,
"file": undefined,
"key": "b",
"line": undefined,
"name": "b",
"selfWeight": 5,
"totalWeight": 14,
},
Frame {
"col": undefined,
"file": undefined,
"key": "c",
"line": undefined,
"name": "c",
"selfWeight": 5,
"totalWeight": 5,
},
Frame {
"col": undefined,
"file": undefined,
"key": "d",
"line": undefined,
"name": "d",
"selfWeight": 4,
"totalWeight": 4,
},
],
"name": "simple-crlf.txt",
"stacks": Array [
"a;b;c 2",
"a;b;d 4",
"a;b;c 3",
"a;b 5",
],
}
`;
exports[`importFromBGFlameGraph with CRLF: indexToView 1`] = `0`;
exports[`importFromBGFlameGraph with CRLF: profileGroup.name 1`] = `"simple-crlf.txt"`;
exports[`importFromBGFlameGraph: indexToView 1`] = `0`;
exports[`importFromBGFlameGraph: profileGroup.name 1`] = `"simple.txt"`;
@@ -59,6 +59,70 @@ Object {
}
`;
exports[`importFromFirefox ignore self-hosted 1`] = `
Object {
"frames": Array [
Frame {
"col": undefined,
"file": "http://localhost:8000/simple.js:1",
"key": "alpha (http://localhost:8000/simple.js:1:14)",
"line": 14,
"name": "alpha",
"selfWeight": 0,
"totalWeight": 26.983816999942064,
},
Frame {
"col": undefined,
"file": "http://localhost:8000/simple.js:14",
"key": "delta (http://localhost:8000/simple.js:14:14)",
"line": 14,
"name": "delta",
"selfWeight": 0,
"totalWeight": 11.946324001066387,
},
Frame {
"col": undefined,
"file": "http://localhost:8000/simple.js:20",
"key": "gamma (http://localhost:8000/simple.js:20:14)",
"line": 14,
"name": "gamma",
"selfWeight": 26.983816999942064,
"totalWeight": 26.983816999942064,
},
Frame {
"col": undefined,
"file": "http://localhost:8000/simple.js:8",
"key": "beta (http://localhost:8000/simple.js:8:13)",
"line": 13,
"name": "beta",
"selfWeight": 0,
"totalWeight": 15.037492998875678,
},
],
"name": "simple-firefox.json",
"stacks": Array [
"alpha;delta;gamma 999.57µs",
"alpha;beta;gamma 2.01ms",
"alpha;delta;gamma 1.00ms",
"alpha;beta;gamma 995.68µs",
"alpha;delta;gamma 996.27µs",
"alpha;beta;gamma 4.01ms",
"alpha;delta;gamma 2.02ms",
"alpha;beta;gamma 959.44µs",
"alpha;delta;gamma 2.01ms",
"alpha;beta;gamma 4.01ms",
"alpha;delta;gamma 959.28µs",
"alpha;beta;gamma 2.03ms",
"alpha;delta;gamma 3.96ms",
"alpha;beta;gamma 1.02ms",
],
}
`;
exports[`importFromFirefox ignore self-hosted: indexToView 1`] = `0`;
exports[`importFromFirefox ignore self-hosted: profileGroup.name 1`] = `"simple-firefox.json"`;
exports[`importFromFirefox recursion 1`] = `
Object {
"frames": Array [
+4
View File
@@ -3,3 +3,7 @@ import {checkProfileSnapshot} from '../lib/test-utils'
test('importFromBGFlameGraph', async () => {
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple.txt')
})
test('importFromBGFlameGraph with CRLF', async () => {
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple-crlf.txt')
})
+4
View File
@@ -7,3 +7,7 @@ test('importFromFirefox', async () => {
test('importFromFirefox recursion', async () => {
await checkProfileSnapshot('./sample/profiles/Firefox/61/recursion.json')
})
test('importFromFirefox ignore self-hosted', async () => {
await checkProfileSnapshot('./sample/profiles/Firefox/63/simple-firefox.json')
})
+5 -1
View File
@@ -180,7 +180,11 @@ export function importFromFirefox(firefoxProfile: FirefoxProfile): Profile {
if (!match) return null
if (match[2].startsWith('resource:') || match[2] === 'self-hosted') {
if (
match[2].startsWith('resource:') ||
match[2] === 'self-hosted' ||
match[2].startsWith('self-hosted:')
) {
// Ignore Firefox-internals stuff
return null
}
+1 -1
View File
@@ -103,7 +103,7 @@ async function _importProfileGroup(
// If every line ends with a space followed by a number, it's probably
// the collapsed stack format.
const lineCount = contents.split(/\n/).length
if (lineCount >= 1 && lineCount === contents.split(/ \d+\n/).length) {
if (lineCount >= 1 && lineCount === contents.split(/ \d+\r?\n/).length) {
console.log('Importing as collapsed stack format')
return toGroup(importFromBGFlameGraph(contents))
}
+4 -2
View File
@@ -7,7 +7,8 @@ describe('TimeFormatter', () => {
expect(f.format(0.04)).toEqual('40.00µs')
expect(f.format(3)).toEqual('3.00ms')
expect(f.format(2070)).toEqual('2.07s')
expect(f.format(1203123)).toEqual('20.05min')
expect(f.format(150000)).toEqual('2:30')
expect(f.format(1203123)).toEqual('20:03')
})
test('input units seconds', () => {
@@ -15,7 +16,8 @@ describe('TimeFormatter', () => {
expect(f.format(0.00004)).toEqual('40.00µs')
expect(f.format(0.003)).toEqual('3.00ms')
expect(f.format(2.07)).toEqual('2.07s')
expect(f.format(1203.123)).toEqual('20.05min')
expect(f.format(150)).toEqual('2:30')
expect(f.format(1203.123)).toEqual('20:03')
})
})
+6 -1
View File
@@ -1,4 +1,5 @@
import {FileFormat} from './file-format-spec'
import {zeroPad} from './utils'
export interface ValueFormatter {
unit: FileFormat.ValueUnit
@@ -25,7 +26,11 @@ export class TimeFormatter implements ValueFormatter {
formatUnsigned(v: number) {
const s = v * this.multiplier
if (s / 60 >= 1) return `${(s / 60).toFixed(2)}min`
if (s / 60 >= 1) {
const minutes = Math.floor(s / 60)
const seconds = Math.floor(s - minutes * 60).toString()
return `${minutes}:${zeroPad(seconds, 2)}`
}
if (s / 1 >= 1) return `${s.toFixed(2)}s`
if (s / 1e-3 >= 1) return `${(s / 1e-3).toFixed(2)}ms`
if (s / 1e-6 >= 1) return `${(s / 1e-6).toFixed(2)}µs`