submodule-version 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/__tests__/versionUtil.test.js +14 -0
- package/dist/src/__tests__/versionUtil.test.js.map +1 -1
- package/dist/src/buildGraph/buildGraph.d.ts +1 -0
- package/dist/src/buildGraph/buildGraph.js +22 -3
- package/dist/src/buildGraph/buildGraph.js.map +1 -1
- package/dist/src/git/git.d.ts +19 -0
- package/dist/src/git/git.js +215 -2
- package/dist/src/git/git.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/sv.d.ts +15 -0
- package/dist/src/sv.js +165 -2
- package/dist/src/sv.js.map +1 -1
- package/dist/src/versionUtil.d.ts +1 -0
- package/dist/src/versionUtil.js +9 -0
- package/dist/src/versionUtil.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/versionUtil.test.ts +17 -0
- package/src/buildGraph/buildGraph.ts +36 -3
- package/src/git/git.ts +331 -2
- package/src/index.ts +1 -0
- package/src/sv.ts +207 -3
- package/src/versionUtil.ts +13 -0
package/dist/src/sv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sv.js","sourceRoot":"","sources":["../../src/sv.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sv.js","sourceRoot":"","sources":["../../src/sv.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,6 @@ export declare const versionUtil: {
|
|
|
8
8
|
pick: (allVersions: string[], v: string) => string[];
|
|
9
9
|
validate: (v: string, relative?: boolean) => boolean;
|
|
10
10
|
latest: (versions: string[]) => string;
|
|
11
|
+
bump: (version: string, kind: "release" | "minor" | "major") => string;
|
|
11
12
|
};
|
|
12
13
|
export {};
|
package/dist/src/versionUtil.js
CHANGED
|
@@ -59,10 +59,19 @@ const latest = (versions) => (cleanup([...versions].sort((v1, v2) => {
|
|
|
59
59
|
return v2Val - v1Val;
|
|
60
60
|
}, 0);
|
|
61
61
|
})[0] || ''));
|
|
62
|
+
const bump = (version, kind) => {
|
|
63
|
+
const [major, minor, patch] = toArray(version);
|
|
64
|
+
if (kind === 'major')
|
|
65
|
+
return `${major + 1}.0.0`;
|
|
66
|
+
if (kind === 'minor')
|
|
67
|
+
return `${major}.${minor + 1}.0`;
|
|
68
|
+
return `${major}.${minor}.${patch + 1}`;
|
|
69
|
+
};
|
|
62
70
|
exports.versionUtil = {
|
|
63
71
|
compare,
|
|
64
72
|
pick,
|
|
65
73
|
validate,
|
|
66
74
|
latest,
|
|
75
|
+
bump,
|
|
67
76
|
};
|
|
68
77
|
//# sourceMappingURL=versionUtil.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versionUtil.js","sourceRoot":"","sources":["../../src/versionUtil.ts"],"names":[],"mappings":";;;AAAA,IAAK,WAIJ;AAJD,WAAK,WAAW;IACd,+CAAS,CAAA;IACT,+CAAS,CAAA;IACT,6CAAQ,CAAA;AACV,CAAC,EAJI,WAAW,KAAX,WAAW,QAIf;AAED,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAEvD,MAAM,OAAO,GAAG,CAAC,CAAS,EAAY,EAAE,CAAC,CACvC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAClC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;IACzB,wDAAwD;IACxD,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC;IAChD,mDAAmD;IACnD,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC;IAEhD,4BAA4B;IAC5B,OAAO,WAAW,CAAC,IAAI,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CACd,OAAiB,EACjB,SAAmB,EACnB,WAAwB,EACxB,EAAE;IACF,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QACvD,2BAA2B;QAC3B,IAAI,CAAC,GAAG;YAAE,OAAO,GAAG,CAAC;QACrB,+DAA+D;QAC/D,IAAI,CAAC,GAAG,WAAW;YAAE,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QAEvD,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,WAAqB,EAAE,CAAS,EAAE,EAAE;IAChD,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IAElC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAExB,OAAO,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAE1B,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,QAAkB,EAAE,EAAE;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAE3B,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,QAAkB,EAAE,EAAE,CAAC,CACrC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IAE1B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpC,IAAI,GAAG,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEvB,OAAO,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CACb,CAAC;AAEW,QAAA,WAAW,GAAG;IACzB,OAAO;IACP,IAAI;IACJ,QAAQ;IACR,MAAM;
|
|
1
|
+
{"version":3,"file":"versionUtil.js","sourceRoot":"","sources":["../../src/versionUtil.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -58,3 +58,20 @@ describe('Compare', () => {
|
|
|
58
58
|
expect(versionUtil.compare([1, 2, 3], [1, 2, 4], 2)).toBe(false);
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
|
+
|
|
62
|
+
describe('Bump', () => {
|
|
63
|
+
it('Release', () => {
|
|
64
|
+
expect(versionUtil.bump('0.0.0', 'release')).toBe('0.0.1');
|
|
65
|
+
expect(versionUtil.bump('1.2.3', 'release')).toBe('1.2.4');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('Minor', () => {
|
|
69
|
+
expect(versionUtil.bump('0.0.0', 'minor')).toBe('0.1.0');
|
|
70
|
+
expect(versionUtil.bump('1.2.3', 'minor')).toBe('1.3.0');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('Major', () => {
|
|
74
|
+
expect(versionUtil.bump('0.0.0', 'major')).toBe('1.0.0');
|
|
75
|
+
expect(versionUtil.bump('1.2.3', 'major')).toBe('2.0.0');
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -22,6 +22,7 @@ export interface IGraphEntry {
|
|
|
22
22
|
versions: string[];
|
|
23
23
|
parents: Record<string, string>;
|
|
24
24
|
used: string[];
|
|
25
|
+
allowedVersions: string[];
|
|
25
26
|
version: string;
|
|
26
27
|
}
|
|
27
28
|
|
|
@@ -91,21 +92,53 @@ export const buildGraph = async (): Promise<Record<string, IGraphEntry>> => {
|
|
|
91
92
|
versionUtil.pick(selective, v)
|
|
92
93
|
), versions);
|
|
93
94
|
|
|
95
|
+
const allowedVersions = Object.entries(parents)
|
|
96
|
+
.filter(([parent]) => parent !== baseJson.name)
|
|
97
|
+
.reduce((selective, [, v]) => (
|
|
98
|
+
versionUtil.pick(selective, v)
|
|
99
|
+
), versions);
|
|
100
|
+
|
|
94
101
|
// No compatible version found and module has version tags
|
|
95
102
|
if (!used.length && versions.length) {
|
|
96
103
|
throw new GraphError('VERSION_CONFLICT', { parents, name });
|
|
97
104
|
}
|
|
98
105
|
|
|
99
|
-
|
|
106
|
+
/**
|
|
107
|
+
* Текущая версия — тег, на котором реально стоит HEAD. Сравнивать с
|
|
108
|
+
* package.json нельзя: его version не обязан совпадать с тегами,
|
|
109
|
+
* и такое сравнение отрывает HEAD (checkout на тег) при каждом buildGraph
|
|
110
|
+
* Checkout делаем только на чистой копии без локальной работы:
|
|
111
|
+
* незакоммиченные изменения или незапушенные коммиты
|
|
112
|
+
* важнее резолва версий.
|
|
113
|
+
*/
|
|
114
|
+
const current = await git.currentVersion(name);
|
|
115
|
+
|
|
116
|
+
if (!current || !used.includes(current)) {
|
|
100
117
|
const latest = versionUtil.latest(used);
|
|
101
|
-
|
|
118
|
+
|
|
119
|
+
const moduleDir = path.join(
|
|
120
|
+
RunOptions.cwd,
|
|
121
|
+
RunOptions.modulesDir,
|
|
122
|
+
name,
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
const [hasChanges, hasUnpushed] = await Promise.all([
|
|
126
|
+
git.hasChanges(moduleDir),
|
|
127
|
+
git.hasUnpushedCommits(moduleDir),
|
|
128
|
+
]);
|
|
129
|
+
|
|
130
|
+
const allChangesDone = !hasChanges && !hasUnpushed;
|
|
131
|
+
|
|
132
|
+
if (latest && latest !== current && allChangesDone) {
|
|
102
133
|
await git.checkout(name, latest);
|
|
103
134
|
}
|
|
104
135
|
}
|
|
105
136
|
|
|
137
|
+
const version = current || meta.version;
|
|
138
|
+
|
|
106
139
|
return {
|
|
107
140
|
name,
|
|
108
|
-
data: { versions, parents, used,
|
|
141
|
+
data: { versions, parents, used, allowedVersions, version },
|
|
109
142
|
};
|
|
110
143
|
}),
|
|
111
144
|
);
|
package/src/git/git.ts
CHANGED
|
@@ -40,10 +40,339 @@ export const git = {
|
|
|
40
40
|
|
|
41
41
|
listVersions: async (projectName: string): Promise<string[]> => {
|
|
42
42
|
const module = path.join(RunOptions.modulesDir, projectName);
|
|
43
|
-
|
|
43
|
+
|
|
44
|
+
return git.listTags(module);
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
status: async (dir: string): Promise<string> => {
|
|
48
|
+
const res = await execAsync(
|
|
49
|
+
`git -C ${dir} status --porcelain`,
|
|
50
|
+
{ cwd: RunOptions.cwd },
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
return res.stdout.toString();
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
hasChanges: async (dir: string): Promise<boolean> => {
|
|
57
|
+
const status = await git.status(dir);
|
|
58
|
+
|
|
59
|
+
return status.trim().length > 0;
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
hasUnpushedCommits: async (dir: string): Promise<boolean> => {
|
|
63
|
+
await git.fetch(dir);
|
|
64
|
+
|
|
65
|
+
const branch = await git.currentBranch(dir);
|
|
66
|
+
|
|
67
|
+
if (branch) {
|
|
68
|
+
let upstream: string | null = null;
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const res = await execAsync(
|
|
72
|
+
`git -C ${dir} rev-parse --abbrev-ref --symbolic-full-name @{u}`,
|
|
73
|
+
{ cwd: RunOptions.cwd },
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
upstream = res.stdout.toString().trim() || null;
|
|
77
|
+
} catch {
|
|
78
|
+
upstream = null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!upstream) {
|
|
82
|
+
try {
|
|
83
|
+
await execAsync(
|
|
84
|
+
`git -C ${dir} rev-parse --verify --quiet origin/${branch}`,
|
|
85
|
+
{ cwd: RunOptions.cwd },
|
|
86
|
+
);
|
|
87
|
+
upstream = `origin/${branch}`;
|
|
88
|
+
} catch {
|
|
89
|
+
upstream = null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Ветки на remote нет — всё локальное не опубликовано */
|
|
94
|
+
if (!upstream) return true;
|
|
95
|
+
|
|
96
|
+
const res = await execAsync(
|
|
97
|
+
`git -C ${dir} rev-list ${upstream}..HEAD --count`,
|
|
98
|
+
{ cwd: RunOptions.cwd },
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
return Number(res.stdout.toString().trim()) > 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* Detached HEAD (checkout на тег): локальные теги не доказывают публикацию
|
|
106
|
+
* (могут быть не запушены) — сверяем HEAD с фактическими рефами remote.
|
|
107
|
+
*/
|
|
108
|
+
let remoteOutput = '';
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const res = await execAsync(
|
|
112
|
+
`git -C ${dir} ls-remote origin`,
|
|
113
|
+
{ cwd: RunOptions.cwd },
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
remoteOutput = res.stdout.toString();
|
|
117
|
+
} catch {
|
|
118
|
+
/* Remote недоступен/не настроен — считаем всё неопубликованным */
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const remoteShas = remoteOutput.split(/\r?\n/)
|
|
123
|
+
.map(line => line.split(/\s+/)[0])
|
|
124
|
+
.filter(sha => /^[0-9a-f]{40}$/.test(sha));
|
|
125
|
+
|
|
126
|
+
for (const sha of remoteShas) {
|
|
127
|
+
try {
|
|
128
|
+
await execAsync(
|
|
129
|
+
`git -C ${dir} merge-base --is-ancestor HEAD ${sha}`,
|
|
130
|
+
{ cwd: RunOptions.cwd },
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
/* HEAD достижим из remote-рефа — опубликован */
|
|
134
|
+
return false;
|
|
135
|
+
} catch {
|
|
136
|
+
// HEAD не предок этого рефа — проверяем остальные
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return true;
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
isGitRepo: async (dir: string): Promise<boolean> => {
|
|
144
|
+
try {
|
|
145
|
+
await execAsync(
|
|
146
|
+
`git -C ${dir} rev-parse --is-inside-work-tree`,
|
|
147
|
+
{ cwd: RunOptions.cwd },
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
return true;
|
|
151
|
+
} catch {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
getRemote: async (dir: string): Promise<string | null> => {
|
|
157
|
+
try {
|
|
158
|
+
const res = await execAsync(
|
|
159
|
+
`git -C ${dir} remote get-url origin`,
|
|
160
|
+
{ cwd: RunOptions.cwd },
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
return res.stdout.toString().trim() || null;
|
|
164
|
+
} catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
init: async (dir: string): Promise<void> => {
|
|
170
|
+
await execAsync(
|
|
171
|
+
`git -C ${dir} init`,
|
|
172
|
+
{ cwd: RunOptions.cwd },
|
|
173
|
+
);
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
addRemote: async (dir: string, url: string): Promise<void> => {
|
|
177
|
+
const existing = await git.getRemote(dir);
|
|
178
|
+
|
|
179
|
+
const command = existing
|
|
180
|
+
? `git -C ${dir} remote set-url origin ${url}`
|
|
181
|
+
: `git -C ${dir} remote add origin ${url}`;
|
|
182
|
+
|
|
183
|
+
await execAsync(command, { cwd: RunOptions.cwd });
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
currentBranch: async (dir: string): Promise<string | null> => {
|
|
187
|
+
try {
|
|
188
|
+
const res = await execAsync(
|
|
189
|
+
`git -C ${dir} symbolic-ref --short -q HEAD`,
|
|
190
|
+
{ cwd: RunOptions.cwd },
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
return res.stdout.toString().trim() || null;
|
|
194
|
+
} catch {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
defaultRemoteBranch: async (dir: string): Promise<string | null> => {
|
|
200
|
+
try {
|
|
201
|
+
const res = await execAsync(
|
|
202
|
+
`git -C ${dir} symbolic-ref --short refs/remotes/origin/HEAD`,
|
|
203
|
+
{ cwd: RunOptions.cwd },
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
return res.stdout.toString().trim().replace(/^origin\//, '') || null;
|
|
207
|
+
} catch {
|
|
208
|
+
// origin/HEAD not set - probe common defaults
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
for (const candidate of ['main', 'master']) {
|
|
212
|
+
try {
|
|
213
|
+
await execAsync(
|
|
214
|
+
`git -C ${dir} rev-parse --verify --quiet origin/${candidate}`,
|
|
215
|
+
{ cwd: RunOptions.cwd },
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
return candidate;
|
|
219
|
+
} catch {
|
|
220
|
+
// No such remote branch
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return null;
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
/*
|
|
228
|
+
* Аддоны checkout'нуты на тег (detached HEAD). Перед коммитом поднимаем
|
|
229
|
+
* локальную ветку на текущем коммите и привязываем её к remote-ветке,
|
|
230
|
+
* чтобы sync/push работали по ветке, а не в оторванной голове.
|
|
231
|
+
*/
|
|
232
|
+
ensureBranch: async (dir: string): Promise<void> => {
|
|
233
|
+
const branch = await git.currentBranch(dir);
|
|
234
|
+
if (branch) return;
|
|
235
|
+
|
|
236
|
+
await git.fetch(dir);
|
|
237
|
+
const remoteBranch = await git.defaultRemoteBranch(dir);
|
|
238
|
+
const target = remoteBranch || 'main';
|
|
239
|
+
|
|
240
|
+
await execAsync(
|
|
241
|
+
`git -C ${dir} checkout -B ${target}`,
|
|
242
|
+
{ cwd: RunOptions.cwd },
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
if (remoteBranch) {
|
|
246
|
+
await execAsync(
|
|
247
|
+
// eslint-disable-next-line max-len
|
|
248
|
+
`git -C ${dir} branch --set-upstream-to=origin/${remoteBranch} ${target}`,
|
|
249
|
+
{ cwd: RunOptions.cwd },
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
|
|
254
|
+
commitAll: async (dir: string, message: string): Promise<void> => {
|
|
255
|
+
await execAsync(
|
|
256
|
+
`git -C ${dir} add -A`,
|
|
257
|
+
{ cwd: RunOptions.cwd },
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
await execAsync(
|
|
261
|
+
`git -C ${dir} commit -m ${JSON.stringify(message)}`,
|
|
262
|
+
{ cwd: RunOptions.cwd },
|
|
263
|
+
);
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
addTag: async (dir: string, version: string): Promise<void> => {
|
|
267
|
+
await execAsync(
|
|
268
|
+
`git -C ${dir} tag ${version}`,
|
|
269
|
+
{ cwd: RunOptions.cwd },
|
|
270
|
+
);
|
|
271
|
+
},
|
|
272
|
+
|
|
273
|
+
push: async (dir: string, tag?: string): Promise<void> => {
|
|
274
|
+
await execAsync(
|
|
275
|
+
`git -C ${dir} push -u origin HEAD`,
|
|
276
|
+
{ cwd: RunOptions.cwd },
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
if (tag) {
|
|
280
|
+
await execAsync(
|
|
281
|
+
`git -C ${dir} push origin ${tag}`,
|
|
282
|
+
{ cwd: RunOptions.cwd },
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
|
|
287
|
+
fetch: async (dir: string): Promise<void> => {
|
|
288
|
+
try {
|
|
289
|
+
await execAsync(
|
|
290
|
+
`git -C ${dir} fetch origin`,
|
|
291
|
+
{ cwd: RunOptions.cwd },
|
|
292
|
+
);
|
|
293
|
+
} catch {
|
|
294
|
+
// Fresh repo without upstream yet - nothing to fetch
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
|
|
298
|
+
isRemoteAhead: async (dir: string): Promise<boolean> => {
|
|
299
|
+
await git.fetch(dir);
|
|
300
|
+
|
|
301
|
+
try {
|
|
302
|
+
const res = await execAsync(
|
|
303
|
+
`git -C ${dir} rev-list HEAD..@{u} --count`,
|
|
304
|
+
{ cwd: RunOptions.cwd },
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
return Number(res.stdout.toString().trim()) > 0;
|
|
308
|
+
} catch {
|
|
309
|
+
// No upstream configured - remote is not ahead
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
|
|
314
|
+
pullRebaseAutostash: async (dir: string): Promise<void> => {
|
|
315
|
+
try {
|
|
316
|
+
await execAsync(
|
|
317
|
+
`git -C ${dir} pull --rebase --autostash`,
|
|
318
|
+
{ cwd: RunOptions.cwd },
|
|
319
|
+
);
|
|
320
|
+
} catch {
|
|
321
|
+
try {
|
|
322
|
+
await execAsync(
|
|
323
|
+
`git -C ${dir} rebase --abort`,
|
|
324
|
+
{ cwd: RunOptions.cwd },
|
|
325
|
+
);
|
|
326
|
+
} catch {
|
|
327
|
+
// Best effort - no rebase in progress
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
try {
|
|
331
|
+
await execAsync(
|
|
332
|
+
`git -C ${dir} stash pop`,
|
|
333
|
+
{ cwd: RunOptions.cwd },
|
|
334
|
+
);
|
|
335
|
+
} catch {
|
|
336
|
+
// Best effort - nothing stashed
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
throw new GitError('GIT_SYNC_CONFLICT');
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
|
|
343
|
+
tagsAtHead: async (dir: string): Promise<string[]> => {
|
|
344
|
+
try {
|
|
345
|
+
const res = await execAsync(
|
|
346
|
+
`git -C ${dir} tag --points-at HEAD`,
|
|
347
|
+
{ cwd: RunOptions.cwd },
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
return res.stdout.toString().split(/\r?\n/)
|
|
351
|
+
.filter(tag => tag && versionUtil.validate(tag));
|
|
352
|
+
} catch {
|
|
353
|
+
return [];
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
|
|
357
|
+
currentVersion: async (name: string): Promise<string | null> => {
|
|
358
|
+
const module = path.join(RunOptions.modulesDir, name);
|
|
359
|
+
const tags = await git.tagsAtHead(module);
|
|
360
|
+
|
|
361
|
+
return versionUtil.latest(tags) || null;
|
|
362
|
+
},
|
|
363
|
+
|
|
364
|
+
listTags: async (dir: string): Promise<string[]> => {
|
|
365
|
+
try {
|
|
366
|
+
await execAsync(
|
|
367
|
+
`git -C ${dir} fetch --tags`,
|
|
368
|
+
{ cwd: RunOptions.cwd },
|
|
369
|
+
);
|
|
370
|
+
} catch {
|
|
371
|
+
// Repo without remote - local tags only
|
|
372
|
+
}
|
|
44
373
|
|
|
45
374
|
const res = await execAsync(
|
|
46
|
-
`git -C ${
|
|
375
|
+
`git -C ${dir} tag -l`,
|
|
47
376
|
{ cwd: RunOptions.cwd },
|
|
48
377
|
);
|
|
49
378
|
|
package/src/index.ts
CHANGED