Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/cs102.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.8.6
- name: Set up Python 3.10.10
uses: actions/setup-python@v2
with:
python-version: '3.8.6'
python-version: '3.10.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
Expand Down
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions .idea/857l.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions homework04/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions homework04/.idea/homework04.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions homework04/.idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions homework04/.idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions homework04/.idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions homework04/pyvcs.egg-info/PKG-INFO
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Metadata-Version: 2.1
Name: pyvcs
Version: 0.1.0
Summary: The stupid content tracker
Home-page: https://github.com/Dementiy/pybook-assignments
Author: Dmitrii Sorokin
Author-email: dementiy@yandex.ru
License: GPLv3
Platform: UNKNOWN
Requires-Python: >=3.6.0

UNKNOWN

15 changes: 15 additions & 0 deletions homework04/pyvcs.egg-info/SOURCES.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
setup.py
pyvcs/__init__.py
pyvcs/__main__.py
pyvcs/cli.py
pyvcs/index.py
pyvcs/objects.py
pyvcs/porcelain.py
pyvcs/refs.py
pyvcs/repo.py
pyvcs/tree.py
pyvcs.egg-info/PKG-INFO
pyvcs.egg-info/SOURCES.txt
pyvcs.egg-info/dependency_links.txt
pyvcs.egg-info/entry_points.txt
pyvcs.egg-info/top_level.txt
1 change: 1 addition & 0 deletions homework04/pyvcs.egg-info/dependency_links.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

3 changes: 3 additions & 0 deletions homework04/pyvcs.egg-info/entry_points.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[console_scripts]
pyvcs = pyvcs.__main__:main

1 change: 1 addition & 0 deletions homework04/pyvcs.egg-info/top_level.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pyvcs
1 change: 1 addition & 0 deletions homework04/pyvcs/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ def add_write_tree_subparser(subparsers) -> None:


def add_commit_tree_subparser(subparsers) -> None:
# FIXME: Add author
commit_tree_subparser = subparsers.add_parser("commit-tree", help="Create a new commit object.")
commit_tree_subparser.add_argument("tree", help="An existing tree object")
commit_tree_subparser.add_argument("-p", dest="parent", help="Id of a parent commit object")
Expand Down
87 changes: 75 additions & 12 deletions homework04/pyvcs/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,30 +25,93 @@ class GitIndexEntry(tp.NamedTuple):
name: str

def pack(self) -> bytes:
# PUT YOUR CODE HERE
...
# pack the data
return (
struct.pack(
f">LLLLLLLLLL20sH{len(self.name.encode())}s", *self[:-1], self.name.encode()
)
+ b"\x00\x00\x00"
)

@staticmethod
def unpack(data: bytes) -> "GitIndexEntry":
# PUT YOUR CODE HERE
...
size = struct.calcsize(">LLLLLLLLLL20sH")
# unpack the data
values = struct.unpack(f">LLLLLLLLLL20sH", data[:size])
# add in tuple value below
values += (data[size:].split(b"\x00\x00\x00")[0].decode(),)
return GitIndexEntry(
*values,
)


def read_index(gitdir: pathlib.Path) -> tp.List[GitIndexEntry]:
# PUT YOUR CODE HERE
...
if not (gitdir / "index").exists():
return []

with (gitdir / "index").open("rb") as f:
data = f.read()
if data[:4] != b"DIRC":
raise Exception("Not a valid index file")
version, count = struct.unpack(">LL", data[4:12])
if version != 2:
raise Exception("Unsupported index version")
entries = []
offset = 12
for _ in range(count):
entry = GitIndexEntry.unpack(data[offset:])
entries.append(entry)
offset += 62 + len(entry.name.encode()) + 3
return entries


def write_index(gitdir: pathlib.Path, entries: tp.List[GitIndexEntry]) -> None:
# PUT YOUR CODE HERE
...
data = b"DIRC" + struct.pack(">LL", 2, len(entries))
for entry in entries:
data += entry.pack()
with (gitdir / "index").open("wb") as f:
f.write(data)
f.write(hashlib.sha1(data).digest())


def ls_files(gitdir: pathlib.Path, details: bool = False) -> None:
# PUT YOUR CODE HERE
...
entries = read_index(gitdir)
for entry in entries:
if details:
print(f"{entry.mode:o} {entry.sha1.hex()} 0\t{entry.name}")
else:
print(entry.name)


def update_index(gitdir: pathlib.Path, paths: tp.List[pathlib.Path], write: bool = True) -> None:
# PUT YOUR CODE HERE
...
entries = read_index(gitdir)
for path in paths:
if not path.exists():
raise Exception(f"Path {path} does not exist")
with path.open("rb") as f:
data = f.read()
sha1 = hash_object(data, "blob", write=True)
for entry in entries:
if entry.name == str(path):
entries.remove(entry)
break
entries.append(
GitIndexEntry(
int(path.stat().st_ctime),
int(path.stat().st_ctime_ns % 1000000000),
int(path.stat().st_mtime),
int(path.stat().st_mtime_ns % 1000000000),
path.stat().st_dev,
path.stat().st_ino,
path.stat().st_mode,
path.stat().st_uid,
path.stat().st_gid,
path.stat().st_size,
bytes.fromhex(sha1),
0,
str(path).replace("\\", "/"),
)
)
if write:
entries.sort(key=operator.attrgetter("name"))
write_index(gitdir, entries)
Loading