diff --git a/spec/remote.spec.js b/spec/remote.spec.js index 1534e589..8357b632 100644 --- a/spec/remote.spec.js +++ b/spec/remote.spec.js @@ -37,6 +37,13 @@ describe('Git Remotes', function() { ); }); + it('pushes', function() { + expectTreeAsync( + 'git clone; git commit; git push', + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); + it('pulls and then pushes', function() { expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull; git push', diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 58d505bf..d0c9ec70 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -577,24 +577,27 @@ var commandConfig = { if (isColonRefspec(firstArg)) { var refspecParts = firstArg.split(':'); source = refspecParts[0]; - destination = refspecParts[1]; - // TODO -- assert good branch name + destination = validateAndAssertBranchName(engine, refspecParts[1]); } else { - // we are using this org as both destination and source + // we are using this arg as destination -- source is one before head destination = firstArg; - source = firstArg; + source = engine.getOneBeforeCommit('HEAD').get('id'); } - destination = validateAndAssertBranchName(engine, destination); } else { - source = engine.getOneBeforeCommit('HEAD'); + // since they have not specified a source or destination, then + // we source from the branch we are on (or HEAD) and push to + // the branch we are on + source = engine.getOneBeforeCommit('HEAD').get('id'); destination = source; - assertBranchIsRemoteTracking(source); + assertBranchIsRemoteTracking(engine, source); } if (source) { assertIsRef(engine, source); } engine.push({ + // NOTE -- very important! destination and source here + // are always, always strings. very important :D destination: destination, source: source }); diff --git a/src/js/git/index.js b/src/js/git/index.js index f4723506..ea4c4b88 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -885,19 +885,16 @@ GitEngine.prototype.push = function(options) { return; } - var remoteBranch = this.refs[options.source]; - + var sourceBranch = this.refs[options.source]; if (!this.origin.refs[options.destination]) { this.makeBranchOnOriginAndTrack( options.destination, 'HEAD' ); } - var branchOnRemote = this.origin.refs[options.source]; - + var branchOnRemote = this.origin.refs[options.destination]; var sourceLocation = this.getOneBeforeCommit(options.source || 'HEAD'); - debugger; // first check if this is even allowed by checking the sync between this.checkUpstreamOfSource( this, @@ -971,7 +968,7 @@ GitEngine.prototype.push = function(options) { // HAX HAX update master and remote tracking for master chain = chain.then(_.bind(function() { var localCommit = this.getCommitFromRef(sourceLocation); - this.setTargetLocation(remoteBranch, localCommit); + this.setTargetLocation(this.refs[ORIGIN_PREFIX + options.destination], localCommit); return this.animationFactory.playRefreshAnimation(this.gitVisuals); }, this)); @@ -2541,6 +2538,9 @@ var Branch = Ref.extend({ }, getIsRemote: function() { + if (typeof this.get('id') !== 'string') { + debugger; + } return this.get('id').slice(0, 2) === ORIGIN_PREFIX; } });