9595
9696import argparse
9797import os
98+ import pathlib
9899
99100import dfetch .commands .command
100101import dfetch .project
101102from dfetch .log import get_logger
102103from dfetch .manifest .project import ProjectEntry
103104from dfetch .project .git import GitSubProject
104- from dfetch .project .metadata import Metadata
105105from dfetch .project .subproject import SubProject
106106from dfetch .project .superproject import SuperProject
107107from dfetch .project .svn import SvnSubProject
@@ -155,19 +155,18 @@ def __call__(self, args: argparse.Namespace) -> None:
155155 for project in projects :
156156 patch_name = f"{ project .name } .patch"
157157 with catch_runtime_exceptions (exceptions ) as exceptions :
158- repo = _get_repo (superproject , project )
159- patch = _diff_from_repo (repo , project , revs )
158+ patch = _get_sub_project (superproject , project ).diff (revs )
160159
161160 _dump_patch (
162- superproject .manifest . path , revs , project , patch_name , patch
161+ superproject .root_directory , revs , project , patch_name , patch
163162 )
164163
165164 if exceptions :
166165 raise RuntimeError ("\n " .join (exceptions ))
167166
168167
169- def _get_repo (superproject : SuperProject , project : ProjectEntry ) -> SubProject :
170- """Get the repo type from the project ."""
168+ def _get_sub_project (superproject : SuperProject , project : ProjectEntry ) -> SubProject :
169+ """Get the subproject in the same vcs type as the superproject ."""
171170 if not os .path .exists (project .destination ):
172171 raise RuntimeError (
173172 "You cannot generate a diff of a project that was never fetched"
@@ -178,29 +177,7 @@ def _get_repo(superproject: SuperProject, project: ProjectEntry) -> SubProject:
178177 return SvnSubProject (project )
179178
180179 raise RuntimeError (
181- "Can only create patch in SVN or Git repo" ,
182- )
183-
184-
185- def _diff_from_repo (repo : SubProject , project : ProjectEntry , revs : list [str ]) -> str :
186- """Generate a relative diff for a svn repo."""
187- if len (revs ) > 2 :
188- raise RuntimeError (f"Too many revisions given! { revs } " )
189-
190- if not revs :
191- revs .append (repo .metadata_revision ())
192- if not revs [- 1 ]:
193- raise RuntimeError (
194- "When not providing any commits, dfetch starts from"
195- f" the last commit to { Metadata .FILENAME } in { project .destination } ."
196- " Please either commit this, or specify a revision to start from with --revs"
197- )
198-
199- if len (revs ) == 1 :
200- revs .append ("" )
201-
202- return repo .get_diff (
203- old_revision = revs [0 ], new_revision = revs [1 ], ignore = (Metadata .FILENAME ,)
180+ "Can only create patch if your project is an SVN or Git repo" ,
204181 )
205182
206183
@@ -214,8 +191,7 @@ def _dump_patch(
214191 project .name ,
215192 f"Generating patch { patch_name } { rev_range } in { os .path .dirname (path )} " ,
216193 )
217- with open (patch_name , "w" , encoding = "UTF-8" ) as patch_file :
218- patch_file .write (patch )
194+ pathlib .Path (patch_name ).write_text (patch , encoding = "UTF-8" )
219195 else :
220196 if revs [1 ]:
221197 msg = f"No diffs found from { revs [0 ]} to { revs [1 ]} "
0 commit comments