Skip to content

Add headings and other geometric pins in motion using State_tags#3995

Open
rodw-au wants to merge 1 commit into
LinuxCNC:masterfrom
rodw-au:state-tags-arcs
Open

Add headings and other geometric pins in motion using State_tags#3995
rodw-au wants to merge 1 commit into
LinuxCNC:masterfrom
rodw-au:state-tags-arcs

Conversation

@rodw-au
Copy link
Copy Markdown
Contributor

@rodw-au rodw-au commented May 2, 2026

Outline

create new [motion.interp.xx ] pins for heading and various geometric data (refer man motion for this PR). Note the following use cases behind this PR.

  • heading requested by Andy as it was trivial to add while working on this. Its been in Mach3 for years. Useful for tangential knives and saws.
  • normal-heading angle from current position to arc centre. Allow bevelled cutting in conjunction with heading. This could allow cuttings of bevels (eg with a plasma torch) with 2D gcode. While torch holders exist that keep the angled torch tip axial to the Z axis, external offsets could be used to calculate the desired XYZ coordinates to centre the torch tip
  • radius A theory of mine. Plasma cutters use torch voltage as a process contol variable to set torch height to obtain even kerf but this assumes a constant velocity (reducing velocity increases torch voltage). When the torch aproaches a centrepetal radius limit, the system could lock the height and switch to using current as the process control variable to keep the voltage constant.
  • iscircle allows a plasma cutter to detect bolt holes (where arc start position = end position) and apply custom hole processing rules more inteligently than the current state. Can be used in conjunction with normal-heading for countersinking holes.

I am sure the community will find many other use cases.

Code notes

  • Uses an extension of state_tags.
  • New procedures tag_straight() and tag_arc() in interp_convert.cc apply our new tags for straight moves and arcs.
  • Because these tags are only applied at the beginning of a segment, heading calculations are applied in motion/control.c/update_status() in real time.
  • The rest of the code is mechanical to transfer the tags added by the interpreter back to motion so the data can be used in real time.
  • May provide a framework for using additional tags in motion

Caveats

We use the state tag motion_type (GM_FIELD_MOTION_MODE) to detect G0,G1,G2,G3 in motion. Currently there is no way to use existing interpreter equates for these values so the numbers are hard coded as 0,10,20,30.

RunTests

These pass locally

Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors
rod@debian:~/devt/linuxcnc$ 

Acknowledgements

Many thanks to Luca Toniolo (grandixximo) for his encouragement and help resolving errors with the tests.

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

Some observations:

  • Why is there a file called arc_heading?
  • I'm not sure that creating test-files in the root LCNC directory called nc_files is a good idea. Tests are supposed to be in the tests directory and have a real test associated. If they are not for testing, then you need to have a specific config and the should be created in the config/sim/... somewhere as an example.
  • The line docs/man/man9/output_buffer.9 is malplaced in the root .gitignore and should be in the docs/man/.gitignore file. However, it is probably malplaced in this PR as it seems unrelated to this PR.
  • The diff of src/emc/rs274ngc/interp_convert.cc is 7000+ lines. Most, if not all, seems to be inappropriate (or stylistic wrong) white-space changes. What are the actual differences in this file?

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 3, 2026

Thanks for the feedback.

  1. I will remove the spurious (empty) arc_heading
  2. The nc_folder was created due to issue RIP build now makes a temp file or folder (I think called $) in the working directory where linuxcnc 2.10pre is invoked from the command line #3924 . I reported which was not resolved until after I commenced work on this PR. I will remove it as there is no need to demonstrate these pins with a custom sim. (I just used the normal axis sim for testing)
  3. docs/man/man9/output_buffer.9 I think appeared on acceptance of a PR from Luca so not sure how to remove it. It seems to be created again in the build process and is not part of this feature. Added to docs/man/.gitignore
  4. Sorry if the style has been broken. Changes in interp_convert.cc are two new procedures at the end tag_straight() and tag_arcs() which are each called once from convert_straight() and convert_arc2(). New procedures are from line 7080 and on. Probably easiest to review in my fork; state_tags_arcs branch. https://github.com/rodw-au/linuxcnc/blob/state-tags-arcs/src/emc/rs274ngc/interp_convert.cc#L7080

Ideas to resolve Item 3 would be appreciated.

Just reviewing further, it appears #3924 that the ~/linuxcnc/configs folder contents have been added to the root folder on my PC. I don't think they have been included in this PR. Could someone please check and confirm?

@hansu
Copy link
Copy Markdown
Member

hansu commented May 3, 2026

docs/man/man9/output_buffer.9 I think appeared on acceptance of a PR from Luca so not sure how to remove it. It seems to be created again in the build process and is not part of this feature. Added to docs/man/.gitignore

Sorry my fault, I forgot to add the generated man page to gitignore (#3941)

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

Hm, I'm not sure I've been looking too good at the nc directory... Point 12 makes 300+ files disappear. That seems very, very wrong. (edit should read point 2)

Point 3 should be a separate PR, I guess.

Point 4 needs to be solved by you taking the original file and only change what is necessary.

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

Just to add a comment on nc files.

It is not that you cannot or should not add (example) files. The point is that there needs to be some kind of docs or procedures that use or reference them. Just having files without people knowing how to find them is kinda pointless.

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

docs/man/man9/output_buffer.9 I think appeared on acceptance of a PR from Luca so not sure how to remove it. It seems to be created again in the build process and is not part of this feature. Added to docs/man/.gitignore

Sorry my fault, I forgot to add the generated man page to gitignore (#3941)

You are not the first who gets bitten by this. There is a change in the works to let CI fail when this happens.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 3, 2026

Just to add a comment on nc files.

It is not that you cannot or should not add (example) files. The point is that there needs to be some kind of docs or procedures that use or reference them. Just having files without people knowing how to find them is kinda pointless.

As mentioned in the original comment, these new pins are documented in the motion man file eg man motion under I_Interpreter Metadata pins._ These should find hteir way to the web site shouldn't they?

Re point 2, you now see the problem with the nc_files folder caused by #3924 . I too only saw it it when the files were removed by git add. It was very wrong as it created the files that should have been under ~/linuxcnc in whatever was the current working directory. So saving the sim to your desktop created this mess!

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

As mentioned in the original comment, these new pins are documented in the motion man file eg man motion under I_Interpreter Metadata pins._ These should find hteir way to the web site shouldn't they?

The man page is a reference for the component. These man pages usually do not do a lot of examples. For that we have the other documentation in the docs/src directory, where specific scenarios are described and more in depth explanations are (should be) presented. This is usually also the place, while explaining and going into depth, to reference the examples provided.

Re point 2, you now see the problem with the nc_files folder caused by #3924 . I too only saw it it when the files were removed by git add. It was very wrong as it created the files that should have been under ~/linuxcnc in whatever was the current working directory. So saving the sim to your desktop created this mess!

Yes, there was that unfortunate wrong side-effect while fixing the Tcl9 compatibility problem, sorry about that. However, it should be fixed now, isn't it?

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 3, 2026

These should find hteir way to the web site shouldn't they?

Man pages should find their way, yes. So does the other documentation afaik.
(if auto updating works, don't know about that)

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 3, 2026

Formatting issue in interp_convert.cc was caused by an errant autoformatting editor I had no idea about.
I reverted to a copy from master branch than reapplied the changes from this PR so the last commit 5461c2d now shows changes nice and clearly.

I can't see a clean way to correct the .gitignore issue by a PR from the oversight in #3941. Its been corrected in this PR.

Re documentation, when I look at a the docs page on the web site, I can't see any chapter where additional documentation of a few extra pins is appropriate except for the man page. Perhaps these gcode samples could be deployed and mentioned on the man page but where do I put them so they turn up in the users nc_file examples?
nc_files.zip.

Adding example gcode for read only pins just does not seem right to me. The man page should be sufficient (as it is for every other component).

All runtests pass
Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

I think this is now OK for approval. It is benign as it does not add any additional features, just exposes some useful information. Breakages are unlikely. Any fixes following user feedback can be added.

@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 4, 2026

I think you also need to restore all the files you deleted from nc_files. You removed much more than you probably intended by simply deleting the entire directory. (This may be partly my fault because I suggested something like it, but I was actually only referring to the added files.)

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

What a nightmare, nc-files restored. I thought the folder had been created by #3924 and did not realise that was a genine folder. So much to learn about this all!

Comment thread docs/man/.gitignore Outdated
Comment thread src/.gitignore Outdated
Comment thread .gitignore Outdated
@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 4, 2026

Thanks. You are still missing file nc_files/3D_Chips.pdf.

I also added some comments on the gitignore changes.

// overrunning the caller's stack array.
int n = GM_FIELD_FLOAT_MAX_FIELDS < ACTIVE_SETTINGS
? GM_FIELD_FLOAT_MAX_FIELDS : ACTIVE_SETTINGS;
for (i=0; i<n; i++)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not use std::min? or even just for(i = 0, i < ACTIVE_SETTINGS, i++) ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was added in a PR by Luca to resolve runtime tests. Without it, because we have added additional state_tags, he maintains the active_settings array would overflow (which made sense).

This worried me because I thought the codebase should be more robust than that so I queried it with him on Discord:

Just get some feedback on a bug you found. In interp_base.hh we have #define ACTIVE_SETTINGS 5
Shouldn't that be #define ACTIVE_SETTINGS GM_FIELD_FLOAT_MAX_FIELDS to prevent future overflows of state tags related code? Or maybe better #defined as the max of the 2 equates?

grandixximo — Yesterday at 11:35 PM
no, that will break the API
compatibility with axis UI and other
If we want a guard against future drift, a one-liner like:
static_assert(ACTIVE_SETTINGS <= GM_FIELD_FLOAT_MAX_FIELDS,
              "ACTIVE_SETTINGS slot must exist in fields_float[]");

would catch anyone adding an ACTIVE_SETTINGS entry without growing the tag, without coupling GM_FIELD_FLOAT_MAX_FIELDS with ACTIVE_SETTINGS. 

Using max(5, 11) = 11 would re-create the exact bug my PR fixed

I did not understand the static_assert and was going to research it once I got this done and raise it here if necessary.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static_assert is like assert (it checks an expression and only continues if expression is true) but it "runs" at compile time. So all quantities in the expression need to be known at compile time.

max would be the "wrong dircetion", you want to copy those settings that both structures can accomodate (the minimum).

static_assert like

static_assert(ACTIVE_SETTINGS == GM_FIELD_FLOAD_FEEDRATE); 

would probably be a good idead nonetheless. Frankly, that whole state_tags structure is a mess and should be converted into a proper struct with proper members, but that's a different story...

What is the difference between GM_FIELD_FLOAT_FEED and a GM_FIELD_FLOAT_FEEDRATE?

I will leave it to others with more knowledge to edit this code. Luca fixed it twice after I broke it when merging!

re GM_FIELD_FLOAT_FEED and a GM_FIELD_FLOAT_FEEDRATE
I'm not sure. I will review that another day. I do recall Dewey added a feed_upm pin (name from memory) using state tags when they were first released but now I see a number of other feed rate pins. machine units per minute was not particularly useful because if using it you would normally want to compare it with current_vel which is in machine units per second (for plasma cutting you want to disable torch height control if current_vel < original feederate to prevent diving.

I found the packed flags OK to work with but the messy bit is the data has to be repeated in a C++ structure in the interpreter. So we have a classic case of data redundancy. Using a union placing bit mapped fields over the unsigned int might help but that's likely to be just as messy!

The other thing I learnt is that the tag is applied at the start of the segment so to see arc headings in real time, you need to calculate them in motion. Thats also a bit messy as I mentioned in my initial comment.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static_assert is like assert (it checks an expression and only continues if expression is true) but it "runs" at compile time. So all quantities in the expression need to be known at compile time.

max would be the "wrong dircetion", you want to copy those settings that both structures can accomodate (the minimum).

static_assert like

static_assert(ACTIVE_SETTINGS == GM_FIELD_FLOAD_FEEDRATE); 

would probably be a good idead nonetheless. Frankly, that whole state_tags structure is a mess and should be converted into a proper struct with proper members, but that's a different story...

What is the difference between GM_FIELD_FLOAT_FEED and a GM_FIELD_FLOAT_FEEDRATE?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this code even necessary? We copy settings[] to state_tags in interp_write.cc and here we copy the same data back from state_tags to settings[] here in rs274ngc_pre.cc

Are we loading data for the GUI to see? Maybe someone with more knowledge can help here.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

Thanks. You are still missing file nc_files/3D_Chips.pdf.

3D_chips.pdf exists but is in a .gitignore file
rod@debian:~/devt/linuxcnc$ git add nc_files/3D_Chips.pdf --dry-run
The following paths are ignored by one of your .gitignore files:
nc_files/3D_Chips.pdf

I would not have added that!

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

Local tests pass
Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

@rodw-au rodw-au requested a review from BsAtHome May 4, 2026 12:37
Comment thread src/emc/motion/state_tag.h Outdated
@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 4, 2026

3D_chips.pdf exists but is in a .gitignore file rod@debian:~/devt/linuxcnc$ git add nc_files/3D_Chips.pdf --dry-run The following paths are ignored by one of your .gitignore files: nc_files/3D_Chips.pdf

Yes, PDF files are ignored by the *.pdf rule in the main .gitignore file because docs generate them. Not sure whether we should make an exception or move the rule to the docs. Definitely sub-optimal, but letting it just stand as is seems fine for now, I guess. You can always argue in a separate PR that a change is necessary ;-)

Comment thread src/emc/motion/state_tag.h Outdated
Comment thread src/emc/rs274ngc/interp_internal.hh Outdated
@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 4, 2026

You still have the nc_files/3D_Chips.pdf marked as removed. You need to run git restore on that file and commit.

Comment thread src/emc/rs274ngc/interp_internal.hh Outdated
@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

Corrected typos in comments. (1 was pre existing)
Rebased to master branch to bring in .gitignmore entry for docs/man/man9/output_buffer.9
removed unused tag GM_FIELD_FLOAT_FEEDRATE which was not necessary in the end.

Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

Thanks for everyone's help

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

I had to force add Chips as it had been removed so restore failed.

rod@debian:~/devt/linuxcnc$ git restore ./nc_files/3D_Chips.pdf
error: pathspec './nc_files/3D_Chips.pdf' did not match any file(s) known to git
rod@debian:~/devt/linuxcnc$ git add ./nc_files/3D_Chips.pdf
The following paths are ignored by one of your .gitignore files:
nc_files/3D_Chips.pdf
hint: Use -f if you really want to add them.
hint: Disable this message with "git config advice.addIgnoredFile false"
rod@debian:~/devt/linuxcnc$ git add -f ./nc_files/3D_Chips.pdf
rod@debian:~/devt/linuxcnc$ git commit
[state-tags-arcs 4fc14bca89] force added missing 3D_Chips.pdf file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 nc_files/3D_Chips.pdf
rod@debian:~/devt/linuxcnc$ git push

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 4, 2026

I don't trust Githubs tests, all runtests still pass locally
Runtest: 278 tests run, 278 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

Comment thread src/emc/motion/control.c
Comment thread src/emc/motion/motion.c Outdated
Comment thread src/emc/motion/state_tag.h Outdated
Comment thread src/emc/rs274ngc/interp_internal.hh
@BsAtHome
Copy link
Copy Markdown
Contributor

BsAtHome commented May 5, 2026

The problem with purely whitespace changes are that they are detractors from what is being changed. As such, it may be fine to change whitespace, but in a complex change it can become hard to keep track. (/me being pedantic)

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 5, 2026

Yeh, I know you are being pedantic but as you say this is complex so I don't mind. Helps me learn.
I'm getting lots of runtests errors like this here

rod@debian:~$ cd devt/linuxcnc
rod@debian:~/devt/linuxcnc$ . ./scripts/rip-environment
rod@debian:~/devt/linuxcnc$ runtests
Running test: /home/rod/devt/linuxcnc/tests/abort/feed-rate
*** /home/rod/devt/linuxcnc/tests/abort/feed-rate: XFAIL: test run exited with 1
*** SHMERR: Shared memory segment 0x00000064 (Emc motion key) was not removed. Removing...

I did a git clean and rebooted but they are persisting. It can't be anything in that last commit surely. The only code I touched was adding back in the commented out pin.

Any ideas short of recloning?

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 13, 2026

This is now complete. Changes include:

  1. Changes to radius calculations to ensure G20/G21 units are respected regardless of machine units
  2. Streamlined tests so now universal and not tied to line numbers
  3. Now there are two tests based on machine units heading-mm (original metric) and heading-in (imperial) - both pass
  4. Modified gcode file to run both in G20 and G21 units used in both tests
  5. Merged upstream master into this branch and resolved conflicts. I made a mistake resolving conflicts but its resolved in a subsequent commit. (forgot to delete some lines)

All runtime tests pass locally.

@rodw-au rodw-au requested a review from BsAtHome May 13, 2026 02:27
@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 13, 2026

Last minute I realised I had an error in gcode (not using G20) and this was not picked up because I was not using the corrected radius in interp_conv.cc.
Both issues corrected.
Both heading-mm and heading-in tests pass

$ runtests tests/motion/heading-mm
Running test: tests/motion/heading-mm
Runtest: 1 tests run, 1 successful, 0 failed + 0 expected, 0 skipped, 0 shmem errors
$ runtests tests/motion/heading-in
Running test: tests/motion/heading-in
Runtest: 1 tests run, 1 successful, 0 failed + 0 expected, 0 skipped, 0 shmem errors

Comment thread src/emc/motion/command.c
Comment thread src/emc/rs274ngc/interp_write.cc Outdated
Comment thread tests/motion/heading-in/test-ui.py Outdated
Comment thread tests/motion/heading-in/test-ui.py Outdated
Comment thread tests/motion/heading-in/test-ui.py Outdated
Comment thread tests/motion/heading-mm/heading.hal Outdated
Comment thread tests/motion/heading-mm/test-ui.py Outdated
@BsAtHome
Copy link
Copy Markdown
Contributor

You have in the test g-code:

G64 P0.1 Q0.1 	; Tolerance 0.1mm
G21             	; Set units to millimeters
...

Should these two be reversed? First set the machine into metric and then set the tolerance to 0.1mm?

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 13, 2026

I will review suggestions tomorrow.
My very last commit (which is quite small) introduced an error on /tests/interp/python/error and is also stopping Linuxcnc from opening with undefined symbol emcStatus. I think it is some kind of linker voodoo which I don't understand. It must be the changes in interp_convert.cc rather than the gcode edits because Linuxcnc errors before it even opens. What I am trying to do is to check if the gcode units = machine units
If you had any ideas on that, please let me know.
I was going to try using the units in units.h when I understand them but it was meal time!
I want to resolve that before tackling revisions.

@BsAtHome
Copy link
Copy Markdown
Contributor

Please find attached heading2.zip that has the merged tests/heading/ content. It also updates the ui script with the points that I mentioned in review.

The CI problem is likely caused by your master branch being divergent from LinuxCNC master branch. You added some commits directly to your master branch and those changes should probably have been in your state-tags-arcs branch. You need to save all your changes, then revert/reset your master branch to match LinuxCNC's and then apply your saved changes to your state-tags-arcs branch. Then you can look and find where you made the error.

@BsAtHome
Copy link
Copy Markdown
Contributor

That should go into tests/motion/heading, that is.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 13, 2026

That should go into tests/motion/heading, that is.
Thanks, the subfolders are a great idea. I tried to get it all in one folder but didn't know enough!
Sometimes, One of the great things about being an Aussie is people like you work our night shift!

You were correct about the divergence. It happened in the first batch of commits and it must have finally bitten. Now fixed. I noticed you corrected the tolerance. But I think its now looser on an inch machine thjan a metric machine. Not sure how to fix that. Can you pass a paramter to the ui file? I guess it won't really matter becasue if its off it will be a G20/G21 issue and it will be far more than that!

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 13, 2026

You have in the test g-code:

G64 P0.1 Q0.1 	; Tolerance 0.1mm
G21             	; Set units to millimeters
...

Should these two be reversed? First set the machine into metric and then set the tolerance to 0.1mm?

I noticed you had fixed that.

Comment thread src/emc/motion/control.c Outdated
Comment thread src/emc/rs274ngc/interp_write.cc Outdated
Comment thread src/emc/motion/command.c
@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 13, 2026

Oops Fixed command.c. Was looking in the wrong file (control.c) and found some redundant code anyway
Will put formatting in a seperate commit

Comment thread src/emc/motion/state_tag.h
@rodw-au rodw-au requested a review from BsAtHome May 13, 2026 23:14
Comment thread src/emc/motion/control.c Outdated
Comment thread src/emc/motion/control.c Outdated
Comment thread src/emc/motion/control.c Outdated
Comment thread src/emc/rs274ngc/interp_convert.cc
Comment thread tests/motion/heading/heading-test.ngc Outdated
Comment thread src/emc/motion/control.c Outdated
Comment thread src/emc/motion/control.c Outdated
Comment thread src/emc/motion/control.c Outdated
Comment thread src/emc/motion/control.c Outdated
Comment thread src/emc/motion/control.c Outdated
@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 14, 2026

Finally! All cleaned up. Sorry about the stream of commits.
There is now only 2 deletions. One by Luca dealing with Active-tags and the orther was me tidying up a comment in state-tag.h

I'm very relieved our revised gcode passes all tests
Runtest: 281 tests run, 281 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

Thanks for all your help and suggestions. It will be great to see this committed now. Some users are keen for it as it was a forum post that spurred me on to get this done. I had an attempt about 6 years ago and gave up but it was good to start afresh with this commit as things had changed and I had done even more silly things than I did in this time!

@BsAtHome
Copy link
Copy Markdown
Contributor

Looks fine to me ;-)

@BsAtHome
Copy link
Copy Markdown
Contributor

@andypugh you need to squash the commits.
There are many individual commits in Rod's tree and many are not relevant to the actual change, but cosmetics. Now, I don't want to cause yet another delay, so squashing this while merging should solve it.

@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 14, 2026

Should I rebase to master at this point?
Such a learning curve.

@BsAtHome
Copy link
Copy Markdown
Contributor

In principle, you could squash the commits locally into one commit with a new message and then force push the result. It is a bit tricky, so make a backup before you attempt and verify locally before you push. But the squash can also be done in the merge here.

@rodw-au rodw-au force-pushed the state-tags-arcs branch from 72d560c to 292bff4 Compare May 16, 2026 23:33
@rodw-au
Copy link
Copy Markdown
Contributor Author

rodw-au commented May 16, 2026

@andypugh Now rebased to master and squashed to a single commit.

Ready to merge into master.
All tests pass locally.
Runtest: 281 tests run, 281 successful, 0 failed + 0 expected, 4 skipped, 0 shmem errors

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants