Skip to content

Commit 531df62

Browse files
fix(push): force push if no change (oids match)
1 parent f3f7a1f commit 531df62

5 files changed

Lines changed: 67 additions & 5 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "git-essentials",
3-
"version": "0.6.4",
3+
"version": "0.6.5",
44
"description": "A collection of essential Git commands for your browser and Node.js",
55
"main": "dist/esm/index.js",
66
"types": "index.d.ts",

src/clients/fs/InMemoryFsClient.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type Stats = {
3232
mtime: Date
3333
}
3434

35-
class StatsImpl implements StatsLike {
35+
class SimpleStats implements StatsLike {
3636
private type: 'file' | 'dir' | 'symlink'
3737
mode: number
3838
size: number
@@ -245,7 +245,7 @@ export class InMemoryFsClient implements FsClient {
245245
return await this.stat(entry.target)
246246
}
247247

248-
return new StatsImpl(entry.stat, entry.type)
248+
return new SimpleStats(entry.stat, entry.type)
249249
}
250250

251251
public async lstat(path: string): Promise<StatsLike> {
@@ -255,7 +255,7 @@ export class InMemoryFsClient implements FsClient {
255255
throw new ENOENT(path)
256256
}
257257

258-
return new StatsImpl(entry.stat, entry.type)
258+
return new SimpleStats(entry.stat, entry.type)
259259
}
260260

261261
public async rename(oldPath: string, newPath: string): Promise<void> {

src/commands/push.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ export async function _push({
203203
}
204204
}
205205

206+
if (oid === oldoid) force = true
207+
206208
if (!force) {
207209
// Is it a tag that already exists?
208210
if (

tests/fixtures/http/push.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,5 +121,50 @@
121121
"encoding": "base64",
122122
"body": "MDAyZQEwMDBldW5wYWNrIG9rCjAwMTdvayByZWZzL2hlYWRzL21haW4KMDAwMDAwMDA="
123123
}
124+
},
125+
126+
{
127+
"comment": "test: push empty",
128+
"request": {
129+
"url": "http://localhost/push-server.git/info/refs?service=git-upload-pack",
130+
"method": "GET"
131+
},
132+
"response": {
133+
"contentType": "application/x-git-upload-pack-advertisement",
134+
"encoding": "utf8",
135+
"body": "001e# service=git-upload-pack\n0000010b5a8905a02e181fe1821068b8c0f48cb6633d5b81 HEAD\u0000multi_ack thin-pack side-band side-band-64k ofs-delta shallow deepen-since deepen-not deepen-relative no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/main object-format=sha1 agent=git/2.34.1\n003d5a8905a02e181fe1821068b8c0f48cb6633d5b81 refs/heads/main\n0000"
136+
}
137+
},
138+
139+
{
140+
"comment": "test: push empty",
141+
"request": {
142+
"url": "http://localhost/push-server.git/git-upload-pack",
143+
"method": "POST",
144+
"contentType": "application/x-git-upload-pack-request",
145+
"encoding": "utf8",
146+
"body": "007ewant 5a8905a02e181fe1821068b8c0f48cb6633d5b81 multi_ack_detailed no-done side-band-64k ofs-delta agent=git/git-essentials\n00000009done\n"
147+
},
148+
"response": {
149+
"contentType": "application/x-git-upload-pack-result",
150+
"encoding": "base64",
151+
"body": "MDAwOE5BSwowMDQwAkVudW1lcmF0aW5nIG9iamVjdHM6IDMsIGRvbmUuCkNvdW50aW5nIG9iamVjdHM6ICAzMyUgKDEvMykNMDAyMgJDb3VudGluZyBvYmplY3RzOiAgNjYlICgyLzMpDTAwNDYCQ291bnRpbmcgb2JqZWN0czogMTAwJSAoMy8zKQ1Db3VudGluZyBvYmplY3RzOiAxMDAlICgzLzMpLCBkb25lLgowMzYxAVBBQ0sAAAACAAAAA50/eJydk0sTqkYUhPf8itlTN7xfqSQVQJ4jL0VRdyAzOICACoj8+ph7t1nl9Karq3rRVecbnwiBXNYKHktCWShf5ZKGRQEhTsLSVeQ5WeY15Wtknsqn8dY/QUbaFrikHfsO/PG+3366v6t7Ttrfrv39L8BJrKRJqsIr4Acrsiz1Te9kHNH/6VZD9SIV+PHvGZbjhSB2YrD3nFBPDzvrZ06BI3q+SN/9Dpxuih0wcxSgAEm8q6Hrhl7pjpH4l/cyurre+5Z/9ieY7YmcSz4RY0a4XPmDCplkW37nO0N8Oy/rSigQ5/dGXsiuW4fusmrW7KHX1nMjMwmeJ9myN8QYGgNmWAn80XAL6/M0DmnWbI/vcSDrmQKndetgdR0Tu6zxcWcovKHh3WDW5RJ3s3ywAutTlvvDmvkSvrqdCemZHNMi4RDfcZeCAhveNmzh0VhGoeww8eDQTiEj9LQU6JOID5NOW8MBRid3C999eGP9xWIzsR2igSYrLClQXO/ZvJPOJmID5e0a13gy0kbwI4eWWimpUiTtq0DQg0UrBmhbnH1CdNhwN6vUuOYVUMAtxivyX3U1qML1yJYnVtyqqaOr8Ej0sfBleMy7133LjoJrVV26+4Q9Ux5V0SVnOsEsBSB6GkGEs5VZem+fmrU+p2+S8BfT++TiHF9oMi50qNTmjrNrmMjTo5FqpnVWRn3QGFEgqeZuTtb1wePgVCbMCh0HJb7j3VSGtK8avTfnm1pOmgvDGeGTnL3jO4QlOpB26e85BRq259rFVD0WJYm6PkJbdbjX2U1Dzx3ri9yakmheNvpjjCuo1PFp8luiMdcocSNoP1YKbHHh4ilS8yapDval2L0fex1nhRHSni9ki2A2WeTXBq/STBQxtuKu0A0V7RYcNjEKIAUUX8Op1XtiYqKdY9QGJ4VdHUiFPm4sJz/z2mik5zV+rtwUaUJeYdaOq0/OdraF4FGjAL33s41ps7X7TET9xnH49v32P6W0kKlfmFjh5r8gobyOjCRvwS8cqX8A2Es+lKECeJwzNDAwMzFRSNQrqShheJnKUnX9aEVqk03tTG1ZlrxlefcrALmrDH02eJzzSM3JyecCAAeLAf+7HWuHiIBZxFtbgrb4IeHuxku7MDAzYQJUb3RhbCAzIChkZWx0YSAwKSwgcmV1c2VkIDAgKGRlbHRhIDApLCBwYWNrLXJldXNlZCAwCjAwMDYBpjAwMDA="
152+
}
153+
},
154+
155+
{
156+
"comment": "test: push empty",
157+
"request": {
158+
"url": "http://localhost/push-server.git/git-receive-pack",
159+
"method": "POST",
160+
"contentType": "application/x-git-receive-pack-request",
161+
"encoding": "base64",
162+
"body": "MDA5YzVhODkwNWEwMmUxODFmZTE4MjEwNjhiOGMwZjQ4Y2I2NjMzZDViODEgNWE4OTA1YTAyZTE4MWZlMTgyMTA2OGI4YzBmNDhjYjY2MzNkNWI4MSByZWZzL2hlYWRzL21haW4AIHJlcG9ydC1zdGF0dXMgc2lkZS1iYW5kLTY0ayBhZ2VudD1naXQvZ2l0LWVzc2VudGlhbHMKMDAwMFBBQ0sAAAACAAAAAAKdCII72KjqtRCtasdcgjz9PtMe"
163+
},
164+
"response": {
165+
"contentType": "application/x-git-receive-pack-result",
166+
"encoding": "base64",
167+
"body": "MDAxNgJidWlsZCBzdGFydGVkLi4uCjAwMTgCYnVpbGQgY29tcGxldGVkLi4uCjAwMTYCdGVzdHMgc3RhcnRlZC4uLgowMDE4AnRlc3RzIGNvbXBsZXRlZC4uLgowMDE4AnN0YXJ0aW5nIHNlcnZlci4uLgowMDE0AnNlcnZlciBydW5uaW5nCjAwMmUBMDAwZXVucGFjayBvawowMDE3b2sgcmVmcy9oZWFkcy9tYWluCjAwMDAwMDMxAkhlcmUgaXMgYSBtZXNzYWdlIGZyb20gJ3Bvc3QtcmVjZWl2ZScgaG9vay4KMDAwMA=="
168+
}
124169
}
125170
]

tests/push.test.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { setConfig, push, listBranches, Auth } from 'git-essentials'
1+
import { setConfig, push, listBranches, Auth, clone } from 'git-essentials'
22
import { setGitClientAgent } from 'git-essentials/utils/pkg'
33
import { UnknownTransportError, HttpError, UserCanceledError } from 'git-essentials/errors'
44

@@ -60,6 +60,21 @@ describe('push', () => {
6060
])
6161
})
6262

63+
it('push empty', async () => {
64+
// arrange
65+
const { fs, dir } = await makeFsFixture()
66+
const http = makeHttpFixture(pushHttpFixtureData as HttpFixtureData)
67+
await clone({ fs, http, dir, url: `http://localhost/push-server.git` })
68+
69+
// act
70+
const res = await push({ fs, http, dir })
71+
72+
// assert
73+
expect(res).toBeTruthy()
74+
expect(res.ok).toBe(true)
75+
expect(res.refs['refs/heads/main'].ok).toBe(true)
76+
})
77+
6378
it('push without ref', async () => {
6479
// arrange
6580
const { fs, dir } = await makeFsFixture(pushFsFixtureData as FsFixtureData)

0 commit comments

Comments
 (0)