@@ -71,7 +71,6 @@ trait GitAlg[F[_]] {
7171}
7272
7373object GitAlg {
74-
7574 def create [F [_]](implicit
7675 config : Config ,
7776 fileAlg : FileAlg [F ],
@@ -80,25 +79,22 @@ object GitAlg {
8079 F : BracketThrowable [F ]
8180 ): GitAlg [F ] =
8281 new GitAlg [F ] {
83- private val sign : String =
84- if (config.signCommits) " --gpg-sign" else " --no-gpg-sign"
85-
8682 override def branchAuthors (repo : Repo , branch : Branch , base : Branch ): F [List [String ]] =
8783 workspaceAlg.repoDir(repo).flatMap { repoDir =>
88- exec( Nel .of( " log" , " --pretty=format:'%an'" , dotdot(base, branch)), repoDir)
84+ git( " log" , " --pretty=format:'%an'" , dotdot(base, branch))( repoDir)
8985 }
9086
9187 override def checkoutBranch (repo : Repo , branch : Branch ): F [Unit ] =
9288 for {
9389 repoDir <- workspaceAlg.repoDir(repo)
94- _ <- exec( Nel .of( " checkout" , branch.name), repoDir)
90+ _ <- git( " checkout" , branch.name)( repoDir)
9591 } yield ()
9692
9793 override def clone (repo : Repo , url : Uri ): F [Unit ] =
9894 for {
9995 rootDir <- workspaceAlg.rootDir
10096 repoDir <- workspaceAlg.repoDir(repo)
101- _ <- exec( Nel .of( " clone" , " --recursive" , url.toString, repoDir.pathAsString), rootDir)
97+ _ <- git( " clone" , " --recursive" , url.toString, repoDir.pathAsString)( rootDir)
10298 } yield ()
10399
104100 override def cloneExists (repo : Repo ): F [Boolean ] =
@@ -110,38 +106,38 @@ object GitAlg {
110106 override def commitAll (repo : Repo , message : String ): F [Commit ] =
111107 for {
112108 repoDir <- workspaceAlg.repoDir(repo)
113- _ <- exec( Nel .of( " commit" , " --all" , sign, " -m" , message), repoDir)
109+ _ <- git( " commit" , " --all" , sign, " -m" , message)( repoDir)
114110 } yield Commit ()
115111
116112 override def containsChanges (repo : Repo ): F [Boolean ] =
117113 workspaceAlg.repoDir(repo).flatMap { repoDir =>
118- val args = Nel .of (" status" , " --porcelain" , " --untracked-files=no" , " --ignore-submodules" )
119- exec (args, repoDir).map(_.nonEmpty)
114+ val args = List (" status" , " --porcelain" , " --untracked-files=no" , " --ignore-submodules" )
115+ git (args : _* )( repoDir).map(_.nonEmpty)
120116 }
121117
122118 override def createBranch (repo : Repo , branch : Branch ): F [Unit ] =
123119 for {
124120 repoDir <- workspaceAlg.repoDir(repo)
125- _ <- exec( Nel .of( " checkout" , " -b" , branch.name), repoDir)
121+ _ <- git( " checkout" , " -b" , branch.name)( repoDir)
126122 } yield ()
127123
128124 override def currentBranch (repo : Repo ): F [Branch ] =
129125 for {
130126 repoDir <- workspaceAlg.repoDir(repo)
131- lines <- exec( Nel .of( " rev-parse" , " --abbrev-ref" , Branch .head.name), repoDir)
127+ lines <- git( " rev-parse" , " --abbrev-ref" , Branch .head.name)( repoDir)
132128 } yield Branch (lines.mkString.trim)
133129
134130 override def findFilesContaining (repo : Repo , string : String ): F [List [String ]] =
135131 for {
136132 repoDir <- workspaceAlg.repoDir(repo)
137- args = Nel .of (" grep" , " -I" , " --fixed-strings" , " --files-with-matches" , string)
138- lines <- exec (args, repoDir).handleError(_ => List .empty[ String ] )
133+ args = List (" grep" , " -I" , " --fixed-strings" , " --files-with-matches" , string)
134+ lines <- git (args : _* )( repoDir).handleError(_ => List .empty)
139135 } yield lines.filter(_.nonEmpty)
140136
141137 override def hasConflicts (repo : Repo , branch : Branch , base : Branch ): F [Boolean ] =
142138 workspaceAlg.repoDir(repo).flatMap { repoDir =>
143- val tryMerge = exec( Nel .of( " merge" , " --no-commit" , " --no-ff" , branch.name), repoDir)
144- val abortMerge = exec( Nel .of( " merge" , " --abort" ), repoDir).void
139+ val tryMerge = git( " merge" , " --no-commit" , " --no-ff" , branch.name)( repoDir)
140+ val abortMerge = git( " merge" , " --abort" )( repoDir).void
145141
146142 returnToCurrentBranch(repo) {
147143 checkoutBranch(repo, base) >> F .guarantee(tryMerge)(abortMerge).attempt.map(_.isLeft)
@@ -150,39 +146,39 @@ object GitAlg {
150146
151147 override def isMerged (repo : Repo , branch : Branch , base : Branch ): F [Boolean ] =
152148 workspaceAlg.repoDir(repo).flatMap { repoDir =>
153- exec( Nel .of( " log" , " --pretty=format:'%h'" , dotdot(base, branch)), repoDir).map(_.isEmpty)
149+ git( " log" , " --pretty=format:'%h'" , dotdot(base, branch))( repoDir).map(_.isEmpty)
154150 }
155151
156152 override def latestSha1 (repo : Repo , branch : Branch ): F [Sha1 ] =
157153 for {
158154 repoDir <- workspaceAlg.repoDir(repo)
159- lines <- exec( Nel .of( " rev-parse" , " --verify" , branch.name), repoDir)
155+ lines <- git( " rev-parse" , " --verify" , branch.name)( repoDir)
160156 sha1 <- F .fromEither(Sha1 .from(lines.mkString(" " ).trim))
161157 } yield sha1
162158
163159 override def mergeTheirs (repo : Repo , branch : Branch ): F [Option [Commit ]] =
164160 for {
165161 before <- latestSha1(repo, Branch .head)
166162 repoDir <- workspaceAlg.repoDir(repo)
167- _ <- exec( Nel .of( " merge" , " --strategy-option=theirs" , sign, branch.name), repoDir)
163+ _ <- git( " merge" , " --strategy-option=theirs" , sign, branch.name)( repoDir).void
168164 .handleErrorWith { throwable =>
169165 // Resolve CONFLICT (modify/delete) by deleting unmerged files:
170166 for {
171- unmergedFiles <- exec( Nel .of( " diff" , " --name-only" , " --diff-filter=U" ), repoDir)
167+ unmergedFiles <- git( " diff" , " --name-only" , " --diff-filter=U" )( repoDir)
172168 _ <- Nel .fromList(unmergedFiles.filter(_.nonEmpty)) match {
173- case Some (files) => files.traverse(file => exec( Nel .of( " rm" , file), repoDir))
169+ case Some (files) => files.traverse(file => git( " rm" , file)( repoDir))
174170 case None => F .raiseError(throwable)
175171 }
176- _ <- exec( Nel .of( " commit" , " --all" , " --no-edit" , sign), repoDir)
177- } yield List .empty
172+ _ <- git( " commit" , " --all" , " --no-edit" , sign)( repoDir)
173+ } yield ()
178174 }
179175 after <- latestSha1(repo, Branch .head)
180176 } yield Option .when(before =!= after)(Commit ())
181177
182178 override def push (repo : Repo , branch : Branch ): F [Unit ] =
183179 for {
184180 repoDir <- workspaceAlg.repoDir(repo)
185- _ <- exec( Nel .of( " push" , " --force" , " --set-upstream" , " origin" , branch.name), repoDir)
181+ _ <- git( " push" , " --force" , " --set-upstream" , " origin" , branch.name)( repoDir)
186182 } yield ()
187183
188184 override def removeClone (repo : Repo ): F [Unit ] =
@@ -191,8 +187,8 @@ object GitAlg {
191187 override def setAuthor (repo : Repo , author : Author ): F [Unit ] =
192188 for {
193189 repoDir <- workspaceAlg.repoDir(repo)
194- _ <- exec( Nel .of( " config" , " user.email" , author.email), repoDir)
195- _ <- exec( Nel .of( " config" , " user.name" , author.name), repoDir)
190+ _ <- git( " config" , " user.email" , author.email)( repoDir)
191+ _ <- git( " config" , " user.name" , author.name)( repoDir)
196192 } yield ()
197193
198194 override def syncFork (repo : Repo , upstreamUrl : Uri , defaultBranch : Branch ): F [Unit ] =
@@ -201,14 +197,19 @@ object GitAlg {
201197 remote = " upstream"
202198 branch = defaultBranch.name
203199 remoteBranch = s " $remote/ $branch"
204- _ <- exec( Nel .of( " remote" , " add" , remote, upstreamUrl.toString), repoDir)
205- _ <- exec( Nel .of( " fetch" , " --tags" , remote, branch), repoDir)
206- _ <- exec( Nel .of( " checkout" , " -B" , branch, " --track" , remoteBranch), repoDir)
207- _ <- exec( Nel .of( " merge" , remoteBranch), repoDir)
200+ _ <- git( " remote" , " add" , remote, upstreamUrl.toString)( repoDir)
201+ _ <- git( " fetch" , " --tags" , remote, branch)( repoDir)
202+ _ <- git( " checkout" , " -B" , branch, " --track" , remoteBranch)( repoDir)
203+ _ <- git( " merge" , remoteBranch)( repoDir)
208204 _ <- push(repo, defaultBranch)
209205 } yield ()
210206
211- private def exec (command : Nel [String ], cwd : File ): F [List [String ]] =
212- processAlg.exec(" git" :: command, cwd, " GIT_ASKPASS" -> config.gitAskPass.pathAsString)
207+ private def git (args : String * )(cwd : File ): F [List [String ]] = {
208+ val extraEnv = " GIT_ASKPASS" -> config.gitAskPass.pathAsString
209+ processAlg.exec(Nel .of(" git" , args : _* ), cwd, extraEnv)
210+ }
211+
212+ private val sign : String =
213+ if (config.signCommits) " --gpg-sign" else " --no-gpg-sign"
213214 }
214215}
0 commit comments