Browse Source

Moves get last fetched date into providers

main
Eric Amodio 3 years ago
parent
commit
bf71dd17d5
5 changed files with 53 additions and 11 deletions
  1. +7
    -0
      src/env/node/git/git.ts
  2. +35
    -6
      src/env/node/git/localGitProvider.ts
  3. +1
    -0
      src/git/gitProvider.ts
  4. +6
    -0
      src/git/gitProviderService.ts
  5. +4
    -5
      src/git/models/repository.ts

+ 7
- 0
src/env/node/git/git.ts View File

@ -1245,6 +1245,13 @@ export namespace Git {
}
}
export async function rev_parse__git_dir(cwd: string): Promise<string | undefined> {
const data = await git<string>({ cwd: cwd, errors: GitErrorHandling.Ignore }, 'rev-parse', '--git-dir');
// Make sure to normalize: https://github.com/git-for-windows/git/issues/2478
// Keep trailing spaces which are part of the directory name
return data.length === 0 ? undefined : normalizePath(data.trimLeft().replace(/[\r|\n]+$/, ''));
}
export async function rev_parse__show_toplevel(cwd: string): Promise<string | undefined> {
try {
const data = await git<string>(

+ 35
- 6
src/env/node/git/localGitProvider.ts View File

@ -125,6 +125,11 @@ const mappedAuthorRegex = /(.+)\s<(.+)>/;
const reflogCommands = ['merge', 'pull'];
interface RepositoryInfo {
gitDir?: string;
user?: GitUser | null;
}
export class LocalGitProvider implements GitProvider, Disposable {
readonly descriptor: GitProviderDescriptor = { id: GitProviderId.Git, name: 'Git' };
readonly supportedSchemes: string[] = [
@ -155,10 +160,10 @@ export class LocalGitProvider implements GitProvider, Disposable {
private readonly _mergeStatusCache = new Map<string, GitMergeStatus | null>();
private readonly _rebaseStatusCache = new Map<string, GitRebaseStatus | null>();
private readonly _remotesWithApiProviderCache = new Map<string, GitRemote<RichRemoteProvider> | null>();
private readonly _repoInfoCache = new Map<string, RepositoryInfo>();
private readonly _stashesCache = new Map<string, GitStash | null>();
private readonly _tagsCache = new Map<string, Promise<PagedResult<GitTag>>>();
private readonly _trackedPaths = new PathTrie<PromiseOrValue<[string, string] | undefined>>();
private readonly _userMapCache = new Map<string, GitUser | null>();
private _disposables: Disposable[] = [];
@ -176,7 +181,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
private onRepositoryChanged(repo: Repository, e: RepositoryChangeEvent) {
if (e.changed(RepositoryChange.Config, RepositoryChangeComparisonMode.Any)) {
this._userMapCache.delete(repo.path);
this._repoInfoCache.delete(repo.path);
}
if (e.changed(RepositoryChange.Heads, RepositoryChange.Remotes, RepositoryChangeComparisonMode.Any)) {
@ -757,7 +762,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
if (cache.length === 0) {
this._trackedPaths.clear();
this._userMapCache.clear();
this._repoInfoCache.clear();
}
}
@ -1546,7 +1551,9 @@ export class LocalGitProvider implements GitProvider, Disposable {
@gate()
@log()
async getCurrentUser(repoPath: string): Promise<GitUser | undefined> {
let user = this._userMapCache.get(repoPath);
const repo = this._repoInfoCache.get(repoPath);
let user = repo?.user;
if (user != null) return user;
// If we found the repo, but no user data was found just return
if (user === null) return undefined;
@ -1572,7 +1579,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
process.env.GIT_AUTHOR_NAME || process.env.GIT_COMMITTER_NAME || userInfo()?.username || undefined;
if (!user.name) {
// If we found no user data, mark it so we won't bother trying again
this._userMapCache.set(repoPath, null);
this._repoInfoCache.set(repoPath, { ...repo, user: null });
return undefined;
}
@ -1593,7 +1600,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
}
}
this._userMapCache.set(repoPath, user);
this._repoInfoCache.set(repoPath, { ...repo, user: user });
return user;
}
@ -1857,6 +1864,28 @@ export class LocalGitProvider implements GitProvider, Disposable {
return files[0];
}
@debug()
async getLastFetchedTimestamp(repoPath: string): Promise<number | undefined> {
try {
const gitDir = await this.getGitDir(repoPath);
const stats = await workspace.fs.stat(this.container.git.getAbsoluteUri(`${gitDir}/FETCH_HEAD`, repoPath));
// If the file is empty, assume the fetch failed, and don't update the timestamp
if (stats.size > 0) return stats.mtime;
} catch {}
return undefined;
}
private async getGitDir(repoPath: string): Promise<string> {
const repo = this._repoInfoCache.get(repoPath);
if (repo?.gitDir != null) return repo.gitDir;
const gitDir = normalizePath((await Git.rev_parse__git_dir(repoPath)) || '.git');
this._repoInfoCache.set(repoPath, { ...repo, gitDir: gitDir });
return gitDir;
}
@log()
async getLog(
repoPath: string,

+ 1
- 0
src/git/gitProvider.ts View File

@ -223,6 +223,7 @@ export interface GitProvider extends Disposable {
options?: { filters?: GitDiffFilter[] | undefined; similarityThreshold?: number | undefined },
): Promise<GitFile[] | undefined>;
getFileStatusForCommit(repoPath: string, uri: Uri, ref: string): Promise<GitFile | undefined>;
getLastFetchedTimestamp(repoPath: string): Promise<number | undefined>;
getLog(
repoPath: string,
options?: {

+ 6
- 0
src/git/gitProviderService.ts View File

@ -1138,6 +1138,12 @@ export class GitProviderService implements Disposable {
return provider.getFileStatusForCommit(path, uri, ref);
}
@debug()
getLastFetchedTimestamp(repoPath: string | Uri): Promise<number | undefined> {
const { provider, path } = this.getProvider(repoPath);
return provider.getLastFetchedTimestamp(path);
}
@log()
async getLog(
repoPath: string | Uri,

+ 4
- 5
src/git/models/repository.ts View File

@ -535,11 +535,10 @@ export class Repository implements Disposable {
}
try {
// TODO@eamodio: Need to move this into an explicit provider call
const stats = await workspace.fs.stat(this.container.git.getAbsoluteUri('.git/FETCH_HEAD', this.path));
// If the file is empty, assume the fetch failed, and don't update the timestamp
if (stats.size > 0) {
this._lastFetched = stats.mtime;
const lastFetched = await this.container.git.getLastFetchedTimestamp(this.path);
// If we don't get a number, assume the fetch failed, and don't update the timestamp
if (lastFetched != null) {
this._lastFetched = lastFetched;
}
} catch {
this._lastFetched = undefined;

Loading…
Cancel
Save