I den här övningen kommer vi att återskapa gits fundamentala funktionalitet.
- gitboken kapitel 10.1-10.3.
python3.7
;- pipenv.
# clone:a ner det här repo:t
git clone git@github.com:cygni/cygni-talent-git-diy.git
# clone:a pytt-repo:t
git clone git@github.com:mbark/pytt.git
cd pytt
# applicera patch:en som sätter koden i rätt läge
git apply ../cygni-talent-git-diy/0001-pass.patch
# installera alla dependencies
pipenv install
# aktivera ett shell med alla dependencies installerade
pipenv shell
# verifiera att pytt startar som det ska
pytt --help
- slutgiltigt: köra först
create_repo.sh
och sedanpytt_commit.sh
och då se två commits frångit log
. - delsteg: implementera följande funktioner i ordning (alla finns i
pytt.py
>): hash-object
(som är färdigimplementerad för att ge en liten headstart);cat-file
;update-index
;ls-files
;write-tree
;commit-tree
;update-ref
.
Finns ej, göre live.
{Tree,Commit}{,.Entry}
uppfyller alla följande api:
unpack
: packa upp data från ett git objekt och skapa klassen;- och
pack
: packa ihop objektet till data.
Visual Studio Code med dess officiella Python-plugin rekommenderas.
- Installera Python-plugin:et;
- Klicka
cmd-shift-p
(ellerctrl-shift-p
för icke-mac), och välj alternativetPython: Select Interpreter
; - Välj den som heter
Python 3.7.0 (virtualenv)
- Om ni vill kunna köra script med shift-enter från VSCode så lägg till denna keybinding:
{
"key": "shift+enter",
"command": "workbench.action.terminal.runSelectedText",
"when":
"editorFocus && !findInputFocussed && !replaceInputFocussed && editorLangId == 'shellscript'"
}
Här har ni några vanliga fel ni kan stöta på.
Se till att du har följande i .profile
eller .zshenv
:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
Om du vill skapa exempelvis ett nytt träd:
Tree.Entry(
entry.name,
entry.sha,
mode_type=entry.mode_type,
mode_permissions=entry.mode_permissions,
)
En referens till objektet du anropar metoden på och skickas in "av sig själv".
Du anropar alltså exempelvis metoden pack
i Tree
på följande sätt:
instance_of_tree_object.pack()
En referens till klassen du anropar den statiska klassmetoden på. Det skickas också in "av sig själv".
Du anropar alltså metoden unpack
i Tree
på följande sätt:
Tree.unpack(data)
TypeError: %b requires a bytes-like object, or an object that implements __bytes__, not 'str'
(eller något liknande)
Python skiljer på byte-strängar (bytes
) som är råa och inte har en encoding och strängar (str
) som har en encoding.
Ni måste arbeta med en sort åt gången, antingen bytes
eller str
.
😭 VA!???
bytes -> str
:some_bytes.decode()
(antar UTF-8 som encoding, vilket ju bör vara rimligt);str -> bytes
some_str.encode()
;- rå
bytes
-sträng: sätt ettb
framför ba:b"our bytes string"
- öppna en fil och läs som
str
:file.open(our_file, 'r')
; - öppna fil och läs som
bytes
:file.open(our_file 'rb')
;
Tips:
- om det är text ni håller på med är det ju oftast
str
; - om det är någon form av data som kan vara lite vad som helst är det oftast
bytes
.
Diskutera vad funktionen har för syfte "i det stora hela", dvs vad ska ni åstadkomma.
Be om hjälp dirr.