From 806d9311bfc5264720806b64e637009c7a55853e Mon Sep 17 00:00:00 2001 From: Jason Rudolph Date: Fri, 20 Jul 2018 13:17:56 -0400 Subject: [PATCH 1/3] Introduce atom.project.onDidAddRepository(callback) --- spec/project-spec.js | 35 +++++++++++++++++++++++++++++++++++ src/project.js | 15 +++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/spec/project-spec.js b/spec/project-spec.js index 2d38058fe..a8eedebb2 100644 --- a/spec/project-spec.js +++ b/spec/project-spec.js @@ -969,6 +969,41 @@ describe('Project', () => { }) }) + describe('.onDidAddRepository()', () => { + it('invokes callback when a path is added and the path is the root of a repository', () => { + const observed = [] + const disposable = atom.project.onDidAddRepository((repo) => observed.push(repo)) + + const repositoryPath = path.join(__dirname, '..') + atom.project.addPath(repositoryPath) + expect(observed.length).toBe(1) + expect(observed[0].getOriginURL()).toContain('github.com/atom/atom') + + disposable.dispose() + }) + + it('invokes callback when a path is added and the path is subdirectory of a repository', () => { + const observed = [] + const disposable = atom.project.onDidAddRepository((repo) => observed.push(repo)) + + atom.project.addPath(__dirname) + expect(observed.length).toBe(1) + expect(observed[0].getOriginURL()).toContain('github.com/atom/atom') + + disposable.dispose() + }) + + it('does not invoke callback when a path is added and the path is not part of a repository', () => { + const observed = [] + const disposable = atom.project.onDidAddRepository((repo) => observed.push(repo)) + + atom.project.addPath(temp.mkdirSync('not-a-repository')) + expect(observed.length).toBe(0) + + disposable.dispose() + }) + }) + describe('.relativize(path)', () => { it('returns the path, relative to whichever root directory it is inside of', () => { atom.project.addPath(temp.mkdirSync('another-path')) diff --git a/src/project.js b/src/project.js index 4e51efcf8..d1b10586f 100644 --- a/src/project.js +++ b/src/project.js @@ -234,6 +234,18 @@ class Project extends Model { return this.emitter.on('did-change-files', callback) } + // Public: Invoke the given callback when a repository is added to the + // project. + // + // * `callback` {Function} to be called when a repository is added. + // * `repository` A {GitRepository}. + // + // Returns a {Disposable} on which `.dispose()` can be called to + // unsubscribe. + onDidAddRepository (callback) { + return this.emitter.on('did-add-repository', callback) + } + /* Section: Accessing the git repository */ @@ -400,6 +412,9 @@ class Project extends Model { if (repo) { break } } this.repositories.push(repo != null ? repo : null) + if (repo != null) { + this.emitter.emit('did-add-repository', repo) + } if (options.emitEvent !== false) { this.emitter.emit('did-change-paths', this.getPaths()) From 55da0d8f5d2741c986aff0fa7a39e5584ce09e66 Mon Sep 17 00:00:00 2001 From: Jason Rudolph Date: Fri, 20 Jul 2018 13:49:18 -0400 Subject: [PATCH 2/3] Introduce atom.project.observeRepositories(callback) --- spec/project-spec.js | 26 ++++++++++++++++++++++++++ src/project.js | 20 ++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/spec/project-spec.js b/spec/project-spec.js index a8eedebb2..b28967eca 100644 --- a/spec/project-spec.js +++ b/spec/project-spec.js @@ -969,6 +969,32 @@ describe('Project', () => { }) }) + describe('.observeRepositories()', () => { + it('invokes the observer with current and future repositories', () => { + const observed = [] + + const directory1 = temp.mkdirSync('git-repo1') + const gitDirPath1 = fs.absolute(path.join(__dirname, 'fixtures', 'git', 'master.git')) + fs.copySync(gitDirPath1, path.join(directory1, '.git')) + + const directory2 = temp.mkdirSync('git-repo2') + const gitDirPath2 = fs.absolute(path.join(__dirname, 'fixtures', 'git', 'repo-with-submodules', 'git.git')) + fs.copySync(gitDirPath2, path.join(directory2, '.git')) + + atom.project.setPaths([directory1]) + + const disposable = atom.project.observeRepositories((repo) => observed.push(repo)) + expect(observed.length).toBe(1) + expect(observed[0].getReferenceTarget('refs/heads/master')).toBe('ef046e9eecaa5255ea5e9817132d4001724d6ae1') + + atom.project.addPath(directory2) + expect(observed.length).toBe(2) + expect(observed[1].getReferenceTarget('refs/heads/master')).toBe('d2b0ad9cbc6f6c4372e8956e5cc5af771b2342e5') + + disposable.dispose() + }) + }) + describe('.onDidAddRepository()', () => { it('invokes callback when a path is added and the path is the root of a repository', () => { const observed = [] diff --git a/src/project.js b/src/project.js index d1b10586f..8ccf60c0b 100644 --- a/src/project.js +++ b/src/project.js @@ -234,6 +234,26 @@ class Project extends Model { return this.emitter.on('did-change-files', callback) } + // Public: Invoke the given callback with all current and future + // repositories in the project. + // + // * `callback` {Function} to be called with current and future + // repositories. + // * `repository` A {GitRepository} that is present at the time of + // subscription or that is added at some later time. + // + // Returns a {Disposable} on which `.dispose()` can be called to + // unsubscribe. + observeRepositories (callback) { + for (const repo of this.repositories) { + if (repo != null) { + callback(repo) + } + } + + return this.onDidAddRepository(callback) + } + // Public: Invoke the given callback when a repository is added to the // project. // From 2a5f7e20c358c6534f4a383feabcc1068cb8c44b Mon Sep 17 00:00:00 2001 From: Jason Rudolph Date: Fri, 20 Jul 2018 15:12:53 -0400 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=85=20Fix=20overly-specific=20asserti?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes failing assertions [1] that unnecessarily assumed that the repository was cloned using `https://github.com/atom/atom.git` as the URL, as opposed to `git@github.com:atom/atom.git` as the URL. [1] https://circleci.com/gh/atom/atom/7981 --- spec/project-spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/project-spec.js b/spec/project-spec.js index b28967eca..e7601253c 100644 --- a/spec/project-spec.js +++ b/spec/project-spec.js @@ -1003,7 +1003,7 @@ describe('Project', () => { const repositoryPath = path.join(__dirname, '..') atom.project.addPath(repositoryPath) expect(observed.length).toBe(1) - expect(observed[0].getOriginURL()).toContain('github.com/atom/atom') + expect(observed[0].getOriginURL()).toContain('atom/atom') disposable.dispose() }) @@ -1014,7 +1014,7 @@ describe('Project', () => { atom.project.addPath(__dirname) expect(observed.length).toBe(1) - expect(observed[0].getOriginURL()).toContain('github.com/atom/atom') + expect(observed[0].getOriginURL()).toContain('atom/atom') disposable.dispose() })