434 Commits

Author SHA1 Message Date
Juan Cruz Viotti
d52f948e46 Use correct exit codes when running Etcher CLI with --robot (#384)
Currently, the exit codes documented in the help section was not
honoured if the CLI was ran with the `--robot` option. In this case, the
CLI would exit with code 0 even if the validation failed.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-29 12:30:09 -04:00
Juan Cruz Viotti
087a008d0d Make sure CLI args are parsed correctly when spawning in OS X (#383)
The binary used when spawning the CLI in OS X during development is
`electron-prebuilt/disk/Electron.app/Contents/MacOS/Electron`.

To make sure we catch both `Electron` and `electron`, make the
executable name lowercase before comparing it.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-29 11:55:23 -04:00
Juan Cruz Viotti
36bd696da9 Make use of etcher-image-write (#382)
This is the new name of the older `resin-image-write` dependency.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-29 09:45:52 -04:00
Juan Cruz Viotti
ad758cf391 Implement Etcher.OS.Dialog module (#381)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-29 09:03:20 -04:00
Juan Cruz Viotti
bd410bd88c Document exit codes in Etcher CLI help (#379)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-29 09:03:08 -04:00
Juan Cruz Viotti
1de3d7b26c Make sure the CLI handles arguments correctly when being packaged (#374)
The CLI now attempts to detect whether it is being run as an argument to
a JavaScript runner (like node or electron), or as a final packaged
executable by applying some heuristics on the first argument.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-27 14:24:49 -04:00
Juan Cruz Viotti
d7ce744e26 Document that ELECTRON_RUN_AS_NODE doesn't load app.asar by default (#375)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-27 14:24:32 -04:00
Juan Cruz Viotti
d80da9f7ce Move Etcher CLI exit code definitions to lib/src (#369)
The purpose is that defined exit codes can be reused in the GUI, so they
are kept in sync more easily.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-26 13:40:44 -04:00
Juan Cruz Viotti
3af8d4d4a2 Upgrade resin-image-write to v4.0.0 (#368)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-26 13:33:39 -04:00
Juan Cruz Viotti
ccae6bf783 Prefix robot progress state output with "progress" (#367)
This makes it a bit easier to determine if a `stdout` line is a progress
state or not, rather than checking for both `write` or `check`.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-26 12:30:06 -04:00
Juan Cruz Viotti
4a856d24df Add entry point file to decide between GUI/CLI (#365)
This file runs the Etcher CLI if the binary was ran with
`ELECTRON_RUN_AS_NODE`, or the GUI otherwise.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-26 11:39:15 -04:00
Juan Cruz Viotti
bb4ad6a042 Add an option to control unmounting on success in Etcher CLI (#362)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-26 09:38:29 -04:00
Juan Cruz Viotti
8bdc089de4 Implement validation support in Etcher CLI (#361)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-25 15:47:05 -04:00
Juan Cruz Viotti
86cbff940c Implement Etcher CLI "robot" option (#360)
This option makes the Etcher CLI outputs state information in a way that
can be easily parsed by a parent process spawning it.

The format of the state output is:

  <type> <percentage>% <eta>s <speed>

This can be easily parsed as follows:

  const output = line.split(' ');

  const state = {
    type: output[0],
    percentage: parseInt(output[1], 10),
    eta: parseInt(output[2], 10),
    speed: parseInt(output[3], 10)
  };

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-25 14:50:34 -04:00
Juan Cruz Viotti
d5b3e0a83f Upgrade drivelist to v3.0.0 (#354)
This new version reports the size as a number of bytes instead of a
human readable string, so we have to take care of converting back to a
readable GB format ourselves.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-25 12:46:59 -04:00
Juan Cruz Viotti
afeba11424 Move GUI code into lib/gui (#358)
This refactoring will be useful on future changes, where there will be
a single application entry point that will execute the CLI or the GUI
version depending on the environment.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-25 12:08:19 -04:00
Juan Cruz Viotti
1ac0fae405 Fix Error: Cannot find module ../global-shortcut in Windows (#353)
Since the Electron upgrade, Windows users are hitting a weird error
about `global-shortcut` not existing.

A solution is to `require('global-shortcut')` instead of accessing it as
a property of `electorn`.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-22 13:03:46 -04:00
Juan Cruz Viotti
dcff257f20 Upgrade Electron to v0.37.6 (#350)
* Upgrade Electron to v0.37.6

The main motiviation for such upgrade is that an error manifesting
itself as `Cannot read property 'object' of undefined` on certain Linux
systems was fixed in v0.37.4.

See https://github.com/electron/electron/issues/5229
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>

* Make use of shell module by requiring `shell`

Otherwise we get a strange issue when trying to stub it:

    TypeError: Attempted to wrap undefined property openExternal as function

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-21 10:26:29 -04:00
Juan Cruz Viotti
148b9d15ae Integrate Etcher CLI in the main repository (#352)
This PR integrates the Etcher CLI code-wise, but doesn't yet handles the
distribution part of the story.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-21 10:08:53 -04:00
Juan Cruz Viotti
4d70676612 Distinguish between flash and validation events in Mixpanel (#347)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-20 14:56:58 -04:00
Juan Cruz Viotti
975c949fdf Allow to bypass elevation with an environment variable (#343)
This is mostly used for debugging purposes, or by power users that know
what they're doing.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-19 11:07:59 -04:00
Juan Cruz Viotti
ed70e4e590 Refactor initial elevation routine (#341)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-19 09:40:25 -04:00
Juan Cruz Viotti
284f2a0ebb Add dashed underline to footer links (#340)
Fixes: https://github.com/resin-io/etcher/issues/338
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-18 13:16:26 -04:00
Juan Cruz Viotti
5baf8e5407 Improve UX when closing the drive selector modal (#339)
The current "Close" button makes it confusing to the user to know if
he's accepting his changes, or just discarding them.

The "Close" button in the top right corner was replaced with a standard
cross icon, and there is a new "Continue" block button fixed in the
bottom of the modal.

Fixes: https://github.com/resin-io/etcher/issues/294
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-18 13:16:17 -04:00
Juan Cruz Viotti
35ac745452 Link the version string in the footer to the CHANGELOG (#337)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-18 12:39:18 -04:00
Juan Cruz Viotti
ed592f0597 Add application version to footer (#335)
* Implement ManifestBind directive

This directive is useful to bind the contents of an element to a
property in the `package.json` manifest.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>

* Add application version to footer

Fixes: https://github.com/resin-io/etcher/issues/292
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-17 23:57:56 -04:00
Juan Cruz Viotti
34ae49df38 Reset writer state on flash error (#330)
Not doing so leads the writer state to have a `progress` of `100%`,
while `isFlashing()` is `false`, which is an inconsistent state.

Fixes: https://github.com/resin-io/etcher/issues/327
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-15 16:43:42 -04:00
Juan Cruz Viotti
0dcc7b22b8 Implement SVGIcon Angular directive (#324)
* Inherit current scope in osOpenExternal directive

This directive attempts to create a new isolated scope, which leads the
errors when using this directive on top of another directive in the same
element.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>

* Implement SVGIcon Angular directive

This directive replaces part of `hero-icon`, the old Polymer component.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 16:14:46 -04:00
Juan Cruz Viotti
04efd16ca3 Misc changes (#322)
* Fix lint warnings about missing empty line above `module.exports`

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>

* Re-build CSS

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 15:45:52 -04:00
Juan Cruz Viotti
66b38105ca Require ui.router and ui.bootstrap using NPM style (#321)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 15:37:05 -04:00
Juan Cruz Viotti
79c19ef341 Document directives with JSDoc (#320)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 15:36:52 -04:00
Juan Cruz Viotti
a874d4b808 Make all angular modules export the name of the module (#318)
This makes them very nicely require-able, for example:

    angular.module('MyModule', [
      require('my-dependency');
    ]);

From https://medium.com/@kentcdodds/how-to-distribute-your-angularjs-module-e04d4dd58ddc#.yqg2zo8im
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 14:22:51 -04:00
Juan Cruz Viotti
39786e3271 Don't require angular-ui-bootstrap in main module (#319)
This dependency is only required by `Etcher.Components.DriveSelector`.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 14:17:31 -04:00
Juan Cruz Viotti
bd9b4d0a3a Promisify drivelist.list() with angular-q-promisify (#317)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 13:57:38 -04:00
Juan Cruz Viotti
42db5992fa Reorganize utilities and desktop integration modules (#316)
- Rename `Etcher.Utils.Dropzone` to `Etcher.OS.Dropzone`
- Rename `Etcher.Utils.OpenExternal` to `Etcher.OS.OpenExternal`
- Rename `Etcher.Utils.WindowProgress` to `Etcher.OS.WindowProgress`
- Rename `Etcher.notification` to `Etcher.OS.Notification`
- Rename `Etcher.notifier` to `Etcher.Utils.Notifier`
- Rename `Etcher.path` to `Etcher.Utils.Path`

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 13:34:31 -04:00
Juan Cruz Viotti
fedde73a02 Improve UX when re-selecting a single available drive (#313)
Currently, if you have only one connected drive, Etcher will auto-select
it. One the single drive is auto-selected, if you attempt to change your
drive selection by clicking on the "Change" link button, the
re-selection is undone, and redone in a matter of milliseconds, making
it very difficult to get the drive selector modal to open.

A simple solution to this problem is making "Change" links trigger the
reselection action (e.g: opening modals, dialogs, etc) instead of simply
undoing the selection.

Fixes: https://github.com/resin-io/etcher/issues/296
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 12:12:19 -04:00
Juan Cruz Viotti
fd00a4ae0e Add a Mixpanel event when the application starts (#311)
Fixes: https://github.com/resin-io/etcher/issues/310
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 10:05:53 -04:00
Juan Cruz Viotti
dec10f618e Add "Change" button links below each step (#306)
Fixes: https://github.com/resin-io/etcher/issues/290
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-12 15:59:42 -04:00
Juan Cruz Viotti
e3bac8dc64 Connect DriveSelector with SelectionStateModel (#305)
Previously, `DriveSelector` kept a temporary selection state until the
modal was closed, which caused the selected drives to be passed to
`SelectionStateModel`.

This proves to be problematic when attempting to pass changes to
`SelectionStateModel` to `DriveSelector`. For example, consider the case
where the `DriveSelector` modal is opened with two drives, and one is
ejected. The remaining drive will be auto-selected by Etcher in the
background, but `DriveSelector` will not update itself with such change.

Fixes: https://github.com/resin-io/etcher/issues/304
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-12 14:42:51 -04:00
Juan Cruz Viotti
aba6e946e3 Hide drive selector modal if no available drives (#303)
If you have the drive selector modal opened, but you eject all the
available drives, the modal will be closed automatically.

Fixes: https://github.com/resin-io/etcher/issues/295
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-12 13:02:10 -04:00
Juan Cruz Viotti
77da54431a Add Etcher logo to application footer (#302)
Fixes: https://github.com/resin-io/etcher/issues/252
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-12 13:01:56 -04:00
Juan Cruz Viotti
3efea5b308 Replace all occurrences of "burn" with "flash" (#300)
Technically, a removable drive is flashed, not burned.

Fixes: https://github.com/resin-io/etcher/issues/297
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-12 12:00:43 -04:00
Juan Cruz Viotti
8417f94649 Allow to drag and drop an image to the first step (#288)
See https://github.com/electron/electron/blob/master/docs/api/file-object.md
Fixes: https://github.com/resin-io/etcher/issues/279
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-11 15:40:13 -04:00
Juan Cruz Viotti
2f65bd512f Implement OS notifications on burn completion (#283)
Its helpful to have an auditive/visual cue when a burn operation
completed.

Instead of adding a setting entry to enable/disable notifications, you
can use the standard way to control notifications from your operating
system. For example, in OS X, you might go to "System Preferences" ->
"Notifications" and disable notifications for "Etcher".

Fixes: https://github.com/resin-io/etcher/issues/280
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-11 11:49:55 -04:00
Juan Cruz Viotti
c2265c6561 Prevent dialog.showErrorBox() throwing if wrong parameters (#274)
If the function lacks a message or a title, the following error is
thrown:

    Error: Could not call remote function ``.
    Check that the function signature is correct.
    Underlying error: Error processing argument at index 0,
    conversion failure from undefined

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-10 23:11:29 -04:00
Juan Cruz Viotti
7e83c378a2 Add subtle hover styling to footer links (#268)
Fixes: https://github.com/resin-io/etcher/issues/253
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-08 15:21:12 -04:00
Juan Cruz Viotti
67daf086a2 Detect removal of selected drive (#264)
Suppose you plug a device, select it in Etcher, but then eject it from
your computer. Etcher will keep the selection thinking the drive is
still there.

With this PR, the selected drive, if any, is ensured its still inside
the array of available drives, otherwise the selected is cleared.

Fixes: https://github.com/resin-io/etcher/issues/254
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-08 12:17:36 -04:00
Juan Cruz Viotti
3a04b5ccaa Fix window contents pushed below when a modal is open (#263)
UI Bootstrap adds the `.modal-open` class to the `<body>`
element and sets its right padding to the width of the
window, causing the window content to overflow and get
pushed to the bottom.
The `!important` flag is needed since UI Bootstrap inlines
the styles programatically to the element.

Fixes: https://github.com/resin-io/etcher/issues/257
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-08 10:37:10 -04:00
Juan Cruz Viotti
2862663ca7 Invert progress bar stripes (#260)
Make the progress bar background striped, and the actual bar solid.

Fixes: https://github.com/resin-io/etcher/issues/251
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-08 10:06:56 -04:00
Juan Cruz Viotti
1bfe88f2f4 Show drive name in drive selector modal (#259)
The `name` property equals the drive letter in Windows, and the mount
point in UNIX based operating systems.

Fixes: https://github.com/resin-io/etcher/issues/258
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-08 09:49:11 -04:00