Skip to content
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

Merged
merged 16 commits into from
Oct 2, 2024
Merged

Conversation

hyphen-o
Copy link
Contributor

@hyphen-o hyphen-o commented Oct 1, 2024

やったこと

blobモデルを実装した

詳細

  • blobクラスを実装し,ファイルの内容からblobオブジェクトをdumpする処理を実装
  • addコマンドの雛形を作成
  • コマンドラインから第3引数を取得できるように修正
  • coloredLogの色追加
  • package.jsonにformatとlintどちらも実行するscriptを追加

Warning

オプション指定は本PRの対象外

確認項目

  • mygit addでhintが出る
  • mygit add XXXでblobオブジェクトが生成されることを確認
  • src/commands/add.tsにあるadd関数内のfilePathをlogするとハッシュが取得できます.
  • git cat-file -p 先ほど取得したハッシュでファイルの内容が出力されることを確認

//追加でルールを指定
rules: {
"no-unused-vars": ["error", { argsIgnorePattern: "^_.*$" }],
},
languageOptions: {
Copy link
Contributor Author

@hyphen-o hyphen-o Oct 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

memo
_から始まる変数はunused扱いされたくないので,srcとdistどちらも無視するように設定しました

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good-badge
ナイスです!こういう環境整えるの大事

あとでyotsu sanにもsyncしておきましょう!
めっちゃ厳密なこと言うとPR分けた方が良いかもしれませんが、個人的にはこのくらいのサイズのPRならシュッと混ぜちゃっててもいいかなって思いました

@hyphen-o hyphen-o marked this pull request as ready for review October 2, 2024 04:34
@S-Nakamur-a S-Nakamur-a self-requested a review October 2, 2024 04:36
Comment on lines 10 to 14
content?: Buffer;

public setContent = (content: Buffer): void => {
this.content = content;
};

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imo-badge

export class BlobObject {
  content: Buffer;

  constructor(content: Buffer) {
      this.content = content;
  }

のようしてBlobObject 生成時にその中身も決定してしまうと contentundefined を取ることがなくなるため、メソッドの方から if (!this.content) を消せるかもしれない、と思いました

また、さらに踏み込むと content 自体が外部に露出している必要はないため

export class BlobObject {
  constructor(private content: Buffer) {}

で隠蔽してしまうと、一度作った BlobObject の中身をうっかり上書きすることがなくなりそうで、より安全かもです!
ref: https://typescriptbook.jp/reference/object-oriented/class/constructor-shorthand

Copy link
Contributor Author

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) {}

この書き方初めて知りました!
おっしゃる通りだったので修正しました!

Comment on lines 27 to 30
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));
Copy link

@S-Nakamur-a S-Nakamur-a Oct 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

next-badge
この処理は git の object系では共通して出てきそうな処理なので、今後どこかのタイミングで切り出しても良いですね!このPRでは対応不要です!

new Uint8Array(Buffer.from(store)),
);

if (existsSync(dirPath)) return;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

must-badge

この部分でディレクトリが存在する場合はblob objectの保存をスキップしているように見えますが、本来作成して欲しい時にもスキップ処理が走ってしまいそうです

例えば、過去に「aa123456789」というハッシュを持つファイルがあった場合

- aa
  ┗ 123456789

というファイルが存在しているはずです。このとき、新たに「aa00000000」というハッシュを持つ blob objectを作ろうと思うと

- aa
  ├ 0000000 <- New!
  ┗ 123456789

という状態にしたくなりそうです。しかし、今の処理だと「aa/ が存在するのでスキップ」となりそうです。

この場合、

  1. 追加対象のblob objectのハッシュから計算されたパスを持つファイルがあるなら早期return
  2. パスがないならblob objectを保存する。このときディレクトリがないのであれば作成する

というようにしておくと安心そうです!

Copy link
Contributor Author

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: {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good-badge
ナイスです!こういう環境整えるの大事

あとでyotsu sanにもsyncしておきましょう!
めっちゃ厳密なこと言うとPR分けた方が良いかもしれませんが、個人的にはこのくらいのサイズのPRならシュッと混ぜちゃっててもいいかなって思いました

constructor(private readonly content: Buffer) {}

public dumpBlobObject = (): void => {
const store = `blob ${this.content.length.toString()}\x00${this.content.toString()}`;

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 のように戻して見た時、画像として表示されなくなりそうです

@hyphen-o hyphen-o merged commit 7f923b2 into main Oct 2, 2024
1 check passed
@hyphen-o hyphen-o deleted the keigo-okamoto/feature-add-blob-model branch October 2, 2024 05:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants