* Add new postinstall script for automatic electron builds FREEBIE * Documentation refresh for the world of electron FREEBIE
11 KiB
Contributor Guidelines
Advice for new contributors
Start small. The PRs most likely to be merged are the ones that make small, easily reviewed changes with clear, and specific intentions. See below for more guidelines on pull requests.
It's a good idea to gauge interest in your intended work by finding the current issue for it or creating a new one yourself. You can use also that issue as a place to signal your intentions and get feedback from the users most likely to appreciate your changes.
Once you've spent a little bit of time planning your solution, it's a good idea to go back to the issue and talk about your approach. We'd be happy to provide feedback. An ounce of prevention, as they say!
Developer Setup
First, you'll need Node.js installed. Anything 6.x or newer works as of Summer 2017. You might consider a version manager to make this easier for yourself.
Then you need git
, if you don't have that yet: https://git-scm.com/
And for the final step before we actually get started, you'll need build tools to install
the native modules used by the application. On Windows, it's easiest to open the Command
Prompt (cmd.exe
) as Administrator
and run this:
npm install --global --production windows-build-tools
On OSX you can install the XCode Command-line tools. On Linux you'll need to take a trip to your favorite package manager. Python 2.x and GCC two key necessary components.
Now, run these commands in your preferred terminal in a good directory for development:
git clone https://github.com/WhisperSystems/Signal-Desktop.git
cd Signal-Desktop
npm install -g yarn # (only if you don't already have yarn)
yarn install # install and build dependencies (this will take a while)
yarn run start # run!
Setting up standalone
By default the application will connect to the staging servers, which means that you will not be able to link it with your primary mobile device.
Fear not! You don't have to link the app with your phone. During setup in development mode, you'll be presented with a 'Standalone' button which goes through the registration process like you would on a phone. But you won't be linked to any other devices.
The staging environment
Sadly, this default setup results in no contacts and no message history, an entirely empty application. But you can use the information from your production install of Signal Desktop to populate your testing application!
First, find your application data:
- OSX:
~/Library/Application Support/Signal
- Linux:
~/.config/Signal
- Windows 10:
C:\Users\<YourName>\AppData\Roaming\Signal
Now make a copy of this production data directory in the same place, and call it
Signal-development
. Now start up the development version of the app as normal,
and you'll see all of your contacts and messages!
You'll notice a prompt to re-link, because your production credentials won't work on staging. Click 'Relink', then 'Standalone', then verify the phone number and click 'Send SMS.'
Once you've entered the confirmation code sent to your phone, you are registered as a standalone staging device with your normal phone number, and a copy of your production message history and contact list.
Here's the catch: you can't message any of these contacts, since they haven't done the same thing. Who can you message for testing?
Additional storage profiles
What you need for proper testing is additional phone numbers, to register additional standalone devices. You can get them via Twilio ($1/mo. per number + $0.0075 per SMS), or via Google Voice (one number per Google Account, free SMS).
Once you have the additional numbers, you can setup additional storage profiles and switch
between them using the NODE_APP_INSTANCE
environment variable.
For example, to create an 'alice' profile, put a file called local-alice.json
in the
config
directory:
{
"storageProfile": "aliceProfile"
}
Then you can start up the application a little differently to load the profile:
NODE_APP_INSTANCE=alice yarn run start
This changes the userData
directory from %appData%/Signal
to %appData%/Signal-aliceProfile
.
Making changes
So you're in the process of preparing that pull request. Here's how to make that go smoothly.
Tests
Please write tests! Our testing framework is mocha and our assertion library is chai.
To run tests, you can run them from the command line with grunt unit-tests
or in an
interactive session with NODE_ENV=test yarn run start
.
Pull requests
So you wanna make a pull request? Please observe the following guidelines.
- Please do not submit pull requests for translation fixes. Anyone can update the translations in Transifex.
- Never use plain strings right in the source code - pull them from
messages.json
! You only need to modify the default locale_locales/en/messages.json
. Other locales are generated automatically based on that file and then periodically uploaded to Transifex for translation. - Rebase your
changes on the latest
master
branch, resolving any conflicts. This ensures that your changes will merge cleanly when you open your PR. - Be sure to add and run tests!
- Make sure the diff between our master and your branch contains only the minimal set of changes needed to implement your feature or bugfix. This will make it easier for the person reviewing your code to approve the changes. Please do not submit a PR with commented out code or unfinished features.
- Avoid meaningless or too-granular commits. If your branch contains commits like the lines of "Oops, reverted this change" or "Just experimenting, will delete this later", please squash or rebase those changes away.
- Don't have too few commits. If you have a complicated or long lived feature branch, it may make sense to break the changes up into logical atomic chunks to aid in the review process.
- Provide a well written and nicely formatted commit message. See this
link
for some tips on formatting. As far as content, try to include in your
summary
- What you changed
- Why this change was made (including git issue # if appropriate)
- Any relevant technical details or motivations for your implementation choices that may be helpful to someone reviewing or auditing the commit history in the future. When in doubt, err on the side of a longer commit message.
Above all, spend some time with the repository. Follow the pull request template added to your pull request description automatically. Take a look at recent approved pull requests, see how they did things.
Linking to a staging mobile device
Multiple standalone desktop devices are great for testing of a lot of scenarios. But a lot of the Signal experience requires a primary mobile device: contact management, synchronizing read and verification states among all linked devices, etc.
This presents a problem - even if you had another phone, the production versions of the iOS and Android apps are locked to the production servers. To test all secenarios in staging, your best bet is to pull down the development version of the iOS or Android app, and register it with one of your extra phone numbers:
First, build Signal for Android or iOS from source, and point its TextSecure service URL to textsecure-service-staging.whispersystems.org
:
on Android: Replace the SIGNAL_URL
value in build.gradle
on iOS: Replace the textSecureServerURL
value in TSConstants.h
(located in the SignalServiceKit pod)
This task is 1% search and replace, 99% setting up your build environment. Instructions are available for both the Android and iOS projects.
Then you can set up your development build of Signal Desktop as normal. If you've already
set up as a standalone install, you can switch by opening the DevTools (View -> Toggle
Developer Tools) and entering this into the Console and pressing enter: window.owsDesktopApp.appView.openInstaller();
Changing to production
If you're completely sure that your changes will have no impact to the production servers,
you can connect your development build to the production server by putting a file called
local-development.json
in the config
directory that looks like this:
{
"serverUrl": "https://textsecure-service.whispersystems.org",
"cdnUrl": "https://cdn.signal.org"
}
Beware: Setting up standalone with your primary phone number when connected to the production servers will unregister your mobile device! All messages from your contacts will go to your new development desktop app instead of your phone.
Dependencies
Note: You probably won't end up doing this. Feel free to skip for now.
Dependencies are managed by bower and built with
grunt. To change them, you'll need to install node and
npm, then run npm install
to install bower, grunt, and related plugins.
Adding a bower component
Add the package name and version to bower.json under 'dependencies' or bower install package-name --save
Next update the "preen" config in bower.json with the list of files we will actually use from the new package, e.g.:
"preen": {
"package-name": [
"path/to/main.js",
"directory/**/*.js"
],
...
}
If you'd like to add the new dependency to js/components.js to be included on
all html pages, simply append the package name to the concat.app list in
bower.json
. Take care to insert it in the order you would like it
concatenated.
Now, run grunt
to delete unused package files and build js/components.js
.
Finally, stage and commit changes to bower.json, js/components.js
,
and components/
. The latter should be limited to files we actually use.