Compare commits

..

No commits in common. "master" and "v0.2.0" have entirely different histories.

16 changed files with 165 additions and 253 deletions

View File

@ -1,20 +0,0 @@
name: Main
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Cache dependencies
uses: actions/cache@v1
with:
path: ~/.stack
key: stack-${{ hashFiles('stack.yaml.lock') }}
- name: Install GHC
run: stack setup
- name: Build dependencies
run: stack build --only-dependencies
- name: Build package
run: stack build

6
.gitignore vendored
View File

@ -1,4 +1,4 @@
Gemfile.lock .cabal-sandbox/
_site/
.stack-work/ .stack-work/
cabal.sandbox.config
dist/

View File

@ -1,28 +1,3 @@
# 0.4.0 (2020-02-16)
## Enhancements
- Use hpack
# 0.3.0 (2019-02-05)
## Enhancements
- Use Stack (executable) to get licenses (ec8412b)
- Use `ls dependencies` instead of `list-dependencies` (4f4d41d)
## Bugs
- Fix incorrect license if package matches a Hackage package (#23)
# 0.2.2 (2018-01-16)
- Allow http-conduit 2.3 (558fe3d)
# 0.2.1 (2017-07-24)
- Allow base 4.10 and Cabal 2.0 (7bbb360)
# 0.2.0 (2016-09-18) # 0.2.0 (2016-09-18)
## Enhancements ## Enhancements

1
CNAME
View File

@ -1 +0,0 @@
licensor.jpvillaisaza.co

View File

@ -1,3 +0,0 @@
source "https://rubygems.org/"
gem "github-pages"

View File

@ -1,5 +1,5 @@
{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RecordWildCards #-}
---------------------------------------------------------------------- ----------------------------------------------------------------------
-- | -- |
@ -64,7 +64,6 @@ liArgs s =
} }
&= program s &= program s
&= summary (unwords ["licensor", Version.showVersion version]) &= summary (unwords ["licensor", Version.showVersion version])
&= verbosity
-- | -- |
@ -75,8 +74,6 @@ main :: IO ()
main = do main = do
LiArgs <- cmdArgsRun . liArgs =<< getProgName LiArgs <- cmdArgsRun . liArgs =<< getProgName
quiet <- fmap not isNormal
maybePackage <- getPackage maybePackage <- getPackage
pid <- pid <-
@ -86,11 +83,11 @@ main = do
if stack if stack
then do then do
putStrLn "Found stack.yaml..." putStrLn "Found stack.yaml..."
pure Nothing return Nothing
else else
Exit.die "Error: No Cabal file found." Exit.die "Error: No Cabal file found."
Just PackageDescription { license, package } -> do Just PackageDescription{..} -> do
putStrLn $ putStrLn $
"Package: " "Package: "
<> display package <> display package
@ -98,15 +95,17 @@ main = do
<> "License: " <> "License: "
<> display license <> display license
<> ")" <> ")"
pure (Just package) return (Just package)
maybeDependencies <- getDependencies maybeDependencies <- getDependencies
maybeLicenses <- getLicenses
case (maybeDependencies, maybeLicenses) of case maybeDependencies of
(Just dependencies, Just licenses) -> do Nothing ->
Exit.die "Error: ..."
Just dependencies -> do
(dependenciesByLicense', failed) <- (dependenciesByLicense', failed) <-
orderPackagesByLicense quiet pid licenses dependencies orderPackagesByLicense pid dependencies
let dependenciesByLicense = fmap (Set.map display) dependenciesByLicense' let dependenciesByLicense = fmap (Set.map display) dependenciesByLicense'
@ -127,5 +126,3 @@ main = do
unless (null failed) $ do unless (null failed) $ do
putStr "Failed: " putStr "Failed: "
print failed print failed
_ ->
Exit.die "Error: ..."

View File

@ -1,7 +1,12 @@
# The not so great automatic Haskell licensor # The not so great automatic Haskell licensor
[![][2]](https://www.stackage.org/lts/package/licensor) [![][1]][0]
[![][3]](https://www.stackage.org/nightly/package/licensor)
[0]: https://circleci.com/gh/jpvillaisaza/licensor
[1]: https://circleci.com/gh/jpvillaisaza/licensor.svg?style=svg
![][2]
![][3]
[2]: https://www.stackage.org/package/licensor/badge/lts [2]: https://www.stackage.org/package/licensor/badge/lts
[3]: https://www.stackage.org/package/licensor/badge/nightly [3]: https://www.stackage.org/package/licensor/badge/nightly
@ -79,7 +84,7 @@ $ cd licensor/ && stack build --exec licensor
For more information, run `licensor --help`: For more information, run `licensor --help`:
``` ```
licensor 0.4.0 licensor 0.2.0
licensor [OPTIONS] licensor [OPTIONS]
@ -87,8 +92,6 @@ Common flags:
-? --help Display help message -? --help Display help message
-V --version Print version information -V --version Print version information
--numeric-version Print just the version number --numeric-version Print just the version number
-v --verbose Loud verbosity
-q --quiet Quiet verbosity
``` ```
## Notes ## Notes
@ -140,29 +143,31 @@ See [LICENSE.md](LICENSE.md).
### License report ### License report
Licensor (0.4.0) depends on the following libraries: Licensor (0.2.0) depends on the following libraries:
Library | License Library | License
------------------------- | ------------------------- ------------------------- | -------------------------
base | BSD3 base | BSD3
bytestring | BSD3
Cabal | BSD3 Cabal | BSD3
cmdargs | BSD3 cmdargs | BSD3
containers | BSD3 containers | BSD3
directory | BSD3 directory | BSD3
http-conduit | BSD3
process | BSD3 process | BSD3
And the following licenses (including transitive dependencies): And the following licenses (including transitive dependencies):
License | Number of libraries License | Number of libraries
------------------------- | ------------------------- ------------------------- | -------------------------
BSD3 | 20 BSD3 | 68
MIT | 7
(Tested with Licensor 0.4.0, Stack 2.1.3, and LTS Haskell 11.11.) (Tested with Licensor 0.2.0, Stack 1.2.0, and LTS 7.0.)
## Additional resources ## Additional resources
- [Choose a License](https://choosealicense.com/) - [Choose a License](http://choosealicense.com/)
- [The Legal Side of Open Source](https://opensource.guide/legal/)
- [License compatibility][ar-01] - [License compatibility][ar-01]
- [Understanding open source and free software licensing][ar-02] - [Understanding open source and free software licensing][ar-02]
(Andrew M. St. Laurent) (Andrew M. St. Laurent)

11
Setup.hs Normal file
View File

@ -0,0 +1,11 @@
module Main
( main
)
where
import Distribution.Simple (defaultMain)
main :: IO ()
main =
defaultMain

View File

@ -1,18 +0,0 @@
exclude:
- app/
- CHANGELOG.md
- Gemfile
- Gemfile.lock
- LICENSE.md
- licensor.cabal
- package.yaml
- src/
- package.yaml
- stack.yaml
- stack.yaml.lock
plugins:
- jekyll-readme-index
readme_index:
remove_originals: true

17
circle.yml Normal file
View File

@ -0,0 +1,17 @@
dependencies:
cache_directories:
- ~/.stack/
- .stack-work/
override:
- stack setup
- stack build --only-dependencies
pre:
- curl -sSL https://get.haskellstack.org/ | sh
test:
override:
- stack build

0
docs/index.html Normal file
View File

View File

@ -1,61 +1,68 @@
cabal-version: 1.12 name: licensor
version: 0.2.0
-- This file has been generated from package.yaml by hpack version 0.31.2. build-type: Simple
-- cabal-version: >= 1.21
-- see: https://github.com/sol/hpack
--
-- hash: b5e0234d196e96476a6a70c11798ae1dd4fd24ca9ce1c11ea74d6b3422604fc8
name: licensor license: MIT
version: 0.4.0 license-file: LICENSE.md
synopsis: A license compatibility helper
description: A license compatibility helper. copyright: 2016 Juan Pedro Villa Isaza
category: Distribution author: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
stability: Experimental maintainer: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
homepage: https://jpvillaisaza.co/licensor
bug-reports: https://github.com/jpvillaisaza/licensor/issues stability: Experimental
author: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
maintainer: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com> homepage: https://github.com/jpvillaisaza/licensor
copyright: 2016 Juan Pedro Villa Isaza bug-reports: https://github.com/jpvillaisaza/licensor/issues
license: MIT
license-file: LICENSE.md synopsis: A license compatibility helper
build-type: Simple description: A license compatibility helper.
extra-source-files:
CHANGELOG.md category: Distribution
README.md
tested-with: GHC == 7.10.3, GHC == 8.0.1
extra-source-files: CHANGELOG.md, README.md
source-repository head
type: git
location: https://github.com/jpvillaisaza/licensor
library library
hs-source-dirs:
src
exposed-modules: exposed-modules:
Licensor Licensor
other-modules: other-modules:
Paths_licensor Paths_licensor
hs-source-dirs:
src
ghc-options: -Wall
build-depends: build-depends:
Cabal >=1.22 && <2.1 base >= 4.8 && < 4.10
, base >=4.8 && <4.11 , bytestring
, Cabal >= 1.22 && < 1.25
, containers , containers
, directory , directory
, http-conduit >= 2.1 && < 2.3
, process , process
default-language: Haskell2010 default-language:
Haskell2010
ghc-options:
-Wall
executable licensor executable licensor
main-is: Main.hs main-is:
other-modules: Main.hs
Paths_licensor
hs-source-dirs:
app
ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
build-depends: build-depends:
Cabal >=1.22 && <2.1 base >= 4.8 && < 5.0
, base >=4.8 && <4.11 , Cabal >= 1.22 && < 1.25
, cmdargs >=0.10 && <0.11 , cmdargs >= 0.10 && < 0.11
, containers , containers
, directory , directory
, licensor , licensor
default-language: Haskell2010 default-language:
Haskell2010
ghc-options:
-Wall -threaded -rtsopts -with-rtsopts=-N
source-repository head
type: git
location: https://github.com/jpvillaisaza/licensor

View File

@ -1,49 +0,0 @@
name: licensor
version: 0.4.0
synopsis: A license compatibility helper
description: A license compatibility helper.
category: Distribution
stability: Experimental
github: jpvillaisaza/licensor
homepage: https://jpvillaisaza.co/licensor
author: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
maintainer: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
copyright: 2016 Juan Pedro Villa Isaza
license-file: LICENSE.md
extra-source-files:
- CHANGELOG.md
- README.md
dependencies:
- Cabal >= 1.22 && < 2.1
- base >= 4.8 && < 4.11
- containers
- directory
ghc-options:
- -Wall
library:
source-dirs:
src
dependencies:
- process
executable:
source-dirs:
app
main:
Main.hs
dependencies:
- cmdargs >= 0.10 && < 0.11
- licensor
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N

View File

@ -1,4 +1,6 @@
{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE ScopedTypeVariables #-}
---------------------------------------------------------------------- ----------------------------------------------------------------------
@ -14,7 +16,6 @@ module Licensor
( LiLicense(..) ( LiLicense(..)
, LiPackage(..) , LiPackage(..)
, getDependencies , getDependencies
, getLicenses
, getPackage , getPackage
, orderPackagesByLicense , orderPackagesByLicense
, version , version
@ -23,17 +24,21 @@ module Licensor
-- base -- base
import qualified Control.Exception as Exception import qualified Control.Exception as Exception
import Control.Monad (unless) import Data.Monoid ((<>))
import Data.Version (Version) import Data.Version (Version)
import System.IO
-- bytestring
import qualified Data.ByteString.Lazy as ByteString
-- Cabal -- Cabal
import Distribution.License (License) import Distribution.License
import Distribution.Package (PackageIdentifier(..), PackageName) import Distribution.Package
import Distribution.PackageDescription (PackageDescription, packageDescription) import Distribution.PackageDescription
import Distribution.PackageDescription.Parse (readGenericPackageDescription) import Distribution.PackageDescription.Parse
import Distribution.Simple.Utils (comparing, findPackageDesc) import Distribution.Simple.Utils
import Distribution.Text (Text, display, simpleParse) import Distribution.Text
import Distribution.Verbosity (silent) import Distribution.Verbosity
-- containers -- containers
import Data.Map.Strict (Map) import Data.Map.Strict (Map)
@ -42,13 +47,17 @@ import Data.Set (Set)
import qualified Data.Set as Set import qualified Data.Set as Set
-- directory -- directory
import System.Directory (getCurrentDirectory) import System.Directory
-- http-conduit
--import Network.HTTP.Client.Conduit
import Network.HTTP.Simple
-- licensor -- licensor
import qualified Paths_licensor import qualified Paths_licensor
-- process -- process
import System.Process (readProcess) import System.Process
-- | -- |
@ -88,7 +97,7 @@ getPackage :: IO (Maybe PackageDescription)
getPackage = do getPackage = do
currentDirectory <- getCurrentDirectory currentDirectory <- getCurrentDirectory
fmap getPackageDescription <$> findPackageDesc currentDirectory fmap getPackageDescription <$> findPackageDesc currentDirectory
>>= either (const (pure Nothing)) (fmap Just) >>= either (const (return Nothing)) (fmap Just)
-- | -- |
@ -97,7 +106,7 @@ getPackage = do
getPackageDescription :: FilePath -> IO PackageDescription getPackageDescription :: FilePath -> IO PackageDescription
getPackageDescription = getPackageDescription =
fmap packageDescription . readGenericPackageDescription silent fmap packageDescription . readPackageDescription silent
-- | -- |
@ -107,54 +116,50 @@ getPackageDescription =
getDependencies :: IO (Maybe (Set PackageIdentifier)) getDependencies :: IO (Maybe (Set PackageIdentifier))
getDependencies = do getDependencies = do
eitherDeps <- eitherDeps <-
Exception.try $ readProcess "stack" ["ls", "dependencies", "--separator", "-"] "" Exception.try $ readProcess "stack" ["list-dependencies", "--separator", "-"] ""
case eitherDeps of case eitherDeps of
Left (_ :: IOError) -> Left (_ :: IOError) ->
pure Nothing return Nothing
Right deps -> Right deps ->
pure $ Set.fromList <$> traverse simpleParse (lines deps) return $ fmap Set.fromList $ sequence $ fmap simpleParse (lines deps)
getLicenses :: IO (Maybe [(PackageName, License)])
getLicenses = do
eitherDeps <-
Exception.try $ readProcess "stack" ["ls", "dependencies", "--license"] ""
case eitherDeps of
Left (_ :: IOError) ->
pure Nothing
Right deps ->
pure $ traverse toNameLicense (lines deps)
where
toNameLicense dep =
case words dep of
[name, license] ->
(,) <$> simpleParse name <*> simpleParse license
_ ->
Nothing
-- | -- |
-- --
-- --
getPackageLicense getPackageLicense :: PackageIdentifier -> IO (Maybe LiLicense)
:: Bool getPackageLicense p@PackageIdentifier{..} = do
-> PackageIdentifier putStr $ display p ++ "..."
-> [(PackageName, License)] let
-> IO (Maybe LiLicense) url =
getPackageLicense quiet packageIdentifier licenses = do "GET https://hackage.haskell.org/package/"
unless quiet (putStr $ display packageIdentifier ++ "...") <> display p
case lookup (pkgName packageIdentifier) licenses of <> "/"
Just license -> do <> unPackageName pkgName
unless quiet (putStrLn $ display license) <> ".cabal"
pure $ Just (LiLicense license)
Nothing -> req <- parseRequest url
pure Nothing eitherPd <- Exception.try $ fmap getResponseBody (httpLBS req)
case eitherPd of
Left (_ :: HttpException) ->
return Nothing
Right pd -> do
(file, handle) <- openTempFile "/tmp" "licensor"
hClose handle
ByteString.writeFile file pd
PackageDescription{license} <- getPackageDescription file
hClose handle
removeFile file
putStrLn $ display license
return $ Just (LiLicense license)
-- | -- |
@ -162,21 +167,19 @@ getPackageLicense quiet packageIdentifier licenses = do
-- --
orderPackagesByLicense orderPackagesByLicense
:: Bool :: Maybe PackageIdentifier
-> Maybe PackageIdentifier
-> [(PackageName, License)]
-> Set PackageIdentifier -> Set PackageIdentifier
-> IO (Map LiLicense (Set PackageIdentifier), Set PackageIdentifier) -> IO (Map LiLicense (Set PackageIdentifier), Set PackageIdentifier)
orderPackagesByLicense quiet maybeP licenses = orderPackagesByLicense maybeP =
let let
cond = cond =
maybe (const False) (==) maybeP maybe (const False) (==) maybeP
insertPackage package orderedPackages' = do insertPackage package orderedPackages' = do
maybeLicense <- getPackageLicense quiet package licenses maybeLicense <- getPackageLicense package
(orderedPackages, failed) <- orderedPackages' (orderedPackages, failed) <- orderedPackages'
pure $ return $
if cond package if cond package
then then
(orderedPackages, failed) (orderedPackages, failed)

View File

@ -1 +1 @@
resolver: lts-11.11 resolver: lts-7.0

View File

@ -1,12 +0,0 @@
# This file was autogenerated by Stack.
# You should not edit this file by hand.
# For more information, please see the documentation at:
# https://docs.haskellstack.org/en/stable/lock_files
packages: []
snapshots:
- completed:
size: 507599
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/11/11.yaml
sha256: 5ec0a1ff4dadde524eb529784556bcc32014422fd1e1ed91231c59f001e92ca9
original: lts-11.11