Skip to content

Commit cf1f97f

Browse files
committed
Merge master into release/1
--HG-- branch : release
2 parents 0e5913a + 884e601 commit cf1f97f

File tree

6 files changed

+90
-92
lines changed

6 files changed

+90
-92
lines changed

.hgtags

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
91d2ec54cf909ab56b0de299730171fbe1a18226 release/1a1
2+
244657cb77ec52ebd9829bb06f76ea97b0bbbc95 release/1a2

README.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Introduction
22

3-
The `hg-convert-prcs-extension` package adds the [PRCS][] source to the
4-
[convert extension][] for [Mercurial][].
3+
The [`convert_prcs` extension][hg-convert-prcs-extension] for [Mercurial][]
4+
enables the [PRCS][] source in the Mercurial [convert extension][].
55

6+
[hg-convert-prcs-extension]: https://pypi.org/project/hg-convert-prcs-extension/
67
[PRCS]: http://prcs.sourceforge.net/
78
[Mercurial]: https://www.mercurial-scm.org/
89
[convert extension]: https://www.mercurial-scm.org/wiki/ConvertExtension
@@ -18,14 +19,10 @@ This program is provided under the terms and conditions of the
1819

1920
[![(License)](https://img.shields.io/badge/license-GPL--3.0--or--later-blue.svg)][GPL-3.0]
2021

21-
[GPL-3.0]: https://opensource.org/licenses/GPL-3.0 "GNU General Public License, version 3"
22+
[GPL-3.0]: https://opensource.org/licenses/GPL-3.0
2223

2324
# Required software
2425

2526
This extension requires the following software:
2627

27-
- A working PRCS command which is available
28-
[here](https://bitbucket.org/kazssym/prcs), and
29-
- Python module prcslib in
30-
[prcs2hg](https://bitbucket.org/kazssym/prcs2hg) 2.0 which is not
31-
released yet.
28+
- [prcslib](https://pypi.org/project/prcslib/) 2.0 or later.

hgext3rd/convert_prcs/__init__.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,23 @@
1717
# SPDX-License-Identifier: GPL-3.0-or-later
1818

1919
"""
20-
Mercurial extension to enable the PRCS source for the Convert extension
20+
Mercurial extension to enable the PRCS source in the convert extension
21+
22+
PRCS is a legacy version control system. This extension makes it possible to
23+
convert a PRCS project to a new Mercurial repository.
2124
"""
2225

23-
from __future__ import absolute_import
24-
from hgext.convert.convcmd import source_converters
26+
from __future__ import absolute_import, unicode_literals
27+
from hgext.convert import convcmd
2528
from .prcs import prcs_source
2629

30+
# Mercurial versions with which this extension has been tested.
2731
testedwith = "5.2.2"
2832

2933
def extsetup(ui):
3034
"""
3135
set up the 'convert_prcs' extension
3236
"""
33-
source_converters.append(
37+
convcmd.source_converters.append(
3438
(b"prcs", prcs_source, b"branchsort")
3539
)

hgext3rd/convert_prcs/prcs.py

Lines changed: 64 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,12 @@
2020
PRCS source for the Mercurial convert extension
2121
"""
2222

23+
from __future__ import absolute_import, unicode_literals
2324
import re
2425
import os
2526
import sys
26-
from mercurial import extensions
2727
from hgext.convert.common import NoRepo, commit, converter_source
28-
from hgext.convert.convcmd import source_converters
29-
from prcslib import PrcsVersion, PrcsProject, PrcsError, PrcsCommandError
28+
from prcslib import PrcsVersion, PrcsProject, PrcsError
3029

3130
# Regular expression pattern that checks for main branches.
3231
_MAIN_BRANCH_RE = re.compile(r"^(\d+)$")
@@ -36,28 +35,26 @@ class prcs_source(converter_source):
3635
PRCS source class.
3736
"""
3837

39-
def __init__(self, ui, type, path, revs=None):
38+
def __init__(self, ui, scm, path, revs=None):
4039
"""
4140
initialize a PRCS source
4241
"""
43-
super(prcs_source, self).__init__(ui, type, path, revs)
42+
super(prcs_source, self).__init__(ui, scm, path, revs)
4443

4544
try:
46-
self._prcs = PrcsProject(path)
47-
self._revisions = self._prcs.versions()
45+
self._project = PrcsProject(path.decode())
46+
self._revisions = self._project.versions()
4847
except PrcsError:
4948
raise NoRepo(b"%s does not look like a PRCS project" % path)
5049

5150
self._cached_descriptor = {}
5251

5352
def _descriptor(self, version):
5453
"""Return a revision descriptor with caching."""
55-
if not isinstance(version, str):
56-
version = str(version)
57-
if self._cached_descriptor.has_key(version):
54+
if version in self._cached_descriptor:
5855
return self._cached_descriptor[version]
5956

60-
descriptor = self._prcs.descriptor(version)
57+
descriptor = self._project.descriptor(version)
6158
self._cached_descriptor[version] = descriptor
6259
return descriptor
6360

@@ -81,44 +78,50 @@ def _nearest_ancestor(self, version):
8178
return version
8279

8380
def getheads(self):
84-
last_minor_version = {}
85-
for v in self._revisions.iterkeys():
86-
if not self._revisions[v]['deleted']:
87-
v = PrcsVersion(v)
88-
if last_minor_version.get(v.major(), 0) < v.minor():
89-
last_minor_version[v.major()] = v.minor()
81+
"""
82+
return all the head versions of the PRCS source
83+
"""
84+
last_minors = {}
85+
for key in self._revisions:
86+
if not self._revisions[key]["deleted"]:
87+
version = PrcsVersion(key)
88+
if last_minors.get(version.major(), 0) < version.minor():
89+
last_minors[version.major()] = version.minor()
9090
return map(
91-
lambda item: str(PrcsVersion(item[0], item[1])),
92-
last_minor_version.iteritems())
91+
lambda item: str(PrcsVersion(*item)).encode(),
92+
last_minors.items())
9393

9494
def getfile(self, name, version):
95-
self.ui.debug("prcs_source.getfile: ", name, " ", version, "\n")
96-
revision = self._revisions[version]
95+
"""
96+
get the content of a file
97+
"""
98+
version = version.decode()
9799
descriptor = self._descriptor(version)
98-
99100
files = descriptor.files()
100-
try:
101-
a = files[name]
102-
if a.has_key('symlink'):
103-
return (a['symlink'], 'l')
104-
105-
self._prcs.checkout(version, [name])
106-
file = open(name, 'rb')
107-
content = file.read()
108-
file.close()
101+
if name.decode() in files:
102+
attr = files[name.decode()]
103+
if "symlink" in attr:
104+
return attr["symlink"].encode(), b"l"
105+
106+
self._project.checkout(version, files=[name.decode()])
107+
108+
with open(name, "rb") as stream:
109+
content = stream.read()
110+
109111
# NOTE: Win32 does not always releases the file name.
110-
if sys.platform != 'win32':
112+
if sys.platform != "win32":
111113
os.unlink(name)
112114
dir = os.path.dirname(name)
113115
if dir:
114116
os.removedirs(dir)
115-
return (content, 'x' if a['mode'] & (0x1 << 6) else '')
116-
except KeyError:
117-
# The file with the specified name was deleted.
118-
return None, None
117+
118+
return content, b"x" if attr["mode"] & (0x1 << 6) else b""
119+
120+
# The file with the specified name was deleted.
121+
return None, None
119122

120123
def getchanges(self, version, full=False):
121-
self.ui.debug("prcs_source.getchanges: ", version, "\n")
124+
version = version.decode()
122125
revision = self._revisions[version]
123126
descriptor = self._descriptor(version)
124127

@@ -130,48 +133,47 @@ def getchanges(self, version, full=False):
130133
p = self._nearest_ancestor(p)
131134
if full or p is None:
132135
# This is the initial checkin so all files are affected.
133-
for name in f.iterkeys():
134-
files.append((name, version))
136+
for name in f:
137+
files.append((name.encode(), version.encode()))
135138
else:
136139
pf = self._descriptor(p).files()
137140
# Handling added or changed files.
138-
for name, a in f.iteritems():
139-
if pf.has_key(name):
141+
for name, a in f.items():
142+
if name in pf:
140143
pa = pf[name]
141-
if a.has_key('symlink'):
142-
if not pa.has_key('symlink'):
144+
if "symlink" in a:
145+
if "symlink" not in pa:
143146
# Changed from a regular file to a symlink.
144-
files.append((name, version))
145-
elif pa.has_key('symlink'):
147+
files.append((name.encode(), version.encode()))
148+
elif "symlink" in pa:
146149
# Changed from a symlink to a regular file.
147-
files.append((name, version))
150+
files.append((name.encode(), version.encode()))
148151
elif a['id'] != pa['id'] \
149152
or a['revision'] != pa['revision'] \
150153
or (a['mode'] ^ pa['mode']) & (0x1 << 6):
151-
files.append((name, version))
154+
files.append((name.encode(), version.encode()))
152155
else:
153156
# Added.
154-
files.append((name, version))
157+
files.append((name.encode(), version.encode()))
155158
# Handling deleted or renamed files.
156159
pnamebyid = {}
157-
for pname, pa in pf.iteritems():
158-
if not f.has_key(pname):
160+
for pname, pa in pf.items():
161+
if pname not in f:
159162
# Removed (or renamed).
160-
files.append((pname, version))
161-
if not pa.has_key('symlink'):
163+
files.append((pname.encode(), version.encode()))
164+
if "symlink" not in pa:
162165
pnamebyid[pa['id']] = pname
163166
# Handling renamed files for copies.
164-
for name, a in f.iteritems():
165-
if not a.has_key('symlink') and \
166-
pnamebyid.has_key(a['id']):
167+
for name, a in f.items():
168+
if "symlink" not in a and a['id'] in pnamebyid:
167169
pname = pnamebyid[a['id']]
168170
if name != pname:
169-
self.ui.note(pname, " was renamed to ", name, "\n")
170-
copies[name] = pname
171+
self.ui.note(b"%s was renamed to %s\n" % (pname.encode(), name.encode()))
172+
copies[name.encode()] = pname.encode()
171173
return files, copies, set()
172174

173175
def getcommit(self, version):
174-
self.ui.debug("prcs_source.getcommit: ", version, "\n")
176+
version = version.decode()
175177
revision = self._revisions[version]
176178
descriptor = self._descriptor(version)
177179

@@ -180,19 +182,19 @@ def getcommit(self, version):
180182
# Preparing for a deleted parent.
181183
p = self._nearest_ancestor(p)
182184
if p is not None:
183-
parents.append(str(p))
185+
parents.append(str(p).encode())
184186
for mp in descriptor.mergeparents():
185187
# Preparing for a deleted merge parent.
186188
mp = self._nearest_ancestor(mp)
187189
if mp is not None:
188-
parents.append(str(mp))
190+
parents.append(str(mp).encode())
189191

190192
branch = PrcsVersion(version).major()
191193
if _MAIN_BRANCH_RE.match(branch):
192194
branch = None
193195
return commit(
194-
revision['author'], revision['date'].isoformat(" "),
195-
descriptor.message(), parents, branch)
196+
revision['author'].encode(), revision['date'].isoformat().encode(),
197+
descriptor.message().encode(), parents, branch)
196198

197199
def gettags(self):
198200
"""Return an empty dictionary since PRCS has no tags."""

rocro.yml

Lines changed: 0 additions & 15 deletions
This file was deleted.

setup.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@
2020
setup script for the 'hg-convert-prcs-extension' package
2121
"""
2222

23+
from __future__ import absolute_import
2324
from os import path
2425
from setuptools import setup
2526

27+
# Package name.
28+
PACKAGE_NAME = "hg-convert-prcs-extension"
29+
2630
# Package version.
27-
PACKAGE_VERSION = "1a2"
31+
PACKAGE_VERSION = "1.0"
2832

2933
def long_description():
3034
"""
@@ -41,22 +45,27 @@ def long_description():
4145

4246
if __name__ == "__main__":
4347
setup(
44-
name="hg-convert-prcs-extension",
48+
name=PACKAGE_NAME,
4549
version=PACKAGE_VERSION,
4650
description="PRCS source for the Mercurial convert extension.",
4751
url="https://vx68k.bitbucket.io/hg-convert-prcs/",
52+
project_urls={
53+
"GitHub": "https://github.com/vx68k/hg-convert-prcs-extension",
54+
},
4855
author="Kaz Nishimura",
4956
author_email="kazssym@linuxfront.com",
5057
long_description=long_description(),
5158
long_description_content_type="text/markdown",
5259
classifiers=[
5360
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
5461
"Programming Language :: Python :: 3",
62+
"Programming Language :: Python :: 2.7",
63+
"Topic :: Software Development :: Version Control",
5564
],
5665
python_requires=">=2.7",
5766
install_requires=[
5867
"mercurial>=4.7",
59-
"prcslib>=1.0"
68+
"prcslib>=2"
6069
],
6170
zip_safe=True,
6271

0 commit comments

Comments
 (0)