@gitkraken/core-gitlens 0.9.1 → 0.9.3

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.
Files changed (61) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/dist/git/providers/diff.d.ts +9 -0
  3. package/dist/git-cli/providers/diff.d.ts +7 -1
  4. package/dist/git-cli/providers/diff.js +28 -6
  5. package/dist/git-cli/providers/diff.js.map +1 -1
  6. package/dist/git-cli/providers/operations.d.ts +1 -0
  7. package/dist/git-cli/providers/operations.js +36 -22
  8. package/dist/git-cli/providers/operations.js.map +1 -1
  9. package/dist/plus/git-github/api/github.js +1 -1
  10. package/dist/plus/git-github/api/github.js.map +1 -1
  11. package/dist/plus/git-github/providers/github/diff.d.ts +3 -1
  12. package/dist/plus/git-github/providers/github/diff.js +2 -1
  13. package/dist/plus/git-github/providers/github/diff.js.map +1 -1
  14. package/dist/plus/integrations/integrationService.d.ts +2 -1
  15. package/dist/plus/integrations/integrationService.js +3 -1
  16. package/dist/plus/integrations/integrationService.js.map +1 -1
  17. package/dist/plus/integrations/models/integration.d.ts +8 -0
  18. package/dist/plus/integrations/models/integration.js +9 -0
  19. package/dist/plus/integrations/models/integration.js.map +1 -1
  20. package/dist/plus/integrations/providers/azure/azure.d.ts +3 -0
  21. package/dist/plus/integrations/providers/azure/azure.js +18 -0
  22. package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
  23. package/dist/plus/integrations/providers/azure/azure.utils.d.ts +12 -0
  24. package/dist/plus/integrations/providers/azure/azure.utils.js +46 -0
  25. package/dist/plus/integrations/providers/azure/azure.utils.js.map +1 -0
  26. package/dist/plus/integrations/providers/azure/models.d.ts +1 -0
  27. package/dist/plus/integrations/providers/azure/models.js +1 -1
  28. package/dist/plus/integrations/providers/azure/models.js.map +1 -1
  29. package/dist/plus/integrations/providers/azureDevOps.d.ts +3 -0
  30. package/dist/plus/integrations/providers/azureDevOps.js +7 -0
  31. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
  32. package/dist/plus/integrations/providers/bitbucket/bitbucket.utils.d.ts +17 -0
  33. package/dist/plus/integrations/providers/bitbucket/bitbucket.utils.js +25 -0
  34. package/dist/plus/integrations/providers/bitbucket/bitbucket.utils.js.map +1 -0
  35. package/dist/plus/integrations/providers/bitbucket-server.d.ts +3 -0
  36. package/dist/plus/integrations/providers/bitbucket-server.js +7 -0
  37. package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -1
  38. package/dist/plus/integrations/providers/bitbucket.d.ts +3 -0
  39. package/dist/plus/integrations/providers/bitbucket.js +7 -0
  40. package/dist/plus/integrations/providers/bitbucket.js.map +1 -1
  41. package/dist/plus/integrations/providers/jira-server.d.ts +3 -1
  42. package/dist/plus/integrations/providers/jira-server.js +19 -5
  43. package/dist/plus/integrations/providers/jira-server.js.map +1 -1
  44. package/dist/plus/integrations/providers/jira.d.ts +20 -3
  45. package/dist/plus/integrations/providers/jira.js +129 -50
  46. package/dist/plus/integrations/providers/jira.js.map +1 -1
  47. package/dist/plus/integrations/providers/linear.d.ts +13 -2
  48. package/dist/plus/integrations/providers/linear.js +41 -10
  49. package/dist/plus/integrations/providers/linear.js.map +1 -1
  50. package/dist/plus/integrations/providers/providerErrors.d.ts +11 -0
  51. package/dist/plus/integrations/providers/providerErrors.js +22 -1
  52. package/dist/plus/integrations/providers/providerErrors.js.map +1 -1
  53. package/dist/plus/integrations/providers/utils/discoveryCache.d.ts +36 -0
  54. package/dist/plus/integrations/providers/utils/discoveryCache.js +59 -0
  55. package/dist/plus/integrations/providers/utils/discoveryCache.js.map +1 -0
  56. package/dist/plus/integrations/reads/drains.js +4 -4
  57. package/dist/plus/integrations/reads/drains.js.map +1 -1
  58. package/dist/plus/integrations/reads/warnings.d.ts +11 -0
  59. package/dist/plus/integrations/reads/warnings.js +14 -1
  60. package/dist/plus/integrations/reads/warnings.js.map +1 -1
  61. package/package.json +1 -1
@@ -3,6 +3,7 @@ import { DiffRange } from "../../../../git/providers/types.js";
3
3
  import { GitRevisionRange } from "../../../../git/models/revision.js";
4
4
  import { GitDiffFilter, GitDiffShortStat } from "../../../../git/models/diff.js";
5
5
  import { GitFile } from "../../../../git/models/file.js";
6
+ import { GitErrorHandling } from "../../../../git/run.types.js";
6
7
  import { Cache } from "../../../../git/cache.js";
7
8
  import { GitDiffSubProvider, NextComparisonUrisResult, PreviousComparisonUrisResult, PreviousRangeComparisonUrisResult } from "../../../../git/providers/diff.js";
8
9
  import { GitHubGitProviderInternal } from "../githubProvider.js";
@@ -15,12 +16,13 @@ export declare class DiffGitSubProvider implements GitDiffSubProvider {
15
16
  uris?: (string | Uri)[];
16
17
  includeUntracked?: boolean;
17
18
  }, _cancellation?: AbortSignal): Promise<GitDiffShortStat | undefined>;
18
- getDiffStatus(repoPath: string, ref1OrRange: string | GitRevisionRange, ref2?: string, _options?: {
19
+ getDiffStatus(repoPath: string, ref1OrRange: string | GitRevisionRange, ref2?: string, options?: {
19
20
  filters?: GitDiffFilter[];
20
21
  includeUntracked?: boolean;
21
22
  path?: string;
22
23
  renameLimit?: number;
23
24
  similarityThreshold?: number;
25
+ errors?: GitErrorHandling;
24
26
  }): Promise<GitFile[] | undefined>;
25
27
  getNextComparisonUris(repoPath: string, pathOrUri: string | Uri, rev: string | undefined, skip?: number, _options?: {
26
28
  ordering?: 'date' | 'author-date' | 'topo' | null;
@@ -54,7 +54,7 @@ var DiffGitSubProvider = class {
54
54
  files: changedFiles
55
55
  };
56
56
  }
57
- async getDiffStatus(repoPath, ref1OrRange, ref2, _options) {
57
+ async getDiffStatus(repoPath, ref1OrRange, ref2, options) {
58
58
  if (repoPath == null) return void 0;
59
59
  const scope = getScopedLogger();
60
60
  const { metadata, github, session } = await this.provider.ensureRepositoryContext(repoPath);
@@ -95,6 +95,7 @@ var DiffGitSubProvider = class {
95
95
  } catch (ex) {
96
96
  scope?.error(ex);
97
97
  debugger;
98
+ if (options?.errors === "throw") throw ex;
98
99
  return;
99
100
  }
100
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","names":[],"sources":["../../../../../../plus/git-github/src/providers/github/diff.ts"],"sourcesContent":["import type { Cache } from '@gitlens/git/cache.js';\nimport type { GitDiffFilter, GitDiffShortStat } from '@gitlens/git/models/diff.js';\nimport type { GitFile } from '@gitlens/git/models/file.js';\nimport { GitFileIndexStatus } from '@gitlens/git/models/fileStatus.js';\nimport type { GitRevisionRange } from '@gitlens/git/models/revision.js';\nimport { deletedOrMissing } from '@gitlens/git/models/revision.js';\nimport type {\n\tGitDiffSubProvider,\n\tNextComparisonUrisResult,\n\tPreviousComparisonUrisResult,\n\tPreviousRangeComparisonUrisResult,\n} from '@gitlens/git/providers/diff.js';\nimport type { DiffRange, RevisionUri } from '@gitlens/git/providers/types.js';\nimport { getChangedFilesCount } from '@gitlens/git/utils/commit.utils.js';\nimport {\n\tcreateRevisionRange,\n\tgetRevisionRangeParts,\n\tisRevisionRange,\n\tstripOrigin,\n} from '@gitlens/git/utils/revision.utils.js';\nimport { encodeGitLensRevisionUriAuthority } from '@gitlens/git/utils/uriAuthority.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { union } from '@gitlens/utils/iterable.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { getSettledValue } from '@gitlens/utils/promise.js';\nimport type { Uri } from '@gitlens/utils/uri.js';\nimport { fromUri } from '@gitlens/utils/uri.js';\nimport { toTokenInfo } from '../../api/tokenUtils.js';\nimport { fromCommitFileStatus } from '../../models.js';\nimport type { GitHubGitProviderInternal } from '../githubProvider.js';\n\nconst slash = 47;\n\nfunction createRevisionUri(repoPath: string, relativePath: string, sha: string | undefined): RevisionUri {\n\t// For virtual repos, the path is the relative path prefixed with /\n\tlet uriPath = relativePath.replace(/\\\\/g, '/');\n\tif (uriPath.charCodeAt(0) !== slash) {\n\t\turiPath = `/${uriPath}`;\n\t}\n\treturn {\n\t\turi: fromUri({\n\t\t\tscheme: 'gitlens',\n\t\t\tauthority: encodeGitLensRevisionUriAuthority({ ref: sha, repoPath: repoPath }),\n\t\t\tpath: uriPath,\n\t\t}),\n\t\tpath: relativePath,\n\t\tsha: sha,\n\t\trepoPath: repoPath,\n\t};\n}\n\nexport class DiffGitSubProvider implements GitDiffSubProvider {\n\tconstructor(\n\t\tprivate readonly cache: Cache,\n\t\tprivate readonly provider: GitHubGitProviderInternal,\n\t) {}\n\n\t@debug()\n\tasync getChangedFilesCount(\n\t\trepoPath: string,\n\t\tto?: string,\n\t\tfrom?: string,\n\t\t_options?: { uris?: (string | Uri)[]; includeUntracked?: boolean },\n\t\t_cancellation?: AbortSignal,\n\t): Promise<GitDiffShortStat | undefined> {\n\t\t// Virtual GitHub repos have no working tree, so no working changes can exist.\n\t\t// Without any refs, return empty stats rather than undefined to avoid \"uncertain state\" callers.\n\t\tif (!to && !from) return { additions: 0, deletions: 0, files: 0 };\n\n\t\t// If only `from` is provided, compare against HEAD\n\t\tif (!to) {\n\t\t\tto = 'HEAD';\n\t\t}\n\n\t\tconst commit = await this.provider.commits.getCommit(repoPath, to);\n\t\tif (commit?.stats == null) return undefined;\n\n\t\tconst { stats } = commit;\n\n\t\tconst changedFiles = getChangedFilesCount(stats.files);\n\t\treturn { additions: stats.additions, deletions: stats.deletions, files: changedFiles };\n\t}\n\n\t@debug()\n\tasync getDiffStatus(\n\t\trepoPath: string,\n\t\tref1OrRange: string | GitRevisionRange,\n\t\tref2?: string,\n\t\t_options?: {\n\t\t\tfilters?: GitDiffFilter[];\n\t\t\tincludeUntracked?: boolean;\n\t\t\tpath?: string;\n\t\t\trenameLimit?: number;\n\t\t\tsimilarityThreshold?: number;\n\t\t},\n\t): Promise<GitFile[] | undefined> {\n\t\tif (repoPath == null) return undefined;\n\n\t\tconst scope = getScopedLogger();\n\n\t\tconst { metadata, github, session } = await this.provider.ensureRepositoryContext(repoPath);\n\n\t\tlet range: GitRevisionRange;\n\t\tif (isRevisionRange(ref1OrRange)) {\n\t\t\trange = ref1OrRange;\n\n\t\t\tif (!isRevisionRange(ref1OrRange, 'qualified')) {\n\t\t\t\tconst parts = getRevisionRangeParts(ref1OrRange);\n\t\t\t\trange = createRevisionRange(parts?.left || 'HEAD', parts?.right || 'HEAD', parts?.notation ?? '...');\n\t\t\t}\n\t\t} else {\n\t\t\trange = createRevisionRange(ref1OrRange || 'HEAD', ref2 || 'HEAD', '...');\n\t\t}\n\n\t\tlet range2: GitRevisionRange | undefined;\n\t\t// GitHub doesn't support the `..` range notation, so we will need to do some extra work\n\t\tif (isRevisionRange(range, 'qualified-double-dot')) {\n\t\t\tconst parts = getRevisionRangeParts(range)!;\n\n\t\t\trange = createRevisionRange(parts.left, parts.right, '...');\n\t\t\trange2 = createRevisionRange(parts.right, parts.left, '...');\n\t\t}\n\n\t\ttry {\n\t\t\tconst token = toTokenInfo(this.provider.authenticationProviderId, session);\n\n\t\t\tlet files;\n\t\t\tif (range2) {\n\t\t\t\t// GitHub doesn't support `..`, so issue both `...` comparisons in parallel and union the results.\n\t\t\t\tconst [result1, result2] = await Promise.allSettled([\n\t\t\t\t\tgithub.getComparison(token, metadata.repo.owner, metadata.repo.name, stripOrigin(range)),\n\t\t\t\t\tgithub.getComparison(token, metadata.repo.owner, metadata.repo.name, stripOrigin(range2)),\n\t\t\t\t]);\n\n\t\t\t\tconst files1 = getSettledValue(result1)?.files;\n\t\t\t\tconst files2 = getSettledValue(result2)?.files;\n\n\t\t\t\tfiles = [...new Set(union(files1, files2))];\n\t\t\t} else {\n\t\t\t\tconst result = await github.getComparison(\n\t\t\t\t\ttoken,\n\t\t\t\t\tmetadata.repo.owner,\n\t\t\t\t\tmetadata.repo.name,\n\t\t\t\t\tstripOrigin(range),\n\t\t\t\t);\n\t\t\t\tfiles = result?.files;\n\t\t\t}\n\n\t\t\treturn files?.map(f => ({\n\t\t\t\tpath: f.filename ?? '',\n\t\t\t\toriginalPath: f.previous_filename,\n\t\t\t\tstatus: fromCommitFileStatus(f.status) ?? GitFileIndexStatus.Modified,\n\t\t\t\trepoPath: repoPath,\n\t\t\t\tstats: { additions: f.additions, deletions: f.deletions, changes: f.changes },\n\t\t\t}));\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tdebugger;\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t@debug()\n\tasync getNextComparisonUris(\n\t\trepoPath: string,\n\t\tpathOrUri: string | Uri,\n\t\trev: string | undefined,\n\t\tskip: number = 0,\n\t\t_options?: { ordering?: 'date' | 'author-date' | 'topo' | null },\n\t\t_cancellation?: AbortSignal,\n\t): Promise<NextComparisonUrisResult | undefined> {\n\t\t// If we have no revision there is no next commit\n\t\tif (!rev) return undefined;\n\n\t\tconst scope = getScopedLogger();\n\n\t\tconst path = this.provider.getRelativePath(pathOrUri, repoPath);\n\n\t\ttry {\n\t\t\tconst context = await this.provider.ensureRepositoryContext(repoPath);\n\t\t\tif (context == null) return undefined;\n\n\t\t\tconst { metadata, github, session } = context;\n\t\t\tconst revision = (await metadata.getRevision()).revision;\n\n\t\t\tif (rev === 'HEAD') {\n\t\t\t\trev = revision;\n\t\t\t}\n\n\t\t\tconst refs = await github.getNextCommitRefs(\n\t\t\t\ttoTokenInfo(this.provider.authenticationProviderId, session),\n\t\t\t\tmetadata.repo.owner,\n\t\t\t\tmetadata.repo.name,\n\t\t\t\trevision,\n\t\t\t\tpath,\n\t\t\t\tstripOrigin(rev),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcurrent:\n\t\t\t\t\tskip === 0\n\t\t\t\t\t\t? createRevisionUri(repoPath, path, rev)\n\t\t\t\t\t\t: createRevisionUri(repoPath, path, refs[skip - 1]),\n\t\t\t\tnext: refs[skip] != null ? createRevisionUri(repoPath, path, refs[skip]) : undefined,\n\t\t\t};\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tdebugger;\n\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\t@debug()\n\tasync getPreviousComparisonUris(\n\t\trepoPath: string,\n\t\tpathOrUri: string | Uri,\n\t\trev: string | undefined,\n\t\tskip: number = 0,\n\t\t_unsaved?: boolean,\n\t\t_options?: { ordering?: 'date' | 'author-date' | 'topo' | null },\n\t\t_cancellation?: AbortSignal,\n\t): Promise<PreviousComparisonUrisResult | undefined> {\n\t\tif (rev === deletedOrMissing) return undefined;\n\n\t\tconst scope = getScopedLogger();\n\n\t\tconst path = this.provider.getRelativePath(pathOrUri, repoPath);\n\n\t\ttry {\n\t\t\tconst context = await this.provider.ensureRepositoryContext(repoPath);\n\t\t\tif (context == null) return undefined;\n\n\t\t\tconst { metadata, github, session } = context;\n\n\t\t\tconst offset = rev != null ? 1 : 0;\n\n\t\t\tconst result = await github.getCommitRefs(\n\t\t\t\ttoTokenInfo(this.provider.authenticationProviderId, session),\n\t\t\t\tmetadata.repo.owner,\n\t\t\t\tmetadata.repo.name,\n\t\t\t\tstripOrigin(!rev || rev === 'HEAD' ? (await metadata.getRevision()).revision : rev),\n\t\t\t\t{\n\t\t\t\t\tpath: path,\n\t\t\t\t\tfirst: offset + skip + 1,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (result == null) return undefined;\n\n\t\t\t// If we are at a commit, diff commit with previous\n\t\t\tconst currentSha = skip === 0 ? rev : (result.values[offset + skip - 1]?.oid ?? deletedOrMissing);\n\n\t\t\tif (currentSha === deletedOrMissing) return undefined;\n\n\t\t\treturn {\n\t\t\t\tcurrent: createRevisionUri(repoPath, path, currentSha),\n\t\t\t\tprevious: createRevisionUri(repoPath, path, result.values[offset + skip]?.oid ?? deletedOrMissing),\n\t\t\t};\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tdebugger;\n\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\t@debug()\n\t// oxlint-disable-next-line typescript/require-await\n\tasync getPreviousComparisonUrisForRange(\n\t\t_repoPath: string,\n\t\t_path: string | Uri,\n\t\t_rev: string | undefined,\n\t\t_range: DiffRange,\n\t\t_options?: { ordering?: 'date' | 'author-date' | 'topo' | null; skipFirstRev?: boolean },\n\t\t_cancellation?: AbortSignal,\n\t): Promise<PreviousRangeComparisonUrisResult | undefined> {\n\t\t// This method requires `getBlameForLine` which depends on VS Code-specific\n\t\t// blame infrastructure. It will be overridden in the extension wrapper.\n\t\treturn undefined;\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","names":[],"sources":["../../../../../../plus/git-github/src/providers/github/diff.ts"],"sourcesContent":["import type { Cache } from '@gitlens/git/cache.js';\nimport type { GitDiffFilter, GitDiffShortStat } from '@gitlens/git/models/diff.js';\nimport type { GitFile } from '@gitlens/git/models/file.js';\nimport { GitFileIndexStatus } from '@gitlens/git/models/fileStatus.js';\nimport type { GitRevisionRange } from '@gitlens/git/models/revision.js';\nimport { deletedOrMissing } from '@gitlens/git/models/revision.js';\nimport type {\n\tGitDiffSubProvider,\n\tNextComparisonUrisResult,\n\tPreviousComparisonUrisResult,\n\tPreviousRangeComparisonUrisResult,\n} from '@gitlens/git/providers/diff.js';\nimport type { DiffRange, RevisionUri } from '@gitlens/git/providers/types.js';\nimport type { GitErrorHandling } from '@gitlens/git/run.types.js';\nimport { getChangedFilesCount } from '@gitlens/git/utils/commit.utils.js';\nimport {\n\tcreateRevisionRange,\n\tgetRevisionRangeParts,\n\tisRevisionRange,\n\tstripOrigin,\n} from '@gitlens/git/utils/revision.utils.js';\nimport { encodeGitLensRevisionUriAuthority } from '@gitlens/git/utils/uriAuthority.js';\nimport { debug } from '@gitlens/utils/decorators/log.js';\nimport { union } from '@gitlens/utils/iterable.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport { getSettledValue } from '@gitlens/utils/promise.js';\nimport type { Uri } from '@gitlens/utils/uri.js';\nimport { fromUri } from '@gitlens/utils/uri.js';\nimport { toTokenInfo } from '../../api/tokenUtils.js';\nimport { fromCommitFileStatus } from '../../models.js';\nimport type { GitHubGitProviderInternal } from '../githubProvider.js';\n\nconst slash = 47;\n\nfunction createRevisionUri(repoPath: string, relativePath: string, sha: string | undefined): RevisionUri {\n\t// For virtual repos, the path is the relative path prefixed with /\n\tlet uriPath = relativePath.replace(/\\\\/g, '/');\n\tif (uriPath.charCodeAt(0) !== slash) {\n\t\turiPath = `/${uriPath}`;\n\t}\n\treturn {\n\t\turi: fromUri({\n\t\t\tscheme: 'gitlens',\n\t\t\tauthority: encodeGitLensRevisionUriAuthority({ ref: sha, repoPath: repoPath }),\n\t\t\tpath: uriPath,\n\t\t}),\n\t\tpath: relativePath,\n\t\tsha: sha,\n\t\trepoPath: repoPath,\n\t};\n}\n\nexport class DiffGitSubProvider implements GitDiffSubProvider {\n\tconstructor(\n\t\tprivate readonly cache: Cache,\n\t\tprivate readonly provider: GitHubGitProviderInternal,\n\t) {}\n\n\t@debug()\n\tasync getChangedFilesCount(\n\t\trepoPath: string,\n\t\tto?: string,\n\t\tfrom?: string,\n\t\t_options?: { uris?: (string | Uri)[]; includeUntracked?: boolean },\n\t\t_cancellation?: AbortSignal,\n\t): Promise<GitDiffShortStat | undefined> {\n\t\t// Virtual GitHub repos have no working tree, so no working changes can exist.\n\t\t// Without any refs, return empty stats rather than undefined to avoid \"uncertain state\" callers.\n\t\tif (!to && !from) return { additions: 0, deletions: 0, files: 0 };\n\n\t\t// If only `from` is provided, compare against HEAD\n\t\tif (!to) {\n\t\t\tto = 'HEAD';\n\t\t}\n\n\t\tconst commit = await this.provider.commits.getCommit(repoPath, to);\n\t\tif (commit?.stats == null) return undefined;\n\n\t\tconst { stats } = commit;\n\n\t\tconst changedFiles = getChangedFilesCount(stats.files);\n\t\treturn { additions: stats.additions, deletions: stats.deletions, files: changedFiles };\n\t}\n\n\t@debug()\n\tasync getDiffStatus(\n\t\trepoPath: string,\n\t\tref1OrRange: string | GitRevisionRange,\n\t\tref2?: string,\n\t\toptions?: {\n\t\t\tfilters?: GitDiffFilter[];\n\t\t\tincludeUntracked?: boolean;\n\t\t\tpath?: string;\n\t\t\trenameLimit?: number;\n\t\t\tsimilarityThreshold?: number;\n\t\t\terrors?: GitErrorHandling;\n\t\t},\n\t): Promise<GitFile[] | undefined> {\n\t\tif (repoPath == null) return undefined;\n\n\t\tconst scope = getScopedLogger();\n\n\t\tconst { metadata, github, session } = await this.provider.ensureRepositoryContext(repoPath);\n\n\t\tlet range: GitRevisionRange;\n\t\tif (isRevisionRange(ref1OrRange)) {\n\t\t\trange = ref1OrRange;\n\n\t\t\tif (!isRevisionRange(ref1OrRange, 'qualified')) {\n\t\t\t\tconst parts = getRevisionRangeParts(ref1OrRange);\n\t\t\t\trange = createRevisionRange(parts?.left || 'HEAD', parts?.right || 'HEAD', parts?.notation ?? '...');\n\t\t\t}\n\t\t} else {\n\t\t\trange = createRevisionRange(ref1OrRange || 'HEAD', ref2 || 'HEAD', '...');\n\t\t}\n\n\t\tlet range2: GitRevisionRange | undefined;\n\t\t// GitHub doesn't support the `..` range notation, so we will need to do some extra work\n\t\tif (isRevisionRange(range, 'qualified-double-dot')) {\n\t\t\tconst parts = getRevisionRangeParts(range)!;\n\n\t\t\trange = createRevisionRange(parts.left, parts.right, '...');\n\t\t\trange2 = createRevisionRange(parts.right, parts.left, '...');\n\t\t}\n\n\t\ttry {\n\t\t\tconst token = toTokenInfo(this.provider.authenticationProviderId, session);\n\n\t\t\tlet files;\n\t\t\tif (range2) {\n\t\t\t\t// GitHub doesn't support `..`, so issue both `...` comparisons in parallel and union the results.\n\t\t\t\tconst [result1, result2] = await Promise.allSettled([\n\t\t\t\t\tgithub.getComparison(token, metadata.repo.owner, metadata.repo.name, stripOrigin(range)),\n\t\t\t\t\tgithub.getComparison(token, metadata.repo.owner, metadata.repo.name, stripOrigin(range2)),\n\t\t\t\t]);\n\n\t\t\t\tconst files1 = getSettledValue(result1)?.files;\n\t\t\t\tconst files2 = getSettledValue(result2)?.files;\n\n\t\t\t\tfiles = [...new Set(union(files1, files2))];\n\t\t\t} else {\n\t\t\t\tconst result = await github.getComparison(\n\t\t\t\t\ttoken,\n\t\t\t\t\tmetadata.repo.owner,\n\t\t\t\t\tmetadata.repo.name,\n\t\t\t\t\tstripOrigin(range),\n\t\t\t\t);\n\t\t\t\tfiles = result?.files;\n\t\t\t}\n\n\t\t\treturn files?.map(f => ({\n\t\t\t\tpath: f.filename ?? '',\n\t\t\t\toriginalPath: f.previous_filename,\n\t\t\t\tstatus: fromCommitFileStatus(f.status) ?? GitFileIndexStatus.Modified,\n\t\t\t\trepoPath: repoPath,\n\t\t\t\tstats: { additions: f.additions, deletions: f.deletions, changes: f.changes },\n\t\t\t}));\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tdebugger;\n\t\t\tif (options?.errors === 'throw') throw ex;\n\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t@debug()\n\tasync getNextComparisonUris(\n\t\trepoPath: string,\n\t\tpathOrUri: string | Uri,\n\t\trev: string | undefined,\n\t\tskip: number = 0,\n\t\t_options?: { ordering?: 'date' | 'author-date' | 'topo' | null },\n\t\t_cancellation?: AbortSignal,\n\t): Promise<NextComparisonUrisResult | undefined> {\n\t\t// If we have no revision there is no next commit\n\t\tif (!rev) return undefined;\n\n\t\tconst scope = getScopedLogger();\n\n\t\tconst path = this.provider.getRelativePath(pathOrUri, repoPath);\n\n\t\ttry {\n\t\t\tconst context = await this.provider.ensureRepositoryContext(repoPath);\n\t\t\tif (context == null) return undefined;\n\n\t\t\tconst { metadata, github, session } = context;\n\t\t\tconst revision = (await metadata.getRevision()).revision;\n\n\t\t\tif (rev === 'HEAD') {\n\t\t\t\trev = revision;\n\t\t\t}\n\n\t\t\tconst refs = await github.getNextCommitRefs(\n\t\t\t\ttoTokenInfo(this.provider.authenticationProviderId, session),\n\t\t\t\tmetadata.repo.owner,\n\t\t\t\tmetadata.repo.name,\n\t\t\t\trevision,\n\t\t\t\tpath,\n\t\t\t\tstripOrigin(rev),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcurrent:\n\t\t\t\t\tskip === 0\n\t\t\t\t\t\t? createRevisionUri(repoPath, path, rev)\n\t\t\t\t\t\t: createRevisionUri(repoPath, path, refs[skip - 1]),\n\t\t\t\tnext: refs[skip] != null ? createRevisionUri(repoPath, path, refs[skip]) : undefined,\n\t\t\t};\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tdebugger;\n\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\t@debug()\n\tasync getPreviousComparisonUris(\n\t\trepoPath: string,\n\t\tpathOrUri: string | Uri,\n\t\trev: string | undefined,\n\t\tskip: number = 0,\n\t\t_unsaved?: boolean,\n\t\t_options?: { ordering?: 'date' | 'author-date' | 'topo' | null },\n\t\t_cancellation?: AbortSignal,\n\t): Promise<PreviousComparisonUrisResult | undefined> {\n\t\tif (rev === deletedOrMissing) return undefined;\n\n\t\tconst scope = getScopedLogger();\n\n\t\tconst path = this.provider.getRelativePath(pathOrUri, repoPath);\n\n\t\ttry {\n\t\t\tconst context = await this.provider.ensureRepositoryContext(repoPath);\n\t\t\tif (context == null) return undefined;\n\n\t\t\tconst { metadata, github, session } = context;\n\n\t\t\tconst offset = rev != null ? 1 : 0;\n\n\t\t\tconst result = await github.getCommitRefs(\n\t\t\t\ttoTokenInfo(this.provider.authenticationProviderId, session),\n\t\t\t\tmetadata.repo.owner,\n\t\t\t\tmetadata.repo.name,\n\t\t\t\tstripOrigin(!rev || rev === 'HEAD' ? (await metadata.getRevision()).revision : rev),\n\t\t\t\t{\n\t\t\t\t\tpath: path,\n\t\t\t\t\tfirst: offset + skip + 1,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (result == null) return undefined;\n\n\t\t\t// If we are at a commit, diff commit with previous\n\t\t\tconst currentSha = skip === 0 ? rev : (result.values[offset + skip - 1]?.oid ?? deletedOrMissing);\n\n\t\t\tif (currentSha === deletedOrMissing) return undefined;\n\n\t\t\treturn {\n\t\t\t\tcurrent: createRevisionUri(repoPath, path, currentSha),\n\t\t\t\tprevious: createRevisionUri(repoPath, path, result.values[offset + skip]?.oid ?? deletedOrMissing),\n\t\t\t};\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex);\n\t\t\tdebugger;\n\n\t\t\tthrow ex;\n\t\t}\n\t}\n\n\t@debug()\n\t// oxlint-disable-next-line typescript/require-await\n\tasync getPreviousComparisonUrisForRange(\n\t\t_repoPath: string,\n\t\t_path: string | Uri,\n\t\t_rev: string | undefined,\n\t\t_range: DiffRange,\n\t\t_options?: { ordering?: 'date' | 'author-date' | 'topo' | null; skipFirstRev?: boolean },\n\t\t_cancellation?: AbortSignal,\n\t): Promise<PreviousRangeComparisonUrisResult | undefined> {\n\t\t// This method requires `getBlameForLine` which depends on VS Code-specific\n\t\t// blame infrastructure. It will be overridden in the extension wrapper.\n\t\treturn undefined;\n\t}\n}\n"],"mappings":"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"}
@@ -153,7 +153,8 @@ export declare class IntegrationService implements Disposable, RepositoryResolut
153
153
  * exchanged token rather than a possibly-stale cached one. Both paths refresh, by different mechanisms: a
154
154
  * per-connection (`connectionId`) read syncs that specific connection's session directly through the auth
155
155
  * provider (the integration's primary-only sync path would never reach a secondary account), while a
156
- * primary read syncs via the integration's own cloud-connection machinery.
156
+ * primary read syncs via the integration's own cloud-connection machinery. Either way the integration's cached
157
+ * discovery (a tracker's project list) is dropped, so the read sees projects created or deleted since.
157
158
  * Best-effort — a failed sync is swallowed so the read still proceeds (and surfaces its own warning).
158
159
  */
159
160
  forceRefreshIfRequested(integration: Integration, forceSync: boolean | undefined, connectionId: string | undefined): Promise<void>;
@@ -544,11 +544,13 @@ var IntegrationService = class {
544
544
  * exchanged token rather than a possibly-stale cached one. Both paths refresh, by different mechanisms: a
545
545
  * per-connection (`connectionId`) read syncs that specific connection's session directly through the auth
546
546
  * provider (the integration's primary-only sync path would never reach a secondary account), while a
547
- * primary read syncs via the integration's own cloud-connection machinery.
547
+ * primary read syncs via the integration's own cloud-connection machinery. Either way the integration's cached
548
+ * discovery (a tracker's project list) is dropped, so the read sees projects created or deleted since.
548
549
  * Best-effort — a failed sync is swallowed so the read still proceeds (and surfaces its own warning).
549
550
  */
550
551
  async forceRefreshIfRequested(integration, forceSync, connectionId) {
551
552
  if (forceSync !== true) return;
553
+ integration.invalidateDiscoveryCaches();
552
554
  try {
553
555
  if (connectionId != null) {
554
556
  const authProvider = await this.authenticationService.get(integration.authProvider.id);