-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
blobモデルの実装 #3
blobモデルの実装 #3
Conversation
… into keigo-okamoto/feature-add-blob-model
//追加でルールを指定 | ||
rules: { | ||
"no-unused-vars": ["error", { argsIgnorePattern: "^_.*$" }], | ||
}, | ||
languageOptions: { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
src/models/blob-object.ts
Outdated
content?: Buffer; | ||
|
||
public setContent = (content: Buffer): void => { | ||
this.content = content; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
export class BlobObject {
content: Buffer;
constructor(content: Buffer) {
this.content = content;
}
のようしてBlobObject
生成時にその中身も決定してしまうと content
が undefined
を取ることがなくなるため、メソッドの方から if (!this.content)
を消せるかもしれない、と思いました
また、さらに踏み込むと content
自体が外部に露出している必要はないため
export class BlobObject {
constructor(private content: Buffer) {}
で隠蔽してしまうと、一度作った BlobObject
の中身をうっかり上書きすることがなくなりそうで、より安全かもです!
ref: https://typescriptbook.jp/reference/object-oriented/class/constructor-shorthand
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
export class BlobObject {
constructor(private content: Buffer) {}
この書き方初めて知りました!
おっしゃる通りだったので修正しました!
src/models/blob-object.ts
Outdated
const hash = createHash("sha1").update(store).digest("hex"); | ||
|
||
const dirPath = join(GIT_OBJECTS, hash.slice(0, 2)); | ||
const filePath = join(GIT_OBJECTS, hash.slice(0, 2), hash.slice(2)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
src/models/blob-object.ts
Outdated
new Uint8Array(Buffer.from(store)), | ||
); | ||
|
||
if (existsSync(dirPath)) return; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この部分でディレクトリが存在する場合はblob objectの保存をスキップしているように見えますが、本来作成して欲しい時にもスキップ処理が走ってしまいそうです
例えば、過去に「aa123456789」というハッシュを持つファイルがあった場合
- aa
┗ 123456789
というファイルが存在しているはずです。このとき、新たに「aa00000000」というハッシュを持つ blob objectを作ろうと思うと
- aa
├ 0000000 <- New!
┗ 123456789
という状態にしたくなりそうです。しかし、今の処理だと「aa/ が存在するのでスキップ」となりそうです。
この場合、
- 追加対象のblob objectのハッシュから計算されたパスを持つファイルがあるなら早期return
- パスがないならblob objectを保存する。このときディレクトリがないのであれば作成する
というようにしておくと安心そうです!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ありがとうございます!
修正しました!
//追加でルールを指定 | ||
rules: { | ||
"no-unused-vars": ["error", { argsIgnorePattern: "^_.*$" }], | ||
}, | ||
languageOptions: { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
src/models/blob-object.ts
Outdated
constructor(private readonly content: Buffer) {} | ||
|
||
public dumpBlobObject = (): void => { | ||
const store = `blob ${this.content.length.toString()}\x00${this.content.toString()}`; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
すいませんこの部分見落としていました!
この方法でほとんど問題ないと思いますが、テキストファイル以外を取り扱おうとすると toString
できないバイナリデータが入ってきて正確な blob objectが作られなさそうです
適当な画像をmygit add してみたあと、git cat-file -p {hash値} > mygit_reverted.png のように戻して見た時、画像として表示されなくなりそうです
やったこと
blobモデルを実装した
詳細
Warning
オプション指定は本PRの対象外
確認項目
src/commands/add.ts
にあるadd関数内のfilePathをlogするとハッシュが取得できます.