Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ceffd422d9 | ||
|
|
00f903d7ac | ||
|
|
9a122b2961 | ||
|
|
3f72d89232 | ||
|
|
4473ab4341 | ||
|
|
9a17f87eee | ||
|
|
15af251f38 | ||
|
|
055192d887 | ||
|
|
72cb001e07 | ||
|
|
6b0eea666e | ||
|
|
fc1fd98e8a | ||
|
|
ba5a60ea7e | ||
|
|
265fa6e773 | ||
|
|
2f3f9a72ec | ||
|
|
73ffa34491 | ||
|
|
5a7e9a4ecf |
@ -1,22 +0,0 @@
|
||||
version: 2
|
||||
jobs:
|
||||
build:
|
||||
docker:
|
||||
- image: fpco/stack-build:lts-11.11
|
||||
steps:
|
||||
- checkout
|
||||
- restore_cache:
|
||||
keys:
|
||||
- v1-.stack-{{ checksum "stack.yaml" }}-{{ checksum "licensor.cabal" }}
|
||||
- v1-.stack-{{ checksum "stack.yaml" }}
|
||||
- v1-.stack-
|
||||
- run:
|
||||
name: Build dependencies
|
||||
command: stack build --only-dependencies
|
||||
- save_cache:
|
||||
key: v1-.stack-{{ checksum "stack.yaml" }}-{{ checksum "licensor.cabal" }}
|
||||
paths:
|
||||
- ~/.stack/
|
||||
- run:
|
||||
name: Build package
|
||||
command: stack build
|
||||
20
.github/workflows/main.yml
vendored
Normal file
20
.github/workflows/main.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
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
6
.gitignore
vendored
@ -1,4 +1,4 @@
|
||||
.cabal-sandbox/
|
||||
Gemfile.lock
|
||||
_site/
|
||||
|
||||
.stack-work/
|
||||
cabal.sandbox.config
|
||||
dist/
|
||||
|
||||
@ -1,3 +1,9 @@
|
||||
# 0.4.0 (2020-02-16)
|
||||
|
||||
## Enhancements
|
||||
|
||||
- Use hpack
|
||||
|
||||
# 0.3.0 (2019-02-05)
|
||||
|
||||
## Enhancements
|
||||
|
||||
21
README.md
21
README.md
@ -1,10 +1,5 @@
|
||||
# The not so great automatic Haskell licensor
|
||||
|
||||
[![][1]][0]
|
||||
|
||||
[0]: https://circleci.com/gh/jpvillaisaza/licensor
|
||||
[1]: https://circleci.com/gh/jpvillaisaza/licensor.svg?style=shield
|
||||
|
||||
[![][2]](https://www.stackage.org/lts/package/licensor)
|
||||
[![][3]](https://www.stackage.org/nightly/package/licensor)
|
||||
|
||||
@ -84,7 +79,7 @@ $ cd licensor/ && stack build --exec licensor
|
||||
For more information, run `licensor --help`:
|
||||
|
||||
```
|
||||
licensor 0.2.0
|
||||
licensor 0.4.0
|
||||
|
||||
licensor [OPTIONS]
|
||||
|
||||
@ -92,6 +87,8 @@ Common flags:
|
||||
-? --help Display help message
|
||||
-V --version Print version information
|
||||
--numeric-version Print just the version number
|
||||
-v --verbose Loud verbosity
|
||||
-q --quiet Quiet verbosity
|
||||
```
|
||||
|
||||
## Notes
|
||||
@ -143,30 +140,24 @@ See [LICENSE.md](LICENSE.md).
|
||||
|
||||
### License report
|
||||
|
||||
Licensor (0.2.2) depends on the following libraries:
|
||||
Licensor (0.4.0) depends on the following libraries:
|
||||
|
||||
Library | License
|
||||
------------------------- | -------------------------
|
||||
base | BSD3
|
||||
bytestring | BSD3
|
||||
Cabal | BSD3
|
||||
cmdargs | BSD3
|
||||
containers | BSD3
|
||||
directory | BSD3
|
||||
http-conduit | BSD3
|
||||
process | BSD3
|
||||
|
||||
And the following licenses (including transitive dependencies):
|
||||
|
||||
License | Number of libraries
|
||||
------------------------- | -------------------------
|
||||
BSD2 | 1
|
||||
BSD3 | 70
|
||||
ISC | 1
|
||||
MIT | 11
|
||||
UnspecifiedLicense | 1
|
||||
BSD3 | 20
|
||||
|
||||
(Tested with Licensor 0.2.2, Stack 1.6.3, and Stackage Nightly 2018-01-16.)
|
||||
(Tested with Licensor 0.4.0, Stack 2.1.3, and LTS Haskell 11.11.)
|
||||
|
||||
## Additional resources
|
||||
|
||||
|
||||
11
Setup.hs
11
Setup.hs
@ -1,11 +0,0 @@
|
||||
module Main
|
||||
( main
|
||||
)
|
||||
where
|
||||
|
||||
import Distribution.Simple (defaultMain)
|
||||
|
||||
|
||||
main :: IO ()
|
||||
main =
|
||||
defaultMain
|
||||
18
_config.yml
Normal file
18
_config.yml
Normal file
@ -0,0 +1,18 @@
|
||||
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
|
||||
@ -1,5 +1,5 @@
|
||||
{-# LANGUAGE DeriveDataTypeable #-}
|
||||
{-# LANGUAGE RecordWildCards #-}
|
||||
{-# LANGUAGE NamedFieldPuns #-}
|
||||
|
||||
----------------------------------------------------------------------
|
||||
-- |
|
||||
@ -86,11 +86,11 @@ main = do
|
||||
if stack
|
||||
then do
|
||||
putStrLn "Found stack.yaml..."
|
||||
return Nothing
|
||||
pure Nothing
|
||||
else
|
||||
Exit.die "Error: No Cabal file found."
|
||||
|
||||
Just PackageDescription{..} -> do
|
||||
Just PackageDescription { license, package } -> do
|
||||
putStrLn $
|
||||
"Package: "
|
||||
<> display package
|
||||
@ -98,18 +98,15 @@ main = do
|
||||
<> "License: "
|
||||
<> display license
|
||||
<> ")"
|
||||
return (Just package)
|
||||
pure (Just package)
|
||||
|
||||
maybeDependencies <- getDependencies
|
||||
maybeLicenses <- getLicenses
|
||||
|
||||
case maybeDependencies of
|
||||
Nothing ->
|
||||
Exit.die "Error: ..."
|
||||
|
||||
Just dependencies -> do
|
||||
case (maybeDependencies, maybeLicenses) of
|
||||
(Just dependencies, Just licenses) -> do
|
||||
(dependenciesByLicense', failed) <-
|
||||
orderPackagesByLicense quiet pid maybeLicenses dependencies
|
||||
orderPackagesByLicense quiet pid licenses dependencies
|
||||
|
||||
let dependenciesByLicense = fmap (Set.map display) dependenciesByLicense'
|
||||
|
||||
@ -130,3 +127,5 @@ main = do
|
||||
unless (null failed) $ do
|
||||
putStr "Failed: "
|
||||
print failed
|
||||
_ ->
|
||||
Exit.die "Error: ..."
|
||||
117
licensor.cabal
117
licensor.cabal
@ -1,68 +1,61 @@
|
||||
name: licensor
|
||||
version: 0.3.0
|
||||
cabal-version: 1.12
|
||||
|
||||
build-type: Simple
|
||||
cabal-version: >= 1.10
|
||||
|
||||
license: MIT
|
||||
license-file: LICENSE.md
|
||||
|
||||
copyright: 2016 Juan Pedro Villa Isaza
|
||||
author: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
|
||||
maintainer: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
|
||||
|
||||
stability: Experimental
|
||||
|
||||
homepage: https://github.com/jpvillaisaza/licensor
|
||||
bug-reports: https://github.com/jpvillaisaza/licensor/issues
|
||||
|
||||
synopsis: A license compatibility helper
|
||||
description: A license compatibility helper.
|
||||
|
||||
category: Distribution
|
||||
|
||||
tested-with: GHC == 7.10.3, GHC == 8.0.1, GHC == 8.0.2, GHC == 8.2.1, GHC == 8.2.2
|
||||
|
||||
extra-source-files: CHANGELOG.md, README.md
|
||||
|
||||
|
||||
library
|
||||
hs-source-dirs:
|
||||
src
|
||||
exposed-modules:
|
||||
Licensor
|
||||
other-modules:
|
||||
Paths_licensor
|
||||
build-depends:
|
||||
base >= 4.8 && < 4.11
|
||||
, bytestring
|
||||
, Cabal >= 1.22 && < 2.1
|
||||
, containers
|
||||
, directory
|
||||
, http-conduit >= 2.1 && < 2.4
|
||||
, process
|
||||
default-language:
|
||||
Haskell2010
|
||||
ghc-options:
|
||||
-Wall
|
||||
|
||||
|
||||
executable licensor
|
||||
main-is:
|
||||
Main.hs
|
||||
build-depends:
|
||||
base
|
||||
, Cabal
|
||||
, cmdargs >= 0.10 && < 0.11
|
||||
, containers
|
||||
, directory
|
||||
, licensor
|
||||
default-language:
|
||||
Haskell2010
|
||||
ghc-options:
|
||||
-Wall -threaded -rtsopts -with-rtsopts=-N
|
||||
-- This file has been generated from package.yaml by hpack version 0.31.2.
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
--
|
||||
-- hash: b5e0234d196e96476a6a70c11798ae1dd4fd24ca9ce1c11ea74d6b3422604fc8
|
||||
|
||||
name: licensor
|
||||
version: 0.4.0
|
||||
synopsis: A license compatibility helper
|
||||
description: A license compatibility helper.
|
||||
category: Distribution
|
||||
stability: Experimental
|
||||
homepage: https://jpvillaisaza.co/licensor
|
||||
bug-reports: https://github.com/jpvillaisaza/licensor/issues
|
||||
author: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
|
||||
maintainer: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
|
||||
copyright: 2016 Juan Pedro Villa Isaza
|
||||
license: MIT
|
||||
license-file: LICENSE.md
|
||||
build-type: Simple
|
||||
extra-source-files:
|
||||
CHANGELOG.md
|
||||
README.md
|
||||
|
||||
source-repository head
|
||||
type: git
|
||||
location: https://github.com/jpvillaisaza/licensor
|
||||
|
||||
library
|
||||
exposed-modules:
|
||||
Licensor
|
||||
other-modules:
|
||||
Paths_licensor
|
||||
hs-source-dirs:
|
||||
src
|
||||
ghc-options: -Wall
|
||||
build-depends:
|
||||
Cabal >=1.22 && <2.1
|
||||
, base >=4.8 && <4.11
|
||||
, containers
|
||||
, directory
|
||||
, process
|
||||
default-language: Haskell2010
|
||||
|
||||
executable licensor
|
||||
main-is: Main.hs
|
||||
other-modules:
|
||||
Paths_licensor
|
||||
hs-source-dirs:
|
||||
app
|
||||
ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
|
||||
build-depends:
|
||||
Cabal >=1.22 && <2.1
|
||||
, base >=4.8 && <4.11
|
||||
, cmdargs >=0.10 && <0.11
|
||||
, containers
|
||||
, directory
|
||||
, licensor
|
||||
default-language: Haskell2010
|
||||
|
||||
49
package.yaml
Normal file
49
package.yaml
Normal file
@ -0,0 +1,49 @@
|
||||
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
|
||||
@ -1,6 +1,4 @@
|
||||
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
||||
{-# LANGUAGE NamedFieldPuns #-}
|
||||
{-# LANGUAGE RecordWildCards #-}
|
||||
{-# LANGUAGE ScopedTypeVariables #-}
|
||||
|
||||
----------------------------------------------------------------------
|
||||
@ -26,21 +24,16 @@ module Licensor
|
||||
-- base
|
||||
import qualified Control.Exception as Exception
|
||||
import Control.Monad (unless)
|
||||
import Data.Monoid ((<>))
|
||||
import Data.Version (Version)
|
||||
import System.IO
|
||||
|
||||
-- bytestring
|
||||
import qualified Data.ByteString.Lazy as ByteString
|
||||
|
||||
-- Cabal
|
||||
import Distribution.License
|
||||
import Distribution.Package
|
||||
import Distribution.PackageDescription
|
||||
import Distribution.PackageDescription.Parse
|
||||
import Distribution.Simple.Utils
|
||||
import Distribution.Text
|
||||
import Distribution.Verbosity
|
||||
import Distribution.License (License)
|
||||
import Distribution.Package (PackageIdentifier(..), PackageName)
|
||||
import Distribution.PackageDescription (PackageDescription, packageDescription)
|
||||
import Distribution.PackageDescription.Parse (readGenericPackageDescription)
|
||||
import Distribution.Simple.Utils (comparing, findPackageDesc)
|
||||
import Distribution.Text (Text, display, simpleParse)
|
||||
import Distribution.Verbosity (silent)
|
||||
|
||||
-- containers
|
||||
import Data.Map.Strict (Map)
|
||||
@ -49,16 +42,13 @@ import Data.Set (Set)
|
||||
import qualified Data.Set as Set
|
||||
|
||||
-- directory
|
||||
import System.Directory
|
||||
|
||||
-- http-conduit
|
||||
import Network.HTTP.Simple (HttpException, getResponseBody, httpLBS, parseRequest)
|
||||
import System.Directory (getCurrentDirectory)
|
||||
|
||||
-- licensor
|
||||
import qualified Paths_licensor
|
||||
|
||||
-- process
|
||||
import System.Process
|
||||
import System.Process (readProcess)
|
||||
|
||||
|
||||
-- |
|
||||
@ -98,7 +88,7 @@ getPackage :: IO (Maybe PackageDescription)
|
||||
getPackage = do
|
||||
currentDirectory <- getCurrentDirectory
|
||||
fmap getPackageDescription <$> findPackageDesc currentDirectory
|
||||
>>= either (const (return Nothing)) (fmap Just)
|
||||
>>= either (const (pure Nothing)) (fmap Just)
|
||||
|
||||
|
||||
-- |
|
||||
@ -107,7 +97,7 @@ getPackage = do
|
||||
|
||||
getPackageDescription :: FilePath -> IO PackageDescription
|
||||
getPackageDescription =
|
||||
fmap packageDescription . readPackageDescription silent
|
||||
fmap packageDescription . readGenericPackageDescription silent
|
||||
|
||||
|
||||
-- |
|
||||
@ -121,10 +111,10 @@ getDependencies = do
|
||||
|
||||
case eitherDeps of
|
||||
Left (_ :: IOError) ->
|
||||
return Nothing
|
||||
pure Nothing
|
||||
|
||||
Right deps ->
|
||||
return $ fmap Set.fromList $ sequence $ fmap simpleParse (lines deps)
|
||||
pure $ Set.fromList <$> traverse simpleParse (lines deps)
|
||||
|
||||
|
||||
getLicenses :: IO (Maybe [(PackageName, License)])
|
||||
@ -134,10 +124,10 @@ getLicenses = do
|
||||
|
||||
case eitherDeps of
|
||||
Left (_ :: IOError) ->
|
||||
return Nothing
|
||||
pure Nothing
|
||||
|
||||
Right deps ->
|
||||
return $ sequence $ fmap toNameLicense (lines deps)
|
||||
pure $ traverse toNameLicense (lines deps)
|
||||
where
|
||||
toNameLicense dep =
|
||||
case words dep of
|
||||
@ -155,45 +145,16 @@ getLicenses = do
|
||||
getPackageLicense
|
||||
:: Bool
|
||||
-> PackageIdentifier
|
||||
-> Maybe [(PackageName, License)]
|
||||
-> [(PackageName, License)]
|
||||
-> IO (Maybe LiLicense)
|
||||
getPackageLicense quiet p@PackageIdentifier{..} (Just licenses) = do
|
||||
unless quiet (putStr $ display p ++ "...")
|
||||
case lookup pkgName licenses of
|
||||
getPackageLicense quiet packageIdentifier licenses = do
|
||||
unless quiet (putStr $ display packageIdentifier ++ "...")
|
||||
case lookup (pkgName packageIdentifier) licenses of
|
||||
Just license -> do
|
||||
unless quiet (putStrLn $ display license)
|
||||
return $ Just (LiLicense license)
|
||||
pure $ Just (LiLicense license)
|
||||
Nothing ->
|
||||
return Nothing
|
||||
getPackageLicense quiet p@PackageIdentifier{..} Nothing = do
|
||||
unless quiet (putStr $ display p ++ "...")
|
||||
let
|
||||
url =
|
||||
"GET https://hackage.haskell.org/package/"
|
||||
<> display p
|
||||
<> "/"
|
||||
<> unPackageName pkgName
|
||||
<> ".cabal"
|
||||
|
||||
req <- parseRequest url
|
||||
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
|
||||
|
||||
unless quiet (putStrLn $ display license)
|
||||
|
||||
return $ Just (LiLicense license)
|
||||
pure Nothing
|
||||
|
||||
|
||||
-- |
|
||||
@ -203,19 +164,19 @@ getPackageLicense quiet p@PackageIdentifier{..} Nothing = do
|
||||
orderPackagesByLicense
|
||||
:: Bool
|
||||
-> Maybe PackageIdentifier
|
||||
-> Maybe [(PackageName, License)]
|
||||
-> [(PackageName, License)]
|
||||
-> Set PackageIdentifier
|
||||
-> IO (Map LiLicense (Set PackageIdentifier), Set PackageIdentifier)
|
||||
orderPackagesByLicense quiet maybeP maybeLicenses =
|
||||
orderPackagesByLicense quiet maybeP licenses =
|
||||
let
|
||||
cond =
|
||||
maybe (const False) (==) maybeP
|
||||
|
||||
insertPackage package orderedPackages' = do
|
||||
maybeLicense <- getPackageLicense quiet package maybeLicenses
|
||||
maybeLicense <- getPackageLicense quiet package licenses
|
||||
|
||||
(orderedPackages, failed) <- orderedPackages'
|
||||
return $
|
||||
pure $
|
||||
if cond package
|
||||
then
|
||||
(orderedPackages, failed)
|
||||
|
||||
12
stack.yaml.lock
Normal file
12
stack.yaml.lock
Normal file
@ -0,0 +1,12 @@
|
||||
# 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
|
||||
Loading…
Reference in New Issue
Block a user