Create contributing file and update readme

This commit is contained in:
Andrew Schwartzmeyer 2016-01-20 11:33:57 -08:00
parent b9e2d3f446
commit 395300ff20
2 changed files with 108 additions and 57 deletions

62
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,62 @@
# Contributing to Project PowerShell on Linux / OS X / Windows
## New to Git?
**DO NOT COMMIT TO THE MASTER BRANCH**
**Do not commit submodule updates accidentally**
Use GitHub's [Hello World][] to learn how to create a feature branch, commit
changes, and issue a pull request.
[hello world]: https://guides.github.com/activities/hello-world/
## Rebase and Fast-Forward Merge Pull Requests
Because GitHub's "Merge Pull Request" button merges with `--no-ff`, an extra
merge commit will always be created. This can be especially annoying when
trying to commit updates to submodules. Therefore our policy is to merge using
the Git CLI after approval, with a rebase onto master to enable a fast-forward
merge. If you are uncomfortable doing this, please ask @andschwa to merge.
## Submodules
This repository is a superproject with a half-dozen [submodules][]. **DO NOT**
commit updates unless absolutely necessary. When submodules must be updated, a
separate Pull Request must be submitted, reviewed, and merged before updating
the superproject. When committing submodule updates, ensure no other changes
are in the same commit. Submodule bumps may be included in feature branches for
ease of work, but the update must be independently approved before merging into
master.
[submodules]: https://www.git-scm.com/book/en/v2/Git-Tools-Submodules
## Recommended Git configurations
I highly recommend these configurations to help deal with whitespace, rebasing,
and general use of Git.
> Auto-corrects your command when it's sure (`stats` to `status`)
```sh
git config --global help.autoCorrect -1
```
> Refuses to merge when pulling, and only pushes to branch with same name.
```sh
git config --global pull.ff only
git config --global push.default current
```
> Shows shorter commit hashes and always shows reference names in the log.
```sh
git config --global log.abbrevCommit true
git config --global log.decorate short
```
> Ignores whitespace changes and uses more information when merging.
```sh
git config --global apply.ignoreWhitespace change
git config --global rerere.enabled true
git config --global rerere.autoUpdate true
git config --global am.threeWay true
```

103
README.md
View File

@ -4,10 +4,9 @@
### Setup Git
Install [Git][], the version control system. If you're new to Git, peruse the
documentation and go through some tutorials; I recommend familiarizing yourself
with `checkout`, `branch`, `pull`, `push`, `merge`, and after a while, `rebase`
and `cherry-pick`. Please commit early and often.
Install [Git][], the version control system. If you're new to Git, work through
the [guides][] until you are familiar with the following commands: `checkout`,
`branch`, `pull`, `push`, `merge`. Don't forget to commit early and often!
The user name and email must be set to do just about anything with Git.
@ -24,47 +23,30 @@ system, so use a [token][].
git config --global credential.helper store
```
I highly recommend these configurations to help deal with whitespace, rebasing,
and general use of Git.
**Read the documentation on [submodules][]!**
> Auto-corrects your command when it's sure (`stats` to `status`)
```sh
git config --global help.autoCorrect -1
```
> Refuses to merge when pulling, and only pushes to branch with same name.
```sh
git config --global pull.ff only
git config --global push.default current
```
> Shows shorter commit hashes and always shows reference names in the log.
```sh
git config --global log.abbrevCommit true
git config --global log.decorate short
```
> Ignores whitespace changes and uses more information when merging.
```sh
git config --global apply.ignoreWhitespace change
git config --global rerere.enabled true
git config --global rerere.autoUpdate true
git config --global am.threeWay true
```
See the [Contributing Guidelines](CONTRIBUTING.md) for more Git information.
[Git]: https://git-scm.com/documentation
[guides]: https://guides.github.com/activities/hello-world/
[token]: https://help.github.com/articles/creating-an-access-token-for-command-line-use/
[submodules]: https://www.git-scm.com/book/en/v2/Git-Tools-Submodules
### Download source code
Clone this repository recurisvely, as it's the superproject with a number of
Clone this repository recursively, as it's the superproject with a number of
submodules.
```sh
git clone --recursive https://github.com/PowerShell/PowerShell-Linux.git
```
On windows don't use `clone --recursive`, because you don't need `omi` repo.
The `src/omi` submodule requires your GitHub user to have joined the Microsoft
organization. If it fails to check out, Git will bail and not check out further
submodules either.
On Windows, many fewer submodules are needed, so don't use `clone --recursive`.
Instead run:
```
@ -72,40 +54,31 @@ git clone https://github.com/PowerShell/PowerShell-Linux.git
git submodule update --init --recursive -- src/monad src/windows-build test/Pester
```
*Read the documentation on [submodules][] if you're not familiar with them.*
Note that because GitHub's "Merge Pull Request" button merges with `--no-ff`,
an extra merge commit will always be created. This can be especially annoying
when trying to commit updates to submodules. Therefore our policy is to merge
using the Git CLI after approval, preferably with a rebase to enable a
fast-forward merge.
[submodules]: https://www.git-scm.com/book/en/v2/Git-Tools-Submodules
## Setup build environment
We use the [.NET Command Line Interface][dotnet-cli] (`dotnet-cli`) to build
the managed components, and [CMake][] to build the native components (on
non-Windows platforms). Install `dotnet-cli` by following their documentation
(make sure to install the `dotnet-dev` package on Linux to get the latest
(make sure to install the `dotnet-nightly` package on Linux to get the latest
version). Then install the following dependencies Linux and OS X.
> Note that OS X dependency installation instructions are not yet documented,
> and Windows only needs `dotnet-cli`.
> Previous installations of DNX or `dnvm` can cause `dotnet-cli` to fail.
### Linux
Tested on Ubuntu 14.04 and OS X 10.11.
```sh
sudo apt-get install g++ cmake make lldb-3.6 strace
```
#### OMI
To develop on the PowerShell Remoting Protocol (PSRP), you'll need to be able
to compile OMI, which additionally requires:
To develop on the PowerShell Remoting Protocol (PSRP) for Linux, you'll need to
be able to compile OMI, which additionally requires:
```sh
sudo apt-get install libpam0g-dev libssl-dev libcurl4-openssl-dev libboost-filesystem-dev
@ -116,8 +89,8 @@ sudo apt-get install libpam0g-dev libssl-dev libcurl4-openssl-dev libboost-files
## Building
*The command `dotnet restore` must be done at least once from the top directory
to obtain all the necessary .NET packages.*
**The command `dotnet restore` must be done at least once from the top directory
to obtain all the necessary .NET packages.**
Build with `./build.sh` on Linux and OS X, and `./build.ps1` on Windows.
@ -131,17 +104,31 @@ Build with `./build.sh` on Linux and OS X, and `./build.ps1` on Windows.
### Windows
Launch `./bin/powershell.exe`. The console output isn't the prettiest, bet the
vast majority of Pester tests pass.
Launch `./bin/powershell.exe`. The console output isn't the prettiest, but the
vast majority of Pester tests pass. Run them in the console with `Invoke-Pester
test/powershell`.
## Known Issues
### xUnit
Sadly, `dotnet-test` is not fully supported on Linux, so our xUnit tests do not
currently run. We may be able to work around this, or get the `dotnet-cli` team
to fix their xUnit runner. GitHub
[issue](https://github.com/dotnet/cli/issues/18).
The xUnit tests cannot currently be run; we are working to integrate the
prototype .NET Core runner to re-enable them.
### Console Output
The console output on Windows and under certain `TERM` environments on Linux
(`xterm` is known to work fine), the console scrolls badly. We believe this is
due to incomplete System.Console APIs, which have been fixed upstream and will
be updated when new packages drop.
### Registry Use
`SafeHandle` objects attempt to use the registry (even on Linux) so a stub is
in place to prevent error messages. This should be fixed in .NET Core. Use of
the registry is widespread throughout the PowerShell codebase, and so innocuous
things (such as loading particular modules) can cause strange behavior when
unguarded code is executed.
## Detailed Build Notes
@ -161,7 +148,7 @@ cp *.ps1xml *_profile.ps1 $BIN
### Native
- `libpsnative.so`: native functions that `CorePsPlatform.cs` P/Invokes
- `libpsl-native.so`: native functions that `CorePsPlatform.cs` P/Invokes
- `api-ms-win-core-registry-l1-1-0.dll`: registry stub to prevent missing DLL error on shutdown
#### libpsl-native
@ -177,6 +164,8 @@ ctest -V
cp native/libpsl-native.* $BIN
```
The output is a `.so` on Linux and `.dylib` on OS X. It is unnecessary for Windows.
#### registry-stub
Provides `RegCloseKey()` to satisfy the disposal of `SafeHandle` objects on shutdown.
@ -193,7 +182,8 @@ PSRP communication is tunneled through OMI using the `omi-provider`.
These build steps are not part of the `./build.sh` script.
> PSRP has been observed working on OS X, but the changes made to OMI to
> accomplish this are not even beta-ready and need to be done correctly.
> accomplish this are not even beta-ready and need to be done correctly. They
> exist on the `andschwa-osx` branch of the OMI repository.
#### OMI
@ -227,4 +217,3 @@ ln -s ../omi/Unix/ omi-1.0.8
./configure --no-rpm --no-dpkg --local
make -j
```