When testing the CLI, "since"-calculations will result in different
values over time:
now
1 month ago
2 months ago
10 months ago
1 year ago
10 years ago
Initially, the solution was to use the wildcard match from `snapbox`,
`[..]`, to match on these values. However, since these values change
in length it means that they will affect the width of the tables
produced by the CLI.
To ensure the width is stable across runs over time it's possible to
use a time that is the same as the commit time used at testing.
To do this the `Timestamp` type is now a newtype which has a
constructor `now` which will use the `RAD_COMMIT_TIME` env variable
for construction, if it's available and in debug mode. This ensure
that all "since"-calculations will result in `now`.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
12 KiB
Using git push to open patches
Let's checkout a branch, make a commit and push to the magic ref refs/patches.
When we push to this ref, a patch is created from our commits.
$ git checkout -b feature/1
Switched to a new branch 'feature/1'
$ git commit -a -m "Add things" -q --allow-empty
$ git push -o patch.message="Add things #1" -o patch.message="See commits for details." rad HEAD:refs/patches
✓ Patch e49e64637ab4a29e5a16c73000dacd2afa918d9d opened
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
* [new reference] HEAD -> refs/patches
We can see a patch was created:
$ rad patch show e49e64637ab4a29e5a16c73000dacd2afa918d9d
╭────────────────────────────────────────────────────╮
│ Title Add things #1 │
│ Patch e49e64637ab4a29e5a16c73000dacd2afa918d9d │
│ Author z6MknSL…StBU8Vi (you) │
│ Head 42d894a83c9c356552a57af09ccdbd5587a99045 │
│ Branches feature/1 │
│ Commits ahead 1, behind 0 │
│ Status open │
│ │
│ See commits for details. │
├────────────────────────────────────────────────────┤
│ 42d894a Add things │
├────────────────────────────────────────────────────┤
│ ● opened by z6MknSL…StBU8Vi (you) now │
╰────────────────────────────────────────────────────╯
If we check our local branch, we can see its upstream is set to track a remote branch associated with this patch:
$ git branch -vv
* feature/1 42d894a [rad/patches/e49e64637ab4a29e5a16c73000dacd2afa918d9d] Add things
master f2de534 [rad/master] Second commit
Let's check that it's up to date with our local head:
$ git status --short --branch
## feature/1...rad/patches/e49e64637ab4a29e5a16c73000dacd2afa918d9d
$ git fetch
$ git push
And let's look at our local and remote refs:
$ git show-ref
42d894a83c9c356552a57af09ccdbd5587a99045 refs/heads/feature/1
f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/heads/master
f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/remotes/rad/master
42d894a83c9c356552a57af09ccdbd5587a99045 refs/remotes/rad/patches/e49e64637ab4a29e5a16c73000dacd2afa918d9d
$ git ls-remote rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji 'refs/heads/patches/*'
42d894a83c9c356552a57af09ccdbd5587a99045 refs/heads/patches/e49e64637ab4a29e5a16c73000dacd2afa918d9d
$ git ls-remote rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi 'refs/cobs/*'
2317f74de0494c489a233ca6f29f2b8bff6d4f15 refs/cobs/xyz.radicle.id/2317f74de0494c489a233ca6f29f2b8bff6d4f15
e49e64637ab4a29e5a16c73000dacd2afa918d9d refs/cobs/xyz.radicle.patch/e49e64637ab4a29e5a16c73000dacd2afa918d9d
We can create another patch:
$ git checkout -b feature/2 -q master
$ git commit -a -m "Add more things" -q --allow-empty
$ git push rad HEAD:refs/patches
✓ Patch b1fd7b6883dca2ef11e0e486a7097e759ea90cdb opened
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
* [new reference] HEAD -> refs/patches
We see both branches with upstreams now:
$ git branch -vv
feature/1 42d894a [rad/patches/e49e64637ab4a29e5a16c73000dacd2afa918d9d] Add things
* feature/2 8b0ea80 [rad/patches/b1fd7b6883dca2ef11e0e486a7097e759ea90cdb] Add more things
master f2de534 [rad/master] Second commit
And both patches:
$ rad patch
╭───────────────────────────────────────────────────────────────────────────────╮
│ ● ID Title Author Head + - Updated │
├───────────────────────────────────────────────────────────────────────────────┤
│ ● b1fd7b6 Add more things z6MknSL…StBU8Vi (you) 8b0ea80 +0 -0 now │
│ ● e49e646 Add things #1 z6MknSL…StBU8Vi (you) 42d894a +0 -0 now │
╰───────────────────────────────────────────────────────────────────────────────╯
To update our patch, we simply push commits to the upstream branch:
$ git commit -a -m "Improve code" -q --allow-empty
$ git push
✓ Patch b1fd7b6 updated to c867846b9f294c271e8934820dfac2c5924ecd5a
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
8b0ea80..02bef3f feature/2 -> patches/b1fd7b6883dca2ef11e0e486a7097e759ea90cdb
This last git push worked without specifying an upstream branch despite the
local branch having a different name than the remote. This is because Radicle
configures repositories upon rad init with push.default = upstream:
$ git config --local --get push.default
upstream
This allows for pushing to the remote patch branch without using the full
<src>:<dst> syntax.
We can then see that the patch head has moved:
$ rad patch show b1fd7b6
╭─────────────────────────────────────────────────────────────────────╮
│ Title Add more things │
│ Patch b1fd7b6883dca2ef11e0e486a7097e759ea90cdb │
│ Author z6MknSL…StBU8Vi (you) │
│ Head 02bef3fac41b2f98bb3c02b868a53ddfecb55b5f │
│ Branches feature/2 │
│ Commits ahead 2, behind 0 │
│ Status open │
├─────────────────────────────────────────────────────────────────────┤
│ 02bef3f Improve code │
│ 8b0ea80 Add more things │
├─────────────────────────────────────────────────────────────────────┤
│ ● opened by z6MknSL…StBU8Vi (you) now │
│ ↑ updated to c867846b9f294c271e8934820dfac2c5924ecd5a (02bef3f) now │
╰─────────────────────────────────────────────────────────────────────╯
And we can check that all the refs are properly updated in our repository:
$ git rev-parse HEAD
02bef3fac41b2f98bb3c02b868a53ddfecb55b5f
$ git status --short --branch
## feature/2...rad/patches/b1fd7b6883dca2ef11e0e486a7097e759ea90cdb
$ git rev-parse refs/remotes/rad/patches/b1fd7b6883dca2ef11e0e486a7097e759ea90cdb
02bef3fac41b2f98bb3c02b868a53ddfecb55b5f
$ git ls-remote rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi refs/heads/patches/b1fd7b6883dca2ef11e0e486a7097e759ea90cdb
02bef3fac41b2f98bb3c02b868a53ddfecb55b5f refs/heads/patches/b1fd7b6883dca2ef11e0e486a7097e759ea90cdb
Force push
Sometimes, it's necessary to force-push a patch update. For example, if we amended the commit and want the updated patch to reflect that.
Let's try.
$ git commit --amend -m "Amended commit" --allow-empty
[feature/2 9304dbc] Amended commit
Date: [..]
Now let's push to the patch head.
$ git push
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
! [rejected] feature/2 -> patches/b1fd7b6883dca2ef11e0e486a7097e759ea90cdb (non-fast-forward)
error: failed to push some refs to 'rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi'
hint: [..]
hint: [..]
hint: [..]
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
The push fails because it's not a fast-forward update. To remedy this, we can
use --force to force the update.
$ git push --force
✓ Patch b1fd7b6 updated to cf4d8577a1ec8aaa21a7ccca67ad8627c3304024
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
+ 02bef3f...9304dbc feature/2 -> patches/b1fd7b6883dca2ef11e0e486a7097e759ea90cdb (forced update)
That worked. We can see the new revision if we call rad patch show:
$ rad patch show b1fd7b6
╭─────────────────────────────────────────────────────────────────────╮
│ Title Add more things │
│ Patch b1fd7b6883dca2ef11e0e486a7097e759ea90cdb │
│ Author z6MknSL…StBU8Vi (you) │
│ Head 9304dbc445925187994a7a93222a3f8bde73b785 │
│ Branches feature/2 │
│ Commits ahead 2, behind 0 │
│ Status open │
├─────────────────────────────────────────────────────────────────────┤
│ 9304dbc Amended commit │
│ 8b0ea80 Add more things │
├─────────────────────────────────────────────────────────────────────┤
│ ● opened by z6MknSL…StBU8Vi (you) now │
│ ↑ updated to c867846b9f294c271e8934820dfac2c5924ecd5a (02bef3f) now │
│ ↑ updated to cf4d8577a1ec8aaa21a7ccca67ad8627c3304024 (9304dbc) now │
╰─────────────────────────────────────────────────────────────────────╯
Empty patch
If we try to open a patch without making any changes to our base branch (master),
we should get an error:
$ git push rad master:refs/patches
To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
! [remote rejected] master -> refs/patches (patch commits are already included in the base branch)
error: failed to push some refs to 'rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi'