Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2686a3ccc0 | ||
|
|
789f296c9c | ||
|
|
64e290c9fc | ||
|
|
a0eba8d434 | ||
|
|
281d9f9033 | ||
|
|
44a1f520fe | ||
|
|
b6190362b4 | ||
|
|
a09f27d816 | ||
|
|
944a6cb126 | ||
|
|
828beb7ccf |
@@ -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
@@ -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
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "speedscope",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"description": "",
|
||||
"repository": "jlfwong/speedscope",
|
||||
"main": "index.js",
|
||||
|
||||
Vendored
BIN
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
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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 [
|
||||
|
||||
@@ -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')
|
||||
})
|
||||
|
||||
@@ -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')
|
||||
})
|
||||
|
||||
@@ -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
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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')
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -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`
|
||||
|
||||
Reference in New Issue
Block a user