diff --git a/src/pygitversionhelper/gitversionhelper.py b/src/pygitversionhelper/gitversionhelper.py index e97936c..e293ebd 100644 --- a/src/pygitversionhelper/gitversionhelper.py +++ b/src/pygitversionhelper/gitversionhelper.py @@ -37,10 +37,19 @@ def _exec(cmd: str, root: str | os.PathLike | None = None) -> list[str]: """ try: - stdout = subprocess.check_output(cmd, shell=True, text=True, cwd=root) + #stdout = subprocess.check_output(cmd, shell=True, text=True, cwd=root) + p = subprocess.run(cmd.split(), text=True, cwd=root, capture_output=True) + if re.search("not a git repository",p.stderr): + raise gitversionhelper.repository.notAGitRepository() + if re.search("fatal:",p.stderr): + raise gitversionhelper.unknownGITFatalError() + if int(p.returncode) < 0: + raise gitversionhelper.unknownGITError + except subprocess.CalledProcessError as e: - stdout = e.output - lines = stdout.splitlines() + raise RuntimeError(e.output) + + lines = p.stdout.splitlines() return [line.rstrip() for line in lines if line.rstrip()] class gitversionhelperException(Exception): @@ -52,12 +61,18 @@ class gitversionhelper: # pylint: disable=too-few-public-methods """ class wrongArguments(gitversionhelperException): pass + class unknownGITError(gitversionhelperException): + pass + class unknownGITFatalError(unknownGITError): + pass class repository: """ class containing methods focusing on repository """ class repositoryException(gitversionhelperException): pass + class notAGitRepository(repositoryException): + pass class repositoryDirty(repositoryException): pass @classmethod @@ -115,7 +130,7 @@ class gitversionhelper: # pylint: disable=too-few-public-methods if len(res)==0: raise cls.tagNotFound("no tag found in commit history") elif len(res)!=1: - raise cls.MoreThanOneTag("multiple tags on same commit is unsupported") + raise cls.moreThanOneTag("multiple tags on same commit is unsupported") return res[0] @classmethod @@ -153,6 +168,7 @@ class gitversionhelper: # pylint: disable=too-few-public-methods "Auto" : None } } + __versionReseted = False class versionException(gitversionhelperException): pass class noValidVersion(versionException): @@ -294,9 +310,13 @@ class gitversionhelper: # pylint: disable=too-few-public-methods saved_kwargs = copy(kwargs) if "formated_output" in kwargs: del saved_kwargs["formated_output"] + _v = cls.getLastVersion(**saved_kwargs) - amount = gitversionhelper.tag.getDistanceFromTag(_v.raw,**kwargs) - _v = _v.bump(amount,**kwargs) + + if cls.__versionReseted == False: + amount = gitversionhelper.tag.getDistanceFromTag(_v.raw,**kwargs) + _v = _v.bump(amount,**kwargs) + if ((cls.__OptDict["formated_output"] in kwargs) and (kwargs[cls.__OptDict["formated_output"]] is True)): return _v.doFormatVersion(**kwargs) return _v @@ -319,10 +339,13 @@ class gitversionhelper: # pylint: disable=too-few-public-methods bAutoVersionStd = True lastTag=cls.MetaVersion.raw + cls.__versionReseted = False try: lastTag = gitversionhelper.tag.getLastTag(**kwargs) except gitversionhelper.tag.tagNotFound: logging.warning('tag not found, reseting versionning') + cls.__versionReseted = True + bFound = False if VersionStd == "SemVer" or (bAutoVersionStd is True) : @@ -422,23 +445,3 @@ class gitversionhelper: # pylint: disable=too-few-public-methods revpattern="-pre" revcount=f".{pre_count}" return OutputFormat.format(major=inputversion.major,minor=inputversion.minor,patch=patch,revpattern=revpattern,revcount=revcount) - - - - - -#print(gitversionhelper.head.isDirty()) -#print(gitversionhelper.tag.getTags()) -#print(gitversionhelper.tag.getLastTag()) -#print(gitversionhelper.tag.getLastTag(same_branch=True)) -#print(gitversionhelper.tag.getDistanceFromLastTag()) -#print(gitversionhelper.tag.getDistanceFromLastTag(same_branch=True)) - -#print(gitversionhelper.version.getLastVersion()) -#print(gitversionhelper.version.getLastVersion(same_branch=True,version_std="PEP440")) -#print(gitversionhelper.version.getLastVersion(same_branch=True,version_std="PEP440")) -#print(gitversionhelper.version.getLastVersion(same_branch=False,version_std="PEP440")) - - -#from setuptools_git_versioning import version_from_git -#print(str(version_from_git(tag_filter="^\d+\.\d+\.\d+$",dev_template = "{tag}.post{ccount}",sort_by="v:refname")),end ="") diff --git a/test/test_gitversionhelper.py b/test/test_gitversionhelper.py index 4029a59..cdbf3ea 100644 --- a/test/test_gitversionhelper.py +++ b/test/test_gitversionhelper.py @@ -685,7 +685,88 @@ class Test_gitversionhelper(unittest.TestCase): self.assertEqual("V_1_0",pygitversionhelper.gitversionhelper.version.getCurrentVersion(bump_type="dev",bump_dev_strategy="pre-major",output_format="V_{major}_{minor}",formated_output=True)) - + def test_nominal_emptyrepo(self): + _v = pygitversionhelper.gitversionhelper.version.getCurrentVersion() + self.assertIsInstance(_v, pygitversionhelper.gitversionhelper.version.MetaVersion) + self.assertIsInstance(_v.raw, str) + self.assertEqual(_v.raw, "0.1.0") + self.assertIsInstance(_v.major, int) + self.assertIsInstance(_v.minor, int) + self.assertIsInstance(_v.patch, int) + self.assertIsInstance(_v.pre_count, int) + self.assertIsInstance(_v.post_count, int) + + self.assertEqual(_v.major,0) + self.assertEqual(_v.minor,1) + self.assertEqual(_v.patch,0) + self.assertEqual(_v.pre_count,0) + self.assertEqual(_v.post_count,0) + self._test_version_format(_v,"0.1.0") + + def test_defect_dirty(self): + _v=self._test_version_readback("0.1.1",version_std="PEP440") + + with open("demofile.txt", "w+t") as tmpFile: + tmpFile.write("testvalue225") + + with self.assertRaises(pygitversionhelper.gitversionhelper.repository.repositoryDirty) as context: + pygitversionhelper.gitversionhelper.version.getCurrentVersion() + + def test_defect_wrongargument_git_sortargs(self): + with self.assertRaises(pygitversionhelper.gitversionhelper.wrongArguments) as context: + pygitversionhelper.gitversionhelper.tag.getTags(sort="toto") + + def test_defect_git_notagfound(self): + with open("demofile.txt", "w+t") as tmpFile: + tmpFile.write("testvalue") + os.system("git add .") + os.system("git commit -m \"first commit\"") + with self.assertRaises(pygitversionhelper.gitversionhelper.tag.tagNotFound) as context: + pygitversionhelper.gitversionhelper.tag.getLastTag() + + """ This test is impossible to do + def test_defect_git_multipletagsfound(self): + with open("demofile.txt", "w+t") as tmpFile: + tmpFile.write("testvalue") + os.system("git add .") + os.system("git commit -m \"first commit\"") + os.system(f"git tag 0.1.0") + os.system(f"git tag 0.2.0") + with self.assertRaises(pygitversionhelper.gitversionhelper.tag.moreThanOneTag) as context: + pygitversionhelper.gitversionhelper.tag.getLastTag() + """ + + def test_defect_wrongargument_bump_type(self): + _v=self._test_version_readback("0.1.1",version_std="PEP440") + with self.assertRaises(pygitversionhelper.gitversionhelper.wrongArguments) as context: + pygitversionhelper.gitversionhelper.version.getCurrentVersion(bump_type="toto") + + def test_defect_wrongargument_bump_dev_strategy(self): + _v=self._test_version_readback("0.1.1",version_std="PEP440") + with self.assertRaises(pygitversionhelper.gitversionhelper.wrongArguments) as context: + pygitversionhelper.gitversionhelper.version.getCurrentVersion(bump_dev_strategy="toto") + + + def tearDown(self): os.chdir("/") - \ No newline at end of file + +class Test_gitversionhelperNoRepo(unittest.TestCase): + def setUp(self): + self.TmpWorkingDir=tempfile.TemporaryDirectory() + self.TmpWorkingDirPath=pathlib.Path(self.TmpWorkingDir.name) + os.chdir(self.TmpWorkingDirPath) + + def test_defect_norepo(self): + with self.assertRaises(pygitversionhelper.gitversionhelper.repository.notAGitRepository) as context: + _v = pygitversionhelper.gitversionhelper.version.getCurrentVersion() + + def tearDown(self): + os.chdir("/") + +#print(gitversionhelper.tag.getLastTag(same_branch=True)) +#print(gitversionhelper.tag.getDistanceFromLastTag(same_branch=True)) + +#print(gitversionhelper.version.getLastVersion(same_branch=True,version_std="PEP440")) +#print(gitversionhelper.version.getLastVersion(same_branch=True,version_std="PEP440")) +#print(gitversionhelper.version.getLastVersion(same_branch=False,version_std="PEP440")) \ No newline at end of file