Hello community,

here is the log from the commit of package ghc-cartel for openSUSE:Factory 
checked in at 2017-04-17 10:25:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-cartel (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-cartel.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-cartel"

Mon Apr 17 10:25:08 2017 rev:2 rq:461609 version:0.18.0.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-cartel/ghc-cartel.changes    2016-09-25 
14:36:43.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-cartel.new/ghc-cartel.changes       
2017-04-17 10:25:20.214493423 +0200
@@ -1,0 +2,5 @@
+Thu Sep 15 06:42:37 UTC 2016 - [email protected]
+
+- Update to version 0.18.0.2 revision 0 with cabal2obs.
+
+-------------------------------------------------------------------

Old:
----
  cartel-0.16.0.0.tar.gz

New:
----
  cartel-0.18.0.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-cartel.spec ++++++
--- /var/tmp/diff_new_pack.69ikQz/_old  2017-04-17 10:25:21.050375046 +0200
+++ /var/tmp/diff_new_pack.69ikQz/_new  2017-04-17 10:25:21.050375046 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package ghc-cartel
 #
-# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,18 +19,21 @@
 %global pkg_name cartel
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.16.0.0
+Version:        0.18.0.2
 Release:        0
 Summary:        Specify Cabal files in Haskell
 License:        BSD-3-Clause
-Group:          System/Libraries
+Group:          Development/Languages/Other
 Url:            https://hackage.haskell.org/package/%{pkg_name}
 Source0:        
https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz
 BuildRequires:  ghc-Cabal-devel
-# Begin cabal-rpm deps:
 BuildRequires:  ghc-directory-devel
 BuildRequires:  ghc-filepath-devel
+BuildRequires:  ghc-optparse-applicative-devel
+BuildRequires:  ghc-pretty-show-devel
+BuildRequires:  ghc-process-devel
 BuildRequires:  ghc-rpm-macros
+BuildRequires:  ghc-split-devel
 BuildRequires:  ghc-time-devel
 BuildRequires:  ghc-transformers-devel
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
@@ -42,7 +45,6 @@
 BuildRequires:  ghc-tasty-quickcheck-devel
 BuildRequires:  ghc-tasty-th-devel
 %endif
-# End cabal-rpm deps
 
 %description
 By specifying your Cabal files in Haskell, you have the power of Haskell at
@@ -65,20 +67,14 @@
 %prep
 %setup -q -n %{pkg_name}-%{version}
 
-
 %build
 %ghc_lib_build
 
-
 %install
 %ghc_lib_install
 
-
 %check
-%if %{with tests}
-%{cabal} test
-%endif
-
+%cabal_test
 
 %post devel
 %ghc_pkg_recache
@@ -89,6 +85,7 @@
 %files -f %{name}.files
 %defattr(-,root,root,-)
 %doc LICENSE
+%{_bindir}/cartel-init
 
 %files devel -f %{name}-devel.files
 %defattr(-,root,root,-)

++++++ cartel-0.16.0.0.tar.gz -> cartel-0.18.0.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/LICENSE new/cartel-0.18.0.2/LICENSE
--- old/cartel-0.16.0.0/LICENSE 2015-09-10 03:18:12.000000000 +0200
+++ new/cartel-0.18.0.2/LICENSE 2016-06-29 19:24:12.000000000 +0200
@@ -1,4 +1,4 @@
-Copyright (c) 2014 - 2015, Omari Norman
+Copyright (c) 2014 - 2016, Omari Norman
 
 All rights reserved.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/README.md 
new/cartel-0.18.0.2/README.md
--- old/cartel-0.16.0.0/README.md       2015-09-10 03:18:12.000000000 +0200
+++ new/cartel-0.18.0.2/README.md       2016-06-29 19:24:12.000000000 +0200
@@ -11,11 +11,15 @@
 
 http://www.github.com/massysett/cartel
 
-## Test results
+## On Stackage
 
-[![Build 
Status](https://travis-ci.org/massysett/cartel.svg?branch=master)](https://travis-ci.org/massysett/cartel)
+https://www.stackage.org/package/cartel
 
-If you have trouble getting Cartel to build, you might try looking at
-the test results by clicking on the button above; archived test
-results will show you what package dependencies have been used in the
-past to build Cartel successfully.
+## Building Cartel
+
+Cartel's Cabal file is generated using Cartel.  You will need to
+have the `stack` program installed.  Stack is available at
+
+http://www.haskellstack.org
+
+To generate the Cabal file, simply run  `sh buildprep`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/cartel.cabal 
new/cartel-0.18.0.2/cartel.cabal
--- old/cartel-0.16.0.0/cartel.cabal    2016-01-30 13:32:28.000000000 +0100
+++ new/cartel-0.18.0.2/cartel.cabal    2016-06-30 03:45:32.000000000 +0200
@@ -2,12 +2,12 @@
 -- Cartel is available at:
 -- http://www.github.com/massysett/cartel
 --
--- Script name used to generate: GenCartelCabal.hs
--- Generated on: 2016-01-30 07:32:28.40375 EST
+-- Script name used to generate: gen-cartel-cabal
+-- Generated on: 2016-06-29 21:45:32.560173 EDT
 -- Cartel library version: 0.16.0.0
 
 name: cartel
-version: 0.16.0.0
+version: 0.18.0.2
 cabal-version: >= 1.10
 license: BSD3
 license-file: LICENSE
@@ -36,10 +36,9 @@
     Cartel.Ast
     Cartel.Betsy
     Cartel.Betsy.Internal
-    Cartel.GenCartelCabal
+    Cartel.Init
     Cartel.Render
     Cartel.Types
-    Cartel.Version
   default-language: Haskell2010
   ghc-options:
     -Wall
@@ -51,6 +50,10 @@
     , filepath >= 1.3.0.0
     , time >= 1.4
     , transformers >= 0.3.0.0
+    , optparse-applicative >= 0.12.1.0
+    , pretty-show >= 1.6.10
+    , process >= 1.2.3.0
+    , split >= 0.2.3
 
 source-repository head
   type: git
@@ -65,10 +68,9 @@
       Cartel.Ast
       Cartel.Betsy
       Cartel.Betsy.Internal
-      Cartel.GenCartelCabal
+      Cartel.Init
       Cartel.Render
       Cartel.Types
-      Cartel.Version
     hs-source-dirs:
       tests
     build-depends:
@@ -88,11 +90,43 @@
       , filepath >= 1.3.0.0
       , time >= 1.4
       , transformers >= 0.3.0.0
+      , optparse-applicative >= 0.12.1.0
+      , pretty-show >= 1.6.10
+      , process >= 1.2.3.0
+      , split >= 0.2.3
   else
     buildable: False
   default-language: Haskell2010
   main-is: cartel-visual-test.hs
 
+Executable cartel-init
+  default-language: Haskell2010
+  main-is: cartel-init.hs
+  hs-source-dirs:
+    exe
+  other-modules:
+    Cartel
+    Cartel.Ast
+    Cartel.Betsy
+    Cartel.Betsy.Internal
+    Cartel.Init
+    Cartel.Render
+    Cartel.Types
+  ghc-options:
+    -Wall
+  hs-source-dirs:
+    lib
+  build-depends:
+      base >= 4.8.0.0 && < 5
+    , directory >= 1.1.0.2
+    , filepath >= 1.3.0.0
+    , time >= 1.4
+    , transformers >= 0.3.0.0
+    , optparse-applicative >= 0.12.1.0
+    , pretty-show >= 1.6.10
+    , process >= 1.2.3.0
+    , split >= 0.2.3
+
 Test-Suite cartel-properties
   default-language: Haskell2010
   other-modules:
@@ -101,10 +135,9 @@
     Cartel.Ast
     Cartel.Betsy
     Cartel.Betsy.Internal
-    Cartel.GenCartelCabal
+    Cartel.Init
     Cartel.Render
     Cartel.Types
-    Cartel.Version
   other-extensions:
     TemplateHaskell
   hs-source-dirs:
@@ -126,6 +159,10 @@
     , filepath >= 1.3.0.0
     , time >= 1.4
     , transformers >= 0.3.0.0
+    , optparse-applicative >= 0.12.1.0
+    , pretty-show >= 1.6.10
+    , process >= 1.2.3.0
+    , split >= 0.2.3
   type: exitcode-stdio-1.0
   main-is: cartel-properties.hs
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/exe/cartel-init.hs 
new/cartel-0.18.0.2/exe/cartel-init.hs
--- old/cartel-0.16.0.0/exe/cartel-init.hs      1970-01-01 01:00:00.000000000 
+0100
+++ new/cartel-0.18.0.2/exe/cartel-init.hs      2016-06-29 19:24:12.000000000 
+0200
@@ -0,0 +1,6 @@
+module Main where
+
+import Cartel.Init
+
+main :: IO ()
+main = cartelInit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/lib/Cartel/Ast.hs 
new/cartel-0.18.0.2/lib/Cartel/Ast.hs
--- old/cartel-0.16.0.0/lib/Cartel/Ast.hs       2016-01-30 13:32:19.000000000 
+0100
+++ new/cartel-0.18.0.2/lib/Cartel/Ast.hs       2016-06-29 19:24:12.000000000 
+0200
@@ -1196,10 +1196,19 @@
 --  -- etc.  Fields you don't supply will be blank.
 --  }
 -- @
+--
+-- Many of these fields hold a 'Maybe' type.  Values that are
+-- 'Nothing' will generate no output in the resulting Cabal file.
+-- Other fields are a 'String' type.  Empty strings will generate no
+-- output in the resulting Cabal file.  Other values are lists; empty
+-- lists generate no output in the resulting Cabal file.
 
 data Properties = Properties
   { name :: String
+  -- ^ The unique name for the package, without the version number.
   , version :: Version
+  -- ^ The package version number, which is always a list of natural
+  -- numbers.
   , cabalVersion :: Maybe (Word, Word)
   -- ^ The version of the Cabal specification to use.  As of
   -- 2016-01-30 I can find no documentation on what these different
@@ -1207,28 +1216,71 @@
   -- version 1.22.6.0 is using @1.10@ as the default value here.
   , buildType :: Maybe BuildType
   , license :: Maybe License
+  -- ^ The type of license under which the package is distributed
   , licenseFile :: String
+  -- ^ The name of a file or files containing the precise copyright
+  -- license.  The license file will be installed with the package. If
+  -- you have mulitple license files, use the 'licenseFiles' field
+  -- instead of, or in addition to, this field.
   , licenseFiles :: [NonEmptyString]
+
   , copyright :: String
+  -- ^ A freeform copyright string, for instance, @Copyright: (c)
+  -- 2006-2007 Joe Bloggs@
   , author :: String
+  -- ^ The original author of the package.
   , maintainer :: String
+  -- ^ According to the \"Developing Cabal Packages\" document, this
+  -- should simply be an email address.
   , stability :: String
+  -- ^ The stability level of the package, e.g. @alpha",
+  -- @experimental@, @provisional@, @stable@, etc.
   , homepage :: String
+  -- ^ URL for package homepage.
   , bugReports :: String
+  -- ^ URL where user should send bug reports.  This can be a
+  -- @mailto:@ for mailed bug reports or an @http@ or @https@ URL for
+  -- an online bug tracking system.
   , packageUrl :: String
+  -- ^ Location of a source bundle for the package.  The distribution
+  -- should be a Cabal package.
   , synopsis :: String
+  -- ^ Very short description of the package, for use in a table of packages.
   , description :: [String]
+  -- ^ Description of the package.  This can be several paragraphs.
   , category :: String
-  -- ^ According to the \"Developing Cabal Packages\" document, this
-  -- should simply be an email address.
+  -- ^ Classification category for Hackage.  There is not much of an
+  -- organizational system to these categories.
   , testedWith :: [(Compiler, Constraint)]
+  -- ^ LIst of compilers and versions against which the package has
+  -- been tested (or built).
   , dataFiles :: [NonEmptyString]
+  -- ^ List of files to be installed for run-time use by the package.
+  -- This is useful for packages that have a large amount of static
+  -- data.
   , dataDir :: String
+  -- ^ The directory where Cabal looks for data files to install,
+  -- relative to the source directory.  By default, Cabal will look in
+  -- the source directory itself.
   , extraSourceFiles :: [NonEmptyString]
+  -- ^ A list of additional files to be included in source
+  -- distributions built with @setup sdist@.  As with 'dataFiles' it
+  -- can include a limited form of @*@ wildcards in file names.
   , extraDocFiles :: [NonEmptyString]
+  -- ^ A list of additional files to be included in source
+  -- distributions, and also copied to the html directory when Haddock
+  -- documentation is generated. As with data-files it can use a
+  -- limited form of @*@ wildcards in file names.
   , extraTmpFiles :: [NonEmptyString]
+  -- ^ A list of additional files or directories to be removed by
+  -- setup clean. These would typically be additional files created by
+  -- additional hooks.
   } deriving (Eq, Ord, Show)
 
+-- | The 'mempty' value will generate no output in the resulting Cabal
+-- file.  'mappend' takes the last non-'Nothing' value (for 'Maybe'
+-- fields) or otherwise simply uses 'mappend' (for 'String' and list
+-- values).
 instance Monoid Properties where
   mempty = Properties
     { name = ""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/lib/Cartel/Betsy/Internal.hs 
new/cartel-0.18.0.2/lib/Cartel/Betsy/Internal.hs
--- old/cartel-0.16.0.0/lib/Cartel/Betsy/Internal.hs    2016-01-30 
13:32:19.000000000 +0100
+++ new/cartel-0.18.0.2/lib/Cartel/Betsy/Internal.hs    2016-06-29 
19:29:22.000000000 +0200
@@ -115,8 +115,7 @@
           Just _ -> Left (DuplicateFlag nm)
 
 runBetsy
-  :: Functor m
-  => Betsy m a
+  :: Betsy m a
   -> m (Either Error (a, [Flag]))
   -- ^ Returns 'Left' if the making of a flag failed.  Otherwise,
   -- returns the result of the computation, along with a list of all
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/lib/Cartel/GenCartelCabal.hs 
new/cartel-0.18.0.2/lib/Cartel/GenCartelCabal.hs
--- old/cartel-0.16.0.0/lib/Cartel/GenCartelCabal.hs    2016-01-30 
13:32:19.000000000 +0100
+++ new/cartel-0.18.0.2/lib/Cartel/GenCartelCabal.hs    1970-01-01 
01:00:00.000000000 +0100
@@ -1,124 +0,0 @@
--- | This program generates Cartel's own Cabal file.  It's included
--- here in the library to provide a live, type-checked, compilable
--- example.  You will want to look at the source code itself, as the
--- Haddocks won't show you much.
-
-module Cartel.GenCartelCabal where
-
-import Cartel
-import qualified Cartel.Version
-
--- Dependencies
-
-base :: Package
-base = closedOpen "base" [4,8,0,0] [5]
-
-directory :: Package
-directory = atLeast "directory" [1,1,0,2]
-
-filepath :: Package
-filepath = atLeast "filepath" [1,3,0,0]
-
-time :: Package
-time = atLeast "time" [1,4]
-
-quickcheck :: Package
-quickcheck = atLeast "QuickCheck" [2,7]
-
-tasty :: Package
-tasty = atLeast "tasty" [0,10]
-
-tastyQuickcheck :: Package
-tastyQuickcheck = atLeast "tasty-quickcheck" [0,8]
-
-tastyTh :: Package
-tastyTh = atLeast "tasty-th" [0,1]
-
-random :: Package
-random = atLeast "random" [1,0,1,1]
-
-transformers :: Package
-transformers = atLeast "transformers" [0,3,0,0]
-
-multiarg :: Package
-multiarg = atLeast "multiarg" [0,30,0,0]
-
-libDepends :: [Package]
-libDepends =
-  [ base, directory, filepath, time, transformers ]
-
-testDepends :: [Package]
-testDepends
-  = [ multiarg, quickcheck, random, tasty, tastyTh, tastyQuickcheck ]
-
-commonOptions :: HasBuildInfo a => [a]
-commonOptions =
-  [ ghcOptions ["-Wall"]
-  , hsSourceDirs ["lib"]
-  , buildDepends libDepends
-  ]
-
-testOptions :: HasBuildInfo a => [a]
-testOptions
-  = hsSourceDirs ["tests"]
-  : buildDepends testDepends
-  : commonOptions
-
-main :: IO ()
-main = defaultMain $ do
-  libModules <- modules "lib"
-  flagVisual <- makeFlag "visual"
-    (FlagOpts { flagDescription = "Build cartel-visual-test executable."
-              , flagDefault = False
-              , flagManual = True
-              })
-  testMods <- modules "tests"
-  return
-    ( mempty
-      { name = "cartel"
-        , version = Cartel.Version.version
-        , buildType = Just simple
-        , category = "Distribution"
-        , maintainer = "[email protected]"
-        , synopsis = "Specify Cabal files in Haskell"
-        , description =
-            [ "By specifying your Cabal files in Haskell, you have the power"
-            , "of Haskell at your disposal to reduce redundancy.  You can"
-            , "also read in trees of module names dynamically, which saves"
-            , "you from manually maintaining lists of module names."
-            , ""
-            , "See the documentation in the \"Cartel\" module for details."
-            ]
-        , license = Just bsd3
-        , licenseFile = "LICENSE"
-        , copyright = "Copyright 2014-2016 Omari Norman"
-        , author = "Omari Norman"
-        , stability = "Experimental"
-        , cabalVersion = Just (1,10)
-        , homepage = "http://www.github.com/massysett/cartel";
-        , bugReports = "http://www.github.com/massysett/cartel/issues";
-        , extraSourceFiles = ["README.md"]
-      }
-    , exposedModules libModules : haskell2010 : commonOptions
-
-    , [ githubHead "massysett" "cartel"
-      , executable "cartel-visual-test"
-        [ condBlock (flag flagVisual)
-          ( buildable True
-          , otherModules (testMods ++ libModules)
-            : testOptions
-          )
-          [ buildable False
-          ]
-        , haskell2010
-        , mainIs "cartel-visual-test.hs"
-        ]
-      , testSuite "cartel-properties"
-        $ haskell2010 
-        : otherModules (testMods ++ libModules)
-        : otherExtensions ["TemplateHaskell"]
-        : testOptions
-        ++ exitcodeFields "cartel-properties.hs"
-        
-      ]
-    )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/lib/Cartel/Init.hs 
new/cartel-0.18.0.2/lib/Cartel/Init.hs
--- old/cartel-0.16.0.0/lib/Cartel/Init.hs      1970-01-01 01:00:00.000000000 
+0100
+++ new/cartel-0.18.0.2/lib/Cartel/Init.hs      2016-06-29 19:24:12.000000000 
+0200
@@ -0,0 +1,911 @@
+-- | Generates a skeletal file structure to start a new Cartel-based
+-- project.  Similar to @cabal init@ or @stack new@.
+module Cartel.Init
+  ( cartelInit
+  , Github(..)
+  , GitInit(..)
+  , License(..)
+  , TreeInitMode(..)
+  , TreeInit(..)
+  , InitMode(..)
+  , Init(..)
+  , cartelInitWithSettings
+  ) where
+
+import Cartel.Types (NonEmptyString)
+import Control.Applicative (many, (<|>))
+import qualified Control.Exception as Exception
+import Data.List (intersperse)
+import Data.List.Split (splitOn)
+import Data.Maybe (fromMaybe, catMaybes)
+import Data.Monoid ((<>))
+import qualified Data.Time as Time
+import qualified Options.Applicative as O
+import qualified Options.Applicative.Types as OT
+import qualified System.Directory as Directory
+import System.FilePath ((</>))
+import qualified System.Process as Process
+import Text.Read (readMaybe)
+import Text.Show.Pretty (ppShow)
+
+-- # Data types
+
+-- | Configuration information for Github.
+data Github = Github
+  { githubUsername :: NonEmptyString
+  , noGithubIssues :: Bool
+  -- ^ If you want to use the Github issue tracker, use 'True' here,
+  -- and then the 'C.bugReports' field will give the Github issues
+  -- URL.
+  , createRemote :: String
+  -- ^ If non-empty, creates a Git remote with the given name using
+  -- the @git remote@ command.  If empty, does not create a Git
+  -- remote.
+  } deriving Show
+
+data GitInit = GitInit
+  { gitIgnorePatterns :: [NonEmptyString]
+  -- ^ If there are any values here, a @.gitignore@ file will be
+  -- created in your project's root directory, with one pattern for
+  -- each element of this list.
+
+  , trackCabal :: Bool
+  -- ^ In addition to 'gitIgnorePatterns', if 'False' a pattern is
+  -- added to ignore the project's generated .cabal file.
+
+  , useGithub :: Maybe Github
+  -- ^ If you want to use Github, pass an appropriate 'Just' value here.
+  -- This will:
+  --
+  -- * use the main Github project page for the 'C.homepage' field
+  --
+  -- * create an appropriate @source-repository@ entry
+  --
+  -- * 'noGithubIssues' if you wish
+  } deriving Show
+
+-- | What kind of license you want to use.  Currently the only choices
+-- are BSD3 or AllRightsReserved.
+data License
+  = BSD3
+  | AllRightsReserved
+  deriving (Read, Show)
+
+data TreeInitMode
+  = MakeTreeOnly
+  -- ^ Create a cabal file and write it with a skeleton of files.
+  | MakeGit GitInit
+  -- ^ Create a cabal file, write it with a skeleton of files, and
+  -- initialize a Git repository.
+  deriving Show
+
+
+data TreeInit = TreeInit
+  { cartelResolver :: NonEmptyString
+  -- ^ Use this resolver for the @stack.yaml@ for the Cabal file
+  -- generator.
+  , packageResolver :: NonEmptyString
+  -- ^ Use this resolver for the @stack.yaml@ for the package.
+  , treeInitMode :: TreeInitMode
+  } deriving Show
+
+-- | What to do when running @cabal-init@.
+data InitMode
+  = ShowCabalOnly
+  -- ^ Only show a cabal file.
+  | MakeTree TreeInit
+  -- ^ Create a cabal file and write it with a skeleton of files.
+  deriving Show
+
+-- | Configuration options.  Some of these can be overridden on the
+-- command line.
+data Init = Init
+  { author :: String
+  -- ^ Used for original package author name.
+  , maintainer :: String
+  -- ^ Used for the current maintainer.  This should be an email address.
+  , initMode :: InitMode
+  , ghcOptions :: [NonEmptyString]
+  -- ^ Put any default GHC warnings you want here, e.g. @["-Wall", "-O0"]@.
+  , license :: License
+  -- ^ Default license type
+  , baseLowerBound :: [Word]
+  -- ^ The lower bounds for the dependency for the @base@ package.
+  -- For example use @[4,8]@ for the lower bound to be @base-4.8@.
+  , baseUpperBound :: [Word]
+  -- ^ The upper bounds for the dependency for the @base@ package.
+  -- For example use @[5]@ for the lower bound to be @base-5@.
+  } deriving Show
+
+data ProjectInit = ProjectInit
+  { piInit :: Init
+  , projectName :: String
+  -- ^ Name for the project.  Will be used as the directory name,
+  -- Github project name, and Cabal project name.
+  } deriving Show
+
+-- # Data type manipulation
+
+gitInit :: Init -> Maybe GitInit
+gitInit ini = case initMode ini of
+  MakeTree treeInit -> case treeInitMode treeInit of
+    MakeTreeOnly -> Nothing
+    MakeGit gi -> Just gi
+  _ -> Nothing
+
+-- # File and directory utilities
+
+-- | Change to the given directory, carry out IO action, and return to
+-- the old directory after the IO action is complete.  Exception safe.
+withDirectory :: FilePath -> IO a -> IO a
+withDirectory fp act = Exception.bracket get
+  Directory.setCurrentDirectory (const act)
+  where
+    get = do
+      current <- Directory.getCurrentDirectory
+      Directory.setCurrentDirectory fp
+      return current
+
+-- | Give the given file executable permission by the user.  Uses the
+-- chmod program.
+makeFileExecutable :: FilePath -> IO ()
+makeFileExecutable fp = Process.callProcess "chmod" ["u+x", fp]
+
+-- | Writes a particular file and then makes it executable.
+writeExecutableFile :: FilePath -> String -> IO ()
+writeExecutableFile fp txt = do
+  writeFile fp txt
+  makeFileExecutable fp
+
+-- # Creating the text for result files
+
+-- | The text for the package home page, without any quotes.  Only
+-- returns text if Github is being used.
+homepageText
+  :: NonEmptyString
+  -- ^ Package name
+  -> Init
+  -> String
+homepageText pkgName ini = fromMaybe "" $ do
+  gi <- gitInit ini
+  gh <- useGithub gi
+  return $ "http://www.github.com/"; ++ githubUsername gh ++ "/" ++ pkgName
+
+-- | The text for the Github issues page, without any quotes, if there
+-- is a Github issues page.
+bugReportsText
+  :: NonEmptyString
+  -- ^ Package name
+  -> Init
+  -> String
+bugReportsText pkgName ini = fromMaybe "" $ do
+  gi <- gitInit ini
+  gh <- useGithub gi
+  return $ if not (noGithubIssues gh)
+    then "http://www.github.com/"; ++ githubUsername gh ++ "/"
+                ++ pkgName ++ "/issues"
+    else ""
+
+licenseName
+  :: Init
+  -> String
+licenseName ini = "Cartel." ++ case license ini of
+  BSD3 -> "bsd3"
+  AllRightsReserved -> "allRightsReserved"
+
+licenseFileName :: Init -> Maybe String
+licenseFileName ini = case license ini of
+  BSD3 -> Just "LICENSE"
+  AllRightsReserved -> Nothing
+
+propertiesText
+  :: NonEmptyString
+  -- ^ Package name
+  -> String
+  -- ^ Year
+  -> Init
+  -> String
+propertiesText packageName year ini = unlines
+  [ "properties :: Cartel.Properties"
+  , "properties = Cartel.Properties"
+  , "  { Cartel.name = " ++ quotes packageName
+  , "  , Cartel.version = version"
+  , "  , Cartel.cabalVersion = Just (1,10)"
+  , "  , Cartel.buildType = Just Cartel.simple"
+  , "  , Cartel.license = Just " ++ licenseName ini
+  , "  , Cartel.licenseFile = " ++ quotes (fromMaybe "" (licenseFileName ini))
+  , "  , Cartel.licenseFiles = []"
+  , "  , Cartel.copyright = " ++ (quotes $ "Copyright (c) "
+         ++ year ++ " " ++ author ini)
+  , "  , Cartel.author = " ++ quotes (author ini)
+  , "  , Cartel.maintainer = " ++ quotes (maintainer ini)
+  , "  , Cartel.stability = \"Experimental\""
+  , "  , Cartel.homepage = " ++ quotes (homepageText packageName ini)
+  , "  , Cartel.bugReports = " ++ quotes (bugReportsText packageName ini)
+  , "  , Cartel.packageUrl = " ++ quotes ""
+  , "  , Cartel.synopsis = " ++ quotes ""
+  , "  , Cartel.description = []"
+  , "  , Cartel.category = " ++ quotes ""
+  , "  , Cartel.testedWith = []"
+  , "  , Cartel.dataFiles = []"
+  , "  , Cartel.dataDir = " ++ quotes ""
+  , "  , Cartel.extraSourceFiles = []"
+  , "  , Cartel.extraDocFiles = []"
+  , "  , Cartel.extraTmpFiles = []"
+  , "  }"
+  ]
+
+ghcOptionsText :: [NonEmptyString] -> String
+ghcOptionsText options = unlines $
+  [ "ghcOptions :: Cartel.HasBuildInfo a => a"
+  , "ghcOptions = Cartel.ghcOptions"
+  ] ++ end
+  where
+    end = case options of
+      [] -> ["  [", "  ]"]
+      x:xs -> optLines ++ ["  ]"]
+        where
+          optLines = ("  [ " ++ quotes x) : fmap (("  , " ++) . quotes) xs
+
+commonOptionsText :: String
+commonOptionsText = unlines
+  [ "commonOptions :: Cartel.HasBuildInfo a => [a]"
+  , "commonOptions"
+  , "  = ghcOptions"
+  , "  : Cartel.haskell2010"
+  , "  : Cartel.hsSourceDirs [\"lib\"]"
+  , "  : []"
+  ]
+
+libDependsText
+  :: [Word]
+  -- ^ Base lower bound
+  -> [Word]
+  -- ^ Base upper bound
+  -> String
+libDependsText lower upper = unlines
+  [ "libraryDepends :: [Cartel.Package]"
+  , "libraryDepends ="
+  , "  [ Cartel.closedOpen \"base\" " ++ show lower ++ " " ++ show upper
+  , "  ]"
+  ]
+
+libraryText :: String
+libraryText = unlines
+  [ "library"
+  , "  :: [Cartel.NonEmptyString]"
+  , "  -- ^ List of library modules"
+  , "  -> [Cartel.LibraryField]"
+  , "library libModules"
+  , "  = Cartel.buildDepends libraryDepends"
+  , "  : Cartel.exposedModules libModules"
+  , "  : commonOptions"
+  ]
+
+githubHeadText
+  :: NonEmptyString
+  -- ^ Package name
+  -> Init
+  -> Maybe String
+githubHeadText pkgName ini = do
+  gi <- gitInit ini
+  gh <- useGithub gi
+  return . unlines $
+    [ "github :: Cartel.Section"
+    , "github = Cartel.githubHead " ++ quotes (githubUsername gh)
+        ++ " " ++ quotes pkgName
+    ]
+
+sectionsText
+  :: Init
+  -> String
+sectionsText ini = unlines
+  [ "sections :: [Cartel.Section]"
+  , "sections ="
+  , "  [" ++ section1
+  , "  ]"
+  ]
+  where
+    section1 = fromMaybe "" $ do
+      gi <- gitInit ini
+      _ <- useGithub gi
+      return " github"
+
+mainText
+  :: NonEmptyString
+  -- ^ Package name
+  -> String
+mainText pkgName = unlines
+  [ "main :: IO ()"
+  , "main = Cartel.defaultMain $ do"
+  , "  libModules <- Cartel.modules " ++ quotes ("../" ++ pkgName ++ "/lib")
+  , "  return (properties, library libModules, sections)"
+  ]
+
+genCabalText
+  :: NonEmptyString
+  -- ^ Package name
+  -> String
+  -- ^ Year
+  -> Init
+  -> String
+genCabalText pkgName year ini = concat . intersperse "\n" . catMaybes $
+  [ Just heading
+  , Just $ propertiesText pkgName year ini
+  , Just $ ghcOptionsText (ghcOptions ini)
+  , Just $ commonOptionsText
+  , Just $ libDependsText (baseLowerBound ini) (baseUpperBound ini)
+  , Just $ libraryText
+  , githubHeadText pkgName ini
+  , Just $ sectionsText ini
+  , Just $ mainText pkgName
+  ]
+  where
+    heading = unlines
+      [ "module Main (main) where"
+      , ""
+      , "import qualified Cartel"
+      , ""
+      , "version :: [Word]"
+      , "version = [0,1,0,0]"
+      ]
+
+
+quotes :: String -> String
+quotes s = "\"" ++ s ++ "\""
+
+cartelCabalText :: ProjectInit -> String
+cartelCabalText pinit = unlines
+  [ "-- This Cabal file generated by the cartel-init program."
+  , ""
+  , "name: gen-" ++ projectName pinit ++ "-cabal"
+  , "version: 0.1"
+  , "build-type: Simple"
+  , "synopsis: Generates a Cabal file for the "
+               ++ projectName pinit ++ " package"
+  , "cabal-version: >=1.10"
+  , ""
+  , "Executable " ++ exeName
+  , "  main-is: " ++ exeName ++ ".hs"
+  , "  default-language: Haskell2010"
+  , "  ghc-options: -W"
+  , "  build-depends: base, cartel"
+  ]
+  where
+    exeName = "gen-" ++ projectName pinit ++ "-cabal"
+
+setupText :: String
+setupText = unlines
+  [ "import Distribution.Simple"
+  , "main = defaultMain"
+  ]
+
+stackYamlText :: NonEmptyString -> String
+stackYamlText resolver = unlines
+  [ "# This stack.yaml generated by the cartel-init program."
+  , ""
+  , "resolver: " ++ resolver
+  ]
+
+buildprepHeader :: [String]
+buildprepHeader =
+  [ "#!/bin/sh"
+  , "# Generates the project's .cabal file."
+  , "# Must be run with the containing directory as the current directory."
+  ]
+
+genCabalBuildprepText
+  :: ProjectInit
+  -> String
+genCabalBuildprepText pini = unlines $ buildprepHeader ++
+  [ "stack build"
+  , "stack exec gen-" ++ projectName pini ++ "-cabal > ../"
+    ++ projectName pini ++ "/" ++ projectName pini ++ ".cabal"
+  ]
+
+genRootBuildprepText
+  :: ProjectInit
+  -> String
+genRootBuildprepText pini = unlines $ buildprepHeader ++
+  [ "cd gen-" ++ projectName pini ++ "-cabal"
+  , "sh buildprep"
+  ]
+
+genPackageBuildprepText
+  :: ProjectInit
+  -> String
+genPackageBuildprepText pini = unlines $ buildprepHeader ++
+  [ "cd ../gen-" ++ projectName pini ++ "-cabal"
+  , "sh buildprep"
+  ]
+
+gitignoreText
+  :: String
+  -- ^ Project name
+  -> GitInit
+  -> String
+gitignoreText pname gi = unlines (headerLines ++ allLines)
+  where
+    headerLines =
+      [ "# This .gitignore file generated by the cartel-init program."
+      , ""
+      , ".stack-work/"
+      , "dist/"
+      ]
+    allLines = projectLines ++ extraLines
+    projectLines
+      | trackCabal gi = []
+      | otherwise =
+          [ "# Do not track project's cabal file"
+          , pname ++ ".cabal"
+          ]
+    extraLines
+      | null . gitIgnorePatterns $ gi = []
+      | otherwise =
+          "# Other specified ignored patterns" : gitIgnorePatterns gi
+
+writeGitignoreText :: ProjectInit -> IO ()
+writeGitignoreText pini = case initMode . piInit $ pini of
+  ShowCabalOnly -> return ()
+  MakeTree ti -> case treeInitMode ti of
+    MakeTreeOnly -> return ()
+    MakeGit gi -> let txt = gitignoreText (projectName pini) gi
+      in writeFile (projectName pini </> ".gitignore") txt
+      
+
+bsd3LicenseText
+  :: String
+  -- ^ Year
+  -> String
+  -- ^ Owner
+  -> String
+  -- ^ License text
+bsd3LicenseText year owner = unlines
+  [ "Copyright (c) " ++ year ++ " " ++ owner
+  , "All rights reserved."
+  , ""
+  , "Redistribution and use in source and binary forms, with or without"
+  , "modification, are permitted provided that the following conditions are"
+  , "met:"
+  , ""
+  , "1. Redistributions of source code must retain the above copyright"
+  , "notice, this list of conditions and the following disclaimer."
+  , ""
+  , "2. Redistributions in binary form must reproduce the above copyright"
+  , "notice, this list of conditions and the following disclaimer in the"
+  , "documentation and/or other materials provided with the distribution."
+  , ""
+  , "3. Neither the name of the copyright holder nor the names of its"
+  , "contributors may be used to endorse or promote products derived from"
+  , "this software without specific prior written permission."
+  , ""
+  , "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS"
+  , "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT"
+  , "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR"
+  , "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT"
+  , "HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,"
+  , "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT"
+  , "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,"
+  , "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY"
+  , "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT"
+  , "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE"
+  , "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+  ]
+
+rootReadme :: ProjectInit -> String
+rootReadme pini = unlines $
+  [ "# " ++ projectName pini
+  , ""
+  ] ++ licenseLines ++
+  [ "## Building this project"
+  , ""
+  , "The Cabal file for this project is generated using the Cartel package."
+  , "To generate the Cabal file, simply run `sh buildprep`."
+  , "You must run this command from the project's main directory."
+  , "You will need to have the `stack` program installed."
+  , ""
+  , "Stack is available at:"
+  , "http://www.haskellstack.org";
+  ]
+  where
+    licenseLines = case license . piInit $ pini of
+      AllRightsReserved -> []
+      BSD3 ->
+        [ "## License"
+        , ""
+        , "This package is released under the BSD3 license."
+          ++ " Please see the LICENSE file."
+        , ""
+        ]
+
+packageReadme :: ProjectInit -> String
+packageReadme pini = unlines $
+  [ "# " ++ projectName pini
+  , ""
+  ] ++ licenseLines ++
+  [ "## Building this project"
+  , ""
+  , "If you are viewing the source code repository, a `.cabal` file might"
+  , "not be included.  Please see the README.md in the main project directory"
+  , "for details on how to generate the `.cabal` file."
+  ]
+  where
+    licenseLines = case license . piInit $ pini of
+      AllRightsReserved -> []
+      BSD3 ->
+        [ "## License"
+        , ""
+        , "This package is released under the BSD3 license."
+          ++ " Please see the LICENSE file."
+        , ""
+        ]
+
+-- # Option parsing
+
+pAuthor :: O.Parser String
+pAuthor = O.strOption
+  ( O.long "author"
+    <> O.short 'a'
+    <> O.metavar "NAME"
+    <> O.help "Name of the package author (typically your full name)")
+
+pMaintainer :: O.Parser String
+pMaintainer = O.strOption
+  ( O.long "maintainer"
+    <> O.short 'm'
+    <> O.metavar "EMAIL"
+    <> O.help "Package maintainer's email address")
+
+pGhcOption :: O.Parser [String]
+pGhcOption = many $ O.strOption
+  ( O.long "ghc-option"
+    <> O.short 'g'
+    <> O.metavar "OPTION"
+    <> O.help ("A single GHC option, with the leading hyphen, e.g. \"-Wall\"."
+       ++ " To get multiple GHC options, use this flag more than once."))
+
+pCartelResolver :: O.Parser String
+pCartelResolver = O.strOption
+  ( O.long "cartel-resolver"
+    <> O.metavar "RESOLVER"
+    <> O.help "Resolver to use for package that generates Cabal file"
+    <> O.value "lts-6.4"
+    <> O.showDefault )
+
+pPackageResolver :: O.Parser String
+pPackageResolver = O.strOption
+  ( O.long "package-resolver"
+    <> O.metavar "RESOLVER"
+    <> O.help "Resolver to use for the new package"
+    <> O.value "lts-6.4"
+    <> O.showDefault )
+
+pLicense :: O.Parser License
+pLicense = flagBSD <|> pure AllRightsReserved
+  where
+    flagBSD = O.flag' BSD3
+      ( O.long "bsd3"
+        <> O.help ("Use BSD3 license. (If this option is not used, license "
+           ++ "will be \"All Rights Reserved\".)"))
+
+parseVersionString :: O.ReadM [Word]
+parseVersionString = do
+  str <- OT.readerAsk
+  let digitStrings = splitOn "." str
+  case mapM readMaybe digitStrings of
+    Nothing -> OT.readerError $ "invalid version number: " ++ str
+    Just r -> return r
+
+
+pLowerBound :: O.Parser [Word]
+pLowerBound = O.option parseVersionString
+  ( O.long "base-lower-bound"
+    <> O.metavar "VERSION"
+    <> O.help ("Lower bound for the 'base' package, e.g. \"4.8\""
+        ++ " (default: 4.8)")
+    <> O.value [4,8] )
+
+pUpperBound :: O.Parser [Word]
+pUpperBound = O.option parseVersionString
+  ( O.long "base-upper-bound"
+    <> O.metavar "VERSION"
+    <> O.help ("Lower bound for the 'base' package, e.g. \"5\""
+              ++ " (default: 5)")
+    <> O.value [5] )
+
+pInit :: O.Parser (InitMode -> Init)
+pInit = f <$> pAuthor
+  <*> pMaintainer <*> pGhcOption <*> pLicense <*> pLowerBound
+  <*> pUpperBound
+  where
+    f a m g l low up gi = Init a m gi g l low up
+
+pTreeInit :: O.Parser (TreeInitMode -> TreeInit)
+pTreeInit = TreeInit <$> pCartelResolver <*> pPackageResolver
+
+pInitTreeOnly :: O.Parser Init
+pInitTreeOnly = f <$> pInit <*> pTreeInit
+  where
+    f mkIni mkTreeIni = mkIni (MakeTree (mkTreeIni MakeTreeOnly))
+
+pInitNoGithub :: O.Parser Init
+pInitNoGithub = f <$> pInit <*> pTreeInit <*> pGitInit
+  where
+    f getInit getTreeInit getGitInit = getInit
+      (MakeTree (getTreeInit (MakeGit (getGitInit Nothing))))
+
+pInitWithGithub :: O.Parser Init
+pInitWithGithub = f <$> pInit <*> pTreeInit <*> pGitInit
+  <*> pGithub
+  where
+    f getInit getTreeInit getGitInit gh = getInit
+      (MakeTree (getTreeInit (MakeGit (getGitInit (Just gh)))))
+
+pInitCabalOnly :: O.Parser Init
+pInitCabalOnly = ($ ShowCabalOnly) <$> pInit
+
+
+pGitInit :: O.Parser (Maybe Github -> GitInit)
+pGitInit = GitInit <$> pGitIgnore <*> pTrackCabal
+  where
+    pGitIgnore = many $ O.strOption
+      (O.long "git-ignore"
+        <> O.short 'g'
+        <> O.metavar "PATTERN"
+        <> O.help ("A single pattern to add to the project-wide \".gitignore\""
+           ++ " file.  To add multiple patterns, use this flag multiple 
times."))
+    pTrackCabal = O.switch
+      (O.long "track-cabal"
+        <> O.short 't'
+        <> O.help ("By default an entry is added to \".gitignore\" so that the"
+           ++ " generated \".cabal\" file is NOT tracked in git.  If you DO 
want"
+           ++ " to track the \".cabal\" file in git, use this option."))
+
+pGithub :: O.Parser Github
+pGithub = Github <$> pUser <*> pIssues <*> pRemote
+  where
+    pUser = O.strOption
+      (O.long "username"
+        <> O.short 'u'
+        <> O.metavar "USERNAME"
+        <> O.help "Github username")
+    pIssues = O.flag False True
+      (O.long "no-issues"
+        <> O.help "Whether to use Github issue tracker"
+        <> O.help ("By default the Github issues tracker is used.  If you do"
+           ++ " NOT want to use it, use this flag."))
+    pRemote = O.strOption
+      (O.long "remote"
+        <> O.short 'r'
+        <> O.metavar "REMOTE"
+        <> O.value "github"
+        <> O.showDefault
+        <> O.help ("Name for local Git remote to interact with Github "
+                  ++ "(use empty string to create no remote)"))
+
+pProjectName :: O.Parser String
+pProjectName = O.strArgument
+  (O.metavar "NAME"
+    <> O.help
+      ( "Name for project.  Used for directory name, Github project name,"
+        ++ " and Cabal project name."))
+
+pTreeCommand :: O.Parser ProjectInit
+pTreeCommand = O.helper <*>
+  (ProjectInit <$> pInitTreeOnly <*> pProjectName)
+
+pCabalCommand :: O.Parser ProjectInit
+pCabalCommand = O.helper <*>
+  (ProjectInit <$> pInitCabalOnly <*> pProjectName)
+
+modTreeCommand :: O.Mod O.CommandFields ProjectInit
+modTreeCommand = O.command "tree" infTreeOnly
+  where
+    infTreeOnly = O.info pTreeCommand
+      (O.progDesc "create file tree only"
+      <> O.footer ("Creates a skeleton file tree."))
+
+pGitCommand :: O.Parser ProjectInit
+pGitCommand = O.helper <*>
+  (f <$> pInitNoGithub <*> pProjectName)
+  where
+    f i pName = ProjectInit i pName
+
+modGitCommand :: O.Mod O.CommandFields ProjectInit
+modGitCommand = O.command "git" infGit
+  where
+    infGit = O.info pGitCommand
+      (O.progDesc "create file tree and Git repository"
+        <> O.footer ("Creates a skeleton file tree and initializes a Git"
+           ++ " repository."))
+
+pGithubCommand :: O.Parser ProjectInit
+pGithubCommand = O.helper <*>
+  (f <$> pInitWithGithub <*> pProjectName)
+  where
+    f i pName = ProjectInit i pName
+
+modGithubCommand :: O.Mod O.CommandFields ProjectInit
+modGithubCommand = O.command "github" infGithub
+  where
+    infGithub = O.info pGithubCommand
+      (O.progDesc "create file tree, Git repository, and Github remotes"
+        <> O.footer ("Creates a skeleton file tree and initializes a Git"
+           ++ " repository with a Github remote."))
+
+modCabalCommand :: O.Mod O.CommandFields ProjectInit
+modCabalCommand = O.command "cabal" infCabal
+  where
+    infCabal = O.info (O.helper <*> pCabalCommand)
+      ( O.progDesc "only show Cabal file program"
+        <> O.footer ("Creates a program that generates a Cabal file and "
+           ++ "prints this program to standard output."))
+
+pCommands :: O.ParserInfo ProjectInit
+pCommands = O.info (O.helper <*> O.subparser
+  (modCabalCommand
+    <> modTreeCommand
+    <> modGitCommand
+    <> modGithubCommand))
+  (O.footer ("Cartel skeleton generator.  Sets up a skeleton file tree "
+    ++ "to start a new package based on Cartel.  Optionally, also sets up "
+    ++ "Git repository and Github information.  Some command line flags are "
+    ++ "required; in the help, these are shown in parentheses.  Optional flags 
"
+    ++ "are shown in square brackets."))
+
+-- | Retrieves the 'ProjectInit' by parsing the command line arguments.
+parseCommands :: IO ProjectInit
+parseCommands = O.execParser pCommands
+
+pSettings :: Init -> O.Parser (a -> a)
+pSettings ini = O.infoOption
+  (ppShow ini)
+  ( O.short 's'
+    <> O.long "settings"
+    <> O.help "show compiled-in settings and exit")
+
+pWithSettingsName :: Init -> O.Parser String
+pWithSettingsName ini = O.helper <*> pSettings ini <*> pProjectName
+
+parseCartelInitWithSettings :: Init -> IO ProjectInit
+parseCartelInitWithSettings ini = O.execParser parseInfo
+  where
+    parseInfo = O.info (O.helper <*> parser)
+      (O.footer ("Cartel skeleton generator, with custom"
+        ++ " compiled-in settings.  To see the settings you compiled in,"
+        ++ " use the \"--settings\" option."))
+    parser = ProjectInit <$> pure ini <*> pWithSettingsName ini
+
+-- | Runs @cartel-init@, but with the settings you compile in.
+-- Retrieves the project name from the command line.  Has a
+-- command-line option, @--settings@, that displays the built-in
+-- settings and then exits.
+cartelInitWithSettings :: Init -> IO ()
+cartelInitWithSettings ini = parseCartelInitWithSettings ini >>= runCartelInit
+
+printCabalText :: ProjectInit -> String -> IO ()
+printCabalText pinit cabalTxt = case initMode . piInit $ pinit of
+  ShowCabalOnly -> putStrLn cabalTxt
+  _ -> return ()
+
+-- # Writing text to disk
+
+writeLicenseText
+  :: String
+  -- ^ Year
+  -> ProjectInit
+  -> IO ()
+writeLicenseText yr pini = case license . piInit $ pini of
+  AllRightsReserved -> return ()
+  BSD3 -> do
+    writeFile (projectName pini </> "LICENSE") txt
+    writeFile (projectName pini </> projectName pini </> "LICENSE") txt
+    where
+      txt = bsd3LicenseText yr (author . piInit $ pini)
+
+writeReadmes :: ProjectInit -> IO ()
+writeReadmes pini = do
+  writeFile (name </> "README.md") (rootReadme pini)
+  writeFile (name </> name </> "README.md") (packageReadme pini)
+  where
+    name = projectName pini
+
+writeSetupFiles :: ProjectInit -> IO ()
+writeSetupFiles pini = do
+  writeFile (name </> ("gen-" ++ name ++ "-cabal") </> "Setup.hs")
+    setupText
+  writeFile (name </> name </> "Setup.hs") setupText
+  where
+    name = projectName pini
+
+writeStackYamls :: ProjectInit -> IO ()
+writeStackYamls pini = case initMode . piInit $ pini of
+  ShowCabalOnly -> return ()
+  MakeTree ti -> do
+    writeFile (name </> ("gen-" ++ name ++ "-cabal") </> "stack.yaml")
+      (stackYamlText (cartelResolver ti))
+    writeFile (name </> name </> "stack.yaml")
+      (stackYamlText (packageResolver ti))
+  where
+    name = projectName pini
+
+writeBuildpreps :: ProjectInit -> IO ()
+writeBuildpreps pini = do
+  let fnRoot = (name </> ("gen-" ++ name ++ "-cabal") </> bp)
+  writeExecutableFile  fnRoot (genCabalBuildprepText pini)
+  let fnPackage = (name </> bp)
+  writeExecutableFile fnPackage (genRootBuildprepText pini)
+  let fnLib = name </> name </> bp
+  writeExecutableFile fnLib (genPackageBuildprepText pini)
+  where
+    name = projectName pini
+    bp = "buildprep"
+
+
+
+createSkeleton
+  :: String
+  -- ^ Year
+  -> ProjectInit
+  -> String
+  -- ^ Cabal text
+  -> IO ()
+createSkeleton yr pini cabalText = do
+  -- Make directories
+  Directory.createDirectory name
+  Directory.createDirectory (name </> cartelProject)
+  Directory.createDirectory (name </> name)
+  Directory.createDirectory (name </> name </> "lib")
+
+  -- Write files
+  writeLicenseText yr pini
+  writeFile (name </> cartelProject </> (cartelProject ++ ".hs")) cabalText
+  writeFile (name </> cartelProject </> (cartelProject ++ ".cabal"))
+    (cartelCabalText pini)
+  writeReadmes pini
+  writeGitignoreText pini
+  writeSetupFiles pini
+  writeStackYamls pini
+  writeBuildpreps pini
+  where
+    name = projectName pini
+    cartelProject = "gen-" ++ name ++ "-cabal"
+
+-- # Git
+
+addGitRemote :: ProjectInit -> IO ()
+addGitRemote pini = case initMode . piInit $ pini of
+  ShowCabalOnly -> return ()
+  MakeTree ti -> case treeInitMode ti of
+    MakeTreeOnly -> return ()
+    MakeGit gi -> case useGithub gi of
+      Nothing -> return ()
+      Just gh
+        | null (createRemote gh) -> return ()
+        | otherwise -> withDirectory (projectName pini) $
+           Process.callProcess "git" ["remote", "add", createRemote gh, url]
+        where
+          url = "[email protected]:" ++ githubUsername gh ++ "/"
+            ++ projectName pini ++ ".git"
+
+runGitInit :: ProjectInit -> IO ()
+runGitInit pini = withDirectory (projectName pini) $
+  Process.callProcess "git" ["init"]
+
+initializeGit :: ProjectInit -> IO ()
+initializeGit pini = runGitInit pini >> addGitRemote pini
+
+runCartelInit :: ProjectInit -> IO ()
+runCartelInit ini = do
+  zt <- Time.getZonedTime
+  let (yr, _, _) = Time.toGregorian . Time.localDay
+        . Time.zonedTimeToLocalTime $ zt
+      cabalText = genCabalText (projectName ini) (show yr) (piInit ini)
+  printCabalText ini cabalText
+  createSkeleton (show yr) ini cabalText
+  initializeGit ini
+
+-- | Runs @cartel-init@, retrieving all configuration information from
+-- the command line.
+cartelInit :: IO ()
+cartelInit = parseCommands >>= runCartelInit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/lib/Cartel/Version.hs 
new/cartel-0.18.0.2/lib/Cartel/Version.hs
--- old/cartel-0.16.0.0/lib/Cartel/Version.hs   2016-01-30 13:32:19.000000000 
+0100
+++ new/cartel-0.18.0.2/lib/Cartel/Version.hs   1970-01-01 01:00:00.000000000 
+0100
@@ -1,12 +0,0 @@
--- | The current version for the Cartel library.  Having this in a
--- separate module allows for the "Cartel.GenCartelCabal" module to
--- exist.  Without this module, I'd have to rely on the @Paths_cartel@
--- module to exist, which introduces some nasty bootstrapping issues
--- for "Cartel.GenCartelCabal" or, alternatively, some nasty circular
--- dependency issues if this value were included directly into
--- "Cartel.GenCartelCabal".
-
-module Cartel.Version where
-
-version :: [Word]
-version = [0,16,0,0]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cartel-0.16.0.0/lib/Cartel.hs 
new/cartel-0.18.0.2/lib/Cartel.hs
--- old/cartel-0.16.0.0/lib/Cartel.hs   2016-01-30 13:32:19.000000000 +0100
+++ new/cartel-0.18.0.2/lib/Cartel.hs   2016-06-30 03:37:16.000000000 +0200
@@ -21,7 +21,7 @@
 -- new Cabal file whenever you change the script that generates your
 -- Cabal file.
 --
--- To the extent possible, Cartel uses the Haskell type system to
+-- To some extent, Cartel uses the Haskell type system to
 -- prevent you from making mistakes in your Cabal file.  For example,
 -- the 'Betsy' type prevents you from using 'flag's that you have not
 -- declared, and you can't put an 'exposedModules' field in anything
@@ -37,35 +37,106 @@
 -- I highly recommend that you use Cartel with @stack@, a Haskell
 -- build tool.  Stack is available at
 --
--- <https://github.com/commercialhaskell/stack>
+-- <https://www.haskellstack.org>
 --
--- By using @stack@ as a script interpreter, you can help ensure that
--- your Cartel script runs well into the future.  This is described at
+-- Using @stack@ means you can easily specify the exact package set
+-- with which to build your Cabal file, which helps ensure that it
+-- builds well into the future regardless of what compiler version
+-- someone happens to have installed.  I recommend setting up a
+-- different Cabal package whose sole job is to build your Cabal file.
+-- If you are on a UNIX-like system, use the @cartel-init@ program,
+-- which is included in the Cartel package.  @cartel-init@ establishes
+-- a skeleton file tree for a new package.  Run @cartel-init@ first to
+-- create an empty tree, and then create your package modules (or copy
+-- them into the tree, if you are converting an existing package to
+-- Cartel.)
 --
--- <http://docs.haskellstack.org/en/stable/GUIDE.html#ghc-runghc>
---
--- In particular, to have a Cartel script that uses @stack@, you do
--- something like this in your Cartel script:
+-- For example, to create a new package named @hello@, I would run the
+-- following:
 --
 -- @
--- #!\/usr/\bin\/env\/stack
--- -- stack --resolver lts-5.0 --install-ghc runghc --package cartel
--- module Main where
--- import qualified Cartel as C
--- -- etc...
+-- \$ cartel\-init github \-\-author \'Omari Norman\' \\
+--    \-\-maintainer \'omari\@smileystation.com\' \\
+--    \-\-bsd3 \-\-username massysett hello
 -- @
 --
--- However, if you have a @stack.yaml@ file in the same directory as
--- your Cabal file, @stack@ will get confused.  To work around this,
--- temporarily rename your @stack.yaml@ file while you use your Cartel
--- script (you can easily write a script to automate this).
+-- The @--author@ and @--maintainer@ options specify the author and
+-- maintainer fields for the Cabal file.  The @--bsd3@ option makes
+-- your new package have the BSD3 license; otherwise, you will get an
+-- \"All Rights Reserved\" license.  The @--username@ option gives
+-- your Github username, and @hello@ is the name of the package
+-- itself.
+--
+-- This command creates a directory tree that looks like this:
+--
+-- [@hello\/@] Main project directory.  Contains two packages: one to
+-- build the Cabal file, and one main package
+--
+-- [@hello\/LICENSE@] BSD3 license file
+--
+-- [@hello\/README.md@] This is NOT distributed with the main Cabal
+-- package.  It describes how to build this project.
+--
+-- [@hello\/buildprep@] With \"hello\" as the current directory, run
+-- \"sh buildprep\" to generate the Cabal file.
+--
+-- [@hello\/gen-hello-cabal\/@] Directory containing a package that
+-- builds the Cabal file.
+--
+-- [@hello\/gen-hello-cabal\/Setup.hs@] For the package that builds the
+-- Cabal file.
+--
+-- [@hello\/gen-hello-cabal\/buildprep@] Run from this directory to
+-- generate the Cabal file.
+--
+-- [@hello\/gen-hello-cabal\/gen-hello-cabal.cabal@] Cabal file for the
+-- pacakge that generates the Cabal file.
+--
+-- [@hello\/gen-hello-cabal\/gen-hello-cabal.hs@] Module with program
+-- that generates the Cabal file.  Edit this to change the generated
+-- Cabal file.
+--
+-- [@hello\/gen-hello-cabal\/stack.yaml@] Specifies stack resolver for
+-- package that builds the Cabal file.
+--
+-- [@hello\/hello\/@] Directory with the Cabal package that you would
+-- distribute on Hackage.
+--
+-- [@hello\/hello\/LICENSE@] BSD3 license.
+--
+-- [@hello\/hello\/README.md@] This is distributed with the project's
+-- Cabal package.
+--
+-- [@hello\/hello\/Setup.hs@] For the main Cabal package.
+--
+-- [@hello\/hello\/buildprep@] From this directory, run \"sh buildprep\"
+-- to generate the Cabal file.
+--
+-- [@hello\/hello\/lib\/@] Empty directory.  Place your library modules
+-- in here.
+--
+-- [@hello\/hello\/stack.yaml@] Has the resolver to use for the main
+-- package.
+--
+-- After running @cartel-init@, you will need to edit the
+-- @gen-yourpackage-cabal.hs@ file to add (at a minimum) a @synopsis@,
+-- @description@, and any additional @build-depends@.
+--
+-- For more information on @cartel-init@, run:
+--
+-- @
+-- \$ cartel-init --help
+-- \$ cartel-init cabal --help
+-- \$ cartel-init tree --help
+-- \$ cartel-init git --help
+-- \$ cartel-init github --help
+-- @
 --
 -- Everything you usually need is in this module.  Other Cartel
 -- modules contain implementation details.  /See first/ the
 -- 'NonEmptyString' type synonym, which has important details on how
 -- to regard 'String's and 'NonEmptyString's as you read the
--- documentation.  Also, examine "Cartel.GenCartelCabal", which
--- generates Cartel's own Cabal file using Cartel.
+-- documentation.
 --
 -- Hopefully this module's documentation is organized so that
 -- top-to-bottom reading will make sense.
@@ -266,8 +337,6 @@
 import Cartel.Betsy
 import Cartel.Render
 import Cartel.Types
-import qualified Cartel.Version
-import Data.List (intersperse)
 import Data.Time
 import System.Environment (getProgName)
 import System.Exit (exitFailure, exitSuccess)
@@ -294,12 +363,7 @@
             _ -> ["-- Script name used to generate: " ++ nm]
       ++
       [ "-- Generated on: " ++ show zt
-      , "-- Cartel library version: " ++ showVer
       ]
-    showVer = concat
-      . intersperse "."
-      . map show
-      $ Cartel.Version.version
 
 -- | Generic header to prepend to Cabal files.
 genericHeader :: IO String


Reply via email to